Bug 532823: fix slot computation for JSOP_NAME accessing outer vars defined in trace entry frame, r=bz

This commit is contained in:
David Mandelin 2009-12-03 18:48:45 -08:00
parent 61d4096a55
commit 6500db42b9
2 changed files with 29 additions and 2 deletions

View File

@ -3301,7 +3301,9 @@ GetFromClosure(JSContext* cx, JSObject* call, const ClosureVarInfo* cv, double*
struct ArgClosureTraits
{
static inline uint32 adj_slot(JSStackFrame* fp, uint32 slot) { return fp->argc + slot; }
static inline uint32 adj_slot(JSStackFrame* fp, uint32 slot) { return 2 + slot; }
// See also UpvarArgTraits.
static inline jsval* slots(JSStackFrame* fp) { return fp->argv; }
private:
ArgClosureTraits();
@ -3316,7 +3318,9 @@ GetClosureArg(JSContext* cx, JSObject* callee, const ClosureVarInfo* cv, double*
struct VarClosureTraits
{
static inline uint32 adj_slot(JSStackFrame* fp, uint32 slot) { return slot; }
static inline jsval* slots(JSStackFrame* fp) { return fp->slots; }
// See also UpvarVarTraits.
static inline jsval* slots(JSStackFrame* fp) { return 3 + fp->argc + fp->slots; }
private:
VarClosureTraits();
};

View File

@ -0,0 +1,23 @@
function loop(f) {
var p;
for (var i = 0; i < 10; ++i) {
p = f();
}
return p;
}
function f(j, k) {
var g = function() { return k; }
var ans = '';
for (k = 0; k < 5; ++k) {
ans += loop(g);
}
return ans;
}
var t0 = new Date;
var actual = f(1);
assertEq(actual, '01234');