Terminate execution when there's only one frame left

This commit is contained in:
Marco Castelluccio 2014-09-30 18:44:28 -07:00
Родитель e1390b706c
Коммит 0162737534
2 изменённых файлов: 13 добавлений и 8 удалений

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

@ -134,7 +134,9 @@ Context.prototype.execute = function(stopFrame) {
throw e; throw e;
} }
} }
} while (this.current() !== stopFrame); } while (this.frames.length !== 1);
this.frames.pop();
} }
Context.prototype.start = function(stopFrame) { Context.prototype.start = function(stopFrame) {
@ -159,7 +161,10 @@ Context.prototype.start = function(stopFrame) {
} }
Instrument.callPauseHooks(ctx.current()); Instrument.callPauseHooks(ctx.current());
if (ctx.current() === stopFrame) { // If there's one frame left, we're back to
// the method that created the thread and
// we're done.
if (ctx.frames.length === 1) {
ctx.kill(); ctx.kill();
return; return;
} }

12
vm.js
Просмотреть файл

@ -1077,9 +1077,9 @@ VM.execute = function(ctx) {
if (VM.DEBUG) { if (VM.DEBUG) {
VM.trace("return", ctx.thread.pid, frame.methodInfo); VM.trace("return", ctx.thread.pid, frame.methodInfo);
} }
popFrame(0); if (ctx.frames.length == 1)
if (!frame.methodInfo)
return; return;
popFrame(0);
break; break;
case 0xac: // ireturn case 0xac: // ireturn
case 0xae: // freturn case 0xae: // freturn
@ -1087,18 +1087,18 @@ VM.execute = function(ctx) {
if (VM.DEBUG) { if (VM.DEBUG) {
VM.trace("return", ctx.thread.pid, frame.methodInfo, stack[stack.length-1]); VM.trace("return", ctx.thread.pid, frame.methodInfo, stack[stack.length-1]);
} }
popFrame(1); if (ctx.frames.length == 1)
if (!frame.methodInfo)
return; return;
popFrame(1);
break; break;
case 0xad: // lreturn case 0xad: // lreturn
case 0xaf: // dreturn case 0xaf: // dreturn
if (VM.DEBUG) { if (VM.DEBUG) {
VM.trace("return", ctx.thread.pid, frame.methodInfo, stack[stack.length-1]); VM.trace("return", ctx.thread.pid, frame.methodInfo, stack[stack.length-1]);
} }
popFrame(2); if (ctx.frames.length == 1)
if (!frame.methodInfo)
return; return;
popFrame(2);
break; break;
default: default:
var opName = OPCODES[op]; var opName = OPCODES[op];