mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2024-12-22 22:12:28 -05:00
Add implementation for ifElse
This commit is contained in:
parent
ca68c55d57
commit
0bf9ab59a1
3 changed files with 25 additions and 6 deletions
|
@ -16,6 +16,7 @@ Scratch3ControlBlocks.prototype.getPrimitives = function() {
|
|||
'control_forever': this.forever,
|
||||
'control_wait': this.wait,
|
||||
'control_if': this.if,
|
||||
'control_if_else': this.ifElse,
|
||||
'control_stop': this.stop
|
||||
};
|
||||
};
|
||||
|
@ -55,6 +56,19 @@ Scratch3ControlBlocks.prototype.if = function(args, util) {
|
|||
}
|
||||
};
|
||||
|
||||
Scratch3ControlBlocks.prototype.ifElse = function(args, util) {
|
||||
// Only execute one time. `ifElse` will be returned to
|
||||
// when the substack finishes, but it shouldn't execute again.
|
||||
if (util.stackFrame.executed === undefined) {
|
||||
util.stackFrame.executed = true;
|
||||
if (args.CONDITION) {
|
||||
util.startSubstack(1);
|
||||
} else {
|
||||
util.startSubstack(2);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Scratch3ControlBlocks.prototype.stop = function() {
|
||||
// @todo - don't use this.runtime
|
||||
this.runtime.stopAll();
|
||||
|
|
|
@ -69,8 +69,8 @@ var execute = function (sequencer, thread) {
|
|||
},
|
||||
timeout: YieldTimers.timeout,
|
||||
stackFrame: currentStackFrame,
|
||||
startSubstack: function () {
|
||||
sequencer.stepToSubstack(thread);
|
||||
startSubstack: function (substackNum) {
|
||||
sequencer.stepToSubstack(thread, substackNum);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -104,11 +104,17 @@ Sequencer.prototype.startThread = function (thread) {
|
|||
/**
|
||||
* Step a thread into a block's substack.
|
||||
* @param {!Thread} thread Thread object to step to substack.
|
||||
* @param {string} currentBlockId Block which owns a substack to step to.
|
||||
* @param {Number} substackNum Which substack to step to (i.e., 1, 2).
|
||||
*/
|
||||
Sequencer.prototype.stepToSubstack = function (thread) {
|
||||
Sequencer.prototype.stepToSubstack = function (thread, substackNum) {
|
||||
if (!substackNum) {
|
||||
substackNum = 1;
|
||||
}
|
||||
var currentBlockId = thread.peekStack();
|
||||
var substackId = this.runtime.blocks.getSubstack(currentBlockId);
|
||||
var substackId = this.runtime.blocks.getSubstack(
|
||||
currentBlockId,
|
||||
substackNum
|
||||
);
|
||||
if (substackId) {
|
||||
// Push substack ID to the thread's stack.
|
||||
thread.pushStack(substackId);
|
||||
|
@ -121,7 +127,6 @@ Sequencer.prototype.stepToSubstack = function (thread) {
|
|||
/**
|
||||
* Finish stepping a thread and proceed it to the next block.
|
||||
* @param {!Thread} thread Thread object to proceed.
|
||||
* @param {string} currentBlockId Block we are finished with.
|
||||
*/
|
||||
Sequencer.prototype.proceedThread = function (thread) {
|
||||
var currentBlockId = thread.peekStack();
|
||||
|
|
Loading…
Reference in a new issue