diff --git a/src/engine/sequencer.js b/src/engine/sequencer.js index 5eca9c202..1498d6320 100644 --- a/src/engine/sequencer.js +++ b/src/engine/sequencer.js @@ -134,17 +134,10 @@ Sequencer.prototype.stepToReporter = function (thread, blockId, inputName) { currentStackFrame.waitingReporter = inputName; // Actually execute the block. this.startThread(thread); - if (thread.status === Thread.STATUS_YIELD || - thread.status === Thread.STATUS_YIELD_BLOCK) { - // Reporter yielded; caller must wait for it to unyield. - // The value will be populated once the reporter unyields, - // and passed up to the currentStackFrame on next execution. - return true; - } else if (thread.status === Thread.STATUS_DONE) { - // Reporter finished, mark the thread as running. - thread.status = Thread.STATUS_RUNNING; - return false; - } + // If a reporter yielded, caller must wait for it to unyield. + // The value will be populated once the reporter unyields, + // and passed up to the currentStackFrame on next execution. + return thread.status === Thread.STATUS_YIELD; }; /** @@ -155,7 +148,8 @@ Sequencer.prototype.proceedThread = function (thread) { var currentBlockId = thread.peekStack(); // Mark the status as done and proceed to the next block. this.runtime.glowBlock(currentBlockId, false); - thread.status = Thread.STATUS_DONE; + // If the block was yielding, move back to running state. + thread.status = Thread.STATUS_RUNNING; // Pop from the stack - finished this level of execution. thread.popStack(); // Push next connected block, if there is one. @@ -167,6 +161,10 @@ Sequencer.prototype.proceedThread = function (thread) { while (thread.peekStack() === null && thread.stack.length > 0) { thread.popStack(); } + // If we still can't find a next block to run, mark the thread as done. + if (thread.peekStack() === null) { + thread.status = Thread.STATUS_DONE; + } }; module.exports = Sequencer; diff --git a/src/engine/thread.js b/src/engine/thread.js index d14d83f90..e5c4df2e4 100644 --- a/src/engine/thread.js +++ b/src/engine/thread.js @@ -32,22 +32,23 @@ function Thread (firstBlock) { /** * Thread status for initialized or running thread. - * Threads are in this state when the primitive is called for the first time. + * This is the default state for a thread - execution should run normally, + * stepping from block to block. * @const */ Thread.STATUS_RUNNING = 0; /** * Thread status for a yielded thread. - * Threads are in this state when a primitive has yielded. + * Threads are in this state when a primitive has yielded; execution is paused + * until the relevant primitive unyields. * @const */ Thread.STATUS_YIELD = 1; /** * Thread status for a finished/done thread. - * Thread is moved to this state when the interpreter - * can proceed with execution. + * Thread is in this state when there are no more blocks to execute. * @const */ Thread.STATUS_DONE = 2;