Commit 428f856e authored by Nicolas B. Pierron's avatar Nicolas B. Pierron
Browse files

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

parent dcb00e1e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
try {
    i
}
catch (x if (function() {})()) {}
catch (d) {
    this.z.z
}
+13 −2
Original line number Diff line number Diff line
@@ -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;
        }