From 44fc2c4d2bda5966b96c8dabf15d94a09eb9df17 Mon Sep 17 00:00:00 2001 From: Luke Wagner Date: Wed, 20 Jun 2012 08:57:29 -0700 Subject: [PATCH] Bug 765907 - Don't save frame variables of dead generators in the debugger (r=billm) --- .../basic/testGeneratorDieButScopeAlive.js | 20 +++++++++++++------ js/src/vm/ScopeObject.cpp | 6 ------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/js/src/jit-test/tests/basic/testGeneratorDieButScopeAlive.js b/js/src/jit-test/tests/basic/testGeneratorDieButScopeAlive.js index 3c3e70f48ab..a1db29ef947 100644 --- a/js/src/jit-test/tests/basic/testGeneratorDieButScopeAlive.js +++ b/js/src/jit-test/tests/basic/testGeneratorDieButScopeAlive.js @@ -1,16 +1,24 @@ var g = newGlobal('new-compartment'); var dbg = new Debugger(g); - var hits = 0; dbg.onDebuggerStatement = function(frame) { ++hits; frame.older.eval("escaped = function() { return y }"); } -g.escaped = undefined; -g.eval("function h() { debugger }"); -g.eval("(function () { var y = 42; h(); yield })().next();"); -assertEq(g.eval("escaped()"), 42); +var arr = []; +const N = 10; + +for (var i = 0; i < N; ++i) { + g.escaped = undefined; + g.eval("function h() { debugger }"); + g.eval("(function () { var y = {p:42}; h(); yield })().next();"); + assertEq(g.eval("escaped().p"), 42); + arr.push(g.escaped); +} + gc(); -assertEq(g.eval("escaped()"), 42); + +for (var i = 0; i < N; ++i) + arr[i](); diff --git a/js/src/vm/ScopeObject.cpp b/js/src/vm/ScopeObject.cpp index 245e6f6dbbb..fe2b3e903d3 100644 --- a/js/src/vm/ScopeObject.cpp +++ b/js/src/vm/ScopeObject.cpp @@ -1522,16 +1522,10 @@ DebugScopes::sweep() * As explained in onGeneratorFrameChange, liveScopes includes * suspended generator frames. Since a generator can be finalized while * its scope is live, we must explicitly detect finalized generators. - * Since the scope is still live, we simulate the onPop* call by - * copying unaliased variables into the scope object. */ if (JSGenerator *gen = fp->maybeSuspendedGenerator(rt)) { JS_ASSERT(gen->state == JSGEN_NEWBORN || gen->state == JSGEN_OPEN); if (!IsObjectMarked(&gen->obj)) { - if (scope->isCall()) - scope->asCall().copyUnaliasedValues(fp); - else if (scope->isBlock()) - scope->asClonedBlock().copyUnaliasedValues(fp); e.removeFront(); continue; }