mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-24 16:17:29 +09:00
Bug 1334314 - Fix debug mode OSR exception handling for IteratorClose trynotes
Issue #74
This commit is contained in:
parent
4ac4296fce
commit
b0960bf497
2 changed files with 48 additions and 9 deletions
16
js/src/jit-test/tests/ion/bug1334314.js
Normal file
16
js/src/jit-test/tests/ion/bug1334314.js
Normal 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();
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue