Bug 787848 - Handle JSOP_THROWING opcode in the decompiler. r=luke

This commit is contained in:
Nicolas B. Pierron 2012-09-28 15:56:28 -07:00
Родитель dcb00e1ea7
Коммит 428f856e78
2 изменённых файлов: 20 добавлений и 2 удалений

Просмотреть файл

@ -0,0 +1,7 @@
try {
i
}
catch (x if (function() {})()) {}
catch (d) {
this.z.z
}

Просмотреть файл

@ -6441,8 +6441,10 @@ ReconstructPCStack(JSContext *cx, JSScript *script, jsbytecode *target,
if (!script->hasTrynotes())
continue;
// If we do not follow a goto we look for another mean to continue
// at the next PC.
/*
* If we do not follow a goto we look for another mean to continue
* at the next PC.
*/
JSTryNote *tn = script->trynotes()->vector;
JSTryNote *tnEnd = tn + script->trynotes()->length;
for (; tn != tnEnd; tn++) {
@ -6451,12 +6453,21 @@ ReconstructPCStack(JSContext *cx, JSScript *script, jsbytecode *target,
if (start < pc && pc <= end && end <= target)
break;
}
if (tn != tnEnd) {
pcdepth = tn->stackDepth;
hpcdepth = unsigned(-1);
oplen = 0;
pc = script->main() + tn->start + tn->length;
continue;
}
/*
* JSOP_THROWING compensates for hidden JSOP_DUP at the start of the
* previous guarded catch (see EmitTry in BytecodeEmitter.cpp).
*/
if (JSOp(*(pc + oplen)) == JSOP_THROWING)
hpcdepth = pcdepth + 2;
continue;
}