Skip to content

Commit 98df18a

Browse files
authored
Merge pull request #216 from Tacodiva/next-next
New compiler!!!!
2 parents 6222be2 + 7ed29f5 commit 98df18a

File tree

63 files changed

+3229
-1987
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+3229
-1987
lines changed

src/compiler/compat-block-utility.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1+
// @ts-check
2+
13
const BlockUtility = require('../engine/block-utility');
24

35
class CompatibilityLayerBlockUtility extends BlockUtility {
46
constructor () {
57
super();
8+
this._stackFrame = {};
69
this._startedBranch = null;
710
}
811

912
get stackFrame () {
10-
return this.thread.compatibilityStackFrame;
13+
return this.thread?.compatibilityStackFrame;
1114
}
1215

1316
startBranch (branchNumber, isLoop) {

src/compiler/compat-blocks.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// @ts-check
2+
13
/**
24
* @fileoverview List of blocks to be supported in the compiler compatibility layer.
35
* This is only for native blocks. Extensions should not be listed here.

src/compiler/compile.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
// @ts-check
2+
13
const {IRGenerator} = require('./irgen');
4+
const {IROptimizer} = require('./iroptimizer');
25
const JSGenerator = require('./jsgen');
36

4-
const compile = thread => {
7+
const compile = (/** @type {import("../engine/thread")} */ thread) => {
58
const irGenerator = new IRGenerator(thread);
69
const ir = irGenerator.generate();
710

11+
const irOptimizer = new IROptimizer(ir);
12+
irOptimizer.optimize();
13+
814
const procedures = {};
915
const target = thread.target;
1016

11-
const compileScript = script => {
17+
const compileScript = (/** @type {import("./intermediate").IntermediateScript} */ script) => {
1218
if (script.cachedCompileResult) {
1319
return script.cachedCompileResult;
1420
}

src/compiler/enums.js

Lines changed: 298 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,298 @@
1+
// @ts-check
2+
3+
/**
4+
* @fileoverview Common enums shared amongst parts of the compiler.
5+
*/
6+
7+
8+
/**
9+
* Enum for the type of the value that is returned by reporter blocks and stored in constants.
10+
*
11+
* At compile time, often we don't know exactly type a value will be but we can tell it must be one of a
12+
* set of types. For this reason, the number value of each type represents a possibility space, where set
13+
* bits indicate that their corropoding type *could* be encountered at runtime.
14+
* For example, a type of InputType.NUMBER | InputType.STRING means the value will be either a number or
15+
* a string at runtime, the compiler can't tell which, but we do know that it's not a boolean or NaN as
16+
* those bits are not set.
17+
*
18+
* @readonly
19+
* @enum {number}
20+
*/
21+
const InputType = {
22+
/** The value Infinity */
23+
NUMBER_POS_INF: 0x001,
24+
/** Any natural number */
25+
NUMBER_POS_INT: 0x002,
26+
/** Any positive fractional number, excluding integers. */
27+
NUMBER_POS_FRACT: 0x004,
28+
/** Any positive number excluding 0 and Infinity. Equal to NUMBER_POS_INT | NUMBER_POS_FRACT */
29+
NUMBER_POS_REAL: 0x006,
30+
/** The value 0 */
31+
NUMBER_ZERO: 0x008,
32+
/** The value -0 */
33+
NUMBER_NEG_ZERO: 0x010,
34+
/** Any negitive integer excluding -0 */
35+
NUMBER_NEG_INT: 0x020,
36+
/** Any negitive fractional number, excluding integers. */
37+
NUMBER_NEG_FRACT: 0x040,
38+
/** Any negitive number excluding -0 and -Infinity. Equal to NUMBER_NEG_INT | NUMBER_NEG_FRACT */
39+
NUMBER_NEG_REAL: 0x060,
40+
/** The value -Infinity */
41+
NUMBER_NEG_INF: 0x080,
42+
43+
/** The value NaN */
44+
NUMBER_NAN: 0x100,
45+
46+
/** Either 0 or -0. Equal to NUMBER_ZERO | NUMBER_NEG_ZERO */
47+
NUMBER_ANY_ZERO: 0x018,
48+
/** Either Infinity or -Infinity. Equal to NUMBER_POS_INF | NUMBER_NEG_INF */
49+
NUMBER_INF: 0x081,
50+
/** Any positive number, excluding 0. Equal to NUMBER_POS_REAL | NUMBER_POS_INF */
51+
NUMBER_POS: 0x007,
52+
/** Any negitive number, excluding -0. Equal to NUMBER_NEG_REAL | NUMBER_NEG_INF */
53+
NUMBER_NEG: 0x0E0,
54+
/** Any whole number. Equal to NUMBER_POS_INT | NUMBER_ZERO */
55+
NUMBER_WHOLE: 0x00A,
56+
/** Any integer. Equal to NUMBER_POS_INT | NUMBER_ANY_ZERO | NUMBER_NEG_INT */
57+
NUMBER_INT: 0x03A,
58+
/** Any number that works as an array index. Equal to NUMBER_INT | NUMBER_INF | NUMBER_NAN */
59+
NUMBER_INDEX: 0x1BB,
60+
/** Any fractional non-integer numbers. Equal to NUMBER_POS_FRACT | NUMBER_NEG_FRACT */
61+
NUMBER_FRACT: 0x44,
62+
/** Any real number. Equal to NUMBER_POS_REAL | NUMBER_ANY_ZERO | NUMBER_NEG_REAL */
63+
NUMBER_REAL: 0x07E,
64+
65+
/** Any number, excluding NaN. Equal to NUMBER_REAL | NUMBER_INF */
66+
NUMBER: 0x0FF,
67+
/** Any number, including NaN. Equal to NUMBER | NUMBER_NAN */
68+
NUMBER_OR_NAN: 0x1FF,
69+
/** Anything that can be interperated as a number. Equal to NUMBER | STRING_NUM | BOOLEAN */
70+
NUMBER_INTERPRETABLE: 0x12FF,
71+
72+
/** Any string which as a non-NaN neumeric interpretation, excluding ''. */
73+
STRING_NUM: 0x200,
74+
/** Any string which has no non-NaN neumeric interpretation, including ''. */
75+
STRING_NAN: 0x400,
76+
/** Either of the strings 'true' or 'false'. */
77+
STRING_BOOLEAN: 0x800,
78+
79+
/** Any string. Equal to STRING_NUM | STRING_NAN | STRING_BOOLEAN */
80+
STRING: 0xE00,
81+
82+
/** Any boolean. */
83+
BOOLEAN: 0x1000,
84+
/** Any input that can be interperated as a boolean. Equal to BOOLEAN | STRING_BOOLEAN */
85+
BOOLEAN_INTERPRETABLE: 0x1800,
86+
87+
/** Any value type (a type a scratch variable can hold). Equal to NUMBER_OR_NAN | STRING | BOOLEAN */
88+
ANY: 0x1FFF,
89+
90+
/** An array of values in the form [R, G, B] */
91+
COLOR: 0x2000
92+
};
93+
94+
/**
95+
* Enum for the opcodes of the stackable blocks used in the IR AST.
96+
* @readonly
97+
* @enum {string}
98+
*/
99+
const StackOpcode = {
100+
NOP: 'noop',
101+
102+
ADDON_CALL: 'addons.call',
103+
DEBUGGER: 'tw.debugger',
104+
VISUAL_REPORT: 'visualReport',
105+
COMPATIBILITY_LAYER: 'compat',
106+
107+
HAT_EDGE: 'hat.edge',
108+
HAT_PREDICATE: 'hat.predicate',
109+
110+
CONTROL_IF_ELSE: 'control.if',
111+
CONTROL_CLONE_CREATE: 'control.createClone',
112+
CONTROL_CLONE_DELETE: 'control.deleteClone',
113+
CONTROL_WHILE: 'control.while',
114+
CONTROL_FOR: 'control.for',
115+
CONTROL_REPEAT: 'control.repeat',
116+
CONTROL_STOP_ALL: 'control.stopAll',
117+
CONTROL_STOP_OTHERS: 'control.stopOthers',
118+
CONTROL_STOP_SCRIPT: 'control.stopScript',
119+
CONTROL_WAIT: 'control.wait',
120+
CONTROL_WAIT_UNTIL: 'control.waitUntil',
121+
CONTROL_CLEAR_COUNTER: 'control.counterClear',
122+
CONTORL_INCR_COUNTER: 'control.counterIncr',
123+
124+
LIST_ADD: 'list.add',
125+
LIST_INSERT: 'list.instert',
126+
LIST_REPLACE: 'list.replace',
127+
LIST_DELETE_ALL: 'list.deleteAll',
128+
LIST_DELETE: 'list.delete',
129+
LIST_SHOW: 'list.show',
130+
LIST_HIDE: 'list.hide',
131+
132+
VAR_SET: 'var.set',
133+
VAR_SHOW: 'var.show',
134+
VAR_HIDE: 'var.hide',
135+
136+
EVENT_BROADCAST: 'event.broadcast',
137+
EVENT_BROADCAST_AND_WAIT: 'event.broadcastAndWait',
138+
139+
LOOKS_EFFECT_SET: 'looks.setEffect',
140+
LOOKS_EFFECT_CHANGE: 'looks.changeEffect',
141+
LOOKS_EFFECT_CLEAR: 'looks.clearEffects',
142+
LOOKS_SIZE_CHANGE: 'looks.changeSize',
143+
LOOKS_SIZE_SET: 'looks.setSize',
144+
LOOKS_LAYER_FORWARD: 'looks.forwardLayers',
145+
LOOKS_LAYER_BACKWARD: 'looks.backwardLayers',
146+
LOOKS_LAYER_FRONT: 'looks.goToFront',
147+
LOOKS_LAYER_BACK: 'looks.goToBack',
148+
LOOKS_HIDE: 'looks.hide',
149+
LOOKS_SHOW: 'looks.show',
150+
LOOKS_BACKDROP_NEXT: 'looks.nextBackdrop',
151+
LOOKS_BACKDROP_SET: 'looks.switchBackdrop',
152+
LOOKS_COSTUME_NEXT: 'looks.nextCostume',
153+
LOOKS_COSTUME_SET: 'looks.switchCostume',
154+
155+
MOTION_X_SET: 'motion.setX',
156+
MOTION_X_CHANGE: 'motion.changeX',
157+
MOTION_Y_SET: 'motion.setY',
158+
MOTION_Y_CHANGE: 'motion.changeY',
159+
MOTION_XY_SET: 'motion.setXY',
160+
MOTION_IF_ON_EDGE_BOUNCE: 'motion.ifOnEdgeBounce',
161+
MOTION_STEP: 'motion.step',
162+
MOTION_ROTATION_STYLE_SET: 'motion.setRotationStyle',
163+
MOTION_DIRECTION_SET: 'motion.setDirection',
164+
165+
PEN_UP: 'pen.up',
166+
PEN_DOWN: 'pen.down',
167+
PEN_CLEAR: 'pen.clear',
168+
PEN_COLOR_PARAM_SET: 'pen.setParam',
169+
PEN_COLOR_PARAM_CHANGE: 'pen.changeParam',
170+
PEN_COLOR_HUE_CHANGE_LEGACY: 'pen.legacyChangeHue',
171+
PEN_COLOR_HUE_SET_LEGACY: 'pen_setPenHueToNumber',
172+
PEN_COLOR_SHADE_CHANGE_LEGACY: 'pen.legacyChangeShade',
173+
PEN_COLOR_SHADE_SET_LEGACY: 'pen.legacySetShade',
174+
PEN_COLOR_SET: 'pen.setColor',
175+
PEN_SIZE_SET: 'pen.setSize',
176+
PEN_SIZE_CHANGE: 'pen.changeSize',
177+
PEN_STAMP: 'pen.stamp',
178+
179+
SENSING_TIMER_RESET: 'timer.reset',
180+
181+
PROCEDURE_RETURN: 'procedures.return',
182+
PROCEDURE_CALL: 'procedures.call'
183+
};
184+
185+
/**
186+
* Enum for the opcodes of the reporter blocks used in the IR AST.
187+
* @readonly
188+
* @enum {string}
189+
*/
190+
const InputOpcode = {
191+
NOP: 'noop',
192+
193+
ADDON_CALL: 'addons.call',
194+
CONSTANT: 'constant',
195+
196+
CAST_NUMBER: 'cast.toNumber',
197+
CAST_NUMBER_INDEX: 'cast.toInteger',
198+
CAST_NUMBER_OR_NAN: 'cast.toNumberOrNaN',
199+
CAST_STRING: 'cast.toString',
200+
CAST_BOOLEAN: 'cast.toBoolean',
201+
CAST_COLOR: 'cast.toColor',
202+
203+
COMPATIBILITY_LAYER: 'compat',
204+
205+
LOOKS_BACKDROP_NUMBER: 'looks.backdropNumber',
206+
LOOKS_BACKDROP_NAME: 'looks.backdropName',
207+
LOOKS_COSTUME_NUMBER: 'looks.costumeNumber',
208+
LOOKS_COSTUME_NAME: 'looks.costumeName',
209+
LOOKS_SIZE_GET: 'looks.size',
210+
211+
VAR_GET: 'var.get',
212+
213+
LIST_GET: 'list.get',
214+
LIST_LENGTH: 'list.length',
215+
LIST_CONTAINS: 'list.contains',
216+
LIST_INDEX_OF: 'list.indexOf',
217+
LIST_CONTENTS: 'list.contents',
218+
219+
MOTION_X_GET: 'motion.x',
220+
MOTION_Y_GET: 'motion.y',
221+
MOTION_DIRECTION_GET: 'motion.direction',
222+
223+
OP_ADD: 'op.add',
224+
OP_AND: 'op.and',
225+
OP_CONTAINS: 'op.contains',
226+
OP_DIVIDE: 'op.divide',
227+
OP_EQUALS: 'op.equals',
228+
OP_GREATER: 'op.greater',
229+
OP_LESS: 'op.less',
230+
OP_JOIN: 'op.join',
231+
OP_LENGTH: 'op.length',
232+
OP_LETTER_OF: 'op.letterOf',
233+
OP_ABS: 'op.abs',
234+
OP_FLOOR: 'op.floor',
235+
OP_CEILING: 'op.ceiling',
236+
OP_SQRT: 'op.sqrt',
237+
OP_SIN: 'op.sin',
238+
OP_COS: 'op.cos',
239+
OP_TAN: 'op.tan',
240+
OP_ASIN: 'op.asin',
241+
OP_ACOS: 'op.acos',
242+
OP_ATAN: 'op.atan',
243+
OP_LOG_E: 'op.ln',
244+
OP_LOG_10: 'op.log',
245+
OP_POW_E: 'op.e^',
246+
OP_POW_10: 'op.10^',
247+
OP_MOD: 'op.mod',
248+
OP_MULTIPLY: 'op.multiply',
249+
OP_NOT: 'op.not',
250+
OP_OR: 'op.or',
251+
OP_RANDOM: 'op.random',
252+
OP_ROUND: 'op.round',
253+
OP_SUBTRACT: 'op.subtract',
254+
255+
SENSING_ANSWER: 'sensing.answer',
256+
SENSING_COLOR_TOUCHING_COLOR: 'sensing.colorTouchingColor',
257+
SENSING_TIME_YEAR: 'sensing.year',
258+
SENSING_TIME_MONTH: 'sensing.month',
259+
SENSING_TIME_DATE: 'sensing.date',
260+
SENSING_TIME_WEEKDAY: 'sensing.dayofweek',
261+
SENSING_TIME_HOUR: 'sensing.hour',
262+
SENSING_TIME_MINUTE: 'sensing.minute',
263+
SENSING_TIME_SECOND: 'sensing.second',
264+
SENSING_TIME_DAYS_SINCE_2000: 'sensing.daysSince2000',
265+
SENSING_DISTANCE: 'sensing.distance',
266+
SENSING_KEY_DOWN: 'keyboard.pressed',
267+
SENSING_MOUSE_DOWN: 'mouse.down',
268+
SENSING_MOUSE_X: 'mouse.x',
269+
SENSING_MOUSE_Y: 'mouse.y',
270+
SENSING_OF: 'sensing.of',
271+
SENSING_OF_BACKDROP_NAME: 'sensing.of.backdropName',
272+
SENSING_OF_BACKDROP_NUMBER: 'sensing.of.backdropNumber',
273+
SENSING_OF_COSTUME_NAME: 'sensing.of.costumeName',
274+
SENSING_OF_COSTUME_NUMBER: 'sensing.of.costumeNumber',
275+
SENSING_OF_VOLUME: 'sensing.of.volume',
276+
SENSING_OF_POS_X: 'sensing.of.x',
277+
SENSING_OF_POS_Y: 'sensing.of.y',
278+
SENSING_OF_DIRECTION: 'sensing.of.direction',
279+
SENSING_OF_SIZE: 'sensing.of.size',
280+
SENSING_OF_VAR: 'sensing.of.var',
281+
SENSING_TIMER_GET: 'timer.get',
282+
SENSING_TOUCHING_COLOR: 'sensing.touchingColor',
283+
SENSING_TOUCHING_OBJECT: 'sensing.touching',
284+
SENSING_USERNAME: 'sensing.username',
285+
286+
PROCEDURE_CALL: 'procedures.call',
287+
PROCEDURE_ARGUMENT: 'procedures.argument',
288+
289+
CONTROL_COUNTER: 'control.counter',
290+
291+
TW_KEY_LAST_PRESSED: 'tw.lastKeyPressed'
292+
};
293+
294+
module.exports = {
295+
StackOpcode,
296+
InputOpcode,
297+
InputType
298+
};

src/compiler/environment.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// @ts-check
12
/* eslint-disable no-eval */
23

34
/**

0 commit comments

Comments
 (0)