diff --git a/js/src/jit-test/tests/basic/bug787848.js b/js/src/jit-test/tests/basic/bug787848.js new file mode 100644 index 000000000000..07cfa74fad4f --- /dev/null +++ b/js/src/jit-test/tests/basic/bug787848.js @@ -0,0 +1,7 @@ +try { + i +} +catch (x if (function() {})()) {} +catch (d) { + this.z.z +} diff --git a/js/src/jsopcode.cpp b/js/src/jsopcode.cpp index da6b9c5da7b0..3061c3f16378 100644 --- a/js/src/jsopcode.cpp +++ b/js/src/jsopcode.cpp @@ -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; }