cvm-server 0.7.0 → 0.8.0
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/main.cjs +1331 -1089
- package/package.json +1 -1
package/main.cjs
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
const mcp_js = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
3
3
|
const stdio_js = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
4
4
|
const zod = require("zod");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
5
|
+
const n$1 = require("typescript");
|
|
6
|
+
const P$1 = require("fs");
|
|
7
7
|
const c$2 = require("path");
|
|
8
8
|
const mongodb = require("mongodb");
|
|
9
9
|
const promises = require("fs/promises");
|
|
@@ -26,51 +26,51 @@ function _interopNamespaceDefault(e2) {
|
|
|
26
26
|
n2.default = e2;
|
|
27
27
|
return Object.freeze(n2);
|
|
28
28
|
}
|
|
29
|
-
const
|
|
30
|
-
const
|
|
29
|
+
const n__namespace = /* @__PURE__ */ _interopNamespaceDefault(n$1);
|
|
30
|
+
const P__namespace = /* @__PURE__ */ _interopNamespaceDefault(P$1);
|
|
31
31
|
const c__namespace = /* @__PURE__ */ _interopNamespaceDefault(c$2);
|
|
32
32
|
const dotenv__namespace = /* @__PURE__ */ _interopNamespaceDefault(dotenv);
|
|
33
|
-
var
|
|
34
|
-
var
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
function
|
|
38
|
-
const
|
|
39
|
-
let
|
|
40
|
-
const
|
|
33
|
+
var f$1 = Object.defineProperty;
|
|
34
|
+
var p$2 = (e2, t2, i2) => t2 in e2 ? f$1(e2, t2, { enumerable: true, configurable: true, writable: true, value: i2 }) : e2[t2] = i2;
|
|
35
|
+
var m$2 = (e2, t2, i2) => p$2(e2, typeof t2 != "symbol" ? t2 + "" : t2, i2);
|
|
36
|
+
var s$2 = /* @__PURE__ */ ((e2) => (e2.PUSH = "PUSH", e2.PUSH_UNDEFINED = "PUSH_UNDEFINED", e2.POP = "POP", e2.LOAD = "LOAD", e2.STORE = "STORE", e2.CONCAT = "CONCAT", e2.ARRAY_NEW = "ARRAY_NEW", e2.ARRAY_PUSH = "ARRAY_PUSH", e2.ARRAY_GET = "ARRAY_GET", e2.ARRAY_SET = "ARRAY_SET", e2.ARRAY_LEN = "ARRAY_LEN", e2.STRING_LEN = "STRING_LEN", e2.STRING_SUBSTRING = "STRING_SUBSTRING", e2.STRING_INDEXOF = "STRING_INDEXOF", e2.STRING_SPLIT = "STRING_SPLIT", e2.STRING_SLICE = "STRING_SLICE", e2.STRING_CHARAT = "STRING_CHARAT", e2.STRING_TOUPPERCASE = "STRING_TOUPPERCASE", e2.STRING_TOLOWERCASE = "STRING_TOLOWERCASE", e2.LENGTH = "LENGTH", e2.JSON_PARSE = "JSON_PARSE", e2.TYPEOF = "TYPEOF", e2.ADD = "ADD", e2.SUB = "SUB", e2.MUL = "MUL", e2.DIV = "DIV", e2.MOD = "MOD", e2.UNARY_MINUS = "UNARY_MINUS", e2.UNARY_PLUS = "UNARY_PLUS", e2.INC = "INC", e2.DEC = "DEC", e2.EQ = "EQ", e2.NEQ = "NEQ", e2.LT = "LT", e2.GT = "GT", e2.LTE = "LTE", e2.GTE = "GTE", e2.EQ_STRICT = "EQ_STRICT", e2.NEQ_STRICT = "NEQ_STRICT", e2.JUMP = "JUMP", e2.JUMP_IF = "JUMP_IF", e2.JUMP_IF_FALSE = "JUMP_IF_FALSE", e2.JUMP_IF_TRUE = "JUMP_IF_TRUE", e2.CALL = "CALL", e2.RETURN = "RETURN", e2.AND = "AND", e2.OR = "OR", e2.NOT = "NOT", e2.BREAK = "BREAK", e2.CONTINUE = "CONTINUE", e2.ITER_START = "ITER_START", e2.ITER_NEXT = "ITER_NEXT", e2.ITER_END = "ITER_END", e2.FS_LIST_FILES = "FS_LIST_FILES", e2.CC = "CC", e2.PRINT = "PRINT", e2.HALT = "HALT", e2))(s$2 || {});
|
|
37
|
+
function A(e2) {
|
|
38
|
+
const t2 = [], i2 = [];
|
|
39
|
+
let r2 = false, a2 = false;
|
|
40
|
+
const l2 = n__namespace.createSourceFile(
|
|
41
41
|
"program.ts",
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
e2,
|
|
43
|
+
n__namespace.ScriptTarget.Latest,
|
|
44
44
|
true
|
|
45
45
|
);
|
|
46
|
-
function
|
|
47
|
-
if (
|
|
48
|
-
const c2 =
|
|
49
|
-
|
|
46
|
+
function S(o2) {
|
|
47
|
+
if (n__namespace.isFunctionDeclaration(o2) && o2.name && o2.name.text === "main" && (r2 = true, o2.parameters.length > 0 && t2.push("main() must not have parameters")), n__namespace.isExpressionStatement(o2) && o2.parent === l2) {
|
|
48
|
+
const c2 = o2.expression;
|
|
49
|
+
n__namespace.isCallExpression(c2) && n__namespace.isIdentifier(c2.expression) && c2.expression.text === "main" && (a2 = true);
|
|
50
50
|
}
|
|
51
|
-
if (
|
|
52
|
-
const c2 =
|
|
53
|
-
["setTimeout", "fetch", "require", "import"].includes(c2) &&
|
|
51
|
+
if (n__namespace.isCallExpression(o2) && n__namespace.isIdentifier(o2.expression)) {
|
|
52
|
+
const c2 = o2.expression.text;
|
|
53
|
+
["setTimeout", "fetch", "require", "import"].includes(c2) && t2.push(`Unsupported function: ${c2}`);
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
n__namespace.forEachChild(o2, S);
|
|
56
56
|
}
|
|
57
|
-
return
|
|
58
|
-
bytecode:
|
|
59
|
-
errors:
|
|
60
|
-
hasMain:
|
|
57
|
+
return S(l2), r2 || t2.push("Program must have a main() function"), r2 && !a2 && t2.push("main() must be called at the top level"), t2.length === 0 && i2.push({ op: s$2.HALT }), {
|
|
58
|
+
bytecode: i2,
|
|
59
|
+
errors: t2,
|
|
60
|
+
hasMain: r2
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
class R {
|
|
64
64
|
constructor() {
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
m$2(this, "bytecode", []);
|
|
66
|
+
m$2(this, "contextStack", []);
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* Emit an instruction and return its index
|
|
70
70
|
*/
|
|
71
|
-
emit(
|
|
72
|
-
const
|
|
73
|
-
return this.bytecode.push({ op:
|
|
71
|
+
emit(t2, i2) {
|
|
72
|
+
const r2 = this.bytecode.length;
|
|
73
|
+
return this.bytecode.push({ op: t2, arg: i2 }), r2;
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Get the current address (next instruction index)
|
|
@@ -81,20 +81,20 @@ let N$1 = class N {
|
|
|
81
81
|
/**
|
|
82
82
|
* Patch a jump instruction with the target address
|
|
83
83
|
*/
|
|
84
|
-
patchJump(
|
|
85
|
-
|
|
84
|
+
patchJump(t2, i2) {
|
|
85
|
+
t2 >= 0 && t2 < this.bytecode.length && (this.bytecode[t2].arg = i2);
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Patch multiple jump instructions with the same target
|
|
89
89
|
*/
|
|
90
|
-
patchJumps(
|
|
91
|
-
|
|
90
|
+
patchJumps(t2, i2) {
|
|
91
|
+
t2.forEach((r2) => this.patchJump(r2, i2));
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
94
|
* Push a new jump context onto the stack
|
|
95
95
|
*/
|
|
96
|
-
pushContext(
|
|
97
|
-
this.contextStack.push(
|
|
96
|
+
pushContext(t2) {
|
|
97
|
+
this.contextStack.push(t2);
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Pop the current jump context from the stack
|
|
@@ -112,9 +112,11 @@ let N$1 = class N {
|
|
|
112
112
|
* Find the nearest loop context (for break/continue)
|
|
113
113
|
*/
|
|
114
114
|
findLoopContext() {
|
|
115
|
-
for (let
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
for (let t2 = this.contextStack.length - 1; t2 >= 0; t2--) {
|
|
116
|
+
const i2 = this.contextStack[t2];
|
|
117
|
+
if (i2.type === "loop" || i2.type === "foreach")
|
|
118
|
+
return i2;
|
|
119
|
+
}
|
|
118
120
|
return null;
|
|
119
121
|
}
|
|
120
122
|
/**
|
|
@@ -135,281 +137,333 @@ let N$1 = class N {
|
|
|
135
137
|
getUnclosedContexts() {
|
|
136
138
|
return [...this.contextStack];
|
|
137
139
|
}
|
|
140
|
+
}
|
|
141
|
+
const h$1 = (e2, t2, { compileExpression: i2, compileStatement: r2 }) => {
|
|
142
|
+
i2(e2.expression);
|
|
143
|
+
const a2 = t2.emit(s$2.JUMP_IF_FALSE, -1), l2 = {
|
|
144
|
+
type: "if",
|
|
145
|
+
endTargets: []
|
|
146
|
+
};
|
|
147
|
+
if (e2.elseStatement ? l2.elseTarget = a2 : l2.endTargets.push(a2), t2.pushContext(l2), r2(e2.thenStatement), e2.elseStatement) {
|
|
148
|
+
const o2 = t2.emit(s$2.JUMP, -1);
|
|
149
|
+
l2.endTargets.push(o2);
|
|
150
|
+
const c2 = t2.currentAddress();
|
|
151
|
+
t2.patchJump(a2, c2), r2(e2.elseStatement);
|
|
152
|
+
}
|
|
153
|
+
const S = t2.popContext();
|
|
154
|
+
if (S) {
|
|
155
|
+
const o2 = t2.currentAddress();
|
|
156
|
+
t2.patchJumps(S.endTargets, o2);
|
|
157
|
+
}
|
|
158
|
+
}, I = (e2, t2, { compileExpression: i2, compileStatement: r2 }) => {
|
|
159
|
+
const a2 = t2.currentAddress();
|
|
160
|
+
i2(e2.expression);
|
|
161
|
+
const S = {
|
|
162
|
+
type: "loop",
|
|
163
|
+
breakTargets: [t2.emit(s$2.JUMP_IF_FALSE, -1)],
|
|
164
|
+
continueTargets: [],
|
|
165
|
+
endTargets: [],
|
|
166
|
+
startAddress: a2
|
|
167
|
+
};
|
|
168
|
+
t2.pushContext(S), r2(e2.statement), t2.emit(s$2.JUMP, a2);
|
|
169
|
+
const o2 = t2.popContext();
|
|
170
|
+
if (o2) {
|
|
171
|
+
const c2 = t2.currentAddress();
|
|
172
|
+
t2.patchJumps(o2.breakTargets || [], c2);
|
|
173
|
+
}
|
|
174
|
+
}, y$1 = (e2, t2, { compileExpression: i2, compileStatement: r2 }) => {
|
|
175
|
+
const a2 = e2.initializer, l2 = e2.expression;
|
|
176
|
+
let S;
|
|
177
|
+
if (n__namespace.isVariableDeclarationList(a2))
|
|
178
|
+
S = a2.declarations[0].name.getText();
|
|
179
|
+
else if (n__namespace.isIdentifier(a2))
|
|
180
|
+
S = a2.text;
|
|
181
|
+
else
|
|
182
|
+
throw new Error("Unsupported for-of variable declaration");
|
|
183
|
+
i2(l2), t2.emit(s$2.ITER_START);
|
|
184
|
+
const o2 = t2.currentAddress();
|
|
185
|
+
t2.emit(s$2.ITER_NEXT);
|
|
186
|
+
const c2 = t2.emit(s$2.JUMP_IF_FALSE, -1);
|
|
187
|
+
t2.emit(s$2.STORE, S);
|
|
188
|
+
const x2 = {
|
|
189
|
+
type: "foreach",
|
|
190
|
+
breakTargets: [c2],
|
|
191
|
+
continueTargets: [],
|
|
192
|
+
endTargets: [],
|
|
193
|
+
startAddress: o2,
|
|
194
|
+
iterVariable: S
|
|
195
|
+
};
|
|
196
|
+
t2.pushContext(x2), r2(e2.statement), t2.emit(s$2.JUMP, o2);
|
|
197
|
+
const u2 = t2.popContext();
|
|
198
|
+
if (u2) {
|
|
199
|
+
const E2 = t2.currentAddress();
|
|
200
|
+
t2.patchJumps(u2.breakTargets || [], E2), t2.emit(s$2.ITER_END);
|
|
201
|
+
}
|
|
202
|
+
}, N$1 = (e2, t2, { compileStatement: i2 }) => {
|
|
203
|
+
e2.statements.forEach((r2) => {
|
|
204
|
+
i2(r2);
|
|
205
|
+
});
|
|
206
|
+
}, g$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
207
|
+
const r2 = e2.declarationList.declarations[0];
|
|
208
|
+
r2.initializer && (i2(r2.initializer), t2.emit(s$2.STORE, r2.name.getText()));
|
|
209
|
+
}, P = (e2, t2, { compileExpression: i2 }) => {
|
|
210
|
+
const r2 = e2.expression;
|
|
211
|
+
if (n__namespace.isBinaryExpression(r2)) {
|
|
212
|
+
const a2 = r2.operatorToken.kind;
|
|
213
|
+
if (a2 === n__namespace.SyntaxKind.PlusEqualsToken || a2 === n__namespace.SyntaxKind.MinusEqualsToken || a2 === n__namespace.SyntaxKind.AsteriskEqualsToken || a2 === n__namespace.SyntaxKind.SlashEqualsToken || a2 === n__namespace.SyntaxKind.PercentEqualsToken) {
|
|
214
|
+
if (n__namespace.isIdentifier(r2.left)) {
|
|
215
|
+
switch (t2.emit(s$2.LOAD, r2.left.text), i2(r2.right), a2) {
|
|
216
|
+
case n__namespace.SyntaxKind.PlusEqualsToken:
|
|
217
|
+
n__namespace.isStringLiteral(r2.right) ? t2.emit(s$2.CONCAT) : t2.emit(s$2.ADD);
|
|
218
|
+
break;
|
|
219
|
+
case n__namespace.SyntaxKind.MinusEqualsToken:
|
|
220
|
+
t2.emit(s$2.SUB);
|
|
221
|
+
break;
|
|
222
|
+
case n__namespace.SyntaxKind.AsteriskEqualsToken:
|
|
223
|
+
t2.emit(s$2.MUL);
|
|
224
|
+
break;
|
|
225
|
+
case n__namespace.SyntaxKind.SlashEqualsToken:
|
|
226
|
+
t2.emit(s$2.DIV);
|
|
227
|
+
break;
|
|
228
|
+
case n__namespace.SyntaxKind.PercentEqualsToken:
|
|
229
|
+
t2.emit(s$2.MOD);
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
t2.emit(s$2.STORE, r2.left.text);
|
|
233
|
+
} else if (n__namespace.isElementAccessExpression(r2.left))
|
|
234
|
+
throw new Error("Compound assignment to array elements not yet supported");
|
|
235
|
+
return;
|
|
236
|
+
} else if (a2 === n__namespace.SyntaxKind.EqualsToken) {
|
|
237
|
+
if (i2(r2.right), n__namespace.isIdentifier(r2.left))
|
|
238
|
+
t2.emit(s$2.STORE, r2.left.text);
|
|
239
|
+
else if (n__namespace.isElementAccessExpression(r2.left)) {
|
|
240
|
+
const l2 = `__temp_${t2.getBytecode().length}`;
|
|
241
|
+
t2.emit(s$2.STORE, l2), i2(r2.left.expression), i2(r2.left.argumentExpression), t2.emit(s$2.LOAD, l2), t2.emit(s$2.ARRAY_SET);
|
|
242
|
+
}
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
n__namespace.isCallExpression(r2) && n__namespace.isPropertyAccessExpression(r2.expression) && r2.expression.expression.getText() === "console" && r2.expression.name.getText() === "log" ? (r2.arguments.forEach((a2) => {
|
|
247
|
+
i2(a2);
|
|
248
|
+
}), t2.emit(s$2.PRINT)) : n__namespace.isCallExpression(r2) && n__namespace.isIdentifier(r2.expression) && r2.expression.text === "CC" ? (r2.arguments.length > 0 && i2(r2.arguments[0]), t2.emit(s$2.CC), t2.emit(s$2.POP)) : n__namespace.isCallExpression(r2) && n__namespace.isPropertyAccessExpression(r2.expression) && r2.expression.name.getText() === "push" ? (i2(r2.expression.expression), r2.arguments.length > 0 && i2(r2.arguments[0]), t2.emit(s$2.ARRAY_PUSH)) : (n__namespace.isPostfixUnaryExpression(r2) || n__namespace.isPrefixUnaryExpression(r2)) && (i2(r2), t2.emit(s$2.POP));
|
|
249
|
+
}, k = (e2, t2, { compileExpression: i2 }) => {
|
|
250
|
+
e2.expression ? i2(e2.expression) : t2.emit(s$2.PUSH, null), t2.emit(s$2.RETURN);
|
|
251
|
+
}, _ = (e2, t2, i2) => {
|
|
252
|
+
const r2 = t2.findLoopContext();
|
|
253
|
+
if (r2) {
|
|
254
|
+
r2.type === "foreach" && t2.emit(s$2.ITER_END);
|
|
255
|
+
const a2 = t2.emit(s$2.BREAK, -1);
|
|
256
|
+
r2.breakTargets = r2.breakTargets || [], r2.breakTargets.push(a2);
|
|
257
|
+
} else
|
|
258
|
+
throw new Error("break statement not in loop");
|
|
259
|
+
}, U$1 = (e2, t2, i2) => {
|
|
260
|
+
const r2 = t2.findLoopContext();
|
|
261
|
+
if (r2 && r2.startAddress !== void 0) {
|
|
262
|
+
const a2 = t2.emit(s$2.CONTINUE, r2.startAddress);
|
|
263
|
+
r2.continueTargets = r2.continueTargets || [], r2.continueTargets.push(a2);
|
|
264
|
+
} else
|
|
265
|
+
throw new Error("continue statement not in loop");
|
|
266
|
+
}, L$1 = {
|
|
267
|
+
[n__namespace.SyntaxKind.IfStatement]: h$1,
|
|
268
|
+
[n__namespace.SyntaxKind.WhileStatement]: I,
|
|
269
|
+
[n__namespace.SyntaxKind.ForOfStatement]: y$1,
|
|
270
|
+
[n__namespace.SyntaxKind.Block]: N$1,
|
|
271
|
+
[n__namespace.SyntaxKind.VariableStatement]: g$1,
|
|
272
|
+
[n__namespace.SyntaxKind.ExpressionStatement]: P,
|
|
273
|
+
[n__namespace.SyntaxKind.ReturnStatement]: k,
|
|
274
|
+
[n__namespace.SyntaxKind.BreakStatement]: _,
|
|
275
|
+
[n__namespace.SyntaxKind.ContinueStatement]: U$1
|
|
276
|
+
}, d$1 = (e2, t2, i2) => {
|
|
277
|
+
t2.emit(s$2.PUSH, e2.text);
|
|
278
|
+
}, K = (e2, t2, i2) => {
|
|
279
|
+
t2.emit(s$2.PUSH, Number(e2.text));
|
|
280
|
+
}, b$1 = (e2, t2, i2) => {
|
|
281
|
+
t2.emit(s$2.PUSH, true);
|
|
282
|
+
}, F$1 = (e2, t2, i2) => {
|
|
283
|
+
t2.emit(s$2.PUSH, false);
|
|
284
|
+
}, D$1 = (e2, t2, i2) => {
|
|
285
|
+
t2.emit(s$2.PUSH, null);
|
|
286
|
+
}, G$1 = (e2, t2, i2) => {
|
|
287
|
+
e2.text === "undefined" ? t2.emit(s$2.PUSH_UNDEFINED) : t2.emit(s$2.LOAD, e2.text);
|
|
288
|
+
}, M$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
289
|
+
t2.emit(s$2.ARRAY_NEW), e2.elements.forEach((r2) => {
|
|
290
|
+
i2(r2), t2.emit(s$2.ARRAY_PUSH);
|
|
291
|
+
});
|
|
292
|
+
}, H$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
293
|
+
i2(e2.expression);
|
|
294
|
+
}, C$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
295
|
+
e2.name.text === "length" && (i2(e2.expression), t2.emit(s$2.LENGTH));
|
|
296
|
+
}, J = (e2, t2, { compileExpression: i2 }) => {
|
|
297
|
+
i2(e2.expression), e2.argumentExpression && i2(e2.argumentExpression), t2.emit(s$2.ARRAY_GET);
|
|
298
|
+
}, w$2 = (e2, t2, { compileExpression: i2 }) => {
|
|
299
|
+
switch (e2.operator) {
|
|
300
|
+
case n__namespace.SyntaxKind.ExclamationToken:
|
|
301
|
+
i2(e2.operand), t2.emit(s$2.NOT);
|
|
302
|
+
break;
|
|
303
|
+
case n__namespace.SyntaxKind.MinusToken:
|
|
304
|
+
i2(e2.operand), t2.emit(s$2.UNARY_MINUS);
|
|
305
|
+
break;
|
|
306
|
+
case n__namespace.SyntaxKind.PlusToken:
|
|
307
|
+
i2(e2.operand), t2.emit(s$2.UNARY_PLUS);
|
|
308
|
+
break;
|
|
309
|
+
case n__namespace.SyntaxKind.PlusPlusToken:
|
|
310
|
+
n__namespace.isIdentifier(e2.operand) && (t2.emit(s$2.PUSH, e2.operand.text), t2.emit(s$2.INC, false));
|
|
311
|
+
break;
|
|
312
|
+
case n__namespace.SyntaxKind.MinusMinusToken:
|
|
313
|
+
n__namespace.isIdentifier(e2.operand) && (t2.emit(s$2.PUSH, e2.operand.text), t2.emit(s$2.DEC, false));
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}, B = (e2, t2, { compileExpression: i2 }) => {
|
|
317
|
+
switch (e2.operator) {
|
|
318
|
+
case n__namespace.SyntaxKind.PlusPlusToken:
|
|
319
|
+
n__namespace.isIdentifier(e2.operand) && (t2.emit(s$2.PUSH, e2.operand.text), t2.emit(s$2.INC, true));
|
|
320
|
+
break;
|
|
321
|
+
case n__namespace.SyntaxKind.MinusMinusToken:
|
|
322
|
+
n__namespace.isIdentifier(e2.operand) && (t2.emit(s$2.PUSH, e2.operand.text), t2.emit(s$2.DEC, true));
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
138
325
|
};
|
|
139
|
-
function
|
|
140
|
-
|
|
141
|
-
|
|
326
|
+
function T$1(e2, t2) {
|
|
327
|
+
return !!(n__namespace.isStringLiteral(e2) || n__namespace.isStringLiteral(t2) || n__namespace.isBinaryExpression(e2) && e2.operatorToken.kind === n__namespace.SyntaxKind.PlusToken && T$1(e2.left, e2.right) || n__namespace.isBinaryExpression(t2) && t2.operatorToken.kind === n__namespace.SyntaxKind.PlusToken && T$1(t2.left, t2.right));
|
|
328
|
+
}
|
|
329
|
+
const Y$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
330
|
+
const r2 = e2.operatorToken.kind;
|
|
331
|
+
switch (i2(e2.left), i2(e2.right), r2) {
|
|
332
|
+
case n__namespace.SyntaxKind.PlusToken:
|
|
333
|
+
T$1(e2.left, e2.right) ? t2.emit(s$2.CONCAT) : t2.emit(s$2.ADD);
|
|
334
|
+
break;
|
|
335
|
+
case n__namespace.SyntaxKind.MinusToken:
|
|
336
|
+
t2.emit(s$2.SUB);
|
|
337
|
+
break;
|
|
338
|
+
case n__namespace.SyntaxKind.AsteriskToken:
|
|
339
|
+
t2.emit(s$2.MUL);
|
|
340
|
+
break;
|
|
341
|
+
case n__namespace.SyntaxKind.SlashToken:
|
|
342
|
+
t2.emit(s$2.DIV);
|
|
343
|
+
break;
|
|
344
|
+
case n__namespace.SyntaxKind.PercentToken:
|
|
345
|
+
t2.emit(s$2.MOD);
|
|
346
|
+
break;
|
|
347
|
+
case n__namespace.SyntaxKind.EqualsEqualsToken:
|
|
348
|
+
t2.emit(s$2.EQ);
|
|
349
|
+
break;
|
|
350
|
+
case n__namespace.SyntaxKind.ExclamationEqualsToken:
|
|
351
|
+
t2.emit(s$2.NEQ);
|
|
352
|
+
break;
|
|
353
|
+
case n__namespace.SyntaxKind.LessThanToken:
|
|
354
|
+
t2.emit(s$2.LT);
|
|
355
|
+
break;
|
|
356
|
+
case n__namespace.SyntaxKind.GreaterThanToken:
|
|
357
|
+
t2.emit(s$2.GT);
|
|
358
|
+
break;
|
|
359
|
+
case n__namespace.SyntaxKind.LessThanEqualsToken:
|
|
360
|
+
t2.emit(s$2.LTE);
|
|
361
|
+
break;
|
|
362
|
+
case n__namespace.SyntaxKind.GreaterThanEqualsToken:
|
|
363
|
+
t2.emit(s$2.GTE);
|
|
364
|
+
break;
|
|
365
|
+
case n__namespace.SyntaxKind.EqualsEqualsEqualsToken:
|
|
366
|
+
t2.emit(s$2.EQ_STRICT);
|
|
367
|
+
break;
|
|
368
|
+
case n__namespace.SyntaxKind.ExclamationEqualsEqualsToken:
|
|
369
|
+
t2.emit(s$2.NEQ_STRICT);
|
|
370
|
+
break;
|
|
371
|
+
case n__namespace.SyntaxKind.AmpersandAmpersandToken:
|
|
372
|
+
t2.emit(s$2.AND);
|
|
373
|
+
break;
|
|
374
|
+
case n__namespace.SyntaxKind.BarBarToken:
|
|
375
|
+
t2.emit(s$2.OR);
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
}, q$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
379
|
+
i2(e2.condition);
|
|
380
|
+
const r2 = t2.emit(s$2.JUMP_IF_FALSE, -1);
|
|
381
|
+
i2(e2.whenTrue);
|
|
382
|
+
const a2 = t2.emit(s$2.JUMP, -1), l2 = t2.currentAddress();
|
|
383
|
+
t2.patchJump(r2, l2), i2(e2.whenFalse);
|
|
384
|
+
const S = t2.currentAddress();
|
|
385
|
+
t2.patchJump(a2, S);
|
|
386
|
+
}, Q = (e2, t2, { compileExpression: i2 }) => {
|
|
387
|
+
i2(e2.expression), t2.emit(s$2.TYPEOF);
|
|
388
|
+
}, V$1 = (e2, t2, { compileExpression: i2 }) => {
|
|
389
|
+
if (n__namespace.isPropertyAccessExpression(e2.expression) && n__namespace.isIdentifier(e2.expression.expression) && e2.expression.expression.text === "fs" && e2.expression.name.text === "listFiles")
|
|
390
|
+
e2.arguments.length > 0 ? i2(e2.arguments[0]) : t2.emit(s$2.PUSH, "."), e2.arguments.length > 1 && i2(e2.arguments[1]), t2.emit(s$2.FS_LIST_FILES);
|
|
391
|
+
else if (n__namespace.isPropertyAccessExpression(e2.expression) && n__namespace.isIdentifier(e2.expression.expression) && e2.expression.expression.text === "JSON" && e2.expression.name.text === "parse")
|
|
392
|
+
e2.arguments.length > 0 && i2(e2.arguments[0]), t2.emit(s$2.JSON_PARSE);
|
|
393
|
+
else if (n__namespace.isIdentifier(e2.expression) && e2.expression.text === "CC")
|
|
394
|
+
e2.arguments.length > 0 && i2(e2.arguments[0]), t2.emit(s$2.CC);
|
|
395
|
+
else if (n__namespace.isPropertyAccessExpression(e2.expression)) {
|
|
396
|
+
const r2 = e2.expression.name.text;
|
|
397
|
+
if (r2 === "substring")
|
|
398
|
+
i2(e2.expression.expression), e2.arguments.length > 0 ? i2(e2.arguments[0]) : t2.emit(s$2.PUSH, 0), e2.arguments.length > 1 && i2(e2.arguments[1]), t2.emit(s$2.STRING_SUBSTRING);
|
|
399
|
+
else if (r2 === "indexOf")
|
|
400
|
+
i2(e2.expression.expression), e2.arguments.length > 0 ? i2(e2.arguments[0]) : t2.emit(s$2.PUSH, ""), t2.emit(s$2.STRING_INDEXOF);
|
|
401
|
+
else if (r2 === "split")
|
|
402
|
+
i2(e2.expression.expression), e2.arguments.length > 0 ? i2(e2.arguments[0]) : t2.emit(s$2.PUSH, ""), t2.emit(s$2.STRING_SPLIT);
|
|
403
|
+
else if (r2 === "slice")
|
|
404
|
+
i2(e2.expression.expression), e2.arguments.length > 0 ? i2(e2.arguments[0]) : t2.emit(s$2.PUSH, 0), e2.arguments.length > 1 && i2(e2.arguments[1]), t2.emit(s$2.STRING_SLICE);
|
|
405
|
+
else if (r2 === "charAt")
|
|
406
|
+
i2(e2.expression.expression), e2.arguments.length > 0 ? i2(e2.arguments[0]) : t2.emit(s$2.PUSH, 0), t2.emit(s$2.STRING_CHARAT);
|
|
407
|
+
else if (r2 === "toUpperCase")
|
|
408
|
+
i2(e2.expression.expression), t2.emit(s$2.STRING_TOUPPERCASE);
|
|
409
|
+
else if (r2 === "toLowerCase")
|
|
410
|
+
i2(e2.expression.expression), t2.emit(s$2.STRING_TOLOWERCASE);
|
|
411
|
+
else
|
|
412
|
+
throw new Error(`Method call '${r2}' is not supported`);
|
|
413
|
+
} else
|
|
414
|
+
throw new Error("Unsupported call expression");
|
|
415
|
+
}, v = {
|
|
416
|
+
[n__namespace.SyntaxKind.StringLiteral]: d$1,
|
|
417
|
+
[n__namespace.SyntaxKind.NumericLiteral]: K,
|
|
418
|
+
[n__namespace.SyntaxKind.TrueKeyword]: b$1,
|
|
419
|
+
[n__namespace.SyntaxKind.FalseKeyword]: F$1,
|
|
420
|
+
[n__namespace.SyntaxKind.NullKeyword]: D$1,
|
|
421
|
+
[n__namespace.SyntaxKind.Identifier]: G$1,
|
|
422
|
+
[n__namespace.SyntaxKind.ArrayLiteralExpression]: M$1,
|
|
423
|
+
[n__namespace.SyntaxKind.BinaryExpression]: Y$1,
|
|
424
|
+
[n__namespace.SyntaxKind.PrefixUnaryExpression]: w$2,
|
|
425
|
+
[n__namespace.SyntaxKind.PostfixUnaryExpression]: B,
|
|
426
|
+
[n__namespace.SyntaxKind.CallExpression]: V$1,
|
|
427
|
+
[n__namespace.SyntaxKind.PropertyAccessExpression]: C$1,
|
|
428
|
+
[n__namespace.SyntaxKind.ElementAccessExpression]: J,
|
|
429
|
+
[n__namespace.SyntaxKind.ConditionalExpression]: q$1,
|
|
430
|
+
[n__namespace.SyntaxKind.TypeOfExpression]: Q,
|
|
431
|
+
[n__namespace.SyntaxKind.ParenthesizedExpression]: H$1
|
|
432
|
+
};
|
|
433
|
+
function j(e2) {
|
|
434
|
+
const t2 = A(e2);
|
|
435
|
+
if (t2.errors.length > 0)
|
|
142
436
|
return {
|
|
143
437
|
success: false,
|
|
144
438
|
bytecode: [],
|
|
145
|
-
errors:
|
|
439
|
+
errors: t2.errors
|
|
146
440
|
};
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
} else if (s__namespace.isWhileStatement(t2)) {
|
|
167
|
-
const i2 = e2.currentAddress();
|
|
168
|
-
a2(t2.expression);
|
|
169
|
-
const m2 = {
|
|
170
|
-
type: "loop",
|
|
171
|
-
breakTargets: [e2.emit(r$1.JUMP_IF_FALSE, -1)],
|
|
172
|
-
continueTargets: [],
|
|
173
|
-
endTargets: [],
|
|
174
|
-
startAddress: i2
|
|
175
|
-
};
|
|
176
|
-
e2.pushContext(m2), T(t2.statement), e2.emit(r$1.JUMP, i2);
|
|
177
|
-
const x = e2.popContext();
|
|
178
|
-
if (x) {
|
|
179
|
-
const S = e2.currentAddress();
|
|
180
|
-
e2.patchJumps(x.breakTargets || [], S);
|
|
181
|
-
}
|
|
182
|
-
} else if (s__namespace.isForOfStatement(t2)) {
|
|
183
|
-
const i2 = t2.initializer, c2 = t2.expression;
|
|
184
|
-
let m2;
|
|
185
|
-
if (s__namespace.isVariableDeclarationList(i2))
|
|
186
|
-
m2 = i2.declarations[0].name.getText();
|
|
187
|
-
else if (s__namespace.isIdentifier(i2))
|
|
188
|
-
m2 = i2.text;
|
|
189
|
-
else
|
|
190
|
-
throw new Error("Unsupported for-of variable declaration");
|
|
191
|
-
a2(c2), e2.emit(r$1.ITER_START);
|
|
192
|
-
const x = e2.currentAddress();
|
|
193
|
-
e2.emit(r$1.ITER_NEXT);
|
|
194
|
-
const S = e2.emit(r$1.JUMP_IF_FALSE, -1);
|
|
195
|
-
e2.emit(r$1.STORE, m2);
|
|
196
|
-
const A2 = {
|
|
197
|
-
type: "foreach",
|
|
198
|
-
breakTargets: [S],
|
|
199
|
-
continueTargets: [],
|
|
200
|
-
endTargets: [],
|
|
201
|
-
startAddress: x,
|
|
202
|
-
iterVariable: m2
|
|
203
|
-
};
|
|
204
|
-
e2.pushContext(A2), T(t2.statement), e2.emit(r$1.JUMP, x);
|
|
205
|
-
const f2 = e2.popContext();
|
|
206
|
-
if (f2) {
|
|
207
|
-
e2.emit(r$1.ITER_END);
|
|
208
|
-
const p2 = e2.currentAddress();
|
|
209
|
-
e2.patchJumps(f2.breakTargets || [], p2);
|
|
210
|
-
}
|
|
211
|
-
} else if (s__namespace.isBlock(t2))
|
|
212
|
-
t2.statements.forEach((i2) => {
|
|
213
|
-
T(i2);
|
|
214
|
-
});
|
|
215
|
-
else if (s__namespace.isExpressionStatement(t2)) {
|
|
216
|
-
const i2 = t2.expression;
|
|
217
|
-
if (s__namespace.isBinaryExpression(i2)) {
|
|
218
|
-
const c2 = i2.operatorToken.kind;
|
|
219
|
-
if (c2 === s__namespace.SyntaxKind.PlusEqualsToken || c2 === s__namespace.SyntaxKind.MinusEqualsToken || c2 === s__namespace.SyntaxKind.AsteriskEqualsToken || c2 === s__namespace.SyntaxKind.SlashEqualsToken || c2 === s__namespace.SyntaxKind.PercentEqualsToken) {
|
|
220
|
-
if (s__namespace.isIdentifier(i2.left)) {
|
|
221
|
-
switch (e2.emit(r$1.LOAD, i2.left.text), a2(i2.right), c2) {
|
|
222
|
-
case s__namespace.SyntaxKind.PlusEqualsToken:
|
|
223
|
-
s__namespace.isStringLiteral(i2.right) ? e2.emit(r$1.CONCAT) : e2.emit(r$1.ADD);
|
|
224
|
-
break;
|
|
225
|
-
case s__namespace.SyntaxKind.MinusEqualsToken:
|
|
226
|
-
e2.emit(r$1.SUB);
|
|
227
|
-
break;
|
|
228
|
-
case s__namespace.SyntaxKind.AsteriskEqualsToken:
|
|
229
|
-
e2.emit(r$1.MUL);
|
|
230
|
-
break;
|
|
231
|
-
case s__namespace.SyntaxKind.SlashEqualsToken:
|
|
232
|
-
e2.emit(r$1.DIV);
|
|
233
|
-
break;
|
|
234
|
-
case s__namespace.SyntaxKind.PercentEqualsToken:
|
|
235
|
-
e2.emit(r$1.MOD);
|
|
236
|
-
break;
|
|
237
|
-
}
|
|
238
|
-
e2.emit(r$1.STORE, i2.left.text);
|
|
239
|
-
} else if (s__namespace.isElementAccessExpression(i2.left))
|
|
240
|
-
throw new Error("Compound assignment to array elements not yet supported");
|
|
241
|
-
return;
|
|
242
|
-
} else if (c2 === s__namespace.SyntaxKind.EqualsToken) {
|
|
243
|
-
if (a2(i2.right), s__namespace.isIdentifier(i2.left))
|
|
244
|
-
e2.emit(r$1.STORE, i2.left.text);
|
|
245
|
-
else if (s__namespace.isElementAccessExpression(i2.left)) {
|
|
246
|
-
const m2 = `__temp_${e2.getBytecode().length}`;
|
|
247
|
-
e2.emit(r$1.STORE, m2), a2(i2.left.expression), a2(i2.left.argumentExpression), e2.emit(r$1.LOAD, m2), e2.emit(r$1.ARRAY_SET);
|
|
248
|
-
}
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
s__namespace.isCallExpression(i2) && s__namespace.isPropertyAccessExpression(i2.expression) && i2.expression.expression.getText() === "console" && i2.expression.name.getText() === "log" ? (i2.arguments.forEach((c2) => {
|
|
253
|
-
a2(c2);
|
|
254
|
-
}), e2.emit(r$1.PRINT)) : s__namespace.isCallExpression(i2) && s__namespace.isIdentifier(i2.expression) && i2.expression.text === "CC" ? (i2.arguments.length > 0 && a2(i2.arguments[0]), e2.emit(r$1.CC), e2.emit(r$1.POP)) : s__namespace.isCallExpression(i2) && s__namespace.isPropertyAccessExpression(i2.expression) && i2.expression.name.getText() === "push" ? (a2(i2.expression.expression), i2.arguments.length > 0 && a2(i2.arguments[0]), e2.emit(r$1.ARRAY_PUSH)) : (s__namespace.isPostfixUnaryExpression(i2) || s__namespace.isPrefixUnaryExpression(i2)) && (a2(i2), e2.emit(r$1.POP));
|
|
255
|
-
} else if (s__namespace.isVariableStatement(t2)) {
|
|
256
|
-
const i2 = t2.declarationList.declarations[0];
|
|
257
|
-
i2.initializer && (a2(i2.initializer), e2.emit(r$1.STORE, i2.name.getText()));
|
|
258
|
-
} else if (s__namespace.isReturnStatement(t2))
|
|
259
|
-
t2.expression ? a2(t2.expression) : e2.emit(r$1.PUSH, null), e2.emit(r$1.RETURN);
|
|
260
|
-
else if (s__namespace.isBreakStatement(t2)) {
|
|
261
|
-
const i2 = e2.findLoopContext();
|
|
262
|
-
if (i2) {
|
|
263
|
-
i2.type === "foreach" && e2.emit(r$1.ITER_END);
|
|
264
|
-
const c2 = e2.emit(r$1.BREAK, -1);
|
|
265
|
-
i2.breakTargets = i2.breakTargets || [], i2.breakTargets.push(c2);
|
|
266
|
-
} else
|
|
267
|
-
throw new Error("break statement not in loop");
|
|
268
|
-
} else if (s__namespace.isContinueStatement(t2)) {
|
|
269
|
-
const i2 = e2.findLoopContext();
|
|
270
|
-
if (i2 && i2.startAddress !== void 0) {
|
|
271
|
-
const c2 = e2.emit(r$1.CONTINUE, i2.startAddress);
|
|
272
|
-
i2.continueTargets = i2.continueTargets || [], i2.continueTargets.push(c2);
|
|
273
|
-
} else
|
|
274
|
-
throw new Error("continue statement not in loop");
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
function a2(t2) {
|
|
278
|
-
if (s__namespace.isStringLiteral(t2))
|
|
279
|
-
e2.emit(r$1.PUSH, t2.text);
|
|
280
|
-
else if (s__namespace.isNumericLiteral(t2))
|
|
281
|
-
e2.emit(r$1.PUSH, Number(t2.text));
|
|
282
|
-
else if (t2.kind === s__namespace.SyntaxKind.TrueKeyword)
|
|
283
|
-
e2.emit(r$1.PUSH, true);
|
|
284
|
-
else if (t2.kind === s__namespace.SyntaxKind.FalseKeyword)
|
|
285
|
-
e2.emit(r$1.PUSH, false);
|
|
286
|
-
else if (t2.kind === s__namespace.SyntaxKind.NullKeyword)
|
|
287
|
-
e2.emit(r$1.PUSH, null);
|
|
288
|
-
else if (s__namespace.isArrayLiteralExpression(t2))
|
|
289
|
-
e2.emit(r$1.ARRAY_NEW), t2.elements.forEach((i2) => {
|
|
290
|
-
a2(i2), e2.emit(r$1.ARRAY_PUSH);
|
|
291
|
-
});
|
|
292
|
-
else if (s__namespace.isElementAccessExpression(t2))
|
|
293
|
-
a2(t2.expression), t2.argumentExpression && a2(t2.argumentExpression), e2.emit(r$1.ARRAY_GET);
|
|
294
|
-
else if (s__namespace.isPropertyAccessExpression(t2) && t2.name.text === "length")
|
|
295
|
-
a2(t2.expression), e2.emit(r$1.LENGTH);
|
|
296
|
-
else if (s__namespace.isIdentifier(t2))
|
|
297
|
-
t2.text === "undefined" ? e2.emit(r$1.PUSH_UNDEFINED) : e2.emit(r$1.LOAD, t2.text);
|
|
298
|
-
else if (s__namespace.isCallExpression(t2)) {
|
|
299
|
-
if (s__namespace.isPropertyAccessExpression(t2.expression) && s__namespace.isIdentifier(t2.expression.expression) && t2.expression.expression.text === "fs" && t2.expression.name.text === "listFiles")
|
|
300
|
-
t2.arguments.length > 0 ? a2(t2.arguments[0]) : e2.emit(r$1.PUSH, "."), t2.arguments.length > 1 && a2(t2.arguments[1]), e2.emit(r$1.FS_LIST_FILES);
|
|
301
|
-
else if (s__namespace.isPropertyAccessExpression(t2.expression) && s__namespace.isIdentifier(t2.expression.expression) && t2.expression.expression.text === "JSON" && t2.expression.name.text === "parse")
|
|
302
|
-
t2.arguments.length > 0 && a2(t2.arguments[0]), e2.emit(r$1.JSON_PARSE);
|
|
303
|
-
else if (s__namespace.isIdentifier(t2.expression) && t2.expression.text === "CC")
|
|
304
|
-
t2.arguments.length > 0 && a2(t2.arguments[0]), e2.emit(r$1.CC);
|
|
305
|
-
else if (s__namespace.isPropertyAccessExpression(t2.expression)) {
|
|
306
|
-
const i2 = t2.expression.name.text;
|
|
307
|
-
i2 === "substring" ? (a2(t2.expression.expression), t2.arguments.length > 0 ? a2(t2.arguments[0]) : e2.emit(r$1.PUSH, 0), t2.arguments.length > 1 && a2(t2.arguments[1]), e2.emit(r$1.STRING_SUBSTRING)) : i2 === "indexOf" ? (a2(t2.expression.expression), t2.arguments.length > 0 ? a2(t2.arguments[0]) : e2.emit(r$1.PUSH, ""), e2.emit(r$1.STRING_INDEXOF)) : i2 === "split" ? (a2(t2.expression.expression), t2.arguments.length > 0 ? a2(t2.arguments[0]) : e2.emit(r$1.PUSH, ""), e2.emit(r$1.STRING_SPLIT)) : i2 === "slice" ? (a2(t2.expression.expression), t2.arguments.length > 0 ? a2(t2.arguments[0]) : e2.emit(r$1.PUSH, 0), t2.arguments.length > 1 && a2(t2.arguments[1]), e2.emit(r$1.STRING_SLICE)) : i2 === "charAt" ? (a2(t2.expression.expression), t2.arguments.length > 0 ? a2(t2.arguments[0]) : e2.emit(r$1.PUSH, 0), e2.emit(r$1.STRING_CHARAT)) : i2 === "toUpperCase" ? (a2(t2.expression.expression), e2.emit(r$1.STRING_TOUPPERCASE)) : i2 === "toLowerCase" && (a2(t2.expression.expression), e2.emit(r$1.STRING_TOLOWERCASE));
|
|
308
|
-
}
|
|
309
|
-
} else if (s__namespace.isParenthesizedExpression(t2))
|
|
310
|
-
a2(t2.expression);
|
|
311
|
-
else if (s__namespace.isBinaryExpression(t2)) {
|
|
312
|
-
const i2 = t2.operatorToken.kind;
|
|
313
|
-
switch (a2(t2.left), a2(t2.right), i2) {
|
|
314
|
-
case s__namespace.SyntaxKind.PlusToken:
|
|
315
|
-
E(t2.left, t2.right) ? e2.emit(r$1.CONCAT) : e2.emit(r$1.ADD);
|
|
316
|
-
break;
|
|
317
|
-
case s__namespace.SyntaxKind.MinusToken:
|
|
318
|
-
e2.emit(r$1.SUB);
|
|
319
|
-
break;
|
|
320
|
-
case s__namespace.SyntaxKind.AsteriskToken:
|
|
321
|
-
e2.emit(r$1.MUL);
|
|
322
|
-
break;
|
|
323
|
-
case s__namespace.SyntaxKind.SlashToken:
|
|
324
|
-
e2.emit(r$1.DIV);
|
|
325
|
-
break;
|
|
326
|
-
case s__namespace.SyntaxKind.PercentToken:
|
|
327
|
-
e2.emit(r$1.MOD);
|
|
328
|
-
break;
|
|
329
|
-
case s__namespace.SyntaxKind.EqualsEqualsToken:
|
|
330
|
-
e2.emit(r$1.EQ);
|
|
331
|
-
break;
|
|
332
|
-
case s__namespace.SyntaxKind.ExclamationEqualsToken:
|
|
333
|
-
e2.emit(r$1.NEQ);
|
|
334
|
-
break;
|
|
335
|
-
case s__namespace.SyntaxKind.LessThanToken:
|
|
336
|
-
e2.emit(r$1.LT);
|
|
337
|
-
break;
|
|
338
|
-
case s__namespace.SyntaxKind.GreaterThanToken:
|
|
339
|
-
e2.emit(r$1.GT);
|
|
340
|
-
break;
|
|
341
|
-
case s__namespace.SyntaxKind.LessThanEqualsToken:
|
|
342
|
-
e2.emit(r$1.LTE);
|
|
343
|
-
break;
|
|
344
|
-
case s__namespace.SyntaxKind.GreaterThanEqualsToken:
|
|
345
|
-
e2.emit(r$1.GTE);
|
|
346
|
-
break;
|
|
347
|
-
case s__namespace.SyntaxKind.EqualsEqualsEqualsToken:
|
|
348
|
-
e2.emit(r$1.EQ_STRICT);
|
|
349
|
-
break;
|
|
350
|
-
case s__namespace.SyntaxKind.ExclamationEqualsEqualsToken:
|
|
351
|
-
e2.emit(r$1.NEQ_STRICT);
|
|
352
|
-
break;
|
|
353
|
-
case s__namespace.SyntaxKind.AmpersandAmpersandToken:
|
|
354
|
-
e2.emit(r$1.AND);
|
|
355
|
-
break;
|
|
356
|
-
case s__namespace.SyntaxKind.BarBarToken:
|
|
357
|
-
e2.emit(r$1.OR);
|
|
358
|
-
break;
|
|
359
|
-
}
|
|
360
|
-
} else if (s__namespace.isPrefixUnaryExpression(t2))
|
|
361
|
-
switch (t2.operator) {
|
|
362
|
-
case s__namespace.SyntaxKind.ExclamationToken:
|
|
363
|
-
a2(t2.operand), e2.emit(r$1.NOT);
|
|
364
|
-
break;
|
|
365
|
-
case s__namespace.SyntaxKind.MinusToken:
|
|
366
|
-
a2(t2.operand), e2.emit(r$1.UNARY_MINUS);
|
|
367
|
-
break;
|
|
368
|
-
case s__namespace.SyntaxKind.PlusToken:
|
|
369
|
-
a2(t2.operand), e2.emit(r$1.UNARY_PLUS);
|
|
370
|
-
break;
|
|
371
|
-
case s__namespace.SyntaxKind.PlusPlusToken:
|
|
372
|
-
s__namespace.isIdentifier(t2.operand) && (e2.emit(r$1.PUSH, t2.operand.text), e2.emit(r$1.INC, false));
|
|
373
|
-
break;
|
|
374
|
-
case s__namespace.SyntaxKind.MinusMinusToken:
|
|
375
|
-
s__namespace.isIdentifier(t2.operand) && (e2.emit(r$1.PUSH, t2.operand.text), e2.emit(r$1.DEC, false));
|
|
376
|
-
break;
|
|
377
|
-
}
|
|
378
|
-
else if (s__namespace.isPostfixUnaryExpression(t2))
|
|
379
|
-
switch (t2.operator) {
|
|
380
|
-
case s__namespace.SyntaxKind.PlusPlusToken:
|
|
381
|
-
s__namespace.isIdentifier(t2.operand) && (e2.emit(r$1.PUSH, t2.operand.text), e2.emit(r$1.INC, true));
|
|
382
|
-
break;
|
|
383
|
-
case s__namespace.SyntaxKind.MinusMinusToken:
|
|
384
|
-
s__namespace.isIdentifier(t2.operand) && (e2.emit(r$1.PUSH, t2.operand.text), e2.emit(r$1.DEC, true));
|
|
385
|
-
break;
|
|
386
|
-
}
|
|
387
|
-
else if (s__namespace.isTypeOfExpression(t2))
|
|
388
|
-
a2(t2.expression), e2.emit(r$1.TYPEOF);
|
|
389
|
-
else if (s__namespace.isConditionalExpression(t2)) {
|
|
390
|
-
a2(t2.condition);
|
|
391
|
-
const i2 = e2.emit(r$1.JUMP_IF_FALSE, -1);
|
|
392
|
-
a2(t2.whenTrue);
|
|
393
|
-
const c2 = e2.emit(r$1.JUMP, -1), m2 = e2.currentAddress();
|
|
394
|
-
e2.patchJump(i2, m2), a2(t2.whenFalse);
|
|
395
|
-
const x = e2.currentAddress();
|
|
396
|
-
e2.patchJump(c2, x);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
return o2.forEachChild((t2) => {
|
|
400
|
-
var i2;
|
|
401
|
-
s__namespace.isFunctionDeclaration(t2) && ((i2 = t2.name) == null ? void 0 : i2.text) === "main" && t2.body && t2.body.statements.forEach((c2) => {
|
|
402
|
-
T(c2);
|
|
441
|
+
const i2 = new R(), r2 = n__namespace.createSourceFile("program.ts", e2, n__namespace.ScriptTarget.Latest, true), a2 = {
|
|
442
|
+
compileStatement: l2,
|
|
443
|
+
compileExpression: S,
|
|
444
|
+
reportError: (o2, c2) => {
|
|
445
|
+
throw new Error(c2);
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
function l2(o2) {
|
|
449
|
+
const c2 = L$1[o2.kind];
|
|
450
|
+
c2 && c2(o2, i2, a2);
|
|
451
|
+
}
|
|
452
|
+
function S(o2) {
|
|
453
|
+
const c2 = v[o2.kind];
|
|
454
|
+
c2 && c2(o2, i2, a2);
|
|
455
|
+
}
|
|
456
|
+
return r2.forEachChild((o2) => {
|
|
457
|
+
var c2;
|
|
458
|
+
n__namespace.isFunctionDeclaration(o2) && ((c2 = o2.name) == null ? void 0 : c2.text) === "main" && o2.body && o2.body.statements.forEach((x2) => {
|
|
459
|
+
l2(x2);
|
|
403
460
|
});
|
|
404
|
-
}),
|
|
461
|
+
}), i2.emit(s$2.HALT), {
|
|
405
462
|
success: true,
|
|
406
|
-
bytecode:
|
|
463
|
+
bytecode: i2.getBytecode(),
|
|
407
464
|
errors: []
|
|
408
465
|
};
|
|
409
466
|
}
|
|
410
|
-
function E(n2, l2) {
|
|
411
|
-
return !!(s__namespace.isStringLiteral(n2) || s__namespace.isStringLiteral(l2) || s__namespace.isBinaryExpression(n2) && n2.operatorToken.kind === s__namespace.SyntaxKind.PlusToken && E(n2.left, n2.right) || s__namespace.isBinaryExpression(l2) && l2.operatorToken.kind === s__namespace.SyntaxKind.PlusToken && E(l2.left, l2.right));
|
|
412
|
-
}
|
|
413
467
|
function n(r2) {
|
|
414
468
|
return typeof r2 == "string";
|
|
415
469
|
}
|
|
@@ -434,7 +488,7 @@ function c$1(r2) {
|
|
|
434
488
|
function y(r2) {
|
|
435
489
|
return i(r2) ? r2 : f(r2) || o(r2) ? false : t(r2) ? r2 !== 0 : n(r2) ? r2 !== "" : e(r2) ? true : !!r2;
|
|
436
490
|
}
|
|
437
|
-
function m(r2) {
|
|
491
|
+
function m$1(r2) {
|
|
438
492
|
return n(r2) ? "string" : t(r2) ? "number" : i(r2) ? "boolean" : f(r2) ? "null" : o(r2) ? "undefined" : e(r2) ? "array" : "unknown";
|
|
439
493
|
}
|
|
440
494
|
function d(r2) {
|
|
@@ -466,7 +520,7 @@ class h {
|
|
|
466
520
|
this.dataDir = t2, this.programsDir = c__namespace.join(t2, "programs"), this.executionsDir = c__namespace.join(t2, "executions"), this.outputsDir = c__namespace.join(t2, "outputs");
|
|
467
521
|
}
|
|
468
522
|
async connect() {
|
|
469
|
-
await
|
|
523
|
+
await P$1.promises.mkdir(this.dataDir, { recursive: true }), await P$1.promises.mkdir(this.programsDir, { recursive: true }), await P$1.promises.mkdir(this.executionsDir, { recursive: true }), await P$1.promises.mkdir(this.outputsDir, { recursive: true }), this.connected = true;
|
|
470
524
|
}
|
|
471
525
|
async disconnect() {
|
|
472
526
|
this.connected = false;
|
|
@@ -477,13 +531,13 @@ class h {
|
|
|
477
531
|
async saveProgram(t2) {
|
|
478
532
|
if (!this.connected) throw new Error("Not connected");
|
|
479
533
|
const n2 = c__namespace.join(this.programsDir, `${t2.id}.json`), e2 = JSON.stringify(t2, null, 2);
|
|
480
|
-
await
|
|
534
|
+
await P$1.promises.writeFile(n2, e2, "utf-8");
|
|
481
535
|
}
|
|
482
536
|
async getProgram(t2) {
|
|
483
537
|
if (!this.connected) throw new Error("Not connected");
|
|
484
538
|
const n2 = c__namespace.join(this.programsDir, `${t2}.json`);
|
|
485
539
|
try {
|
|
486
|
-
const e2 = await
|
|
540
|
+
const e2 = await P$1.promises.readFile(n2, "utf-8"), o2 = JSON.parse(e2);
|
|
487
541
|
return o2.created = new Date(o2.created), o2.updated && (o2.updated = new Date(o2.updated)), o2;
|
|
488
542
|
} catch (e2) {
|
|
489
543
|
if (e2.code === "ENOENT")
|
|
@@ -494,13 +548,13 @@ class h {
|
|
|
494
548
|
async saveExecution(t2) {
|
|
495
549
|
if (!this.connected) throw new Error("Not connected");
|
|
496
550
|
const n2 = c__namespace.join(this.executionsDir, `${t2.id}.json`), e2 = JSON.stringify(t2, null, 2);
|
|
497
|
-
await
|
|
551
|
+
await P$1.promises.writeFile(n2, e2, "utf-8");
|
|
498
552
|
}
|
|
499
553
|
async getExecution(t2) {
|
|
500
554
|
if (!this.connected) throw new Error("Not connected");
|
|
501
555
|
const n2 = c__namespace.join(this.executionsDir, `${t2}.json`);
|
|
502
556
|
try {
|
|
503
|
-
const e2 = await
|
|
557
|
+
const e2 = await P$1.promises.readFile(n2, "utf-8"), o2 = JSON.parse(e2);
|
|
504
558
|
return o2.created = new Date(o2.created), o2.updated && (o2.updated = new Date(o2.updated)), o2;
|
|
505
559
|
} catch (e2) {
|
|
506
560
|
if (e2.code === "ENOENT")
|
|
@@ -513,13 +567,13 @@ class h {
|
|
|
513
567
|
const e2 = c__namespace.join(this.outputsDir, `${t2}.output`), o2 = n2.join(`
|
|
514
568
|
`) + `
|
|
515
569
|
`;
|
|
516
|
-
await
|
|
570
|
+
await P$1.promises.appendFile(e2, o2, "utf-8");
|
|
517
571
|
}
|
|
518
572
|
async getOutput(t2) {
|
|
519
573
|
if (!this.connected) throw new Error("Not connected");
|
|
520
574
|
const n2 = c__namespace.join(this.outputsDir, `${t2}.output`);
|
|
521
575
|
try {
|
|
522
|
-
return (await
|
|
576
|
+
return (await P$1.promises.readFile(n2, "utf-8")).split(`
|
|
523
577
|
`).filter((o2) => o2.length > 0);
|
|
524
578
|
} catch (e2) {
|
|
525
579
|
if (e2.code === "ENOENT")
|
|
@@ -606,736 +660,924 @@ class g {
|
|
|
606
660
|
}
|
|
607
661
|
}
|
|
608
662
|
}
|
|
609
|
-
var
|
|
610
|
-
var
|
|
611
|
-
var
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
663
|
+
var T = Object.defineProperty;
|
|
664
|
+
var w$1 = (e2, r2, t2) => r2 in e2 ? T(e2, r2, { enumerable: true, configurable: true, writable: true, value: t2 }) : e2[r2] = t2;
|
|
665
|
+
var E = (e2, r2, t2) => w$1(e2, typeof r2 != "symbol" ? r2 + "" : r2, t2);
|
|
666
|
+
const C = {
|
|
667
|
+
[s$2.ADD]: {
|
|
668
|
+
stackIn: 2,
|
|
669
|
+
stackOut: 1,
|
|
670
|
+
execute: (e2) => {
|
|
671
|
+
const r2 = e2.stack.pop(), t2 = e2.stack.pop(), s2 = d(t2), c2 = d(r2);
|
|
672
|
+
e2.stack.push(s2 + c2);
|
|
673
|
+
}
|
|
674
|
+
},
|
|
675
|
+
[s$2.SUB]: {
|
|
676
|
+
stackIn: 2,
|
|
677
|
+
stackOut: 1,
|
|
678
|
+
execute: (e2) => {
|
|
679
|
+
const r2 = e2.stack.pop(), t2 = e2.stack.pop(), s2 = d(t2), c2 = d(r2);
|
|
680
|
+
e2.stack.push(s2 - c2);
|
|
681
|
+
}
|
|
682
|
+
},
|
|
683
|
+
[s$2.MUL]: {
|
|
684
|
+
stackIn: 2,
|
|
685
|
+
stackOut: 1,
|
|
686
|
+
execute: (e2) => {
|
|
687
|
+
const r2 = e2.stack.pop(), t2 = e2.stack.pop(), s2 = d(t2), c2 = d(r2);
|
|
688
|
+
e2.stack.push(s2 * c2);
|
|
689
|
+
}
|
|
690
|
+
},
|
|
691
|
+
[s$2.DIV]: {
|
|
692
|
+
stackIn: 2,
|
|
693
|
+
stackOut: 1,
|
|
694
|
+
execute: (e2, r2) => {
|
|
695
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop(), c2 = d(s2), n2 = d(t2);
|
|
696
|
+
if (n2 === 0)
|
|
697
|
+
return {
|
|
698
|
+
type: "DivisionByZero",
|
|
699
|
+
message: "Division by zero",
|
|
700
|
+
pc: e2.pc,
|
|
701
|
+
opcode: r2.op
|
|
702
|
+
};
|
|
703
|
+
e2.stack.push(c2 / n2);
|
|
704
|
+
}
|
|
705
|
+
},
|
|
706
|
+
[s$2.MOD]: {
|
|
707
|
+
stackIn: 2,
|
|
708
|
+
stackOut: 1,
|
|
709
|
+
execute: (e2) => {
|
|
710
|
+
const r2 = e2.stack.pop(), t2 = e2.stack.pop(), s2 = d(t2), c2 = d(r2);
|
|
711
|
+
e2.stack.push(s2 % c2);
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
[s$2.UNARY_MINUS]: {
|
|
715
|
+
stackIn: 1,
|
|
716
|
+
stackOut: 1,
|
|
717
|
+
execute: (e2) => {
|
|
718
|
+
const r2 = e2.stack.pop(), t2 = d(r2);
|
|
719
|
+
e2.stack.push(-t2);
|
|
720
|
+
}
|
|
721
|
+
},
|
|
722
|
+
[s$2.UNARY_PLUS]: {
|
|
723
|
+
stackIn: 1,
|
|
724
|
+
stackOut: 1,
|
|
725
|
+
execute: (e2) => {
|
|
726
|
+
const r2 = e2.stack.pop(), t2 = d(r2);
|
|
727
|
+
e2.stack.push(t2);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}, b = {
|
|
731
|
+
[s$2.PUSH]: {
|
|
732
|
+
stackIn: 0,
|
|
733
|
+
stackOut: 1,
|
|
734
|
+
execute: (e2, r2) => {
|
|
735
|
+
e2.stack.push(r2.arg);
|
|
736
|
+
}
|
|
737
|
+
},
|
|
738
|
+
[s$2.PUSH_UNDEFINED]: {
|
|
739
|
+
stackIn: 0,
|
|
740
|
+
stackOut: 1,
|
|
741
|
+
execute: (e2) => {
|
|
742
|
+
e2.stack.push(s$1());
|
|
743
|
+
}
|
|
744
|
+
},
|
|
745
|
+
[s$2.POP]: {
|
|
746
|
+
stackIn: 1,
|
|
747
|
+
stackOut: 0,
|
|
748
|
+
execute: (e2) => {
|
|
749
|
+
e2.stack.pop();
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}, U = {
|
|
753
|
+
[s$2.PRINT]: {
|
|
754
|
+
stackIn: 1,
|
|
755
|
+
stackOut: 0,
|
|
756
|
+
execute: (e2) => {
|
|
757
|
+
const r2 = e2.stack.pop();
|
|
758
|
+
r2 !== void 0 && e2.output.push(c$1(r2));
|
|
759
|
+
}
|
|
760
|
+
},
|
|
761
|
+
[s$2.CC]: {
|
|
762
|
+
stackIn: 1,
|
|
763
|
+
stackOut: 0,
|
|
764
|
+
controlsPC: true,
|
|
765
|
+
// CC pauses execution
|
|
766
|
+
execute: (e2, r2) => {
|
|
767
|
+
const t2 = e2.stack.pop();
|
|
768
|
+
e2.ccPrompt = c$1(t2), e2.status = "waiting_cc";
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}, G = {
|
|
772
|
+
[s$2.HALT]: {
|
|
773
|
+
stackIn: 0,
|
|
774
|
+
stackOut: 0,
|
|
775
|
+
controlsPC: true,
|
|
776
|
+
execute: (e2) => {
|
|
777
|
+
e2.status = "complete";
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
[s$2.JUMP]: {
|
|
781
|
+
stackIn: 0,
|
|
782
|
+
stackOut: 0,
|
|
783
|
+
controlsPC: true,
|
|
784
|
+
execute: (e2, r2) => {
|
|
785
|
+
if (r2.arg === void 0)
|
|
786
|
+
return {
|
|
787
|
+
type: "RuntimeError",
|
|
788
|
+
message: "JUMP requires a target address",
|
|
789
|
+
pc: e2.pc,
|
|
790
|
+
opcode: r2.op
|
|
791
|
+
};
|
|
792
|
+
const t2 = r2.arg;
|
|
793
|
+
if (t2 < 0)
|
|
794
|
+
return {
|
|
795
|
+
type: "RuntimeError",
|
|
796
|
+
message: `Invalid jump target: ${t2}`,
|
|
797
|
+
pc: e2.pc,
|
|
798
|
+
opcode: r2.op
|
|
799
|
+
};
|
|
800
|
+
e2.pc = t2;
|
|
801
|
+
}
|
|
802
|
+
},
|
|
803
|
+
[s$2.JUMP_IF_FALSE]: {
|
|
804
|
+
stackIn: 1,
|
|
805
|
+
stackOut: 0,
|
|
806
|
+
controlsPC: true,
|
|
807
|
+
execute: (e2, r2) => {
|
|
808
|
+
const t2 = e2.stack.pop();
|
|
809
|
+
if (r2.arg === void 0)
|
|
810
|
+
return {
|
|
811
|
+
type: "RuntimeError",
|
|
812
|
+
message: "JUMP_IF_FALSE requires a target address",
|
|
813
|
+
pc: e2.pc,
|
|
814
|
+
opcode: r2.op
|
|
815
|
+
};
|
|
816
|
+
const s2 = r2.arg;
|
|
817
|
+
if (s2 < 0)
|
|
818
|
+
return {
|
|
819
|
+
type: "RuntimeError",
|
|
820
|
+
message: `Invalid jump target: ${s2}`,
|
|
821
|
+
pc: e2.pc,
|
|
822
|
+
opcode: r2.op
|
|
823
|
+
};
|
|
824
|
+
y(t2) ? e2.pc++ : e2.pc = s2;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}, L = {
|
|
828
|
+
[s$2.LOAD]: {
|
|
829
|
+
stackIn: 0,
|
|
830
|
+
stackOut: 1,
|
|
831
|
+
execute: (e2, r2) => {
|
|
832
|
+
const t2 = r2.arg;
|
|
833
|
+
e2.variables.has(t2) ? e2.stack.push(e2.variables.get(t2)) : e2.stack.push(s$1());
|
|
834
|
+
}
|
|
835
|
+
},
|
|
836
|
+
[s$2.STORE]: {
|
|
837
|
+
stackIn: 1,
|
|
838
|
+
stackOut: 0,
|
|
839
|
+
execute: (e2, r2) => {
|
|
840
|
+
const t2 = e2.stack.pop();
|
|
841
|
+
e2.variables.set(r2.arg, t2);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}, M = {
|
|
845
|
+
[s$2.ITER_START]: {
|
|
846
|
+
stackIn: 1,
|
|
847
|
+
stackOut: 0,
|
|
848
|
+
execute: (e$1, r2) => {
|
|
849
|
+
const t2 = e$1.stack.pop();
|
|
850
|
+
if (t2 == null)
|
|
851
|
+
return {
|
|
852
|
+
type: "TypeError",
|
|
853
|
+
message: "TypeError: Cannot iterate over null or undefined",
|
|
854
|
+
pc: e$1.pc,
|
|
855
|
+
opcode: r2.op
|
|
856
|
+
};
|
|
857
|
+
if (!e(t2))
|
|
858
|
+
return {
|
|
859
|
+
type: "TypeError",
|
|
860
|
+
message: "TypeError: Cannot iterate over non-array value",
|
|
861
|
+
pc: e$1.pc,
|
|
862
|
+
opcode: r2.op
|
|
863
|
+
};
|
|
864
|
+
if (e$1.iterators.length >= 10)
|
|
865
|
+
return {
|
|
866
|
+
type: "RuntimeError",
|
|
867
|
+
message: "RuntimeError: Maximum iterator depth exceeded",
|
|
868
|
+
pc: e$1.pc,
|
|
869
|
+
opcode: r2.op
|
|
870
|
+
};
|
|
871
|
+
e$1.iterators.push({
|
|
872
|
+
array: t2,
|
|
873
|
+
index: 0,
|
|
874
|
+
length: t2.elements.length
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
},
|
|
878
|
+
[s$2.ITER_NEXT]: {
|
|
879
|
+
stackIn: 0,
|
|
880
|
+
stackOut: 2,
|
|
881
|
+
// Pushes element and hasMore flag
|
|
882
|
+
execute: (e2, r2) => {
|
|
883
|
+
if (e2.iterators.length === 0)
|
|
884
|
+
return {
|
|
885
|
+
type: "RuntimeError",
|
|
886
|
+
message: "ITER_NEXT: No active iterator",
|
|
887
|
+
pc: e2.pc,
|
|
888
|
+
opcode: r2.op
|
|
889
|
+
};
|
|
890
|
+
const t2 = e2.iterators[e2.iterators.length - 1];
|
|
891
|
+
t2.index < t2.length ? (t2.index < t2.array.elements.length ? e2.stack.push(t2.array.elements[t2.index]) : e2.stack.push(s$1()), e2.stack.push(true), t2.index++) : (e2.stack.push(null), e2.stack.push(false));
|
|
892
|
+
}
|
|
893
|
+
},
|
|
894
|
+
[s$2.ITER_END]: {
|
|
895
|
+
stackIn: 0,
|
|
896
|
+
stackOut: 0,
|
|
897
|
+
execute: (e2, r2) => {
|
|
898
|
+
if (e2.iterators.length === 0)
|
|
899
|
+
return {
|
|
900
|
+
type: "RuntimeError",
|
|
901
|
+
message: "ITER_END: No active iterator",
|
|
902
|
+
pc: e2.pc,
|
|
903
|
+
opcode: r2.op
|
|
904
|
+
};
|
|
905
|
+
e2.iterators.pop();
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
};
|
|
909
|
+
function m(e2, r2, t2) {
|
|
910
|
+
const s2 = e2.stack.pop(), c2 = e2.stack.pop(), n2 = t2(c2, s2);
|
|
911
|
+
e2.stack.push(n2);
|
|
912
|
+
}
|
|
913
|
+
const V = {
|
|
914
|
+
[s$2.EQ]: {
|
|
915
|
+
stackIn: 2,
|
|
916
|
+
stackOut: 1,
|
|
917
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => {
|
|
918
|
+
if (f(t2) && o(s2) || o(t2) && f(s2))
|
|
919
|
+
return true;
|
|
920
|
+
if (o(t2) && o(s2))
|
|
921
|
+
return true;
|
|
922
|
+
{
|
|
923
|
+
const c2 = d(t2), n2 = d(s2);
|
|
924
|
+
return !isNaN(c2) && !isNaN(n2) ? c2 === n2 : c$1(t2) === c$1(s2);
|
|
925
|
+
}
|
|
926
|
+
})
|
|
927
|
+
},
|
|
928
|
+
[s$2.NEQ]: {
|
|
929
|
+
stackIn: 2,
|
|
930
|
+
stackOut: 1,
|
|
931
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => {
|
|
932
|
+
if (f(t2) && o(s2) || o(t2) && f(s2))
|
|
933
|
+
return false;
|
|
934
|
+
if (o(t2) && o(s2))
|
|
935
|
+
return false;
|
|
936
|
+
{
|
|
937
|
+
const c2 = d(t2), n2 = d(s2);
|
|
938
|
+
return !isNaN(c2) && !isNaN(n2) ? c2 !== n2 : c$1(t2) !== c$1(s2);
|
|
939
|
+
}
|
|
940
|
+
})
|
|
941
|
+
},
|
|
942
|
+
[s$2.LT]: {
|
|
943
|
+
stackIn: 2,
|
|
944
|
+
stackOut: 1,
|
|
945
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => {
|
|
946
|
+
const c2 = d(t2), n2 = d(s2);
|
|
947
|
+
return c2 < n2;
|
|
948
|
+
})
|
|
949
|
+
},
|
|
950
|
+
[s$2.GT]: {
|
|
951
|
+
stackIn: 2,
|
|
952
|
+
stackOut: 1,
|
|
953
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => {
|
|
954
|
+
const c2 = d(t2), n2 = d(s2);
|
|
955
|
+
return c2 > n2;
|
|
956
|
+
})
|
|
957
|
+
},
|
|
958
|
+
[s$2.LTE]: {
|
|
959
|
+
stackIn: 2,
|
|
960
|
+
stackOut: 1,
|
|
961
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => {
|
|
962
|
+
const c2 = d(t2), n2 = d(s2);
|
|
963
|
+
return c2 <= n2;
|
|
964
|
+
})
|
|
965
|
+
},
|
|
966
|
+
[s$2.GTE]: {
|
|
967
|
+
stackIn: 2,
|
|
968
|
+
stackOut: 1,
|
|
969
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => {
|
|
970
|
+
const c2 = d(t2), n2 = d(s2);
|
|
971
|
+
return c2 >= n2;
|
|
972
|
+
})
|
|
973
|
+
},
|
|
974
|
+
[s$2.EQ_STRICT]: {
|
|
975
|
+
stackIn: 2,
|
|
976
|
+
stackOut: 1,
|
|
977
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => t2 === s2)
|
|
978
|
+
},
|
|
979
|
+
[s$2.NEQ_STRICT]: {
|
|
980
|
+
stackIn: 2,
|
|
981
|
+
stackOut: 1,
|
|
982
|
+
execute: (e2, r2) => m(e2, r2, (t2, s2) => t2 !== s2)
|
|
983
|
+
}
|
|
984
|
+
}, F = {
|
|
985
|
+
[s$2.AND]: {
|
|
986
|
+
stackIn: 2,
|
|
987
|
+
stackOut: 1,
|
|
988
|
+
execute: (e2, r2) => {
|
|
989
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop(), c2 = y(s2) ? t2 : s2;
|
|
990
|
+
e2.stack.push(c2);
|
|
991
|
+
}
|
|
992
|
+
},
|
|
993
|
+
[s$2.OR]: {
|
|
994
|
+
stackIn: 2,
|
|
995
|
+
stackOut: 1,
|
|
996
|
+
execute: (e2, r2) => {
|
|
997
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop(), c2 = y(s2) ? s2 : t2;
|
|
998
|
+
e2.stack.push(c2);
|
|
999
|
+
}
|
|
1000
|
+
},
|
|
1001
|
+
[s$2.NOT]: {
|
|
1002
|
+
stackIn: 1,
|
|
1003
|
+
stackOut: 1,
|
|
1004
|
+
execute: (e2, r2) => {
|
|
1005
|
+
const t2 = e2.stack.pop(), s2 = !y(t2);
|
|
1006
|
+
e2.stack.push(s2);
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
}, D = {
|
|
1010
|
+
[s$2.ARRAY_NEW]: {
|
|
1011
|
+
stackIn: 0,
|
|
1012
|
+
stackOut: 1,
|
|
1013
|
+
execute: (e2, r2) => {
|
|
1014
|
+
e2.stack.push(p$1());
|
|
1015
|
+
}
|
|
1016
|
+
},
|
|
1017
|
+
[s$2.ARRAY_PUSH]: {
|
|
1018
|
+
stackIn: 2,
|
|
1019
|
+
stackOut: 1,
|
|
1020
|
+
execute: (e$1, r2) => {
|
|
1021
|
+
const t2 = e$1.stack.pop(), s2 = e$1.stack.pop();
|
|
1022
|
+
if (!e(s2))
|
|
1023
|
+
return {
|
|
1024
|
+
type: "RuntimeError",
|
|
1025
|
+
message: "ARRAY_PUSH requires an array",
|
|
1026
|
+
pc: e$1.pc,
|
|
1027
|
+
opcode: r2.op
|
|
1028
|
+
};
|
|
1029
|
+
s2.elements.push(t2), e$1.stack.push(s2);
|
|
1030
|
+
}
|
|
1031
|
+
},
|
|
1032
|
+
[s$2.ARRAY_GET]: {
|
|
1033
|
+
stackIn: 2,
|
|
1034
|
+
stackOut: 1,
|
|
1035
|
+
execute: (e$1, r2) => {
|
|
1036
|
+
const t$1 = e$1.stack.pop(), s2 = e$1.stack.pop();
|
|
1037
|
+
if (!e(s2))
|
|
1038
|
+
return {
|
|
1039
|
+
type: "RuntimeError",
|
|
1040
|
+
message: "ARRAY_GET requires an array",
|
|
1041
|
+
pc: e$1.pc,
|
|
1042
|
+
opcode: r2.op
|
|
1043
|
+
};
|
|
1044
|
+
if (!t(t$1))
|
|
1045
|
+
return {
|
|
1046
|
+
type: "RuntimeError",
|
|
1047
|
+
message: "ARRAY_GET requires numeric index",
|
|
1048
|
+
pc: e$1.pc,
|
|
1049
|
+
opcode: r2.op
|
|
1050
|
+
};
|
|
1051
|
+
const c2 = s2.elements[t$1] ?? null;
|
|
1052
|
+
e$1.stack.push(c2);
|
|
1053
|
+
}
|
|
1054
|
+
},
|
|
1055
|
+
[s$2.ARRAY_SET]: {
|
|
1056
|
+
stackIn: 3,
|
|
1057
|
+
stackOut: 0,
|
|
1058
|
+
execute: (e$1, r2) => {
|
|
1059
|
+
const t$1 = e$1.stack.pop(), s2 = e$1.stack.pop(), c2 = e$1.stack.pop();
|
|
1060
|
+
if (!e(c2))
|
|
1061
|
+
return {
|
|
1062
|
+
type: "RuntimeError",
|
|
1063
|
+
message: "ARRAY_SET requires an array",
|
|
1064
|
+
pc: e$1.pc,
|
|
1065
|
+
opcode: r2.op
|
|
1066
|
+
};
|
|
1067
|
+
if (!t(s2))
|
|
1068
|
+
return {
|
|
1069
|
+
type: "RuntimeError",
|
|
1070
|
+
message: "ARRAY_SET requires numeric index",
|
|
1071
|
+
pc: e$1.pc,
|
|
1072
|
+
opcode: r2.op
|
|
1073
|
+
};
|
|
1074
|
+
const n2 = Math.floor(s2);
|
|
1075
|
+
if (n2 < 0)
|
|
1076
|
+
return {
|
|
1077
|
+
type: "RuntimeError",
|
|
1078
|
+
message: "ARRAY_SET: Negative index not allowed",
|
|
1079
|
+
pc: e$1.pc,
|
|
1080
|
+
opcode: r2.op
|
|
1081
|
+
};
|
|
1082
|
+
c2.elements[n2] = t$1;
|
|
1083
|
+
}
|
|
1084
|
+
},
|
|
1085
|
+
[s$2.ARRAY_LEN]: {
|
|
1086
|
+
stackIn: 1,
|
|
1087
|
+
stackOut: 1,
|
|
1088
|
+
execute: (e$1, r2) => {
|
|
1089
|
+
const t2 = e$1.stack.pop();
|
|
1090
|
+
if (!e(t2))
|
|
1091
|
+
return {
|
|
1092
|
+
type: "RuntimeError",
|
|
1093
|
+
message: "ARRAY_LEN requires an array",
|
|
1094
|
+
pc: e$1.pc,
|
|
1095
|
+
opcode: r2.op
|
|
1096
|
+
};
|
|
1097
|
+
e$1.stack.push(t2.elements.length);
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
}, q = {
|
|
1101
|
+
[s$2.CONCAT]: {
|
|
1102
|
+
stackIn: 2,
|
|
1103
|
+
stackOut: 1,
|
|
1104
|
+
execute: (e2, r2) => {
|
|
1105
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop();
|
|
1106
|
+
e2.stack.push(c$1(s2) + c$1(t2));
|
|
1107
|
+
}
|
|
1108
|
+
},
|
|
1109
|
+
[s$2.STRING_LEN]: {
|
|
1110
|
+
stackIn: 1,
|
|
1111
|
+
stackOut: 1,
|
|
1112
|
+
execute: (e2, r2) => {
|
|
1113
|
+
const t2 = e2.stack.pop();
|
|
1114
|
+
if (!n(t2))
|
|
1115
|
+
return {
|
|
1116
|
+
type: "RuntimeError",
|
|
1117
|
+
message: "STRING_LEN requires a string",
|
|
1118
|
+
pc: e2.pc,
|
|
1119
|
+
opcode: r2.op
|
|
1120
|
+
};
|
|
1121
|
+
e2.stack.push(t2.length);
|
|
1122
|
+
}
|
|
1123
|
+
},
|
|
1124
|
+
[s$2.LENGTH]: {
|
|
1125
|
+
stackIn: 1,
|
|
1126
|
+
stackOut: 1,
|
|
1127
|
+
execute: (e$1, r2) => {
|
|
1128
|
+
const t2 = e$1.stack.pop();
|
|
1129
|
+
if (n(t2))
|
|
1130
|
+
e$1.stack.push(t2.length);
|
|
1131
|
+
else if (e(t2))
|
|
1132
|
+
e$1.stack.push(t2.elements.length);
|
|
1133
|
+
else
|
|
1134
|
+
return {
|
|
1135
|
+
type: "RuntimeError",
|
|
1136
|
+
message: "LENGTH requires a string or array",
|
|
1137
|
+
pc: e$1.pc,
|
|
1138
|
+
opcode: r2.op
|
|
1139
|
+
};
|
|
1140
|
+
}
|
|
1141
|
+
},
|
|
1142
|
+
[s$2.JSON_PARSE]: {
|
|
1143
|
+
stackIn: 1,
|
|
1144
|
+
stackOut: 1,
|
|
1145
|
+
execute: (e2, r2) => {
|
|
1146
|
+
const t2 = e2.stack.pop();
|
|
1147
|
+
if (!n(t2))
|
|
1148
|
+
return {
|
|
1149
|
+
type: "RuntimeError",
|
|
1150
|
+
message: "JSON_PARSE requires a string",
|
|
1151
|
+
pc: e2.pc,
|
|
1152
|
+
opcode: r2.op
|
|
1153
|
+
};
|
|
1154
|
+
try {
|
|
1155
|
+
const s2 = JSON.parse(t2);
|
|
1156
|
+
Array.isArray(s2) ? e2.stack.push(p$1(s2)) : e2.stack.push(p$1());
|
|
1157
|
+
} catch {
|
|
1158
|
+
e2.stack.push(p$1());
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
},
|
|
1162
|
+
[s$2.TYPEOF]: {
|
|
1163
|
+
stackIn: 1,
|
|
1164
|
+
stackOut: 1,
|
|
1165
|
+
execute: (e2, r2) => {
|
|
1166
|
+
const t2 = e2.stack.pop();
|
|
1167
|
+
e2.stack.push(m$1(t2));
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
}, H = {
|
|
1171
|
+
[s$2.INC]: {
|
|
1172
|
+
stackIn: 1,
|
|
1173
|
+
stackOut: 1,
|
|
1174
|
+
execute: (e2, r2) => {
|
|
1175
|
+
const t2 = e2.stack.pop();
|
|
1176
|
+
if (typeof t2 != "string")
|
|
1177
|
+
return {
|
|
1178
|
+
type: "RuntimeError",
|
|
1179
|
+
message: "INC: Invalid variable name",
|
|
1180
|
+
pc: e2.pc,
|
|
1181
|
+
opcode: r2.op
|
|
1182
|
+
};
|
|
1183
|
+
const s2 = e2.variables.get(t2) ?? 0, c2 = d(s2) + 1;
|
|
1184
|
+
e2.variables.set(t2, c2);
|
|
1185
|
+
const n2 = r2.arg === true;
|
|
1186
|
+
e2.stack.push(n2 ? d(s2) : c2);
|
|
1187
|
+
}
|
|
1188
|
+
},
|
|
1189
|
+
[s$2.DEC]: {
|
|
1190
|
+
stackIn: 1,
|
|
1191
|
+
stackOut: 1,
|
|
1192
|
+
execute: (e2, r2) => {
|
|
1193
|
+
const t2 = e2.stack.pop();
|
|
1194
|
+
if (typeof t2 != "string")
|
|
1195
|
+
return {
|
|
1196
|
+
type: "RuntimeError",
|
|
1197
|
+
message: "DEC: Invalid variable name",
|
|
1198
|
+
pc: e2.pc,
|
|
1199
|
+
opcode: r2.op
|
|
1200
|
+
};
|
|
1201
|
+
const s2 = e2.variables.get(t2) ?? 0, c2 = d(s2) - 1;
|
|
1202
|
+
e2.variables.set(t2, c2);
|
|
1203
|
+
const n2 = r2.arg === true;
|
|
1204
|
+
e2.stack.push(n2 ? d(s2) : c2);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
}, Y = {
|
|
1208
|
+
[s$2.RETURN]: {
|
|
1209
|
+
stackIn: 0,
|
|
1210
|
+
stackOut: 0,
|
|
1211
|
+
controlsPC: true,
|
|
1212
|
+
execute: (e2, r2) => {
|
|
1213
|
+
const t2 = e2.stack.pop() ?? null;
|
|
1214
|
+
e2.returnValue = t2, e2.status = "complete";
|
|
1215
|
+
}
|
|
1216
|
+
},
|
|
1217
|
+
[s$2.BREAK]: {
|
|
1218
|
+
stackIn: 0,
|
|
1219
|
+
stackOut: 0,
|
|
1220
|
+
controlsPC: true,
|
|
1221
|
+
execute: (e2, r2) => {
|
|
1222
|
+
if (r2.arg === void 0)
|
|
1223
|
+
return {
|
|
1224
|
+
type: "RuntimeError",
|
|
1225
|
+
message: "BREAK requires a target address",
|
|
1226
|
+
pc: e2.pc,
|
|
1227
|
+
opcode: r2.op
|
|
1228
|
+
};
|
|
1229
|
+
const t2 = r2.arg;
|
|
1230
|
+
if (t2 < 0)
|
|
1231
|
+
return {
|
|
1232
|
+
type: "RuntimeError",
|
|
1233
|
+
message: `Invalid break target: ${t2}`,
|
|
1234
|
+
pc: e2.pc,
|
|
1235
|
+
opcode: r2.op
|
|
1236
|
+
};
|
|
1237
|
+
e2.pc = t2;
|
|
1238
|
+
}
|
|
1239
|
+
},
|
|
1240
|
+
[s$2.CONTINUE]: {
|
|
1241
|
+
stackIn: 0,
|
|
1242
|
+
stackOut: 0,
|
|
1243
|
+
controlsPC: true,
|
|
1244
|
+
execute: (e2, r2) => {
|
|
1245
|
+
if (r2.arg === void 0)
|
|
1246
|
+
return {
|
|
1247
|
+
type: "RuntimeError",
|
|
1248
|
+
message: "CONTINUE requires a target address",
|
|
1249
|
+
pc: e2.pc,
|
|
1250
|
+
opcode: r2.op
|
|
1251
|
+
};
|
|
1252
|
+
const t2 = r2.arg;
|
|
1253
|
+
if (t2 < 0)
|
|
1254
|
+
return {
|
|
1255
|
+
type: "RuntimeError",
|
|
1256
|
+
message: `Invalid continue target: ${t2}`,
|
|
1257
|
+
pc: e2.pc,
|
|
1258
|
+
opcode: r2.op
|
|
1259
|
+
};
|
|
1260
|
+
e2.pc = t2;
|
|
1261
|
+
}
|
|
1262
|
+
},
|
|
1263
|
+
[s$2.FS_LIST_FILES]: {
|
|
1264
|
+
stackIn: 1,
|
|
1265
|
+
// Minimum 1 argument (path), optionally 2 (path + options)
|
|
1266
|
+
stackOut: 0,
|
|
1267
|
+
controlsPC: true,
|
|
1268
|
+
execute: (e$1, r2) => {
|
|
1269
|
+
if (e$1.stack.length < 1)
|
|
1270
|
+
return {
|
|
1271
|
+
type: "StackUnderflow",
|
|
1272
|
+
message: "FS_LIST_FILES: Stack underflow",
|
|
1273
|
+
pc: e$1.pc,
|
|
1274
|
+
opcode: r2.op
|
|
1275
|
+
};
|
|
1276
|
+
let t2, s2 = {};
|
|
1277
|
+
const c2 = e$1.stack[e$1.stack.length - 1];
|
|
1278
|
+
if (e$1.stack.length >= 2 && typeof c2 == "object" && c2 !== null && !e(c2) && (s2 = e$1.stack.pop()), t2 = e$1.stack.pop(), !n(t2))
|
|
1279
|
+
return {
|
|
1280
|
+
type: "RuntimeError",
|
|
1281
|
+
message: "FS_LIST_FILES requires a string path",
|
|
1282
|
+
pc: e$1.pc,
|
|
1283
|
+
opcode: r2.op
|
|
1284
|
+
};
|
|
1285
|
+
e$1.fsOperation = {
|
|
1286
|
+
type: "listFiles",
|
|
1287
|
+
path: t2,
|
|
1288
|
+
options: s2
|
|
1289
|
+
}, e$1.status = "waiting_fs";
|
|
1290
|
+
}
|
|
1291
|
+
},
|
|
1292
|
+
// String method handlers
|
|
1293
|
+
[s$2.STRING_SUBSTRING]: {
|
|
1294
|
+
stackIn: 2,
|
|
1295
|
+
// Minimum 2 (string, start), optionally 3 (string, start, end)
|
|
1296
|
+
stackOut: 1,
|
|
1297
|
+
execute: (e2, r2) => {
|
|
1298
|
+
if (e2.stack.length < 2)
|
|
1299
|
+
return {
|
|
1300
|
+
type: "StackUnderflow",
|
|
1301
|
+
message: "STRING_SUBSTRING: Stack underflow",
|
|
1302
|
+
pc: e2.pc,
|
|
1303
|
+
opcode: r2.op
|
|
1304
|
+
};
|
|
1305
|
+
const t2 = e2.stack.length;
|
|
1306
|
+
let s2, c2, n$12;
|
|
1307
|
+
const a2 = e2.stack[t2 - 1], i2 = e2.stack[t2 - 2];
|
|
1308
|
+
if (t2 >= 3 && typeof a2 == "number" && typeof i2 == "number" ? (n$12 = e2.stack.pop(), c2 = e2.stack.pop(), s2 = e2.stack.pop()) : (c2 = e2.stack.pop(), s2 = e2.stack.pop(), n$12 = void 0), !n(s2))
|
|
1309
|
+
return {
|
|
1310
|
+
type: "RuntimeError",
|
|
1311
|
+
message: "STRING_SUBSTRING requires a string",
|
|
1312
|
+
pc: e2.pc,
|
|
1313
|
+
opcode: r2.op
|
|
1314
|
+
};
|
|
1315
|
+
if (typeof c2 != "number")
|
|
1316
|
+
return {
|
|
1317
|
+
type: "RuntimeError",
|
|
1318
|
+
message: "STRING_SUBSTRING requires numeric start index",
|
|
1319
|
+
pc: e2.pc,
|
|
1320
|
+
opcode: r2.op
|
|
1321
|
+
};
|
|
1322
|
+
const p2 = s2.length;
|
|
1323
|
+
c2 < 0 && (c2 = Math.max(0, p2 + c2)), n$12 !== void 0 && n$12 < 0 && (n$12 = Math.max(0, p2 + n$12));
|
|
1324
|
+
const I2 = n$12 !== void 0 ? s2.substring(c2, n$12) : s2.substring(c2);
|
|
1325
|
+
e2.stack.push(I2);
|
|
1326
|
+
}
|
|
1327
|
+
},
|
|
1328
|
+
[s$2.STRING_INDEXOF]: {
|
|
1329
|
+
stackIn: 2,
|
|
1330
|
+
stackOut: 1,
|
|
1331
|
+
execute: (e2, r2) => {
|
|
1332
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop();
|
|
1333
|
+
if (!n(s2) || !n(t2))
|
|
1334
|
+
return {
|
|
1335
|
+
type: "RuntimeError",
|
|
1336
|
+
message: "STRING_INDEXOF requires string arguments",
|
|
1337
|
+
pc: e2.pc,
|
|
1338
|
+
opcode: r2.op
|
|
1339
|
+
};
|
|
1340
|
+
e2.stack.push(s2.indexOf(t2));
|
|
1341
|
+
}
|
|
1342
|
+
},
|
|
1343
|
+
[s$2.STRING_SPLIT]: {
|
|
1344
|
+
stackIn: 2,
|
|
1345
|
+
stackOut: 1,
|
|
1346
|
+
execute: (e2, r2) => {
|
|
1347
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop();
|
|
1348
|
+
if (!n(s2) || !n(t2))
|
|
1349
|
+
return {
|
|
1350
|
+
type: "RuntimeError",
|
|
1351
|
+
message: "STRING_SPLIT requires string arguments",
|
|
1352
|
+
pc: e2.pc,
|
|
1353
|
+
opcode: r2.op
|
|
1354
|
+
};
|
|
1355
|
+
let c2;
|
|
1356
|
+
t2 === "" ? c2 = s2.split("") : c2 = s2.split(t2), e2.stack.push(p$1(c2));
|
|
1357
|
+
}
|
|
1358
|
+
},
|
|
1359
|
+
[s$2.STRING_SLICE]: {
|
|
1360
|
+
stackIn: 2,
|
|
1361
|
+
// Minimum 2 (string, start), optionally 3 (string, start, end)
|
|
1362
|
+
stackOut: 1,
|
|
1363
|
+
execute: (e2, r2) => {
|
|
1364
|
+
if (e2.stack.length < 2)
|
|
1365
|
+
return {
|
|
1366
|
+
type: "StackUnderflow",
|
|
1367
|
+
message: "STRING_SLICE: Stack underflow",
|
|
1368
|
+
pc: e2.pc,
|
|
1369
|
+
opcode: r2.op
|
|
1370
|
+
};
|
|
1371
|
+
const t2 = e2.stack.length;
|
|
1372
|
+
let s2, c2, n$12;
|
|
1373
|
+
const a2 = e2.stack.length >= 1 ? e2.stack[t2 - 1] : void 0, i2 = e2.stack.length >= 2 ? e2.stack[t2 - 2] : void 0;
|
|
1374
|
+
if (t2 >= 3 && typeof a2 == "number" && typeof i2 == "number" ? (n$12 = e2.stack.pop(), c2 = e2.stack.pop(), s2 = e2.stack.pop()) : (c2 = e2.stack.pop(), s2 = e2.stack.pop(), n$12 = void 0), !n(s2))
|
|
1375
|
+
return {
|
|
1376
|
+
type: "RuntimeError",
|
|
1377
|
+
message: "STRING_SLICE requires a string",
|
|
1378
|
+
pc: e2.pc,
|
|
1379
|
+
opcode: r2.op
|
|
1380
|
+
};
|
|
1381
|
+
if (typeof c2 != "number")
|
|
1382
|
+
return {
|
|
1383
|
+
type: "RuntimeError",
|
|
1384
|
+
message: "STRING_SLICE requires numeric start index",
|
|
1385
|
+
pc: e2.pc,
|
|
1386
|
+
opcode: r2.op
|
|
1387
|
+
};
|
|
1388
|
+
const p2 = n$12 !== void 0 ? s2.slice(c2, n$12) : s2.slice(c2);
|
|
1389
|
+
e2.stack.push(p2);
|
|
1390
|
+
}
|
|
1391
|
+
},
|
|
1392
|
+
[s$2.STRING_CHARAT]: {
|
|
1393
|
+
stackIn: 2,
|
|
1394
|
+
stackOut: 1,
|
|
1395
|
+
execute: (e2, r2) => {
|
|
1396
|
+
const t2 = e2.stack.pop(), s2 = e2.stack.pop();
|
|
1397
|
+
if (!n(s2))
|
|
1398
|
+
return {
|
|
1399
|
+
type: "RuntimeError",
|
|
1400
|
+
message: "STRING_CHARAT requires a string",
|
|
1401
|
+
pc: e2.pc,
|
|
1402
|
+
opcode: r2.op
|
|
1403
|
+
};
|
|
1404
|
+
if (typeof t2 != "number")
|
|
1405
|
+
return {
|
|
1406
|
+
type: "RuntimeError",
|
|
1407
|
+
message: "STRING_CHARAT requires numeric index",
|
|
1408
|
+
pc: e2.pc,
|
|
1409
|
+
opcode: r2.op
|
|
1410
|
+
};
|
|
1411
|
+
const c2 = s2.charAt(t2);
|
|
1412
|
+
e2.stack.push(c2);
|
|
1413
|
+
}
|
|
1414
|
+
},
|
|
1415
|
+
[s$2.STRING_TOUPPERCASE]: {
|
|
1416
|
+
stackIn: 1,
|
|
1417
|
+
stackOut: 1,
|
|
1418
|
+
execute: (e2, r2) => {
|
|
1419
|
+
const t2 = e2.stack.pop();
|
|
1420
|
+
if (!n(t2))
|
|
1421
|
+
return {
|
|
1422
|
+
type: "RuntimeError",
|
|
1423
|
+
message: "STRING_TOUPPERCASE requires a string",
|
|
1424
|
+
pc: e2.pc,
|
|
1425
|
+
opcode: r2.op
|
|
1426
|
+
};
|
|
1427
|
+
e2.stack.push(t2.toUpperCase());
|
|
1428
|
+
}
|
|
1429
|
+
},
|
|
1430
|
+
[s$2.STRING_TOLOWERCASE]: {
|
|
1431
|
+
stackIn: 1,
|
|
1432
|
+
stackOut: 1,
|
|
1433
|
+
execute: (e2, r2) => {
|
|
1434
|
+
const t2 = e2.stack.pop();
|
|
1435
|
+
if (!n(t2))
|
|
1436
|
+
return {
|
|
1437
|
+
type: "RuntimeError",
|
|
1438
|
+
message: "STRING_TOLOWERCASE requires a string",
|
|
1439
|
+
pc: e2.pc,
|
|
1440
|
+
opcode: r2.op
|
|
1441
|
+
};
|
|
1442
|
+
e2.stack.push(t2.toLowerCase());
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
}, $ = {
|
|
1446
|
+
...C,
|
|
1447
|
+
...b,
|
|
1448
|
+
...U,
|
|
1449
|
+
...G,
|
|
1450
|
+
...L,
|
|
1451
|
+
...M,
|
|
1452
|
+
...V,
|
|
1453
|
+
...F,
|
|
1454
|
+
...D,
|
|
1455
|
+
...q,
|
|
1456
|
+
...H,
|
|
1457
|
+
...Y
|
|
1458
|
+
};
|
|
1459
|
+
class N {
|
|
1460
|
+
validateStack(r2, t2, s2) {
|
|
1461
|
+
if (s2.stack.length < r2.stackIn)
|
|
1462
|
+
return {
|
|
1463
|
+
type: "StackUnderflow",
|
|
1464
|
+
message: `${s$2[t2.op]}: Stack underflow`,
|
|
1465
|
+
pc: s2.pc,
|
|
1466
|
+
opcode: t2.op
|
|
1467
|
+
};
|
|
1468
|
+
}
|
|
1469
|
+
execute(r2, t2) {
|
|
1470
|
+
const s2 = {
|
|
1471
|
+
pc: (t2 == null ? void 0 : t2.pc) ?? 0,
|
|
1472
|
+
stack: (t2 == null ? void 0 : t2.stack) ?? [],
|
|
1473
|
+
variables: (t2 == null ? void 0 : t2.variables) ?? /* @__PURE__ */ new Map(),
|
|
618
1474
|
status: "running",
|
|
619
|
-
output: (
|
|
620
|
-
iterators: (
|
|
621
|
-
...
|
|
1475
|
+
output: (t2 == null ? void 0 : t2.output) ?? [],
|
|
1476
|
+
iterators: (t2 == null ? void 0 : t2.iterators) ?? [],
|
|
1477
|
+
...t2
|
|
622
1478
|
};
|
|
623
|
-
for (;
|
|
624
|
-
const
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
case r$1.PUSH:
|
|
630
|
-
r2.stack.push(n$1.arg), r2.pc++;
|
|
631
|
-
break;
|
|
632
|
-
case r$1.PUSH_UNDEFINED:
|
|
633
|
-
r2.stack.push(s$1()), r2.pc++;
|
|
634
|
-
break;
|
|
635
|
-
case r$1.POP:
|
|
636
|
-
r2.stack.pop(), r2.pc++;
|
|
637
|
-
break;
|
|
638
|
-
case r$1.LOAD: {
|
|
639
|
-
const t2 = n$1.arg;
|
|
640
|
-
r2.variables.has(t2) ? r2.stack.push(r2.variables.get(t2)) : r2.stack.push(s$1()), r2.pc++;
|
|
641
|
-
break;
|
|
642
|
-
}
|
|
643
|
-
case r$1.STORE:
|
|
644
|
-
const f$1 = r2.stack.pop();
|
|
645
|
-
if (f$1 === void 0) {
|
|
646
|
-
r2.status = "error", r2.error = "STORE: Stack underflow";
|
|
647
|
-
break;
|
|
648
|
-
}
|
|
649
|
-
r2.variables.set(n$1.arg, f$1), r2.pc++;
|
|
650
|
-
break;
|
|
651
|
-
case r$1.CONCAT:
|
|
652
|
-
const u2 = r2.stack.pop(), l2 = r2.stack.pop();
|
|
653
|
-
if (l2 === void 0 || u2 === void 0) {
|
|
654
|
-
r2.status = "error", r2.error = "CONCAT: Stack underflow";
|
|
655
|
-
break;
|
|
656
|
-
}
|
|
657
|
-
r2.stack.push(c$1(l2) + c$1(u2)), r2.pc++;
|
|
658
|
-
break;
|
|
659
|
-
case r$1.PRINT:
|
|
660
|
-
const k2 = r2.stack.pop();
|
|
661
|
-
k2 !== void 0 && r2.output.push(c$1(k2)), r2.pc++;
|
|
662
|
-
break;
|
|
663
|
-
case r$1.CC: {
|
|
664
|
-
const t2 = r2.stack.pop();
|
|
665
|
-
if (t2 === void 0) {
|
|
666
|
-
r2.status = "error", r2.error = "CC: Stack underflow";
|
|
667
|
-
break;
|
|
668
|
-
}
|
|
669
|
-
r2.ccPrompt = c$1(t2), r2.status = "waiting_cc";
|
|
670
|
-
break;
|
|
671
|
-
}
|
|
672
|
-
// Array operations
|
|
673
|
-
case r$1.ARRAY_NEW:
|
|
674
|
-
r2.stack.push(p$1()), r2.pc++;
|
|
675
|
-
break;
|
|
676
|
-
case r$1.ARRAY_PUSH: {
|
|
677
|
-
const t2 = r2.stack.pop(), e$1 = r2.stack.pop();
|
|
678
|
-
if (t2 === void 0 || e$1 === void 0) {
|
|
679
|
-
r2.status = "error", r2.error = "ARRAY_PUSH: Stack underflow";
|
|
680
|
-
break;
|
|
681
|
-
}
|
|
682
|
-
if (!e(e$1)) {
|
|
683
|
-
r2.status = "error", r2.error = "ARRAY_PUSH requires an array";
|
|
684
|
-
break;
|
|
685
|
-
}
|
|
686
|
-
e$1.elements.push(t2), r2.stack.push(e$1), r2.pc++;
|
|
687
|
-
break;
|
|
688
|
-
}
|
|
689
|
-
case r$1.ARRAY_GET: {
|
|
690
|
-
const t$1 = r2.stack.pop(), e$1 = r2.stack.pop();
|
|
691
|
-
if (t$1 === void 0 || e$1 === void 0) {
|
|
692
|
-
r2.status = "error", r2.error = "ARRAY_GET: Stack underflow";
|
|
693
|
-
break;
|
|
694
|
-
}
|
|
695
|
-
if (!e(e$1)) {
|
|
696
|
-
r2.status = "error", r2.error = "ARRAY_GET requires an array";
|
|
697
|
-
break;
|
|
698
|
-
}
|
|
699
|
-
if (!t(t$1)) {
|
|
700
|
-
r2.status = "error", r2.error = "ARRAY_GET requires numeric index";
|
|
701
|
-
break;
|
|
702
|
-
}
|
|
703
|
-
const o2 = e$1.elements[t$1] ?? null;
|
|
704
|
-
r2.stack.push(o2), r2.pc++;
|
|
705
|
-
break;
|
|
706
|
-
}
|
|
707
|
-
case r$1.ARRAY_SET: {
|
|
708
|
-
const t$1 = r2.stack.pop(), e$1 = r2.stack.pop(), o2 = r2.stack.pop();
|
|
709
|
-
if (t$1 === void 0 || e$1 === void 0 || o2 === void 0) {
|
|
710
|
-
r2.status = "error", r2.error = "ARRAY_SET: Stack underflow";
|
|
711
|
-
break;
|
|
712
|
-
}
|
|
713
|
-
if (!e(o2)) {
|
|
714
|
-
r2.status = "error", r2.error = "ARRAY_SET requires an array";
|
|
715
|
-
break;
|
|
716
|
-
}
|
|
717
|
-
if (!t(e$1)) {
|
|
718
|
-
r2.status = "error", r2.error = "ARRAY_SET requires numeric index";
|
|
719
|
-
break;
|
|
720
|
-
}
|
|
721
|
-
const i2 = Math.floor(e$1);
|
|
722
|
-
if (i2 < 0) {
|
|
723
|
-
r2.status = "error", r2.error = "ARRAY_SET: Negative index not allowed";
|
|
724
|
-
break;
|
|
725
|
-
}
|
|
726
|
-
o2.elements[i2] = t$1, r2.pc++;
|
|
727
|
-
break;
|
|
728
|
-
}
|
|
729
|
-
case r$1.ARRAY_LEN: {
|
|
730
|
-
const t2 = r2.stack.pop();
|
|
731
|
-
if (t2 === void 0) {
|
|
732
|
-
r2.status = "error", r2.error = "ARRAY_LEN: Stack underflow";
|
|
733
|
-
break;
|
|
734
|
-
}
|
|
735
|
-
if (!e(t2)) {
|
|
736
|
-
r2.status = "error", r2.error = "ARRAY_LEN requires an array";
|
|
737
|
-
break;
|
|
738
|
-
}
|
|
739
|
-
r2.stack.push(t2.elements.length), r2.pc++;
|
|
740
|
-
break;
|
|
741
|
-
}
|
|
742
|
-
case r$1.STRING_LEN: {
|
|
743
|
-
const t2 = r2.stack.pop();
|
|
744
|
-
if (t2 === void 0) {
|
|
745
|
-
r2.status = "error", r2.error = "STRING_LEN: Stack underflow";
|
|
746
|
-
break;
|
|
747
|
-
}
|
|
748
|
-
if (!n(t2)) {
|
|
749
|
-
r2.status = "error", r2.error = "STRING_LEN requires a string";
|
|
750
|
-
break;
|
|
751
|
-
}
|
|
752
|
-
r2.stack.push(t2.length), r2.pc++;
|
|
753
|
-
break;
|
|
754
|
-
}
|
|
755
|
-
case r$1.LENGTH: {
|
|
756
|
-
const t2 = r2.stack.pop();
|
|
757
|
-
if (t2 === void 0) {
|
|
758
|
-
r2.status = "error", r2.error = "LENGTH: Stack underflow";
|
|
759
|
-
break;
|
|
760
|
-
}
|
|
761
|
-
if (n(t2))
|
|
762
|
-
r2.stack.push(t2.length);
|
|
763
|
-
else if (e(t2))
|
|
764
|
-
r2.stack.push(t2.elements.length);
|
|
765
|
-
else {
|
|
766
|
-
r2.status = "error", r2.error = "LENGTH requires a string or array";
|
|
767
|
-
break;
|
|
768
|
-
}
|
|
769
|
-
r2.pc++;
|
|
770
|
-
break;
|
|
771
|
-
}
|
|
772
|
-
case r$1.JSON_PARSE: {
|
|
773
|
-
const t2 = r2.stack.pop();
|
|
774
|
-
if (t2 === void 0) {
|
|
775
|
-
r2.status = "error", r2.error = "JSON_PARSE: Stack underflow";
|
|
776
|
-
break;
|
|
777
|
-
}
|
|
778
|
-
if (!n(t2)) {
|
|
779
|
-
r2.status = "error", r2.error = "JSON_PARSE requires a string";
|
|
780
|
-
break;
|
|
781
|
-
}
|
|
782
|
-
try {
|
|
783
|
-
const e2 = JSON.parse(t2);
|
|
784
|
-
Array.isArray(e2) ? r2.stack.push(p$1(e2)) : r2.stack.push(p$1());
|
|
785
|
-
} catch {
|
|
786
|
-
r2.stack.push(p$1());
|
|
787
|
-
}
|
|
788
|
-
r2.pc++;
|
|
789
|
-
break;
|
|
790
|
-
}
|
|
791
|
-
case r$1.TYPEOF: {
|
|
792
|
-
const t2 = r2.stack.pop();
|
|
793
|
-
if (t2 === void 0) {
|
|
794
|
-
r2.status = "error", r2.error = "TYPEOF: Stack underflow";
|
|
795
|
-
break;
|
|
796
|
-
}
|
|
797
|
-
r2.stack.push(m(t2)), r2.pc++;
|
|
798
|
-
break;
|
|
799
|
-
}
|
|
800
|
-
// Arithmetic operations
|
|
801
|
-
case r$1.ADD: {
|
|
802
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
803
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
804
|
-
r2.status = "error", r2.error = "ADD: Stack underflow";
|
|
805
|
-
break;
|
|
806
|
-
}
|
|
807
|
-
const o2 = d(e2), i2 = d(t2);
|
|
808
|
-
r2.stack.push(o2 + i2), r2.pc++;
|
|
809
|
-
break;
|
|
810
|
-
}
|
|
811
|
-
case r$1.SUB: {
|
|
812
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
813
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
814
|
-
r2.status = "error", r2.error = "SUB: Stack underflow";
|
|
815
|
-
break;
|
|
816
|
-
}
|
|
817
|
-
const o2 = d(e2), i2 = d(t2);
|
|
818
|
-
r2.stack.push(o2 - i2), r2.pc++;
|
|
819
|
-
break;
|
|
820
|
-
}
|
|
821
|
-
case r$1.MUL: {
|
|
822
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
823
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
824
|
-
r2.status = "error", r2.error = "MUL: Stack underflow";
|
|
825
|
-
break;
|
|
826
|
-
}
|
|
827
|
-
const o2 = d(e2), i2 = d(t2);
|
|
828
|
-
r2.stack.push(o2 * i2), r2.pc++;
|
|
829
|
-
break;
|
|
830
|
-
}
|
|
831
|
-
case r$1.DIV: {
|
|
832
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
833
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
834
|
-
r2.status = "error", r2.error = "DIV: Stack underflow";
|
|
835
|
-
break;
|
|
836
|
-
}
|
|
837
|
-
const o2 = d(e2), i2 = d(t2);
|
|
838
|
-
if (i2 === 0) {
|
|
839
|
-
r2.status = "error", r2.error = "Division by zero";
|
|
840
|
-
break;
|
|
841
|
-
}
|
|
842
|
-
r2.stack.push(o2 / i2), r2.pc++;
|
|
843
|
-
break;
|
|
844
|
-
}
|
|
845
|
-
case r$1.MOD: {
|
|
846
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
847
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
848
|
-
r2.status = "error", r2.error = "MOD: Stack underflow";
|
|
849
|
-
break;
|
|
850
|
-
}
|
|
851
|
-
const o2 = d(e2), i2 = d(t2);
|
|
852
|
-
r2.stack.push(o2 % i2), r2.pc++;
|
|
853
|
-
break;
|
|
854
|
-
}
|
|
855
|
-
// Unary operations
|
|
856
|
-
case r$1.UNARY_MINUS: {
|
|
857
|
-
const t2 = r2.stack.pop();
|
|
858
|
-
if (t2 === void 0) {
|
|
859
|
-
r2.status = "error", r2.error = "UNARY_MINUS: Stack underflow";
|
|
860
|
-
break;
|
|
861
|
-
}
|
|
862
|
-
const e2 = d(t2);
|
|
863
|
-
r2.stack.push(-e2), r2.pc++;
|
|
864
|
-
break;
|
|
865
|
-
}
|
|
866
|
-
case r$1.UNARY_PLUS: {
|
|
867
|
-
const t2 = r2.stack.pop();
|
|
868
|
-
if (t2 === void 0) {
|
|
869
|
-
r2.status = "error", r2.error = "UNARY_PLUS: Stack underflow";
|
|
870
|
-
break;
|
|
871
|
-
}
|
|
872
|
-
const e2 = d(t2);
|
|
873
|
-
r2.stack.push(e2), r2.pc++;
|
|
874
|
-
break;
|
|
875
|
-
}
|
|
876
|
-
case r$1.INC: {
|
|
877
|
-
const t2 = r2.stack.pop();
|
|
878
|
-
if (t2 === void 0 || typeof t2 != "string") {
|
|
879
|
-
r2.status = "error", r2.error = "INC: Invalid variable name";
|
|
880
|
-
break;
|
|
881
|
-
}
|
|
882
|
-
const e2 = r2.variables.get(t2) ?? 0, o2 = d(e2) + 1;
|
|
883
|
-
r2.variables.set(t2, o2);
|
|
884
|
-
const i2 = n$1.arg === true;
|
|
885
|
-
r2.stack.push(i2 ? d(e2) : o2), r2.pc++;
|
|
886
|
-
break;
|
|
887
|
-
}
|
|
888
|
-
case r$1.DEC: {
|
|
889
|
-
const t2 = r2.stack.pop();
|
|
890
|
-
if (t2 === void 0 || typeof t2 != "string") {
|
|
891
|
-
r2.status = "error", r2.error = "DEC: Invalid variable name";
|
|
892
|
-
break;
|
|
893
|
-
}
|
|
894
|
-
const e2 = r2.variables.get(t2) ?? 0, o2 = d(e2) - 1;
|
|
895
|
-
r2.variables.set(t2, o2);
|
|
896
|
-
const i2 = n$1.arg === true;
|
|
897
|
-
r2.stack.push(i2 ? d(e2) : o2), r2.pc++;
|
|
1479
|
+
for (; s2.status === "running" && s2.pc < r2.length; ) {
|
|
1480
|
+
const c2 = r2[s2.pc], n2 = $[c2.op];
|
|
1481
|
+
if (n2) {
|
|
1482
|
+
const a2 = this.validateStack(n2, c2, s2);
|
|
1483
|
+
if (a2) {
|
|
1484
|
+
s2.status = "error", s2.error = a2.message;
|
|
898
1485
|
break;
|
|
899
1486
|
}
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
const
|
|
903
|
-
|
|
904
|
-
r2.status = "error", r2.error = "EQ: Stack underflow";
|
|
905
|
-
break;
|
|
906
|
-
}
|
|
907
|
-
if (f(e2) && o(t2) || o(e2) && f(t2))
|
|
908
|
-
r2.stack.push(true);
|
|
909
|
-
else if (o(e2) && o(t2))
|
|
910
|
-
r2.stack.push(true);
|
|
911
|
-
else {
|
|
912
|
-
const o2 = d(e2), i2 = d(t2);
|
|
913
|
-
!isNaN(o2) && !isNaN(i2) ? r2.stack.push(o2 === i2) : r2.stack.push(c$1(e2) === c$1(t2));
|
|
914
|
-
}
|
|
915
|
-
r2.pc++;
|
|
1487
|
+
if ((c2.op === s$2.JUMP || c2.op === s$2.JUMP_IF_FALSE || c2.op === s$2.BREAK || c2.op === s$2.CONTINUE) && c2.arg !== void 0 && c2.arg >= r2.length) {
|
|
1488
|
+
s2.status = "error";
|
|
1489
|
+
const p2 = c2.op === s$2.JUMP || c2.op === s$2.JUMP_IF_FALSE ? "jump" : c2.op === s$2.BREAK ? "break" : "continue";
|
|
1490
|
+
s2.error = `Invalid ${p2} target: ${c2.arg}`;
|
|
916
1491
|
break;
|
|
917
1492
|
}
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
r2.status = "error", r2.error = "NEQ: Stack underflow";
|
|
922
|
-
break;
|
|
923
|
-
}
|
|
924
|
-
if (f(e2) && o(t2) || o(e2) && f(t2))
|
|
925
|
-
r2.stack.push(false);
|
|
926
|
-
else if (o(e2) && o(t2))
|
|
927
|
-
r2.stack.push(false);
|
|
928
|
-
else {
|
|
929
|
-
const o2 = d(e2), i2 = d(t2);
|
|
930
|
-
!isNaN(o2) && !isNaN(i2) ? r2.stack.push(o2 !== i2) : r2.stack.push(c$1(e2) !== c$1(t2));
|
|
931
|
-
}
|
|
932
|
-
r2.pc++;
|
|
933
|
-
break;
|
|
934
|
-
}
|
|
935
|
-
case r$1.LT: {
|
|
936
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
937
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
938
|
-
r2.status = "error", r2.error = "LT: Stack underflow";
|
|
939
|
-
break;
|
|
940
|
-
}
|
|
941
|
-
const o2 = d(e2), i2 = d(t2);
|
|
942
|
-
r2.stack.push(o2 < i2), r2.pc++;
|
|
943
|
-
break;
|
|
944
|
-
}
|
|
945
|
-
case r$1.GT: {
|
|
946
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
947
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
948
|
-
r2.status = "error", r2.error = "GT: Stack underflow";
|
|
949
|
-
break;
|
|
950
|
-
}
|
|
951
|
-
const o2 = d(e2), i2 = d(t2);
|
|
952
|
-
r2.stack.push(o2 > i2), r2.pc++;
|
|
953
|
-
break;
|
|
954
|
-
}
|
|
955
|
-
case r$1.LTE: {
|
|
956
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
957
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
958
|
-
r2.status = "error", r2.error = "LTE: Stack underflow";
|
|
959
|
-
break;
|
|
960
|
-
}
|
|
961
|
-
const o2 = d(e2), i2 = d(t2);
|
|
962
|
-
r2.stack.push(o2 <= i2), r2.pc++;
|
|
963
|
-
break;
|
|
964
|
-
}
|
|
965
|
-
case r$1.GTE: {
|
|
966
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
967
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
968
|
-
r2.status = "error", r2.error = "GTE: Stack underflow";
|
|
969
|
-
break;
|
|
970
|
-
}
|
|
971
|
-
const o2 = d(e2), i2 = d(t2);
|
|
972
|
-
r2.stack.push(o2 >= i2), r2.pc++;
|
|
973
|
-
break;
|
|
974
|
-
}
|
|
975
|
-
case r$1.EQ_STRICT: {
|
|
976
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
977
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
978
|
-
r2.status = "error", r2.error = "EQ_STRICT: Stack underflow";
|
|
979
|
-
break;
|
|
980
|
-
}
|
|
981
|
-
r2.stack.push(e2 === t2), r2.pc++;
|
|
982
|
-
break;
|
|
983
|
-
}
|
|
984
|
-
case r$1.NEQ_STRICT: {
|
|
985
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
986
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
987
|
-
r2.status = "error", r2.error = "NEQ_STRICT: Stack underflow";
|
|
988
|
-
break;
|
|
989
|
-
}
|
|
990
|
-
r2.stack.push(e2 !== t2), r2.pc++;
|
|
991
|
-
break;
|
|
992
|
-
}
|
|
993
|
-
// Jump operations
|
|
994
|
-
case r$1.JUMP: {
|
|
995
|
-
if (n$1.arg === void 0) {
|
|
996
|
-
r2.status = "error", r2.error = "JUMP requires a target address";
|
|
997
|
-
break;
|
|
998
|
-
}
|
|
999
|
-
const t2 = n$1.arg;
|
|
1000
|
-
if (t2 < 0 || t2 >= a2.length) {
|
|
1001
|
-
r2.status = "error", r2.error = `Invalid jump target: ${t2}`;
|
|
1002
|
-
break;
|
|
1003
|
-
}
|
|
1004
|
-
r2.pc = t2;
|
|
1005
|
-
break;
|
|
1006
|
-
}
|
|
1007
|
-
case r$1.JUMP_IF_FALSE: {
|
|
1008
|
-
const t2 = r2.stack.pop();
|
|
1009
|
-
if (t2 === void 0) {
|
|
1010
|
-
r2.status = "error", r2.error = "JUMP_IF_FALSE: Stack underflow";
|
|
1011
|
-
break;
|
|
1012
|
-
}
|
|
1013
|
-
if (n$1.arg === void 0) {
|
|
1014
|
-
r2.status = "error", r2.error = "JUMP_IF_FALSE requires a target address";
|
|
1015
|
-
break;
|
|
1016
|
-
}
|
|
1017
|
-
const e2 = n$1.arg;
|
|
1018
|
-
if (e2 < 0 || e2 >= a2.length) {
|
|
1019
|
-
r2.status = "error", r2.error = `Invalid jump target: ${e2}`;
|
|
1020
|
-
break;
|
|
1021
|
-
}
|
|
1022
|
-
y(t2) ? r2.pc++ : r2.pc = e2;
|
|
1493
|
+
const i2 = n2.execute(s2, c2);
|
|
1494
|
+
if (i2) {
|
|
1495
|
+
s2.status = "error", s2.error = i2.message;
|
|
1023
1496
|
break;
|
|
1024
1497
|
}
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
r2.status = "error", r2.error = "ITER_START: Stack underflow";
|
|
1028
|
-
break;
|
|
1029
|
-
}
|
|
1030
|
-
const t2 = r2.stack.pop();
|
|
1031
|
-
if (t2 == null) {
|
|
1032
|
-
r2.status = "error", r2.error = "TypeError: Cannot iterate over null or undefined";
|
|
1033
|
-
break;
|
|
1034
|
-
}
|
|
1035
|
-
if (!e(t2)) {
|
|
1036
|
-
r2.status = "error", r2.error = "TypeError: Cannot iterate over non-array value";
|
|
1037
|
-
break;
|
|
1038
|
-
}
|
|
1039
|
-
if (r2.iterators.length >= 10) {
|
|
1040
|
-
r2.status = "error", r2.error = "RuntimeError: Maximum iterator depth exceeded";
|
|
1041
|
-
break;
|
|
1042
|
-
}
|
|
1043
|
-
const e$1 = p$1([...t2.elements]);
|
|
1044
|
-
r2.iterators.push({
|
|
1045
|
-
array: e$1,
|
|
1046
|
-
index: 0
|
|
1047
|
-
}), r2.pc++;
|
|
1048
|
-
break;
|
|
1049
|
-
}
|
|
1050
|
-
case r$1.ITER_NEXT: {
|
|
1051
|
-
if (r2.iterators.length === 0) {
|
|
1052
|
-
r2.status = "error", r2.error = "ITER_NEXT: No active iterator";
|
|
1053
|
-
break;
|
|
1054
|
-
}
|
|
1055
|
-
const t2 = r2.iterators[r2.iterators.length - 1];
|
|
1056
|
-
t2.index < t2.array.elements.length ? (r2.stack.push(t2.array.elements[t2.index]), r2.stack.push(true), t2.index++) : (r2.stack.push(null), r2.stack.push(false)), r2.pc++;
|
|
1057
|
-
break;
|
|
1058
|
-
}
|
|
1059
|
-
case r$1.ITER_END: {
|
|
1060
|
-
if (r2.iterators.length === 0) {
|
|
1061
|
-
r2.status = "error", r2.error = "ITER_END: No active iterator";
|
|
1062
|
-
break;
|
|
1063
|
-
}
|
|
1064
|
-
r2.iterators.pop(), r2.pc++;
|
|
1065
|
-
break;
|
|
1066
|
-
}
|
|
1067
|
-
// Logical operators
|
|
1068
|
-
case r$1.AND: {
|
|
1069
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
1070
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
1071
|
-
r2.status = "error", r2.error = "AND: Stack underflow";
|
|
1072
|
-
break;
|
|
1073
|
-
}
|
|
1074
|
-
y(e2) ? r2.stack.push(t2) : r2.stack.push(e2), r2.pc++;
|
|
1075
|
-
break;
|
|
1076
|
-
}
|
|
1077
|
-
case r$1.OR: {
|
|
1078
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
1079
|
-
if (e2 === void 0 || t2 === void 0) {
|
|
1080
|
-
r2.status = "error", r2.error = "OR: Stack underflow";
|
|
1081
|
-
break;
|
|
1082
|
-
}
|
|
1083
|
-
y(e2) ? r2.stack.push(e2) : r2.stack.push(t2), r2.pc++;
|
|
1084
|
-
break;
|
|
1085
|
-
}
|
|
1086
|
-
case r$1.NOT: {
|
|
1087
|
-
const t2 = r2.stack.pop();
|
|
1088
|
-
if (t2 === void 0) {
|
|
1089
|
-
r2.status = "error", r2.error = "NOT: Stack underflow";
|
|
1090
|
-
break;
|
|
1091
|
-
}
|
|
1092
|
-
r2.stack.push(!y(t2)), r2.pc++;
|
|
1093
|
-
break;
|
|
1094
|
-
}
|
|
1095
|
-
case r$1.RETURN: {
|
|
1096
|
-
const t2 = r2.stack.pop() ?? null;
|
|
1097
|
-
r2.returnValue = t2, r2.status = "complete";
|
|
1098
|
-
break;
|
|
1099
|
-
}
|
|
1100
|
-
// String methods
|
|
1101
|
-
case r$1.STRING_SUBSTRING: {
|
|
1102
|
-
if (r2.stack.length < 2) {
|
|
1103
|
-
r2.status = "error", r2.error = "STRING_SUBSTRING: Stack underflow";
|
|
1104
|
-
break;
|
|
1105
|
-
}
|
|
1106
|
-
const t2 = r2.stack.length;
|
|
1107
|
-
let e2, o2, i2;
|
|
1108
|
-
const w2 = r2.stack[t2 - 1], _ = r2.stack[t2 - 2];
|
|
1109
|
-
if (t2 >= 3 && typeof w2 == "number" && typeof _ == "number" ? (i2 = r2.stack.pop(), o2 = r2.stack.pop(), e2 = r2.stack.pop()) : (o2 = r2.stack.pop(), e2 = r2.stack.pop(), i2 = void 0), !n(e2)) {
|
|
1110
|
-
r2.status = "error", r2.error = "STRING_SUBSTRING requires a string";
|
|
1111
|
-
break;
|
|
1112
|
-
}
|
|
1113
|
-
if (typeof o2 != "number") {
|
|
1114
|
-
r2.status = "error", r2.error = "STRING_SUBSTRING requires numeric start index";
|
|
1115
|
-
break;
|
|
1116
|
-
}
|
|
1117
|
-
const S = e2.length;
|
|
1118
|
-
o2 < 0 && (o2 = Math.max(0, S + o2)), i2 !== void 0 && i2 < 0 && (i2 = Math.max(0, S + i2));
|
|
1119
|
-
const O = i2 !== void 0 ? e2.substring(o2, i2) : e2.substring(o2);
|
|
1120
|
-
r2.stack.push(O), r2.pc++;
|
|
1121
|
-
break;
|
|
1122
|
-
}
|
|
1123
|
-
case r$1.STRING_INDEXOF: {
|
|
1124
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
1125
|
-
if (t2 === void 0 || e2 === void 0) {
|
|
1126
|
-
r2.status = "error", r2.error = "STRING_INDEXOF: Stack underflow";
|
|
1127
|
-
break;
|
|
1128
|
-
}
|
|
1129
|
-
if (!n(e2) || !n(t2)) {
|
|
1130
|
-
r2.status = "error", r2.error = "STRING_INDEXOF requires string arguments";
|
|
1131
|
-
break;
|
|
1132
|
-
}
|
|
1133
|
-
r2.stack.push(e2.indexOf(t2)), r2.pc++;
|
|
1134
|
-
break;
|
|
1135
|
-
}
|
|
1136
|
-
case r$1.STRING_SPLIT: {
|
|
1137
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
1138
|
-
if (t2 === void 0 || e2 === void 0) {
|
|
1139
|
-
r2.status = "error", r2.error = "STRING_SPLIT: Stack underflow";
|
|
1140
|
-
break;
|
|
1141
|
-
}
|
|
1142
|
-
if (!n(e2) || !n(t2)) {
|
|
1143
|
-
r2.status = "error", r2.error = "STRING_SPLIT requires string arguments";
|
|
1144
|
-
break;
|
|
1145
|
-
}
|
|
1146
|
-
let o2;
|
|
1147
|
-
t2 === "" ? o2 = e2.split("") : o2 = e2.split(t2), r2.stack.push(p$1(o2)), r2.pc++;
|
|
1148
|
-
break;
|
|
1149
|
-
}
|
|
1150
|
-
case r$1.STRING_SLICE: {
|
|
1151
|
-
if (r2.stack.length < 2) {
|
|
1152
|
-
r2.status = "error", r2.error = "STRING_SLICE: Stack underflow";
|
|
1153
|
-
break;
|
|
1154
|
-
}
|
|
1155
|
-
const t2 = r2.stack.length;
|
|
1156
|
-
let e2, o2, i2;
|
|
1157
|
-
const w2 = r2.stack[t2 - 1], _ = r2.stack[t2 - 2];
|
|
1158
|
-
if (t2 >= 3 && typeof w2 == "number" && typeof _ == "number" ? (i2 = r2.stack.pop(), o2 = r2.stack.pop(), e2 = r2.stack.pop()) : (o2 = r2.stack.pop(), e2 = r2.stack.pop(), i2 = void 0), !n(e2)) {
|
|
1159
|
-
r2.status = "error", r2.error = "STRING_SLICE requires a string";
|
|
1160
|
-
break;
|
|
1161
|
-
}
|
|
1162
|
-
if (typeof o2 != "number") {
|
|
1163
|
-
r2.status = "error", r2.error = "STRING_SLICE requires numeric start index";
|
|
1164
|
-
break;
|
|
1165
|
-
}
|
|
1166
|
-
const S = i2 !== void 0 ? e2.slice(o2, i2) : e2.slice(o2);
|
|
1167
|
-
r2.stack.push(S), r2.pc++;
|
|
1168
|
-
break;
|
|
1169
|
-
}
|
|
1170
|
-
case r$1.STRING_CHARAT: {
|
|
1171
|
-
const t2 = r2.stack.pop(), e2 = r2.stack.pop();
|
|
1172
|
-
if (t2 === void 0 || e2 === void 0) {
|
|
1173
|
-
r2.status = "error", r2.error = "STRING_CHARAT: Stack underflow";
|
|
1174
|
-
break;
|
|
1175
|
-
}
|
|
1176
|
-
if (!n(e2)) {
|
|
1177
|
-
r2.status = "error", r2.error = "STRING_CHARAT requires a string";
|
|
1178
|
-
break;
|
|
1179
|
-
}
|
|
1180
|
-
if (typeof t2 != "number") {
|
|
1181
|
-
r2.status = "error", r2.error = "STRING_CHARAT requires numeric index";
|
|
1182
|
-
break;
|
|
1183
|
-
}
|
|
1184
|
-
const o2 = e2.charAt(t2);
|
|
1185
|
-
r2.stack.push(o2), r2.pc++;
|
|
1186
|
-
break;
|
|
1187
|
-
}
|
|
1188
|
-
case r$1.STRING_TOUPPERCASE: {
|
|
1189
|
-
const t2 = r2.stack.pop();
|
|
1190
|
-
if (t2 === void 0) {
|
|
1191
|
-
r2.status = "error", r2.error = "STRING_TOUPPERCASE: Stack underflow";
|
|
1192
|
-
break;
|
|
1193
|
-
}
|
|
1194
|
-
if (!n(t2)) {
|
|
1195
|
-
r2.status = "error", r2.error = "STRING_TOUPPERCASE requires a string";
|
|
1196
|
-
break;
|
|
1197
|
-
}
|
|
1198
|
-
r2.stack.push(t2.toUpperCase()), r2.pc++;
|
|
1199
|
-
break;
|
|
1200
|
-
}
|
|
1201
|
-
case r$1.STRING_TOLOWERCASE: {
|
|
1202
|
-
const t2 = r2.stack.pop();
|
|
1203
|
-
if (t2 === void 0) {
|
|
1204
|
-
r2.status = "error", r2.error = "STRING_TOLOWERCASE: Stack underflow";
|
|
1205
|
-
break;
|
|
1206
|
-
}
|
|
1207
|
-
if (!n(t2)) {
|
|
1208
|
-
r2.status = "error", r2.error = "STRING_TOLOWERCASE requires a string";
|
|
1209
|
-
break;
|
|
1210
|
-
}
|
|
1211
|
-
r2.stack.push(t2.toLowerCase()), r2.pc++;
|
|
1212
|
-
break;
|
|
1213
|
-
}
|
|
1214
|
-
case r$1.BREAK: {
|
|
1215
|
-
if (n$1.arg === void 0) {
|
|
1216
|
-
r2.status = "error", r2.error = "BREAK requires a target address";
|
|
1217
|
-
break;
|
|
1218
|
-
}
|
|
1219
|
-
const t2 = n$1.arg;
|
|
1220
|
-
if (t2 < 0 || t2 >= a2.length) {
|
|
1221
|
-
r2.status = "error", r2.error = `Invalid break target: ${t2}`;
|
|
1222
|
-
break;
|
|
1223
|
-
}
|
|
1224
|
-
r2.pc = t2;
|
|
1225
|
-
break;
|
|
1226
|
-
}
|
|
1227
|
-
case r$1.CONTINUE: {
|
|
1228
|
-
if (n$1.arg === void 0) {
|
|
1229
|
-
r2.status = "error", r2.error = "CONTINUE requires a target address";
|
|
1230
|
-
break;
|
|
1231
|
-
}
|
|
1232
|
-
const t2 = n$1.arg;
|
|
1233
|
-
if (t2 < 0 || t2 >= a2.length) {
|
|
1234
|
-
r2.status = "error", r2.error = `Invalid continue target: ${t2}`;
|
|
1235
|
-
break;
|
|
1236
|
-
}
|
|
1237
|
-
r2.pc = t2;
|
|
1238
|
-
break;
|
|
1239
|
-
}
|
|
1240
|
-
case r$1.FS_LIST_FILES: {
|
|
1241
|
-
if (r2.stack.length < 1) {
|
|
1242
|
-
r2.status = "error", r2.error = "FS_LIST_FILES: Stack underflow";
|
|
1243
|
-
break;
|
|
1244
|
-
}
|
|
1245
|
-
let t2, e$1 = {};
|
|
1246
|
-
const o2 = r2.stack[r2.stack.length - 1];
|
|
1247
|
-
if (r2.stack.length >= 2 && typeof o2 == "object" && o2 !== null && !e(o2) && (e$1 = r2.stack.pop()), t2 = r2.stack.pop(), !n(t2)) {
|
|
1248
|
-
r2.status = "error", r2.error = "FS_LIST_FILES requires a string path";
|
|
1249
|
-
break;
|
|
1250
|
-
}
|
|
1251
|
-
r2.fsOperation = {
|
|
1252
|
-
type: "listFiles",
|
|
1253
|
-
path: t2,
|
|
1254
|
-
options: e$1
|
|
1255
|
-
}, r2.status = "waiting_fs";
|
|
1256
|
-
break;
|
|
1257
|
-
}
|
|
1258
|
-
default:
|
|
1259
|
-
r2.status = "error", r2.error = `Unknown opcode: ${n$1.op} (type: ${typeof n$1.op})`;
|
|
1498
|
+
n2.controlsPC || s2.pc++;
|
|
1499
|
+
continue;
|
|
1260
1500
|
}
|
|
1501
|
+
s2.status = "error", s2.error = `Unknown opcode: ${s$2[c2.op]}`;
|
|
1502
|
+
break;
|
|
1261
1503
|
}
|
|
1262
|
-
return
|
|
1504
|
+
return s2;
|
|
1263
1505
|
}
|
|
1264
|
-
resume(
|
|
1265
|
-
if (
|
|
1506
|
+
resume(r2, t2, s2) {
|
|
1507
|
+
if (r2.status !== "waiting_cc")
|
|
1266
1508
|
throw new Error("Cannot resume: VM not waiting for CC");
|
|
1267
|
-
const
|
|
1268
|
-
...
|
|
1269
|
-
stack: [...
|
|
1509
|
+
const c2 = {
|
|
1510
|
+
...r2,
|
|
1511
|
+
stack: [...r2.stack, t2],
|
|
1270
1512
|
status: "running",
|
|
1271
1513
|
ccPrompt: void 0,
|
|
1272
|
-
pc:
|
|
1514
|
+
pc: r2.pc + 1
|
|
1273
1515
|
};
|
|
1274
|
-
return this.execute(
|
|
1516
|
+
return this.execute(s2, c2);
|
|
1275
1517
|
}
|
|
1276
|
-
resumeWithFsResult(
|
|
1277
|
-
if (
|
|
1518
|
+
resumeWithFsResult(r2, t2, s2) {
|
|
1519
|
+
if (r2.status !== "waiting_fs")
|
|
1278
1520
|
throw new Error("Cannot resume: VM not waiting for FS operation");
|
|
1279
|
-
const
|
|
1280
|
-
...
|
|
1281
|
-
stack: [...
|
|
1521
|
+
const c2 = {
|
|
1522
|
+
...r2,
|
|
1523
|
+
stack: [...r2.stack, t2],
|
|
1282
1524
|
status: "running",
|
|
1283
1525
|
fsOperation: void 0,
|
|
1284
|
-
pc:
|
|
1526
|
+
pc: r2.pc + 1
|
|
1285
1527
|
};
|
|
1286
|
-
return this.execute(
|
|
1528
|
+
return this.execute(s2, c2);
|
|
1287
1529
|
}
|
|
1288
1530
|
}
|
|
1289
|
-
class
|
|
1531
|
+
class x {
|
|
1290
1532
|
constructor() {
|
|
1291
|
-
|
|
1292
|
-
const
|
|
1293
|
-
|
|
1294
|
-
}
|
|
1295
|
-
isPathAllowed(
|
|
1296
|
-
const
|
|
1297
|
-
return
|
|
1298
|
-
(
|
|
1533
|
+
E(this, "sandboxPaths", []);
|
|
1534
|
+
const r2 = process.env.CVM_SANDBOX_PATHS, t2 = process.env.CVM_SANDBOX_ROOT;
|
|
1535
|
+
r2 ? this.sandboxPaths = r2.split(",").map((s2) => c__namespace.resolve(s2.trim())) : t2 && (this.sandboxPaths = [c__namespace.resolve(t2)]);
|
|
1536
|
+
}
|
|
1537
|
+
isPathAllowed(r2) {
|
|
1538
|
+
const t2 = c__namespace.resolve(r2);
|
|
1539
|
+
return t2.includes("..") || this.sandboxPaths.length === 0 ? false : this.sandboxPaths.some(
|
|
1540
|
+
(s2) => t2.startsWith(s2)
|
|
1299
1541
|
);
|
|
1300
1542
|
}
|
|
1301
|
-
listFiles(
|
|
1302
|
-
const
|
|
1303
|
-
if (!this.isPathAllowed(
|
|
1304
|
-
return
|
|
1543
|
+
listFiles(r2, t2 = {}) {
|
|
1544
|
+
const s2 = p$1();
|
|
1545
|
+
if (!this.isPathAllowed(r2))
|
|
1546
|
+
return s2;
|
|
1305
1547
|
try {
|
|
1306
|
-
const
|
|
1307
|
-
this.listFilesRecursive(
|
|
1548
|
+
const c2 = c__namespace.resolve(r2);
|
|
1549
|
+
this.listFilesRecursive(c2, c2, s2.elements, t2);
|
|
1308
1550
|
} catch {
|
|
1309
1551
|
}
|
|
1310
|
-
return
|
|
1552
|
+
return s2;
|
|
1311
1553
|
}
|
|
1312
|
-
matchesPattern(
|
|
1313
|
-
let
|
|
1314
|
-
|
|
1554
|
+
matchesPattern(r2, t2) {
|
|
1555
|
+
let s2 = t2.replace(/\./g, "\\.").replace(/\*\*/g, "__DOUBLESTAR__").replace(/\*/g, "[^/]*").replace(/__DOUBLESTAR__/g, ".*").replace(/\?/g, ".");
|
|
1556
|
+
s2 = "^" + s2 + "$";
|
|
1315
1557
|
try {
|
|
1316
|
-
return new RegExp(
|
|
1558
|
+
return new RegExp(s2).test(r2);
|
|
1317
1559
|
} catch {
|
|
1318
1560
|
return true;
|
|
1319
1561
|
}
|
|
1320
1562
|
}
|
|
1321
|
-
listFilesRecursive(
|
|
1563
|
+
listFilesRecursive(r2, t2, s2, c2, n2 = 0) {
|
|
1322
1564
|
try {
|
|
1323
|
-
const
|
|
1324
|
-
for (const
|
|
1325
|
-
const
|
|
1326
|
-
|
|
1565
|
+
const a2 = P__namespace.readdirSync(t2, { withFileTypes: true });
|
|
1566
|
+
for (const i2 of a2) {
|
|
1567
|
+
const p2 = c__namespace.join(t2, i2.name), I2 = c__namespace.relative(r2, p2);
|
|
1568
|
+
i2.isSymbolicLink() || c2.filter && !this.matchesPattern(I2, c2.filter) || (s2.push(p2), i2.isDirectory() && c2.recursive && this.listFilesRecursive(r2, p2, s2, c2, n2 + 1));
|
|
1327
1569
|
}
|
|
1328
1570
|
} catch {
|
|
1329
1571
|
}
|
|
1330
1572
|
}
|
|
1331
1573
|
}
|
|
1332
|
-
new
|
|
1333
|
-
class
|
|
1334
|
-
constructor(
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1574
|
+
new x();
|
|
1575
|
+
class X {
|
|
1576
|
+
constructor(r2, t2) {
|
|
1577
|
+
E(this, "vms", /* @__PURE__ */ new Map());
|
|
1578
|
+
E(this, "storage");
|
|
1579
|
+
E(this, "fileSystem");
|
|
1580
|
+
r2 ? this.storage = r2 : this.storage = g.create(), this.fileSystem = t2 || new x();
|
|
1339
1581
|
}
|
|
1340
1582
|
/**
|
|
1341
1583
|
* Initialize the VMManager (connect to database)
|
|
@@ -1352,152 +1594,152 @@ class $ {
|
|
|
1352
1594
|
/**
|
|
1353
1595
|
* Load and compile a program from source code
|
|
1354
1596
|
*/
|
|
1355
|
-
async loadProgram(
|
|
1356
|
-
const
|
|
1357
|
-
if (!
|
|
1358
|
-
throw new Error(`Compilation failed: ${
|
|
1359
|
-
const
|
|
1360
|
-
id:
|
|
1361
|
-
name:
|
|
1362
|
-
source:
|
|
1363
|
-
bytecode:
|
|
1597
|
+
async loadProgram(r2, t2) {
|
|
1598
|
+
const s2 = j(t2);
|
|
1599
|
+
if (!s2.success)
|
|
1600
|
+
throw new Error(`Compilation failed: ${s2.errors.join(", ")}`);
|
|
1601
|
+
const c2 = {
|
|
1602
|
+
id: r2,
|
|
1603
|
+
name: r2,
|
|
1604
|
+
source: t2,
|
|
1605
|
+
bytecode: s2.bytecode,
|
|
1364
1606
|
// VM decides internal format
|
|
1365
1607
|
created: /* @__PURE__ */ new Date()
|
|
1366
1608
|
};
|
|
1367
|
-
await this.storage.saveProgram(
|
|
1609
|
+
await this.storage.saveProgram(c2);
|
|
1368
1610
|
}
|
|
1369
1611
|
/**
|
|
1370
1612
|
* Start execution of a loaded program
|
|
1371
1613
|
*/
|
|
1372
|
-
async startExecution(
|
|
1373
|
-
if (!await this.storage.getProgram(
|
|
1374
|
-
throw new Error(`Program not found: ${
|
|
1375
|
-
const
|
|
1376
|
-
id:
|
|
1377
|
-
programId:
|
|
1614
|
+
async startExecution(r2, t2) {
|
|
1615
|
+
if (!await this.storage.getProgram(r2))
|
|
1616
|
+
throw new Error(`Program not found: ${r2}`);
|
|
1617
|
+
const c2 = {
|
|
1618
|
+
id: t2,
|
|
1619
|
+
programId: r2,
|
|
1378
1620
|
state: "READY",
|
|
1379
1621
|
pc: 0,
|
|
1380
1622
|
stack: [],
|
|
1381
1623
|
variables: {},
|
|
1382
1624
|
created: /* @__PURE__ */ new Date()
|
|
1383
1625
|
};
|
|
1384
|
-
await this.storage.saveExecution(
|
|
1385
|
-
const
|
|
1386
|
-
this.vms.set(
|
|
1626
|
+
await this.storage.saveExecution(c2);
|
|
1627
|
+
const n2 = new N();
|
|
1628
|
+
this.vms.set(t2, n2);
|
|
1387
1629
|
}
|
|
1388
1630
|
/**
|
|
1389
1631
|
* Get next action from execution (Claude polls this)
|
|
1390
1632
|
* This is READ-ONLY - just returns current state
|
|
1391
1633
|
*/
|
|
1392
|
-
async getNext(
|
|
1393
|
-
const
|
|
1394
|
-
if (!
|
|
1395
|
-
throw new Error(`Execution not found: ${
|
|
1396
|
-
if (
|
|
1397
|
-
const
|
|
1398
|
-
if (!
|
|
1399
|
-
throw new Error(`Program not found: ${
|
|
1400
|
-
let
|
|
1401
|
-
|
|
1402
|
-
const
|
|
1634
|
+
async getNext(r2) {
|
|
1635
|
+
const t2 = await this.storage.getExecution(r2);
|
|
1636
|
+
if (!t2)
|
|
1637
|
+
throw new Error(`Execution not found: ${r2}`);
|
|
1638
|
+
if (t2.state === "READY") {
|
|
1639
|
+
const s2 = await this.storage.getProgram(t2.programId);
|
|
1640
|
+
if (!s2)
|
|
1641
|
+
throw new Error(`Program not found: ${t2.programId}`);
|
|
1642
|
+
let c2 = this.vms.get(r2);
|
|
1643
|
+
c2 || (c2 = new N(), this.vms.set(r2, c2));
|
|
1644
|
+
const n2 = {
|
|
1403
1645
|
pc: 0,
|
|
1404
1646
|
stack: [],
|
|
1405
1647
|
variables: /* @__PURE__ */ new Map(),
|
|
1406
1648
|
output: []
|
|
1407
|
-
},
|
|
1408
|
-
if (
|
|
1409
|
-
return
|
|
1649
|
+
}, a2 = c2.execute(s2.bytecode, n2);
|
|
1650
|
+
if (a2.output.length > 0 && await this.storage.appendOutput(r2, a2.output), t2.pc = a2.pc, t2.stack = a2.stack, t2.variables = Object.fromEntries(a2.variables), t2.iterators = a2.iterators, a2.status === "complete")
|
|
1651
|
+
return t2.state = "COMPLETED", a2.returnValue !== void 0 && (t2.returnValue = a2.returnValue), await this.storage.saveExecution(t2), this.vms.delete(r2), {
|
|
1410
1652
|
type: "completed",
|
|
1411
1653
|
message: "Execution completed",
|
|
1412
|
-
result:
|
|
1654
|
+
result: a2.returnValue
|
|
1413
1655
|
};
|
|
1414
|
-
if (
|
|
1415
|
-
return
|
|
1656
|
+
if (a2.status === "waiting_cc")
|
|
1657
|
+
return t2.state = "AWAITING_COGNITIVE_RESULT", t2.ccPrompt = a2.ccPrompt, await this.storage.saveExecution(t2), {
|
|
1416
1658
|
type: "waiting",
|
|
1417
|
-
message:
|
|
1659
|
+
message: a2.ccPrompt || "Waiting for input"
|
|
1418
1660
|
};
|
|
1419
|
-
if (
|
|
1420
|
-
if (
|
|
1421
|
-
const
|
|
1422
|
-
return
|
|
1661
|
+
if (a2.status === "waiting_fs") {
|
|
1662
|
+
if (a2.fsOperation) {
|
|
1663
|
+
const i2 = this.fileSystem.listFiles(a2.fsOperation.path, a2.fsOperation.options), p2 = c2.resumeWithFsResult(a2, i2, s2.bytecode);
|
|
1664
|
+
return p2.output.length > 0 && await this.storage.appendOutput(r2, p2.output), t2.pc = p2.pc, t2.stack = p2.stack, t2.variables = Object.fromEntries(p2.variables), t2.iterators = p2.iterators, p2.status === "complete" ? (t2.state = "COMPLETED", p2.returnValue !== void 0 && (t2.returnValue = p2.returnValue), await this.storage.saveExecution(t2), this.vms.delete(r2), {
|
|
1423
1665
|
type: "completed",
|
|
1424
1666
|
message: "Execution completed",
|
|
1425
|
-
result:
|
|
1426
|
-
}) :
|
|
1667
|
+
result: p2.returnValue
|
|
1668
|
+
}) : p2.status === "error" ? (t2.state = "ERROR", t2.error = p2.error, await this.storage.saveExecution(t2), this.vms.delete(r2), {
|
|
1427
1669
|
type: "error",
|
|
1428
|
-
error:
|
|
1429
|
-
}) :
|
|
1670
|
+
error: p2.error
|
|
1671
|
+
}) : p2.status === "waiting_cc" ? (t2.state = "AWAITING_COGNITIVE_RESULT", t2.ccPrompt = p2.ccPrompt, await this.storage.saveExecution(t2), {
|
|
1430
1672
|
type: "waiting",
|
|
1431
|
-
message:
|
|
1432
|
-
}) : (
|
|
1673
|
+
message: p2.ccPrompt || "Waiting for input"
|
|
1674
|
+
}) : (t2.state = "RUNNING", await this.storage.saveExecution(t2), this.getNext(r2));
|
|
1433
1675
|
}
|
|
1434
|
-
} else if (
|
|
1435
|
-
return
|
|
1676
|
+
} else if (a2.status === "error")
|
|
1677
|
+
return t2.state = "ERROR", t2.error = a2.error, await this.storage.saveExecution(t2), this.vms.delete(r2), {
|
|
1436
1678
|
type: "error",
|
|
1437
|
-
error:
|
|
1679
|
+
error: a2.error
|
|
1438
1680
|
};
|
|
1439
1681
|
}
|
|
1440
|
-
if (
|
|
1682
|
+
if (t2.state === "COMPLETED")
|
|
1441
1683
|
return {
|
|
1442
1684
|
type: "completed",
|
|
1443
1685
|
message: "Execution completed"
|
|
1444
1686
|
};
|
|
1445
|
-
if (
|
|
1687
|
+
if (t2.state === "ERROR")
|
|
1446
1688
|
return {
|
|
1447
1689
|
type: "error",
|
|
1448
|
-
error:
|
|
1690
|
+
error: t2.error || "Unknown error"
|
|
1449
1691
|
};
|
|
1450
|
-
if (
|
|
1692
|
+
if (t2.state === "AWAITING_COGNITIVE_RESULT")
|
|
1451
1693
|
return {
|
|
1452
1694
|
type: "waiting",
|
|
1453
|
-
message:
|
|
1695
|
+
message: t2.ccPrompt || "Waiting for input"
|
|
1454
1696
|
};
|
|
1455
|
-
throw new Error(`Unexpected execution state: ${
|
|
1697
|
+
throw new Error(`Unexpected execution state: ${t2.state}`);
|
|
1456
1698
|
}
|
|
1457
1699
|
/**
|
|
1458
1700
|
* Report result from cognitive operation and continue execution
|
|
1459
1701
|
*/
|
|
1460
|
-
async reportCCResult(
|
|
1461
|
-
const
|
|
1462
|
-
if (!
|
|
1463
|
-
throw new Error(`Execution not found: ${
|
|
1464
|
-
const
|
|
1465
|
-
if (!
|
|
1466
|
-
throw new Error(`Program not found: ${
|
|
1467
|
-
let
|
|
1468
|
-
|
|
1469
|
-
const
|
|
1470
|
-
pc:
|
|
1471
|
-
stack:
|
|
1472
|
-
variables: new Map(Object.entries(
|
|
1702
|
+
async reportCCResult(r2, t2) {
|
|
1703
|
+
const s2 = await this.storage.getExecution(r2);
|
|
1704
|
+
if (!s2)
|
|
1705
|
+
throw new Error(`Execution not found: ${r2}`);
|
|
1706
|
+
const c2 = await this.storage.getProgram(s2.programId);
|
|
1707
|
+
if (!c2)
|
|
1708
|
+
throw new Error(`Program not found: ${s2.programId}`);
|
|
1709
|
+
let n2 = this.vms.get(r2);
|
|
1710
|
+
n2 || (n2 = new N(), this.vms.set(r2, n2));
|
|
1711
|
+
const a2 = {
|
|
1712
|
+
pc: s2.pc,
|
|
1713
|
+
stack: s2.stack,
|
|
1714
|
+
variables: new Map(Object.entries(s2.variables)),
|
|
1473
1715
|
status: "waiting_cc",
|
|
1474
1716
|
output: [],
|
|
1475
1717
|
// Start with empty output for resumed execution
|
|
1476
1718
|
ccPrompt: void 0,
|
|
1477
|
-
iterators:
|
|
1478
|
-
},
|
|
1479
|
-
|
|
1719
|
+
iterators: s2.iterators || []
|
|
1720
|
+
}, i2 = n2.resume(a2, t2, c2.bytecode);
|
|
1721
|
+
i2.output.length > 0 && await this.storage.appendOutput(r2, i2.output), s2.pc = i2.pc, s2.stack = i2.stack, s2.variables = Object.fromEntries(i2.variables), s2.iterators = i2.iterators, i2.status === "complete" ? (s2.state = "COMPLETED", i2.returnValue !== void 0 && (s2.returnValue = i2.returnValue), this.vms.delete(r2)) : i2.status === "error" ? (s2.state = "ERROR", s2.error = i2.error, this.vms.delete(r2)) : i2.status === "waiting_cc" ? (s2.state = "AWAITING_COGNITIVE_RESULT", s2.ccPrompt = i2.ccPrompt) : s2.state = "RUNNING", await this.storage.saveExecution(s2);
|
|
1480
1722
|
}
|
|
1481
1723
|
/**
|
|
1482
1724
|
* Get current execution status
|
|
1483
1725
|
*/
|
|
1484
|
-
async getExecutionStatus(
|
|
1485
|
-
const
|
|
1486
|
-
if (!
|
|
1487
|
-
throw new Error(`Execution not found: ${
|
|
1726
|
+
async getExecutionStatus(r2) {
|
|
1727
|
+
const t2 = await this.storage.getExecution(r2);
|
|
1728
|
+
if (!t2)
|
|
1729
|
+
throw new Error(`Execution not found: ${r2}`);
|
|
1488
1730
|
return {
|
|
1489
|
-
id:
|
|
1490
|
-
state:
|
|
1491
|
-
pc:
|
|
1492
|
-
stack:
|
|
1493
|
-
variables:
|
|
1731
|
+
id: t2.id,
|
|
1732
|
+
state: t2.state,
|
|
1733
|
+
pc: t2.pc,
|
|
1734
|
+
stack: t2.stack,
|
|
1735
|
+
variables: t2.variables
|
|
1494
1736
|
};
|
|
1495
1737
|
}
|
|
1496
1738
|
/**
|
|
1497
1739
|
* Get output for an execution
|
|
1498
1740
|
*/
|
|
1499
|
-
async getExecutionOutput(
|
|
1500
|
-
return await this.storage.getOutput(
|
|
1741
|
+
async getExecutionOutput(r2) {
|
|
1742
|
+
return await this.storage.getOutput(r2);
|
|
1501
1743
|
}
|
|
1502
1744
|
}
|
|
1503
1745
|
var a = Object.defineProperty;
|
|
@@ -1509,7 +1751,7 @@ class w {
|
|
|
1509
1751
|
s(this, "transport", null);
|
|
1510
1752
|
s(this, "vmManager");
|
|
1511
1753
|
s(this, "version");
|
|
1512
|
-
this.version = r2, this.vmManager = new
|
|
1754
|
+
this.version = r2, this.vmManager = new X(), this.server = new mcp_js.McpServer({
|
|
1513
1755
|
name: "cvm-server",
|
|
1514
1756
|
version: this.version
|
|
1515
1757
|
}), this.setupTools();
|
|
@@ -1763,7 +2005,7 @@ async function main() {
|
|
|
1763
2005
|
];
|
|
1764
2006
|
for (const packageJsonPath of possiblePaths) {
|
|
1765
2007
|
try {
|
|
1766
|
-
const packageJson = JSON.parse(
|
|
2008
|
+
const packageJson = JSON.parse(P$1.readFileSync(packageJsonPath, "utf-8"));
|
|
1767
2009
|
if (packageJson.name === "cvm-server" && packageJson.version) {
|
|
1768
2010
|
version = packageJson.version;
|
|
1769
2011
|
break;
|