mlogjs 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +68 -18
- package/build/Compiler.d.ts +18 -18
- package/build/Compiler.js +99 -119
- package/build/Compiler.js.map +1 -1
- package/build/Scope.d.ts +26 -26
- package/build/Scope.js +60 -60
- package/build/Scope.js.map +1 -1
- package/build/bin.d.ts +2 -2
- package/build/bin.js +60 -41
- package/build/bin.js.map +1 -1
- package/build/handlers/BlockStatement.d.ts +2 -2
- package/build/handlers/BlockStatement.js +13 -13
- package/build/handlers/CallExpression.d.ts +3 -3
- package/build/handlers/CallExpression.js +19 -19
- package/build/handlers/ForStatement.d.ts +2 -2
- package/build/handlers/ForStatement.js +31 -31
- package/build/handlers/Function.d.ts +4 -4
- package/build/handlers/Function.js +35 -35
- package/build/handlers/Identifier.d.ts +2 -2
- package/build/handlers/Identifier.js +7 -7
- package/build/handlers/IfStatement.d.ts +2 -2
- package/build/handlers/IfStatement.js +24 -24
- package/build/handlers/Literal.d.ts +2 -2
- package/build/handlers/Literal.js +17 -17
- package/build/handlers/Object.d.ts +4 -4
- package/build/handlers/Object.js +43 -43
- package/build/handlers/OperationExpressions.d.ts +7 -7
- package/build/handlers/OperationExpressions.js +32 -32
- package/build/handlers/Program.d.ts +2 -2
- package/build/handlers/Program.js +8 -8
- package/build/handlers/Program.js.map +1 -1
- package/build/handlers/Statements.d.ts +5 -5
- package/build/handlers/Statements.js +29 -29
- package/build/handlers/TemplateExpression.d.ts +2 -2
- package/build/handlers/TemplateExpression.js +17 -17
- package/build/handlers/VariableDeclaration.d.ts +3 -3
- package/build/handlers/VariableDeclaration.js +55 -55
- package/build/handlers/WhileStatement.d.ts +2 -2
- package/build/handlers/WhileStatement.js +22 -22
- package/build/handlers/index.d.ts +14 -14
- package/build/handlers/index.js +30 -30
- package/build/index.d.ts +1 -1
- package/build/index.js +7 -7
- package/build/initScope.d.ts +2 -0
- package/build/initScope.js +40 -0
- package/build/initScope.js.map +1 -0
- package/build/instructions/AddressResolver.d.ts +12 -12
- package/build/instructions/AddressResolver.js +30 -30
- package/build/instructions/ControlInstructions.d.ts +11 -11
- package/build/instructions/ControlInstructions.js +22 -22
- package/build/instructions/EndInstruction.d.ts +4 -4
- package/build/instructions/EndInstruction.js +10 -10
- package/build/instructions/InstructionBase.d.ts +10 -10
- package/build/instructions/InstructionBase.js +20 -20
- package/build/instructions/JumpInstruction.d.ts +15 -15
- package/build/instructions/JumpInstruction.js +21 -21
- package/build/instructions/OperationInstruction.d.ts +5 -5
- package/build/instructions/OperationInstruction.js +10 -10
- package/build/instructions/SetCounterInstruction.d.ts +5 -5
- package/build/instructions/SetCounterInstruction.js +10 -10
- package/build/instructions/SetInstruction.d.ts +5 -5
- package/build/instructions/SetInstruction.js +10 -10
- package/build/instructions/ZeroSpaceInstruction.d.ts +4 -4
- package/build/instructions/ZeroSpaceInstruction.js +10 -10
- package/build/instructions/index.d.ts +9 -9
- package/build/instructions/index.js +25 -25
- package/build/macros/Building.d.ts +11 -11
- package/build/macros/Building.js +80 -80
- package/build/macros/Function.d.ts +12 -12
- package/build/macros/Function.js +19 -19
- package/build/macros/Math.d.ts +5 -5
- package/build/macros/Math.js +56 -56
- package/build/macros/Math.js.map +1 -1
- package/build/macros/Memory.d.ts +5 -5
- package/build/macros/Memory.js +60 -60
- package/build/macros/Namespace.d.ts +21 -21
- package/build/macros/Namespace.js +97 -97
- package/build/macros/Other.d.ts +5 -5
- package/build/macros/Other.js +19 -19
- package/build/macros/RawValue.d.ts +5 -5
- package/build/macros/RawValue.js +15 -15
- package/build/macros/commands/{control.d.ts → Control.d.ts} +5 -5
- package/build/macros/commands/{control.js → Control.js} +24 -24
- package/build/macros/commands/{control.js.map → Control.js.map} +0 -0
- package/build/macros/commands/Draw.d.ts +5 -5
- package/build/macros/commands/Draw.js +38 -38
- package/build/macros/commands/DrawFlush.d.ts +5 -5
- package/build/macros/commands/DrawFlush.js +16 -16
- package/build/macros/commands/GetLink.d.ts +5 -5
- package/build/macros/commands/GetLink.js +20 -20
- package/build/macros/commands/Lookup.d.ts +5 -5
- package/build/macros/commands/Lookup.js +23 -23
- package/build/macros/commands/Print.d.ts +5 -5
- package/build/macros/commands/Print.js +13 -13
- package/build/macros/commands/PrintFlush.d.ts +5 -5
- package/build/macros/commands/PrintFlush.js +16 -16
- package/build/macros/commands/Radar.d.ts +7 -7
- package/build/macros/commands/Radar.js +60 -60
- package/build/macros/commands/Sensor.d.ts +5 -5
- package/build/macros/commands/Sensor.js +19 -19
- package/build/macros/commands/UnitBind.d.ts +5 -5
- package/build/macros/commands/UnitBind.js +16 -16
- package/build/macros/commands/UnitControl.d.ts +5 -5
- package/build/macros/commands/UnitControl.js +67 -67
- package/build/macros/commands/UnitLocate.d.ts +5 -5
- package/build/macros/commands/UnitLocate.js +54 -54
- package/build/macros/commands/UnitRadar.d.ts +5 -5
- package/build/macros/commands/UnitRadar.js +40 -40
- package/build/macros/commands/Wait.d.ts +5 -5
- package/build/macros/commands/Wait.js +17 -17
- package/build/macros/commands/index.d.ts +14 -14
- package/build/macros/commands/index.js +32 -32
- package/build/macros/index.d.ts +7 -7
- package/build/macros/index.js +39 -39
- package/build/operators.d.ts +25 -25
- package/build/operators.js +101 -101
- package/build/types.d.ts +49 -49
- package/build/types.js +27 -27
- package/build/utils.d.ts +3 -3
- package/build/utils.js +12 -12
- package/build/values/BaseValue.d.ts +5 -5
- package/build/values/BaseValue.js +111 -111
- package/build/values/FunctionValue.d.ts +34 -34
- package/build/values/FunctionValue.js +103 -103
- package/build/values/LiteralValue.d.ts +12 -12
- package/build/values/LiteralValue.js +87 -87
- package/build/values/LiteralValue.js.map +1 -1
- package/build/values/ObjectValue.d.ts +17 -17
- package/build/values/ObjectValue.js +49 -49
- package/build/values/StoreValue.d.ts +11 -11
- package/build/values/StoreValue.js +30 -30
- package/build/values/TempValue.d.ts +12 -12
- package/build/values/TempValue.js +66 -66
- package/build/values/TempValue.js.map +1 -1
- package/build/values/VoidValue.d.ts +11 -11
- package/build/values/VoidValue.js +30 -30
- package/build/values/index.d.ts +6 -6
- package/build/values/index.js +22 -22
- package/dist/mlogjs.es.js +6366 -0
- package/dist/mlogjs.umd.js +8 -0
- package/lib/commands.d.ts +326 -326
- package/lib/eslib/index.d.ts +3 -3
- package/lib/eslib/lib.d.ts +9 -9
- package/lib/eslib/lib.es2015.collection.d.ts +89 -89
- package/lib/eslib/lib.es2015.core.d.ts +16 -16
- package/lib/eslib/lib.es2015.d.ts +30 -30
- package/lib/eslib/lib.es2015.generator.d.ts +79 -79
- package/lib/eslib/lib.es2015.iterable.d.ts +70 -70
- package/lib/eslib/lib.es5.d.ts +295 -295
- package/lib/eslib/lib.es6.d.ts +18 -18
- package/lib/globals.d.ts +328 -328
- package/lib/helpers.d.ts +23 -23
- package/lib/index.d.ts +7 -7
- package/lib/kinds.d.ts +36 -36
- package/lib/memory.d.ts +17 -17
- package/lib/traits.d.ts +121 -121
- package/lib/util.d.ts +32 -32
- package/package.json +73 -48
- package/build/macros/Blocks.d.ts +0 -5
- package/build/macros/Blocks.js +0 -143
- package/build/macros/Blocks.js.map +0 -1
- package/build/macros/Draw.d.ts +0 -5
- package/build/macros/Draw.js +0 -39
- package/build/macros/Draw.js.map +0 -1
- package/build/macros/Items.d.ts +0 -5
- package/build/macros/Items.js +0 -20
- package/build/macros/Items.js.map +0 -1
- package/build/macros/Liquids.d.ts +0 -5
- package/build/macros/Liquids.js +0 -18
- package/build/macros/Liquids.js.map +0 -1
- package/build/macros/Symbol.d.ts +0 -0
- package/build/macros/Symbol.js +0 -1
- package/build/macros/Symbol.js.map +0 -1
- package/build/macros/SymbolNamespace.d.ts +0 -0
- package/build/macros/SymbolNamespace.js +0 -1
- package/build/macros/SymbolNamespace.js.map +0 -1
- package/build/macros/TypeFactory.d.ts +0 -8
- package/build/macros/TypeFactory.js +0 -22
- package/build/macros/TypeFactory.js.map +0 -1
- package/build/macros/Units.d.ts +0 -5
- package/build/macros/Units.js +0 -18
- package/build/macros/Units.js.map +0 -1
- package/build/macros/Vars.d.ts +0 -5
- package/build/macros/Vars.js +0 -18
- package/build/macros/Vars.js.map +0 -1
- package/build/macros/commands/Asm.d.ts +0 -5
- package/build/macros/commands/Asm.js +0 -21
- package/build/macros/commands/Asm.js.map +0 -1
- package/build/macros/commands/io.d.ts +0 -8
- package/build/macros/commands/io.js +0 -47
- package/build/macros/commands/io.js.map +0 -1
- package/build/macros/helpers/GetBuilding.d.ts +0 -5
- package/build/macros/helpers/GetBuilding.js +0 -16
- package/build/macros/helpers/GetBuilding.js.map +0 -1
- package/build/macros/helpers/GetVar.d.ts +0 -5
- package/build/macros/helpers/GetVar.js +0 -16
- package/build/macros/helpers/GetVar.js.map +0 -1
- package/build/macros/helpers/index.d.ts +0 -2
- package/build/macros/helpers/index.js +0 -15
- package/build/macros/helpers/index.js.map +0 -1
- package/dist/bundle.js +0 -1
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseValue = void 0;
|
|
4
|
-
const instructions_1 = require("../instructions");
|
|
5
|
-
const operators_1 = require("../operators");
|
|
6
|
-
const _1 = require(".");
|
|
7
|
-
class BaseValue extends _1.VoidValue {
|
|
8
|
-
"u-"(scope) {
|
|
9
|
-
const [that, inst] = this.eval(scope);
|
|
10
|
-
const temp = new _1.TempValue(scope);
|
|
11
|
-
return [
|
|
12
|
-
temp,
|
|
13
|
-
[
|
|
14
|
-
...inst,
|
|
15
|
-
new instructions_1.OperationInstruction("sub", temp, new _1.LiteralValue(scope, 0), that),
|
|
16
|
-
],
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
exports.BaseValue = BaseValue;
|
|
21
|
-
const operatorMap = {
|
|
22
|
-
"==": "equal",
|
|
23
|
-
"===": "strictEqual",
|
|
24
|
-
"!=": "notEqual",
|
|
25
|
-
"!==": "notEqual",
|
|
26
|
-
"<": "lessThan",
|
|
27
|
-
">": "greaterThan",
|
|
28
|
-
"<=": "lessThanEq",
|
|
29
|
-
">=": "greaterThanEq",
|
|
30
|
-
"+": "add",
|
|
31
|
-
"-": "sub",
|
|
32
|
-
"*": "mul",
|
|
33
|
-
"/": "div",
|
|
34
|
-
"%": "mod",
|
|
35
|
-
"**": "pow",
|
|
36
|
-
"|": "or",
|
|
37
|
-
"&": "and",
|
|
38
|
-
"^": "xor",
|
|
39
|
-
">>": "shr",
|
|
40
|
-
">>>": "shr",
|
|
41
|
-
"<<": "shl",
|
|
42
|
-
"&&": "land",
|
|
43
|
-
"||": "or",
|
|
44
|
-
};
|
|
45
|
-
for (const key in operatorMap) {
|
|
46
|
-
const kind = operatorMap[key];
|
|
47
|
-
BaseValue.prototype[key] = function (scope, value) {
|
|
48
|
-
const [left, leftInst] = this.eval(scope);
|
|
49
|
-
const [right, rightInst] = value.eval(scope);
|
|
50
|
-
const temp = new _1.TempValue(scope);
|
|
51
|
-
return [
|
|
52
|
-
temp,
|
|
53
|
-
[
|
|
54
|
-
...leftInst,
|
|
55
|
-
...rightInst,
|
|
56
|
-
new instructions_1.OperationInstruction(kind, temp, left, right),
|
|
57
|
-
],
|
|
58
|
-
];
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
const unaryOperatorMap = {
|
|
62
|
-
"!": "not",
|
|
63
|
-
"~": "flip",
|
|
64
|
-
};
|
|
65
|
-
for (const key in unaryOperatorMap) {
|
|
66
|
-
const name = unaryOperatorMap[key];
|
|
67
|
-
BaseValue.prototype[key] = function (scope) {
|
|
68
|
-
const [that, inst] = this.eval(scope);
|
|
69
|
-
const temp = new _1.TempValue(scope);
|
|
70
|
-
return [temp, [...inst, new instructions_1.OperationInstruction(name, temp, that)]];
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
const assignmentToBinary = {
|
|
74
|
-
"+=": "+",
|
|
75
|
-
"-=": "-",
|
|
76
|
-
"*=": "*",
|
|
77
|
-
"/=": "/",
|
|
78
|
-
"%=": "%",
|
|
79
|
-
"**=": "**",
|
|
80
|
-
"|=": "|",
|
|
81
|
-
"&=": "&",
|
|
82
|
-
"^=": "^",
|
|
83
|
-
">>=": ">>",
|
|
84
|
-
">>>=": ">>>",
|
|
85
|
-
"<<=": "<<",
|
|
86
|
-
"&&=": "&&",
|
|
87
|
-
"||=": "||",
|
|
88
|
-
};
|
|
89
|
-
for (const op in assignmentToBinary) {
|
|
90
|
-
BaseValue.prototype[op] = function (scope, value) {
|
|
91
|
-
const [opValue, opInst] = this[assignmentToBinary[op]](scope, value);
|
|
92
|
-
const [retValue, retInst] = this["="](scope, opValue);
|
|
93
|
-
return [retValue, [...opInst, ...retInst]];
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
for (const key of operators_1.updateOperators) {
|
|
97
|
-
BaseValue.prototype[key] = function (scope, prefix) {
|
|
98
|
-
let [ret, inst] = this.eval(scope);
|
|
99
|
-
if (!prefix) {
|
|
100
|
-
const temp = new _1.TempValue(scope);
|
|
101
|
-
const [tempValue, tempInst] = temp["="](scope, ret);
|
|
102
|
-
ret = tempValue;
|
|
103
|
-
inst.push(...tempInst);
|
|
104
|
-
}
|
|
105
|
-
const kind = key === "++" ? "+=" : "-=";
|
|
106
|
-
return [
|
|
107
|
-
ret,
|
|
108
|
-
[...inst, ...this[kind](scope, new _1.LiteralValue(scope, 1))[1]],
|
|
109
|
-
];
|
|
110
|
-
};
|
|
111
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseValue = void 0;
|
|
4
|
+
const instructions_1 = require("../instructions");
|
|
5
|
+
const operators_1 = require("../operators");
|
|
6
|
+
const _1 = require(".");
|
|
7
|
+
class BaseValue extends _1.VoidValue {
|
|
8
|
+
"u-"(scope) {
|
|
9
|
+
const [that, inst] = this.eval(scope);
|
|
10
|
+
const temp = new _1.TempValue(scope);
|
|
11
|
+
return [
|
|
12
|
+
temp,
|
|
13
|
+
[
|
|
14
|
+
...inst,
|
|
15
|
+
new instructions_1.OperationInstruction("sub", temp, new _1.LiteralValue(scope, 0), that),
|
|
16
|
+
],
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.BaseValue = BaseValue;
|
|
21
|
+
const operatorMap = {
|
|
22
|
+
"==": "equal",
|
|
23
|
+
"===": "strictEqual",
|
|
24
|
+
"!=": "notEqual",
|
|
25
|
+
"!==": "notEqual",
|
|
26
|
+
"<": "lessThan",
|
|
27
|
+
">": "greaterThan",
|
|
28
|
+
"<=": "lessThanEq",
|
|
29
|
+
">=": "greaterThanEq",
|
|
30
|
+
"+": "add",
|
|
31
|
+
"-": "sub",
|
|
32
|
+
"*": "mul",
|
|
33
|
+
"/": "div",
|
|
34
|
+
"%": "mod",
|
|
35
|
+
"**": "pow",
|
|
36
|
+
"|": "or",
|
|
37
|
+
"&": "and",
|
|
38
|
+
"^": "xor",
|
|
39
|
+
">>": "shr",
|
|
40
|
+
">>>": "shr",
|
|
41
|
+
"<<": "shl",
|
|
42
|
+
"&&": "land",
|
|
43
|
+
"||": "or",
|
|
44
|
+
};
|
|
45
|
+
for (const key in operatorMap) {
|
|
46
|
+
const kind = operatorMap[key];
|
|
47
|
+
BaseValue.prototype[key] = function (scope, value) {
|
|
48
|
+
const [left, leftInst] = this.eval(scope);
|
|
49
|
+
const [right, rightInst] = value.eval(scope);
|
|
50
|
+
const temp = new _1.TempValue(scope);
|
|
51
|
+
return [
|
|
52
|
+
temp,
|
|
53
|
+
[
|
|
54
|
+
...leftInst,
|
|
55
|
+
...rightInst,
|
|
56
|
+
new instructions_1.OperationInstruction(kind, temp, left, right),
|
|
57
|
+
],
|
|
58
|
+
];
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const unaryOperatorMap = {
|
|
62
|
+
"!": "not",
|
|
63
|
+
"~": "flip",
|
|
64
|
+
};
|
|
65
|
+
for (const key in unaryOperatorMap) {
|
|
66
|
+
const name = unaryOperatorMap[key];
|
|
67
|
+
BaseValue.prototype[key] = function (scope) {
|
|
68
|
+
const [that, inst] = this.eval(scope);
|
|
69
|
+
const temp = new _1.TempValue(scope);
|
|
70
|
+
return [temp, [...inst, new instructions_1.OperationInstruction(name, temp, that)]];
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const assignmentToBinary = {
|
|
74
|
+
"+=": "+",
|
|
75
|
+
"-=": "-",
|
|
76
|
+
"*=": "*",
|
|
77
|
+
"/=": "/",
|
|
78
|
+
"%=": "%",
|
|
79
|
+
"**=": "**",
|
|
80
|
+
"|=": "|",
|
|
81
|
+
"&=": "&",
|
|
82
|
+
"^=": "^",
|
|
83
|
+
">>=": ">>",
|
|
84
|
+
">>>=": ">>>",
|
|
85
|
+
"<<=": "<<",
|
|
86
|
+
"&&=": "&&",
|
|
87
|
+
"||=": "||",
|
|
88
|
+
};
|
|
89
|
+
for (const op in assignmentToBinary) {
|
|
90
|
+
BaseValue.prototype[op] = function (scope, value) {
|
|
91
|
+
const [opValue, opInst] = this[assignmentToBinary[op]](scope, value);
|
|
92
|
+
const [retValue, retInst] = this["="](scope, opValue);
|
|
93
|
+
return [retValue, [...opInst, ...retInst]];
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
for (const key of operators_1.updateOperators) {
|
|
97
|
+
BaseValue.prototype[key] = function (scope, prefix) {
|
|
98
|
+
let [ret, inst] = this.eval(scope);
|
|
99
|
+
if (!prefix) {
|
|
100
|
+
const temp = new _1.TempValue(scope);
|
|
101
|
+
const [tempValue, tempInst] = temp["="](scope, ret);
|
|
102
|
+
ret = tempValue;
|
|
103
|
+
inst.push(...tempInst);
|
|
104
|
+
}
|
|
105
|
+
const kind = key === "++" ? "+=" : "-=";
|
|
106
|
+
return [
|
|
107
|
+
ret,
|
|
108
|
+
[...inst, ...this[kind](scope, new _1.LiteralValue(scope, 1))[1]],
|
|
109
|
+
];
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
112
|
//# sourceMappingURL=BaseValue.js.map
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { Compiler } from "../Compiler";
|
|
2
|
-
import { es, IFunctionValue, IScope, IValue, TValueInstructions } from "../types";
|
|
3
|
-
import { StoreValue } from "./StoreValue";
|
|
4
|
-
import { VoidValue } from "./VoidValue";
|
|
5
|
-
export declare class FunctionValue extends VoidValue implements IFunctionValue {
|
|
6
|
-
constant: boolean;
|
|
7
|
-
macro: boolean;
|
|
8
|
-
private paramStores;
|
|
9
|
-
private paramNames;
|
|
10
|
-
private inst;
|
|
11
|
-
private addr;
|
|
12
|
-
private temp;
|
|
13
|
-
private ret;
|
|
14
|
-
private inline;
|
|
15
|
-
private tryingInline;
|
|
16
|
-
private body;
|
|
17
|
-
private name;
|
|
18
|
-
private c;
|
|
19
|
-
private callSize;
|
|
20
|
-
private inlineTemp;
|
|
21
|
-
private inlineEnd;
|
|
22
|
-
private bundled;
|
|
23
|
-
private createValues;
|
|
24
|
-
typeof(scope: IScope): TValueInstructions;
|
|
25
|
-
private createInst;
|
|
26
|
-
constructor(scope: IScope, name: string, paramNames: string[], paramStores: StoreValue[], body: es.BlockStatement, c: Compiler);
|
|
27
|
-
private normalReturn;
|
|
28
|
-
private normalCall;
|
|
29
|
-
private inlineReturn;
|
|
30
|
-
private inlineCall;
|
|
31
|
-
call(scope: IScope, args: IValue[]): TValueInstructions;
|
|
32
|
-
return(scope: IScope, arg: IValue): TValueInstructions;
|
|
33
|
-
eval(scope: IScope): TValueInstructions;
|
|
34
|
-
}
|
|
1
|
+
import { Compiler } from "../Compiler";
|
|
2
|
+
import { es, IFunctionValue, IScope, IValue, TValueInstructions } from "../types";
|
|
3
|
+
import { StoreValue } from "./StoreValue";
|
|
4
|
+
import { VoidValue } from "./VoidValue";
|
|
5
|
+
export declare class FunctionValue extends VoidValue implements IFunctionValue {
|
|
6
|
+
constant: boolean;
|
|
7
|
+
macro: boolean;
|
|
8
|
+
private paramStores;
|
|
9
|
+
private paramNames;
|
|
10
|
+
private inst;
|
|
11
|
+
private addr;
|
|
12
|
+
private temp;
|
|
13
|
+
private ret;
|
|
14
|
+
private inline;
|
|
15
|
+
private tryingInline;
|
|
16
|
+
private body;
|
|
17
|
+
private name;
|
|
18
|
+
private c;
|
|
19
|
+
private callSize;
|
|
20
|
+
private inlineTemp;
|
|
21
|
+
private inlineEnd;
|
|
22
|
+
private bundled;
|
|
23
|
+
private createValues;
|
|
24
|
+
typeof(scope: IScope): TValueInstructions;
|
|
25
|
+
private createInst;
|
|
26
|
+
constructor(scope: IScope, name: string, paramNames: string[], paramStores: StoreValue[], body: es.BlockStatement, c: Compiler);
|
|
27
|
+
private normalReturn;
|
|
28
|
+
private normalCall;
|
|
29
|
+
private inlineReturn;
|
|
30
|
+
private inlineCall;
|
|
31
|
+
call(scope: IScope, args: IValue[]): TValueInstructions;
|
|
32
|
+
return(scope: IScope, arg: IValue): TValueInstructions;
|
|
33
|
+
eval(scope: IScope): TValueInstructions;
|
|
34
|
+
}
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FunctionValue = void 0;
|
|
4
|
-
const instructions_1 = require("../instructions");
|
|
5
|
-
const LiteralValue_1 = require("./LiteralValue");
|
|
6
|
-
const StoreValue_1 = require("./StoreValue");
|
|
7
|
-
const TempValue_1 = require("./TempValue");
|
|
8
|
-
const VoidValue_1 = require("./VoidValue");
|
|
9
|
-
class FunctionValue extends VoidValue_1.VoidValue {
|
|
10
|
-
constructor(scope, name, paramNames, paramStores, body, c) {
|
|
11
|
-
super(scope);
|
|
12
|
-
this.constant = true;
|
|
13
|
-
this.macro = true;
|
|
14
|
-
this.bundled = false;
|
|
15
|
-
this.name = name;
|
|
16
|
-
this.paramNames = paramNames;
|
|
17
|
-
this.paramStores = paramStores;
|
|
18
|
-
this.body = body;
|
|
19
|
-
this.c = c;
|
|
20
|
-
this.callSize = paramStores.length + 2;
|
|
21
|
-
scope.function = this;
|
|
22
|
-
this.createValues();
|
|
23
|
-
this.createInst();
|
|
24
|
-
}
|
|
25
|
-
createValues() {
|
|
26
|
-
this.addr = new LiteralValue_1.LiteralValue(this.scope, null);
|
|
27
|
-
this.temp = new StoreValue_1.StoreValue(this.scope, "f" + this.name);
|
|
28
|
-
this.ret = new StoreValue_1.StoreValue(this.scope, "r" + this.name);
|
|
29
|
-
}
|
|
30
|
-
typeof(scope) {
|
|
31
|
-
return [new LiteralValue_1.LiteralValue(scope, "function"), []];
|
|
32
|
-
}
|
|
33
|
-
createInst() {
|
|
34
|
-
this.inst = [
|
|
35
|
-
new instructions_1.AddressResolver(this.addr),
|
|
36
|
-
...this.c.handle(this.scope, this.body)[1],
|
|
37
|
-
];
|
|
38
|
-
this.inst.push(new instructions_1.SetCounterInstruction(this.ret));
|
|
39
|
-
}
|
|
40
|
-
normalReturn(scope, arg) {
|
|
41
|
-
const argInst = arg ? this.temp["="](scope, arg)[1] : [];
|
|
42
|
-
return [null, [...argInst, new instructions_1.SetCounterInstruction(this.ret)]];
|
|
43
|
-
}
|
|
44
|
-
normalCall(scope, args) {
|
|
45
|
-
if (!this.bundled)
|
|
46
|
-
this.scope.inst.push(...this.inst);
|
|
47
|
-
this.bundled = true;
|
|
48
|
-
const callAddressLiteral = new LiteralValue_1.LiteralValue(scope, null);
|
|
49
|
-
const inst = this.paramStores
|
|
50
|
-
.map((param, i) => param["="](scope, args[i])[1])
|
|
51
|
-
.reduce((s, c) => s.concat(c), [])
|
|
52
|
-
.concat(...this.ret["="](scope, callAddressLiteral)[1], new instructions_1.JumpInstruction(this.addr, instructions_1.EJumpKind.Always), new instructions_1.AddressResolver(callAddressLiteral));
|
|
53
|
-
return [this.temp, inst];
|
|
54
|
-
}
|
|
55
|
-
inlineReturn(scope, arg) {
|
|
56
|
-
const argInst = arg ? this.inlineTemp["="](scope, arg)[1] : [];
|
|
57
|
-
return [null, [...argInst, new instructions_1.ReturnInstruction(this.inlineEnd)]];
|
|
58
|
-
}
|
|
59
|
-
inlineCall(scope, args) {
|
|
60
|
-
// create return value
|
|
61
|
-
this.inlineTemp = new TempValue_1.TempValue(scope);
|
|
62
|
-
this.inlineEnd = new LiteralValue_1.LiteralValue(scope, null);
|
|
63
|
-
// make a copy of the function scope
|
|
64
|
-
const fnScope = this.scope.copy();
|
|
65
|
-
// hard set variables within the function scope
|
|
66
|
-
this.paramNames.forEach((name, i) => fnScope.hardSet(name, args[i]));
|
|
67
|
-
this.tryingInline = true;
|
|
68
|
-
let inst = this.c.handle(fnScope, this.body)[1];
|
|
69
|
-
this.tryingInline = false;
|
|
70
|
-
// removing useless instruction
|
|
71
|
-
// get the last instructions
|
|
72
|
-
// const [jump] = inst.slice(-1);
|
|
73
|
-
// if (jump instanceof JumpInstruction) {
|
|
74
|
-
// // remove useless jump
|
|
75
|
-
// if (jump.args[1] === this.inlineEnd) inst.pop();
|
|
76
|
-
// }
|
|
77
|
-
inst.push(new instructions_1.AddressResolver(this.inlineEnd));
|
|
78
|
-
// return the function value
|
|
79
|
-
return [this.inlineTemp, inst];
|
|
80
|
-
}
|
|
81
|
-
call(scope, args) {
|
|
82
|
-
if (args.length !== this.paramStores.length)
|
|
83
|
-
throw new Error("Cannot call: argument count not matching.");
|
|
84
|
-
const inlineCall = this.inlineCall(scope, args);
|
|
85
|
-
const inlineSize = inlineCall[1].filter(i => !i.hidden).length;
|
|
86
|
-
if (this.inline || inlineSize <= this.callSize)
|
|
87
|
-
return inlineCall;
|
|
88
|
-
return this.normalCall(scope, args);
|
|
89
|
-
}
|
|
90
|
-
return(scope, arg) {
|
|
91
|
-
if (arg && arg.macro) {
|
|
92
|
-
this.inline = true;
|
|
93
|
-
return [null, []];
|
|
94
|
-
}
|
|
95
|
-
if (this.inline || this.tryingInline)
|
|
96
|
-
return this.inlineReturn(scope, arg);
|
|
97
|
-
return this.normalReturn(scope, arg);
|
|
98
|
-
}
|
|
99
|
-
eval(scope) {
|
|
100
|
-
return [this, []];
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
exports.FunctionValue = FunctionValue;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FunctionValue = void 0;
|
|
4
|
+
const instructions_1 = require("../instructions");
|
|
5
|
+
const LiteralValue_1 = require("./LiteralValue");
|
|
6
|
+
const StoreValue_1 = require("./StoreValue");
|
|
7
|
+
const TempValue_1 = require("./TempValue");
|
|
8
|
+
const VoidValue_1 = require("./VoidValue");
|
|
9
|
+
class FunctionValue extends VoidValue_1.VoidValue {
|
|
10
|
+
constructor(scope, name, paramNames, paramStores, body, c) {
|
|
11
|
+
super(scope);
|
|
12
|
+
this.constant = true;
|
|
13
|
+
this.macro = true;
|
|
14
|
+
this.bundled = false;
|
|
15
|
+
this.name = name;
|
|
16
|
+
this.paramNames = paramNames;
|
|
17
|
+
this.paramStores = paramStores;
|
|
18
|
+
this.body = body;
|
|
19
|
+
this.c = c;
|
|
20
|
+
this.callSize = paramStores.length + 2;
|
|
21
|
+
scope.function = this;
|
|
22
|
+
this.createValues();
|
|
23
|
+
this.createInst();
|
|
24
|
+
}
|
|
25
|
+
createValues() {
|
|
26
|
+
this.addr = new LiteralValue_1.LiteralValue(this.scope, null);
|
|
27
|
+
this.temp = new StoreValue_1.StoreValue(this.scope, "f" + this.name);
|
|
28
|
+
this.ret = new StoreValue_1.StoreValue(this.scope, "r" + this.name);
|
|
29
|
+
}
|
|
30
|
+
typeof(scope) {
|
|
31
|
+
return [new LiteralValue_1.LiteralValue(scope, "function"), []];
|
|
32
|
+
}
|
|
33
|
+
createInst() {
|
|
34
|
+
this.inst = [
|
|
35
|
+
new instructions_1.AddressResolver(this.addr),
|
|
36
|
+
...this.c.handle(this.scope, this.body)[1],
|
|
37
|
+
];
|
|
38
|
+
this.inst.push(new instructions_1.SetCounterInstruction(this.ret));
|
|
39
|
+
}
|
|
40
|
+
normalReturn(scope, arg) {
|
|
41
|
+
const argInst = arg ? this.temp["="](scope, arg)[1] : [];
|
|
42
|
+
return [null, [...argInst, new instructions_1.SetCounterInstruction(this.ret)]];
|
|
43
|
+
}
|
|
44
|
+
normalCall(scope, args) {
|
|
45
|
+
if (!this.bundled)
|
|
46
|
+
this.scope.inst.push(...this.inst);
|
|
47
|
+
this.bundled = true;
|
|
48
|
+
const callAddressLiteral = new LiteralValue_1.LiteralValue(scope, null);
|
|
49
|
+
const inst = this.paramStores
|
|
50
|
+
.map((param, i) => param["="](scope, args[i])[1])
|
|
51
|
+
.reduce((s, c) => s.concat(c), [])
|
|
52
|
+
.concat(...this.ret["="](scope, callAddressLiteral)[1], new instructions_1.JumpInstruction(this.addr, instructions_1.EJumpKind.Always), new instructions_1.AddressResolver(callAddressLiteral));
|
|
53
|
+
return [this.temp, inst];
|
|
54
|
+
}
|
|
55
|
+
inlineReturn(scope, arg) {
|
|
56
|
+
const argInst = arg ? this.inlineTemp["="](scope, arg)[1] : [];
|
|
57
|
+
return [null, [...argInst, new instructions_1.ReturnInstruction(this.inlineEnd)]];
|
|
58
|
+
}
|
|
59
|
+
inlineCall(scope, args) {
|
|
60
|
+
// create return value
|
|
61
|
+
this.inlineTemp = new TempValue_1.TempValue(scope);
|
|
62
|
+
this.inlineEnd = new LiteralValue_1.LiteralValue(scope, null);
|
|
63
|
+
// make a copy of the function scope
|
|
64
|
+
const fnScope = this.scope.copy();
|
|
65
|
+
// hard set variables within the function scope
|
|
66
|
+
this.paramNames.forEach((name, i) => fnScope.hardSet(name, args[i]));
|
|
67
|
+
this.tryingInline = true;
|
|
68
|
+
let inst = this.c.handle(fnScope, this.body)[1];
|
|
69
|
+
this.tryingInline = false;
|
|
70
|
+
// removing useless instruction
|
|
71
|
+
// get the last instructions
|
|
72
|
+
// const [jump] = inst.slice(-1);
|
|
73
|
+
// if (jump instanceof JumpInstruction) {
|
|
74
|
+
// // remove useless jump
|
|
75
|
+
// if (jump.args[1] === this.inlineEnd) inst.pop();
|
|
76
|
+
// }
|
|
77
|
+
inst.push(new instructions_1.AddressResolver(this.inlineEnd));
|
|
78
|
+
// return the function value
|
|
79
|
+
return [this.inlineTemp, inst];
|
|
80
|
+
}
|
|
81
|
+
call(scope, args) {
|
|
82
|
+
if (args.length !== this.paramStores.length)
|
|
83
|
+
throw new Error("Cannot call: argument count not matching.");
|
|
84
|
+
const inlineCall = this.inlineCall(scope, args);
|
|
85
|
+
const inlineSize = inlineCall[1].filter(i => !i.hidden).length;
|
|
86
|
+
if (this.inline || inlineSize <= this.callSize)
|
|
87
|
+
return inlineCall;
|
|
88
|
+
return this.normalCall(scope, args);
|
|
89
|
+
}
|
|
90
|
+
return(scope, arg) {
|
|
91
|
+
if (arg && arg.macro) {
|
|
92
|
+
this.inline = true;
|
|
93
|
+
return [null, []];
|
|
94
|
+
}
|
|
95
|
+
if (this.inline || this.tryingInline)
|
|
96
|
+
return this.inlineReturn(scope, arg);
|
|
97
|
+
return this.normalReturn(scope, arg);
|
|
98
|
+
}
|
|
99
|
+
eval(scope) {
|
|
100
|
+
return [this, []];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.FunctionValue = FunctionValue;
|
|
104
104
|
//# sourceMappingURL=FunctionValue.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { IScope, IBindableValue, TLiteral, TValueInstructions, IValue } from "../types";
|
|
2
|
-
import { BaseValue } from ".";
|
|
3
|
-
export declare class LiteralValue extends BaseValue implements IBindableValue {
|
|
4
|
-
data: TLiteral;
|
|
5
|
-
constant: boolean;
|
|
6
|
-
constructor(scope: IScope, data: TLiteral);
|
|
7
|
-
eval(scope: IScope): TValueInstructions;
|
|
8
|
-
toString(): string;
|
|
9
|
-
get(scope: IScope, name: IValue): TValueInstructions;
|
|
10
|
-
get num(): number;
|
|
11
|
-
typeof(scope: IScope): TValueInstructions;
|
|
12
|
-
}
|
|
1
|
+
import { IScope, IBindableValue, TLiteral, TValueInstructions, IValue } from "../types";
|
|
2
|
+
import { BaseValue } from ".";
|
|
3
|
+
export declare class LiteralValue extends BaseValue implements IBindableValue {
|
|
4
|
+
data: TLiteral;
|
|
5
|
+
constant: boolean;
|
|
6
|
+
constructor(scope: IScope, data: TLiteral);
|
|
7
|
+
eval(scope: IScope): TValueInstructions;
|
|
8
|
+
toString(): string;
|
|
9
|
+
get(scope: IScope, name: IValue): TValueInstructions;
|
|
10
|
+
get num(): number;
|
|
11
|
+
typeof(scope: IScope): TValueInstructions;
|
|
12
|
+
}
|