-
Notifications
You must be signed in to change notification settings - Fork 9
/
BlocklyExecutor.js
124 lines (108 loc) · 4.03 KB
/
BlocklyExecutor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
*
*/
'use strict';
define('BlocklyExecutor', [], function() {
function update(Blockly) {
Blockly.Executor = function(){};
Blockly.Executor.prototype.setDefault = function() {
this.blocks = [];
this.finished = false;
Blockly.setDefault();
var topBlocks = Blockly.getMainWorkspace().getTopBlocks(true).reverse();
var argsDict = {}
for (var i = 0, block; block = topBlocks[i]; ++i) {
if (block.type == 'funcdef' || block.outputConnection)
continue
var blocksStack = [block];
for (var nextBlock=block; nextBlock = nextBlock.nextConnection.targetBlock();) {
blocksStack.push(nextBlock);
}
for (var j = blocksStack.length - 1, b; b = blocksStack[j]; --j) {
this.blocks.push(b);
b.argsDict = argsDict;
}
}
// Remove block at the beginning of the next step. Put blocks here
// if they were replaced with other (e.g. due to arguments reduction).
this.delayedRemoveBlocks = [];
// Restore block at the beginning of the next step.
this.delayedRestoreBlocks = [];
};
Blockly.Executor.prototype.save = function(){
if (!this.xmlWSBackup) {
this.xmlWSBackup = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);
}
}
Blockly.Executor.prototype.restore = function(){
if (this.xmlWSBackup) {
var mainWS = Blockly.mainWorkspace;
mainWS.clear();
Blockly.problem.restoreWorkspace(this.xmlWSBackup);
delete this.xmlWSBackup;
}
}
Blockly.Executor.prototype.exec = function(cmdNumToExecute) {
// if (!this.blocks.length)
// this.setDefault();
this.save();
if (this.blocks[0] && !this.blocks[0].savedBlock_) {
// First exec. Prepare top blocks.
for (var i = 0, block; block = this.blocks[i]; ++i) {
this.blocks[i] = block.cloneBeforeExec()
}
}
while (cmdNumToExecute) {
// Handle delayed operations
for (var block; block = this.delayedRemoveBlocks.pop();) {
block.dispose();
}
for (var block; block = this.delayedRestoreBlocks.pop();) {
block.restoreAfterExec();
}
var block = this.blocks.pop();
if (!block) {
this.finished = true;
Blockly.setDefault();
break
}
try {
var executed = block.execStep()
} catch (e) {
logError(e);
Blockly.highlight(block);
this.setDefault();
Blockly.problem.playing = false;
throw(e)
}
if (executed) {
cmdNumToExecute--;
Blockly.highlight(block);
if (cmdNumToExecute == 0) {
break;
}
}
}
return cmdNumToExecute
};
Blockly.Executor.prototype.pushList = function(list, clone) {
for (var i = 0, block; block = list[i]; ++i) {
if (clone) {
block = block.cloneBeforeExec();
}
this.blocks.push(block);
}
};
Blockly.Executor.prototype.pushReversedList = function(list, clone) {
for (var i = list.length - 1, block; block = list[i]; --i) {
if (clone) {
block = block.cloneBeforeExec();
}
this.blocks.push(block);
}
};
}
return {
update: update
}
})