Bug 1334314 - Fix debug mode OSR exception handling for IteratorClose trynotes

Issue #74
This commit is contained in:
janekptacijarabaci 2018-03-25 14:49:32 +02:00 • committed by Roy Tam
commit b0960bf497
2 changed files with 48 additions and 9 deletions

View file

@ -0,0 +1,16 @@
// |jit-test| error: TypeError
var g = newGlobal();
g.parent = this;
g.eval("new Debugger(parent).onExceptionUnwind = function () { };");
function f() {
[[]] = [];
}
try {
f();
} catch (e) {};
try {
f();
} catch (e) {};
f();

View file

@ -487,7 +487,7 @@ GetNextNonLoopEntryPc(jsbytecode* pc)
} }
static bool static bool
HasLiveIteratorAtStackDepth(JSScript* script, jsbytecode* pc, uint32_t stackDepth) HasLiveStackValueAtDepth(JSScript* script, jsbytecode* pc, uint32_t stackDepth)
{ {
if (!script->hasTrynotes()) if (!script->hasTrynotes())
return false; return false;
@ -501,14 +501,37 @@ HasLiveIteratorAtStackDepth(JSScript* script, jsbytecode* pc, uint32_t stackDept
if (pcOffset >= tn->start + tn->length) if (pcOffset >= tn->start + tn->length)
continue; continue;
switch (tn->kind) {
case JSTRY_FOR_IN:
// For-in loops have only the iterator on stack. // For-in loops have only the iterator on stack.
if (tn->kind == JSTRY_FOR_IN && stackDepth == tn->stackDepth) if (stackDepth == tn->stackDepth)
return true; return true;
break;
case JSTRY_FOR_OF:
// For-of loops have both the iterator and the result object on // For-of loops have both the iterator and the result object on
// stack. The iterator is below the result object. // stack. The iterator is below the result object.
if (tn->kind == JSTRY_FOR_OF && stackDepth == tn->stackDepth - 1) if (stackDepth == tn->stackDepth - 1)
return true; return true;
break;
case JSTRY_ITERCLOSE:
// Code that need to call IteratorClose have the iterator on the
// stack.
if (stackDepth == tn->stackDepth)
return true;
break;
case JSTRY_DESTRUCTURING_ITERCLOSE:
// Destructuring code that need to call IteratorClose have both
// the iterator and the "done" value on the stack.
if (stackDepth == tn->stackDepth || stackDepth == tn->stackDepth - 1)
return true;
break;
default:
break;
}
} }
return false; return false;
@ -945,7 +968,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC,
// iterators, however, so read them out. They will be closed by // iterators, however, so read them out. They will be closed by
// HandleExceptionBaseline. // HandleExceptionBaseline.
MOZ_ASSERT(cx->compartment()->isDebuggee()); MOZ_ASSERT(cx->compartment()->isDebuggee());
if (iter.moreFrames() || HasLiveIteratorAtStackDepth(script, pc, i + 1)) { if (iter.moreFrames() || HasLiveStackValueAtDepth(script, pc, i + 1)) {
v = iter.read(); v = iter.read();
} else { } else {
iter.skip(); iter.skip();