@rezless/vm 0.2.0 → 0.3.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.
Files changed (89) hide show
  1. package/NOTICE +1 -0
  2. package/dist/builtins/base64.d.ts +5 -0
  3. package/dist/builtins/base64.d.ts.map +1 -1
  4. package/dist/builtins/base64.js +35 -0
  5. package/dist/builtins/base64.js.map +1 -1
  6. package/dist/builtins/http.js.map +1 -1
  7. package/dist/builtins/index.d.ts.map +1 -1
  8. package/dist/builtins/index.js +11 -3
  9. package/dist/builtins/index.js.map +1 -1
  10. package/dist/builtins/json.d.ts.map +1 -1
  11. package/dist/builtins/json.js +26 -15
  12. package/dist/builtins/json.js.map +1 -1
  13. package/dist/builtins/linksetdata.d.ts.map +1 -1
  14. package/dist/builtins/linksetdata.js +5 -4
  15. package/dist/builtins/linksetdata.js.map +1 -1
  16. package/dist/builtins/lists.d.ts +24 -4
  17. package/dist/builtins/lists.d.ts.map +1 -1
  18. package/dist/builtins/lists.js +206 -92
  19. package/dist/builtins/lists.js.map +1 -1
  20. package/dist/builtins/prim-accessors.d.ts.map +1 -1
  21. package/dist/builtins/prim-accessors.js +2 -1
  22. package/dist/builtins/prim-accessors.js.map +1 -1
  23. package/dist/builtins/prim-params.d.ts.map +1 -1
  24. package/dist/builtins/prim-params.js +8 -5
  25. package/dist/builtins/prim-params.js.map +1 -1
  26. package/dist/builtins/time.d.ts +6 -0
  27. package/dist/builtins/time.d.ts.map +1 -1
  28. package/dist/builtins/time.js +16 -0
  29. package/dist/builtins/time.js.map +1 -1
  30. package/dist/clock.d.ts +7 -0
  31. package/dist/clock.d.ts.map +1 -1
  32. package/dist/clock.js +13 -0
  33. package/dist/clock.js.map +1 -1
  34. package/dist/coverage.d.ts.map +1 -1
  35. package/dist/dispatch.d.ts.map +1 -1
  36. package/dist/dispatch.js +4 -3
  37. package/dist/dispatch.js.map +1 -1
  38. package/dist/env.d.ts.map +1 -1
  39. package/dist/env.js.map +1 -1
  40. package/dist/generated/events.d.ts.map +1 -1
  41. package/dist/generated/functions.d.ts.map +1 -1
  42. package/dist/index.d.ts +2 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/interpreter.d.ts +3 -1
  47. package/dist/interpreter.d.ts.map +1 -1
  48. package/dist/interpreter.js +21 -7
  49. package/dist/interpreter.js.map +1 -1
  50. package/dist/inventory.d.ts.map +1 -1
  51. package/dist/linkset.d.ts +2 -0
  52. package/dist/linkset.d.ts.map +1 -1
  53. package/dist/linkset.js +2 -1
  54. package/dist/linkset.js.map +1 -1
  55. package/dist/own.d.ts +6 -0
  56. package/dist/own.d.ts.map +1 -0
  57. package/dist/own.js +8 -0
  58. package/dist/own.js.map +1 -0
  59. package/dist/prim-params.d.ts +3 -1
  60. package/dist/prim-params.d.ts.map +1 -1
  61. package/dist/prim-params.js +69 -2
  62. package/dist/prim-params.js.map +1 -1
  63. package/dist/prim.d.ts.map +1 -1
  64. package/dist/prim.js.map +1 -1
  65. package/dist/random.d.ts.map +1 -1
  66. package/dist/script.d.ts +21 -1
  67. package/dist/script.d.ts.map +1 -1
  68. package/dist/script.js +55 -37
  69. package/dist/script.js.map +1 -1
  70. package/dist/typecheck.d.ts +8 -0
  71. package/dist/typecheck.d.ts.map +1 -0
  72. package/dist/typecheck.js +550 -0
  73. package/dist/typecheck.js.map +1 -0
  74. package/dist/values/coerce.d.ts.map +1 -1
  75. package/dist/values/coerce.js +6 -4
  76. package/dist/values/coerce.js.map +1 -1
  77. package/dist/values/list-types.d.ts +15 -0
  78. package/dist/values/list-types.d.ts.map +1 -0
  79. package/dist/values/list-types.js +47 -0
  80. package/dist/values/list-types.js.map +1 -0
  81. package/dist/values/ops.d.ts +1 -1
  82. package/dist/values/ops.d.ts.map +1 -1
  83. package/dist/values/ops.js +20 -23
  84. package/dist/values/ops.js.map +1 -1
  85. package/dist/values/types.d.ts +4 -0
  86. package/dist/values/types.d.ts.map +1 -1
  87. package/dist/values/types.js +21 -2
  88. package/dist/values/types.js.map +1 -1
  89. package/package.json +3 -3
@@ -0,0 +1,550 @@
1
+ import { BUILTIN_SPECS } from './generated/functions.js';
2
+ import { EVENT_SPECS } from './generated/events.js';
3
+ import { CONSTANT_TABLE } from './generated/constants_table.js';
4
+ import { own } from './own.js';
5
+ /**
6
+ * `functions` declares names outside kwdb that tests provide through
7
+ * `script.mock`; calls to any other undeclared name are rejected, as in SL.
8
+ */
9
+ export function typecheck(ast, filename, functions = {}) {
10
+ return new Checker(ast, filename, functions).run();
11
+ }
12
+ const CASTS = {
13
+ integer: ['integer', 'float', 'string', 'list'],
14
+ float: ['integer', 'float', 'string', 'list'],
15
+ string: ['integer', 'float', 'string', 'key', 'vector', 'rotation', 'list'],
16
+ key: ['key', 'string', 'list'],
17
+ vector: ['vector', 'string', 'list'],
18
+ rotation: ['rotation', 'string', 'list'],
19
+ list: ['list', 'string'],
20
+ };
21
+ /** Implicit conversions SL allows on assignment, argument passing and return. */
22
+ function assignable(dst, src) {
23
+ if (src === 'unknown' || dst === 'unknown')
24
+ return true;
25
+ if (src === 'void' || dst === 'void')
26
+ return false;
27
+ return (dst === src ||
28
+ (dst === 'float' && src === 'integer') ||
29
+ (dst === 'key' && src === 'string') ||
30
+ (dst === 'string' && src === 'key'));
31
+ }
32
+ const isNum = (t) => t === 'integer' || t === 'float';
33
+ const isText = (t) => t === 'string' || t === 'key';
34
+ /** Result type of `l op r`, or null when SL rejects the operand types. */
35
+ function binaryType(op, l, r) {
36
+ if (l === 'unknown' || r === 'unknown')
37
+ return 'unknown';
38
+ if (l === 'void' || r === 'void')
39
+ return null;
40
+ const numeric = () => isNum(l) && isNum(r) ? (l === 'float' || r === 'float' ? 'float' : 'integer') : null;
41
+ switch (op) {
42
+ case '+':
43
+ if (l === 'list' || r === 'list')
44
+ return 'list';
45
+ if (l === r && (l === 'string' || l === 'vector' || l === 'rotation'))
46
+ return l;
47
+ return numeric();
48
+ case '-':
49
+ if (l === r && (l === 'vector' || l === 'rotation'))
50
+ return l;
51
+ return numeric();
52
+ case '*':
53
+ if (l === 'vector' && r === 'vector')
54
+ return 'float';
55
+ if ((l === 'vector' && isNum(r)) || (isNum(l) && r === 'vector'))
56
+ return 'vector';
57
+ if (l === 'vector' && r === 'rotation')
58
+ return 'vector';
59
+ if (l === 'rotation' && r === 'rotation')
60
+ return 'rotation';
61
+ return numeric();
62
+ case '/':
63
+ if (l === 'vector' && (isNum(r) || r === 'rotation'))
64
+ return 'vector';
65
+ if (l === 'rotation' && r === 'rotation')
66
+ return 'rotation';
67
+ return numeric();
68
+ case '%':
69
+ if (l === 'vector' && r === 'vector')
70
+ return 'vector';
71
+ return l === 'integer' && r === 'integer' ? 'integer' : null;
72
+ case '==':
73
+ case '!=':
74
+ return (isNum(l) && isNum(r)) || (isText(l) && isText(r)) || l === r ? 'integer' : null;
75
+ case '<':
76
+ case '>':
77
+ case '<=':
78
+ case '>=':
79
+ return numeric() ? 'integer' : null;
80
+ case '<<':
81
+ case '>>':
82
+ case '&':
83
+ case '|':
84
+ case '^':
85
+ case '&&':
86
+ case '||':
87
+ return l === 'integer' && r === 'integer' ? 'integer' : null;
88
+ }
89
+ }
90
+ class Checker {
91
+ ast;
92
+ filename;
93
+ declared;
94
+ diagnostics = [];
95
+ globals = new Map();
96
+ functions = new Map();
97
+ states;
98
+ scopes = [];
99
+ /** Return type of the function being checked; 'void' inside event handlers. */
100
+ returnType = 'void';
101
+ inFunction = false;
102
+ /** Labels visible from the current block: its own and every enclosing block's. */
103
+ labelScopes = [];
104
+ /** Every label in the current function or handler; Mono rejects duplicates. */
105
+ labels = new Set();
106
+ constructor(ast, filename, declared) {
107
+ this.ast = ast;
108
+ this.filename = filename;
109
+ this.declared = declared;
110
+ this.states = new Set(ast.states.map((s) => s.name));
111
+ for (const f of ast.functions) {
112
+ this.functions.set(f.name, {
113
+ returnType: f.returnType ?? 'void',
114
+ params: f.params.map((p) => p.typeName),
115
+ });
116
+ }
117
+ }
118
+ run() {
119
+ const decls = [...this.ast.globals, ...this.ast.functions];
120
+ const states = [...this.ast.states].sort((a, b) => a.loc.offset - b.loc.offset);
121
+ const firstState = states[0];
122
+ if (!firstState)
123
+ this.error(this.ast, 'Syntax error: the script has no default state');
124
+ if (firstState && firstState.name !== 'default') {
125
+ this.error(firstState, 'Syntax error: the default state must come first');
126
+ }
127
+ for (const d of decls) {
128
+ if (firstState && d.loc.offset > firstState.loc.offset) {
129
+ this.error(d, `Syntax error: ${d.name} must be declared before the states`);
130
+ }
131
+ }
132
+ // Globals, functions and states share one namespace with the built-in
133
+ // functions and constants, and with functions declared for script.mock.
134
+ const topLevel = new Set();
135
+ for (const d of [...decls, ...states].sort((a, b) => a.loc.offset - b.loc.offset)) {
136
+ const builtin = Object.hasOwn(BUILTIN_SPECS, d.name) ||
137
+ Object.hasOwn(CONSTANT_TABLE, d.name) ||
138
+ Object.hasOwn(this.declared, d.name);
139
+ if (builtin || topLevel.has(d.name))
140
+ this.alreadyDeclared(d, d.name);
141
+ topLevel.add(d.name);
142
+ }
143
+ for (const g of this.ast.globals) {
144
+ if (g.init) {
145
+ if (!isSimpleGlobalInit(g.init, true)) {
146
+ this.error(g.init, 'Syntax error: a global can only be initialised with a literal, a constant or an earlier global');
147
+ }
148
+ this.expectAssignable(g, g.typeName, this.expr(g.init));
149
+ }
150
+ this.globals.set(g.name, g.typeName);
151
+ }
152
+ for (const f of this.ast.functions) {
153
+ this.returnType = f.returnType ?? 'void';
154
+ this.inFunction = true;
155
+ this.body(f.params, f.body);
156
+ if (f.returnType && !alwaysReturns(f.body)) {
157
+ this.error(f, `Not all code paths return a value in ${f.name}`);
158
+ }
159
+ }
160
+ this.inFunction = false;
161
+ for (const s of this.ast.states) {
162
+ if (s.handlers.length === 0)
163
+ this.error(s, `Syntax error: state ${s.name} has no event handlers`);
164
+ const events = new Set();
165
+ for (const h of s.handlers) {
166
+ if (events.has(h.name))
167
+ this.alreadyDeclared(h, h.name);
168
+ events.add(h.name);
169
+ const spec = own(EVENT_SPECS, h.name);
170
+ if (!spec) {
171
+ this.error(h, `Unknown event '${h.name}'`);
172
+ }
173
+ else if (spec.params.length !== h.params.length ||
174
+ spec.params.some((p, i) => p.type !== h.params[i].typeName)) {
175
+ const want = spec.params.map((p) => p.type).join(', ');
176
+ this.error(h, `Event '${h.name}' takes (${want})`);
177
+ }
178
+ this.returnType = 'void';
179
+ this.body(h.params, h.body);
180
+ }
181
+ }
182
+ return this.diagnostics;
183
+ }
184
+ error(node, message) {
185
+ this.diagnostics.push({ severity: 'error', message, filename: this.filename, loc: node.loc });
186
+ }
187
+ alreadyDeclared(node, name) {
188
+ this.error(node, `Name previously declared within scope: ${name}`);
189
+ }
190
+ /** Check a function or handler body against its parameters. */
191
+ body(params, body) {
192
+ const scope = new Map();
193
+ for (const p of params) {
194
+ this.declare(scope, p, p.name, p.typeName);
195
+ }
196
+ this.scopes = [scope];
197
+ this.labelScopes = [];
198
+ this.labels = new Set();
199
+ this.block(body, 'denied');
200
+ }
201
+ declare(scope, node, name, type) {
202
+ if (Object.hasOwn(CONSTANT_TABLE, name))
203
+ this.error(node, `Syntax error: ${name} is a constant`);
204
+ else if (scope.has(name))
205
+ this.alreadyDeclared(node, name);
206
+ scope.set(name, type);
207
+ }
208
+ mismatch(node, detail) {
209
+ this.error(node, `Type mismatch: ${detail}`);
210
+ }
211
+ expectAssignable(node, dst, src) {
212
+ if (!assignable(dst, src))
213
+ this.mismatch(node, `cannot assign ${src} to ${dst}`);
214
+ }
215
+ // ---- Statements ----
216
+ block(b, mode) {
217
+ this.scopes.push(new Map());
218
+ this.labelScopes.push(labelsIn(b.body));
219
+ const pending = b.body.flatMap((s) => this.stmt(s, mode));
220
+ this.labelScopes.pop();
221
+ this.scopes.pop();
222
+ return pending;
223
+ }
224
+ /** Returns deferred errors that only count if an enclosing `if` gets an `else`. */
225
+ restricted(node, message, mode) {
226
+ if (mode === 'denied')
227
+ this.error(node, message);
228
+ return mode === 'deferred' ? [{ node, message }] : [];
229
+ }
230
+ stmt(s, mode) {
231
+ switch (s.kind) {
232
+ case 'BlockStatement':
233
+ return this.block(s, mode);
234
+ case 'VariableDeclaration':
235
+ if (s.init)
236
+ this.expectAssignable(s, s.typeName, this.expr(s.init));
237
+ this.declare(this.scopes[this.scopes.length - 1], s, s.name, s.typeName);
238
+ return [];
239
+ case 'EmptyStatement':
240
+ return [];
241
+ case 'ExpressionStatement':
242
+ this.expr(s.expression);
243
+ return [];
244
+ case 'IfStatement': {
245
+ this.condition(s.test);
246
+ const then = this.stmt(s.consequent, 'deferred');
247
+ if (!s.alternate)
248
+ return [];
249
+ if (mode === 'denied')
250
+ for (const p of then)
251
+ this.error(p.node, p.message);
252
+ const otherwise = this.stmt(s.alternate, mode);
253
+ return mode === 'deferred' ? [...then, ...otherwise] : [];
254
+ }
255
+ case 'WhileStatement':
256
+ this.condition(s.test);
257
+ this.stmt(s.body, 'allowed');
258
+ return [];
259
+ case 'DoWhileStatement':
260
+ this.stmt(s.body, 'allowed');
261
+ this.condition(s.test);
262
+ return [];
263
+ case 'ForStatement':
264
+ for (const e of s.init)
265
+ this.expr(e);
266
+ if (s.test)
267
+ this.condition(s.test);
268
+ for (const e of s.update)
269
+ this.expr(e);
270
+ this.stmt(s.body, 'allowed');
271
+ return [];
272
+ case 'ReturnStatement': {
273
+ const got = s.argument ? this.expr(s.argument) : 'void';
274
+ if (got === 'void' && this.returnType !== 'void') {
275
+ this.error(s, "Function returns a value but return statement doesn't");
276
+ return [];
277
+ }
278
+ const message = `Return statement type doesn't match function return type (${got} vs ${this.returnType})`;
279
+ if (this.returnType === 'void') {
280
+ if (got === 'unknown')
281
+ return [];
282
+ if (got !== 'void')
283
+ this.error(s, message);
284
+ // `return voidFn();` compiles in some positions (an LL compiler quirk).
285
+ else if (s.argument)
286
+ return this.restricted(s, message, mode);
287
+ }
288
+ else if (!assignable(this.returnType, got)) {
289
+ this.error(s, message);
290
+ }
291
+ return [];
292
+ }
293
+ case 'StateChangeStatement':
294
+ if (!this.states.has(s.target))
295
+ this.error(s, `Name not defined within scope: state ${s.target}`);
296
+ return this.inFunction ? this.restricted(s, "Global functions can't change state", mode) : [];
297
+ case 'JumpStatement':
298
+ if (!this.labelScopes.some((scope) => scope.has(s.label))) {
299
+ this.error(s, `Name not defined within scope: label ${s.label}`);
300
+ }
301
+ return [];
302
+ case 'LabelStatement':
303
+ if (this.labels.has(s.name))
304
+ this.error(s, `Duplicate label name: ${s.name}`);
305
+ this.labels.add(s.name);
306
+ this.declare(this.scopes[this.scopes.length - 1], s, s.name, 'label');
307
+ return [];
308
+ }
309
+ }
310
+ condition(e) {
311
+ if (this.expr(e) === 'void')
312
+ this.mismatch(e, 'condition has no value');
313
+ }
314
+ // ---- Expressions ----
315
+ isVariable(name) {
316
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
317
+ const t = this.scopes[i].get(name);
318
+ if (t)
319
+ return t !== 'label';
320
+ }
321
+ return this.globals.has(name);
322
+ }
323
+ /** A constant not hidden by a variable of the same name. */
324
+ isConstant(name) {
325
+ return !this.isVariable(name) && own(CONSTANT_TABLE, name) !== undefined;
326
+ }
327
+ /** Type of a variable or constant; a label in scope hides outer names. */
328
+ lookup(name) {
329
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
330
+ const t = this.scopes[i].get(name);
331
+ if (t)
332
+ return t === 'label' ? undefined : t;
333
+ }
334
+ return this.globals.get(name) ?? own(CONSTANT_TABLE, name)?.type;
335
+ }
336
+ expr(e) {
337
+ switch (e.kind) {
338
+ case 'IntegerLiteral':
339
+ return 'integer';
340
+ case 'FloatLiteral':
341
+ return 'float';
342
+ case 'StringLiteral':
343
+ return 'string';
344
+ case 'VectorLiteral':
345
+ for (const c of [e.x, e.y, e.z])
346
+ this.component(c);
347
+ return 'vector';
348
+ case 'RotationLiteral':
349
+ for (const c of [e.x, e.y, e.z, e.s])
350
+ this.component(c);
351
+ return 'rotation';
352
+ case 'ListLiteral':
353
+ // SL compiles any element type; a list or void element only fails at runtime.
354
+ for (const el of e.elements)
355
+ this.expr(el);
356
+ return 'list';
357
+ case 'Identifier': {
358
+ const t = this.lookup(e.name);
359
+ if (t)
360
+ return t;
361
+ this.error(e, `Name not defined within scope: ${e.name}`);
362
+ return 'unknown';
363
+ }
364
+ case 'CallExpression':
365
+ return this.call(e);
366
+ case 'UnaryExpression': {
367
+ const t = this.expr(e.argument);
368
+ if (t === 'unknown')
369
+ return t;
370
+ const ok = e.operator === '-'
371
+ ? isNum(t) || t === 'vector' || t === 'rotation'
372
+ : t === 'integer';
373
+ if (ok)
374
+ return t;
375
+ this.mismatch(e, `'${e.operator}' not defined for ${t}`);
376
+ return 'unknown';
377
+ }
378
+ case 'BinaryExpression': {
379
+ const l = this.expr(e.left);
380
+ const r = this.expr(e.right);
381
+ const t = binaryType(e.operator, l, r);
382
+ if (t)
383
+ return t;
384
+ this.mismatch(e, `'${e.operator}' not defined for ${l} and ${r}`);
385
+ return 'unknown';
386
+ }
387
+ case 'AssignmentExpression': {
388
+ const target = this.lvalue(e.target);
389
+ const value = this.expr(e.value);
390
+ if (e.operator === '=') {
391
+ this.expectAssignable(e, target, value);
392
+ return target;
393
+ }
394
+ // `integer *= float` is a documented SL quirk; every other compound
395
+ // assignment must produce a value assignable back to the target.
396
+ if (e.operator === '*=' && target === 'integer' && value === 'float')
397
+ return target;
398
+ const t = binaryType(e.operator[0], target, value);
399
+ if (!t || !assignable(target, t)) {
400
+ this.mismatch(e, `'${e.operator}' not defined for ${target} and ${value}`);
401
+ }
402
+ return target;
403
+ }
404
+ case 'CastExpression': {
405
+ const t = this.expr(e.argument);
406
+ if (t === 'unknown')
407
+ return e.targetType;
408
+ if (t === 'void' || !CASTS[t].includes(e.targetType)) {
409
+ this.mismatch(e, `cannot cast ${t} to ${e.targetType}`);
410
+ }
411
+ return e.targetType;
412
+ }
413
+ case 'MemberExpression':
414
+ return this.member(e);
415
+ case 'UpdateExpression': {
416
+ const t = this.lvalue(e.argument);
417
+ if (t !== 'unknown' && !isNum(t))
418
+ this.mismatch(e, `'${e.operator}' not defined for ${t}`);
419
+ return t;
420
+ }
421
+ case 'PrintExpression':
422
+ return this.expr(e.argument);
423
+ }
424
+ }
425
+ component(e) {
426
+ const t = this.expr(e);
427
+ if (!assignable('float', t))
428
+ this.mismatch(e, `vector/rotation component must be a number, got ${t}`);
429
+ }
430
+ member(e) {
431
+ if (e.object.kind !== 'Identifier') {
432
+ this.error(e, `Syntax error: .${e.property} only works on a variable`);
433
+ }
434
+ else if (this.isConstant(e.object.name)) {
435
+ this.error(e, `Syntax error: can't read a component of constant ${e.object.name}`);
436
+ }
437
+ const t = this.expr(e.object);
438
+ if (t === 'unknown')
439
+ return 'float';
440
+ const ok = (t === 'vector' && ['x', 'y', 'z'].includes(e.property)) ||
441
+ (t === 'rotation' && ['x', 'y', 'z', 's'].includes(e.property));
442
+ if (!ok)
443
+ this.error(e, `Use of vector or quaternion method on incorrect type: ${t}.${e.property}`);
444
+ return 'float';
445
+ }
446
+ lvalue(e) {
447
+ const base = e.kind === 'MemberExpression' ? e.object : e;
448
+ if (base.kind === 'Identifier' && this.isConstant(base.name)) {
449
+ this.error(e, `Syntax error: can't assign to constant ${base.name}`);
450
+ return e.kind === 'MemberExpression' ? 'float' : this.expr(e);
451
+ }
452
+ if (e.kind === 'Identifier' || e.kind === 'MemberExpression')
453
+ return this.expr(e);
454
+ this.expr(e);
455
+ this.error(e, 'Assignment target must be a variable');
456
+ return 'unknown';
457
+ }
458
+ call(e) {
459
+ const args = e.args.map((a) => this.expr(a));
460
+ const builtin = own(BUILTIN_SPECS, e.callee);
461
+ const declared = own(CONSTANT_TABLE, e.callee) ? undefined : own(this.declared, e.callee);
462
+ const sig = this.functions.get(e.callee) ??
463
+ (builtin && { returnType: builtin.returnType, params: builtin.params.map((p) => p.type) }) ??
464
+ (declared && { returnType: declared.returns ?? 'void', params: declared.params ?? [] });
465
+ if (!sig) {
466
+ // Calls resolve in the global namespace, so locals and events don't count.
467
+ const named = this.globals.has(e.callee) || own(CONSTANT_TABLE, e.callee) || this.states.has(e.callee);
468
+ this.error(e, `Name not defined within scope: ${e.callee}${named ? ' is not a function' : ''}`);
469
+ return 'unknown';
470
+ }
471
+ if (sig.params.length !== args.length || sig.params.some((p, i) => !assignable(p, args[i]))) {
472
+ const want = sig.params.join(', ');
473
+ this.error(e, `Function call mismatches type or number of arguments: ${e.callee}(${want})`);
474
+ }
475
+ return sig.returnType;
476
+ }
477
+ }
478
+ /**
479
+ * SL only allows literals, constants and earlier globals in a global
480
+ * initialiser, optionally negated (numbers) or wrapped in a vector, rotation
481
+ * or (one level of) list literal.
482
+ */
483
+ function isSimpleGlobalInit(e, allowList) {
484
+ switch (e.kind) {
485
+ case 'IntegerLiteral':
486
+ case 'FloatLiteral':
487
+ case 'StringLiteral':
488
+ case 'Identifier':
489
+ return true;
490
+ case 'UnaryExpression':
491
+ return (e.operator === '-' &&
492
+ (e.argument.kind === 'IntegerLiteral' || e.argument.kind === 'FloatLiteral'));
493
+ case 'VectorLiteral':
494
+ return [e.x, e.y, e.z].every((c) => isSimpleGlobalInit(c, false));
495
+ case 'RotationLiteral':
496
+ return [e.x, e.y, e.z, e.s].every((c) => isSimpleGlobalInit(c, false));
497
+ case 'ListLiteral':
498
+ return allowList && e.elements.every((el) => isSimpleGlobalInit(el, false));
499
+ default:
500
+ return false;
501
+ }
502
+ }
503
+ /**
504
+ * SL's return-path rule: a block returns if its last statement does, and an
505
+ * `if` returns only when both branches do. Loops never count.
506
+ */
507
+ function alwaysReturns(s) {
508
+ switch (s.kind) {
509
+ case 'ReturnStatement':
510
+ return true;
511
+ case 'BlockStatement': {
512
+ const last = s.body[s.body.length - 1];
513
+ return last !== undefined && alwaysReturns(last);
514
+ }
515
+ case 'IfStatement':
516
+ return s.alternate !== null && alwaysReturns(s.consequent) && alwaysReturns(s.alternate);
517
+ default:
518
+ return false;
519
+ }
520
+ }
521
+ /**
522
+ * Labels declared in a block, including inside unbraced if/loop bodies,
523
+ * which share the block's scope. Jumps can reach these from the block and
524
+ * anything nested in it, before or after the label.
525
+ */
526
+ function labelsIn(stmts) {
527
+ const out = new Set();
528
+ const visit = (s) => {
529
+ switch (s.kind) {
530
+ case 'LabelStatement':
531
+ out.add(s.name);
532
+ return;
533
+ case 'IfStatement':
534
+ visit(s.consequent);
535
+ if (s.alternate)
536
+ visit(s.alternate);
537
+ return;
538
+ case 'WhileStatement':
539
+ case 'DoWhileStatement':
540
+ case 'ForStatement':
541
+ visit(s.body);
542
+ return;
543
+ default:
544
+ return;
545
+ }
546
+ };
547
+ stmts.forEach(visit);
548
+ return out;
549
+ }
550
+ //# sourceMappingURL=typecheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typecheck.js","sourceRoot":"","sources":["../src/typecheck.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"coerce.d.ts","sourceRoot":"","sources":["../../src/values/coerce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAY,MAAM,YAAY,CAAA;AAC/D,OAAO,EAA8B,QAAQ,EAAiC,MAAM,YAAY,CAAA;AAGhG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,CAuCpE;AAMD,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAoB/C;AAkFD,iEAAiE;AACjE,OAAO,EAAE,QAAQ,EAAE,CAAA"}
1
+ {"version":3,"file":"coerce.d.ts","sourceRoot":"","sources":["../../src/values/coerce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAY,MAAM,YAAY,CAAA;AAC/D,OAAO,EAA8B,QAAQ,EAA4C,MAAM,YAAY,CAAA;AAI3G;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,CAuCpE;AAMD,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAoB/C;AAmFD,iEAAiE;AACjE,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -1,5 +1,6 @@
1
- import { ZERO_VECTOR, ZERO_ROTATION, NULL_KEY, isVector, isRotation, toInt32 } from './types.js';
1
+ import { ZERO_VECTOR, ZERO_ROTATION, NULL_KEY, isVector, isRotation, toInt32, toFloat32 } from './types.js';
2
2
  import { formatFloat, formatList, formatVector, formatRotation } from './format.js';
3
+ import { typedList } from './list-types.js';
3
4
  /**
4
5
  * Coerce a runtime value to a target LSL type.
5
6
  *
@@ -28,7 +29,7 @@ export function coerce(from, target) {
28
29
  }
29
30
  case 'float': {
30
31
  if (typeof v === 'number')
31
- return { type: 'float', value: v };
32
+ return { type: 'float', value: toFloat32(v) };
32
33
  if (typeof v === 'string')
33
34
  return { type: 'float', value: parseLslFloat(v) };
34
35
  throw typeError(from, target);
@@ -59,7 +60,7 @@ export function coerce(from, target) {
59
60
  if (Array.isArray(v))
60
61
  return { type: 'list', value: v };
61
62
  // Wrap any single value as a one-element list.
62
- return { type: 'list', value: [v] };
63
+ return { type: 'list', value: typedList([v], [from.type]) };
63
64
  }
64
65
  case 'void':
65
66
  throw new Error('cannot coerce to void');
@@ -154,7 +155,8 @@ function parseLslFloat(s) {
154
155
  if (i === start)
155
156
  return 0;
156
157
  const n = Number.parseFloat(s.slice(start, i));
157
- return Number.isFinite(n) ? n : 0;
158
+ // A value too large for a 32-bit float rounds to infinity, as in Mono.
159
+ return Number.isFinite(n) ? toFloat32(n) : 0;
158
160
  }
159
161
  function parseLslVector(s) {
160
162
  const m = s.match(/^\s*<\s*([^,]+),\s*([^,]+),\s*([^>]+)\s*>\s*$/);