@rezless/vm 0.1.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 (175) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +32 -0
  3. package/dist/builtins/base64.d.ts +25 -0
  4. package/dist/builtins/base64.d.ts.map +1 -0
  5. package/dist/builtins/base64.js +43 -0
  6. package/dist/builtins/base64.js.map +1 -0
  7. package/dist/builtins/chat.d.ts +10 -0
  8. package/dist/builtins/chat.d.ts.map +1 -0
  9. package/dist/builtins/chat.js +36 -0
  10. package/dist/builtins/chat.js.map +1 -0
  11. package/dist/builtins/dataserver.d.ts +26 -0
  12. package/dist/builtins/dataserver.d.ts.map +1 -0
  13. package/dist/builtins/dataserver.js +20 -0
  14. package/dist/builtins/dataserver.js.map +1 -0
  15. package/dist/builtins/detected.d.ts +40 -0
  16. package/dist/builtins/detected.d.ts.map +1 -0
  17. package/dist/builtins/detected.js +23 -0
  18. package/dist/builtins/detected.js.map +1 -0
  19. package/dist/builtins/hash.d.ts +6 -0
  20. package/dist/builtins/hash.d.ts.map +1 -0
  21. package/dist/builtins/hash.js +34 -0
  22. package/dist/builtins/hash.js.map +1 -0
  23. package/dist/builtins/http.d.ts +40 -0
  24. package/dist/builtins/http.d.ts.map +1 -0
  25. package/dist/builtins/http.js +87 -0
  26. package/dist/builtins/http.js.map +1 -0
  27. package/dist/builtins/identity.d.ts +14 -0
  28. package/dist/builtins/identity.d.ts.map +1 -0
  29. package/dist/builtins/identity.js +17 -0
  30. package/dist/builtins/identity.js.map +1 -0
  31. package/dist/builtins/index.d.ts +8 -0
  32. package/dist/builtins/index.d.ts.map +1 -0
  33. package/dist/builtins/index.js +232 -0
  34. package/dist/builtins/index.js.map +1 -0
  35. package/dist/builtins/inventory.d.ts +33 -0
  36. package/dist/builtins/inventory.d.ts.map +1 -0
  37. package/dist/builtins/inventory.js +134 -0
  38. package/dist/builtins/inventory.js.map +1 -0
  39. package/dist/builtins/json.d.ts +7 -0
  40. package/dist/builtins/json.d.ts.map +1 -0
  41. package/dist/builtins/json.js +690 -0
  42. package/dist/builtins/json.js.map +1 -0
  43. package/dist/builtins/link-info.d.ts +10 -0
  44. package/dist/builtins/link-info.d.ts.map +1 -0
  45. package/dist/builtins/link-info.js +26 -0
  46. package/dist/builtins/link-info.js.map +1 -0
  47. package/dist/builtins/linked.d.ts +23 -0
  48. package/dist/builtins/linked.d.ts.map +1 -0
  49. package/dist/builtins/linked.js +20 -0
  50. package/dist/builtins/linked.js.map +1 -0
  51. package/dist/builtins/linksetdata.d.ts +20 -0
  52. package/dist/builtins/linksetdata.d.ts.map +1 -0
  53. package/dist/builtins/linksetdata.js +196 -0
  54. package/dist/builtins/linksetdata.js.map +1 -0
  55. package/dist/builtins/listen.d.ts +33 -0
  56. package/dist/builtins/listen.d.ts.map +1 -0
  57. package/dist/builtins/listen.js +45 -0
  58. package/dist/builtins/listen.js.map +1 -0
  59. package/dist/builtins/lists.d.ts +37 -0
  60. package/dist/builtins/lists.d.ts.map +1 -0
  61. package/dist/builtins/lists.js +275 -0
  62. package/dist/builtins/lists.js.map +1 -0
  63. package/dist/builtins/math.d.ts +32 -0
  64. package/dist/builtins/math.d.ts.map +1 -0
  65. package/dist/builtins/math.js +104 -0
  66. package/dist/builtins/math.js.map +1 -0
  67. package/dist/builtins/object.d.ts +29 -0
  68. package/dist/builtins/object.d.ts.map +1 -0
  69. package/dist/builtins/object.js +50 -0
  70. package/dist/builtins/object.js.map +1 -0
  71. package/dist/builtins/prim-accessors.d.ts +56 -0
  72. package/dist/builtins/prim-accessors.d.ts.map +1 -0
  73. package/dist/builtins/prim-accessors.js +353 -0
  74. package/dist/builtins/prim-accessors.js.map +1 -0
  75. package/dist/builtins/prim-params.d.ts +12 -0
  76. package/dist/builtins/prim-params.d.ts.map +1 -0
  77. package/dist/builtins/prim-params.js +124 -0
  78. package/dist/builtins/prim-params.js.map +1 -0
  79. package/dist/builtins/script-control.d.ts +13 -0
  80. package/dist/builtins/script-control.d.ts.map +1 -0
  81. package/dist/builtins/script-control.js +41 -0
  82. package/dist/builtins/script-control.js.map +1 -0
  83. package/dist/builtins/strings.d.ts +23 -0
  84. package/dist/builtins/strings.d.ts.map +1 -0
  85. package/dist/builtins/strings.js +130 -0
  86. package/dist/builtins/strings.js.map +1 -0
  87. package/dist/builtins/time.d.ts +28 -0
  88. package/dist/builtins/time.d.ts.map +1 -0
  89. package/dist/builtins/time.js +54 -0
  90. package/dist/builtins/time.js.map +1 -0
  91. package/dist/clock.d.ts +75 -0
  92. package/dist/clock.d.ts.map +1 -0
  93. package/dist/clock.js +125 -0
  94. package/dist/clock.js.map +1 -0
  95. package/dist/coverage.d.ts +110 -0
  96. package/dist/coverage.d.ts.map +1 -0
  97. package/dist/coverage.js +221 -0
  98. package/dist/coverage.js.map +1 -0
  99. package/dist/dispatch.d.ts +19 -0
  100. package/dist/dispatch.d.ts.map +1 -0
  101. package/dist/dispatch.js +42 -0
  102. package/dist/dispatch.js.map +1 -0
  103. package/dist/env.d.ts +33 -0
  104. package/dist/env.d.ts.map +1 -0
  105. package/dist/env.js +76 -0
  106. package/dist/env.js.map +1 -0
  107. package/dist/generated/constants.d.ts +967 -0
  108. package/dist/generated/constants.d.ts.map +1 -0
  109. package/dist/generated/constants.js +969 -0
  110. package/dist/generated/constants.js.map +1 -0
  111. package/dist/generated/constants_table.d.ts +11 -0
  112. package/dist/generated/constants_table.d.ts.map +1 -0
  113. package/dist/generated/constants_table.js +978 -0
  114. package/dist/generated/constants_table.js.map +1 -0
  115. package/dist/generated/events.d.ts +545 -0
  116. package/dist/generated/events.d.ts.map +1 -0
  117. package/dist/generated/events.js +49 -0
  118. package/dist/generated/events.js.map +1 -0
  119. package/dist/generated/functions.d.ts +6051 -0
  120. package/dist/generated/functions.d.ts.map +1 -0
  121. package/dist/generated/functions.js +526 -0
  122. package/dist/generated/functions.js.map +1 -0
  123. package/dist/index.d.ts +21 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +11 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/interpreter.d.ts +39 -0
  128. package/dist/interpreter.d.ts.map +1 -0
  129. package/dist/interpreter.js +381 -0
  130. package/dist/interpreter.js.map +1 -0
  131. package/dist/inventory.d.ts +52 -0
  132. package/dist/inventory.d.ts.map +1 -0
  133. package/dist/inventory.js +45 -0
  134. package/dist/inventory.js.map +1 -0
  135. package/dist/linkset.d.ts +89 -0
  136. package/dist/linkset.d.ts.map +1 -0
  137. package/dist/linkset.js +179 -0
  138. package/dist/linkset.js.map +1 -0
  139. package/dist/prim-params.d.ts +221 -0
  140. package/dist/prim-params.d.ts.map +1 -0
  141. package/dist/prim-params.js +852 -0
  142. package/dist/prim-params.js.map +1 -0
  143. package/dist/prim.d.ts +79 -0
  144. package/dist/prim.d.ts.map +1 -0
  145. package/dist/prim.js +96 -0
  146. package/dist/prim.js.map +1 -0
  147. package/dist/random.d.ts +16 -0
  148. package/dist/random.d.ts.map +1 -0
  149. package/dist/random.js +29 -0
  150. package/dist/random.js.map +1 -0
  151. package/dist/runtime.d.ts +108 -0
  152. package/dist/runtime.d.ts.map +1 -0
  153. package/dist/runtime.js +2 -0
  154. package/dist/runtime.js.map +1 -0
  155. package/dist/script.d.ts +248 -0
  156. package/dist/script.d.ts.map +1 -0
  157. package/dist/script.js +667 -0
  158. package/dist/script.js.map +1 -0
  159. package/dist/values/coerce.d.ts +22 -0
  160. package/dist/values/coerce.d.ts.map +1 -0
  161. package/dist/values/coerce.js +184 -0
  162. package/dist/values/coerce.js.map +1 -0
  163. package/dist/values/format.d.ts +20 -0
  164. package/dist/values/format.d.ts.map +1 -0
  165. package/dist/values/format.js +47 -0
  166. package/dist/values/format.js.map +1 -0
  167. package/dist/values/ops.d.ts +19 -0
  168. package/dist/values/ops.d.ts.map +1 -0
  169. package/dist/values/ops.js +345 -0
  170. package/dist/values/ops.js.map +1 -0
  171. package/dist/values/types.d.ts +39 -0
  172. package/dist/values/types.d.ts.map +1 -0
  173. package/dist/values/types.js +68 -0
  174. package/dist/values/types.js.map +1 -0
  175. package/package.json +52 -0
@@ -0,0 +1,381 @@
1
+ import { callBuiltin, specFor } from './dispatch.js';
2
+ import { defaultEvalFor, isVector, isRotation } from './values/types.js';
3
+ import { coerce } from './values/coerce.js';
4
+ import { applyBinary, applyUnary, reduceCompound, truthy } from './values/ops.js';
5
+ import { Env } from './env.js';
6
+ class ReturnSignal {
7
+ value;
8
+ constructor(value) {
9
+ this.value = value;
10
+ }
11
+ }
12
+ class JumpSignal {
13
+ label;
14
+ constructor(label) {
15
+ this.label = label;
16
+ }
17
+ }
18
+ export class StateChangeSignal {
19
+ target;
20
+ constructor(target) {
21
+ this.target = target;
22
+ }
23
+ }
24
+ export function execHandler(ctx, handler, args = []) {
25
+ if (ctx.state.coverage) {
26
+ ctx.state.coverage.hitFunction(handler.loc);
27
+ // execBlock bypasses execStatement for the outermost body, so credit
28
+ // the body BlockStatement here.
29
+ ctx.state.coverage.hitStatement(handler.body.loc);
30
+ }
31
+ const env = ctx.globals.push();
32
+ // Bind handler params (each carries declared LSL type).
33
+ handler.params.forEach((p, i) => {
34
+ const a = args[i] ?? defaultEvalFor(p.typeName);
35
+ env.declare(p.name, p.typeName, a);
36
+ });
37
+ try {
38
+ execBlock(ctx, env, handler.body);
39
+ }
40
+ catch (e) {
41
+ if (e instanceof ReturnSignal)
42
+ return;
43
+ throw e;
44
+ }
45
+ }
46
+ /**
47
+ * Invoke a user-defined function. Pushes a fresh env (no closures —
48
+ * functions see globals only), binds args to params, runs the body,
49
+ * and unwraps a ReturnSignal into the function's return value.
50
+ */
51
+ export function callUserFunction(ctx, fn, args) {
52
+ if (ctx.state.coverage) {
53
+ ctx.state.coverage.hitFunction(fn.loc);
54
+ ctx.state.coverage.hitStatement(fn.body.loc);
55
+ }
56
+ const env = ctx.globals.push();
57
+ fn.params.forEach((p, i) => {
58
+ const a = args[i] ?? defaultEvalFor(p.typeName);
59
+ env.declare(p.name, p.typeName, a);
60
+ });
61
+ try {
62
+ execBlock(ctx, env, fn.body);
63
+ }
64
+ catch (e) {
65
+ if (e instanceof ReturnSignal) {
66
+ if (fn.returnType === null)
67
+ return { type: 'void', value: 0 };
68
+ return e.value ? coerce(e.value, fn.returnType) : defaultEvalFor(fn.returnType);
69
+ }
70
+ if (e instanceof JumpSignal) {
71
+ // A jump that escaped the function body means the label is undefined
72
+ // within the function. Without this catch the signal would bubble into
73
+ // the calling handler and could land on an unrelated same-named label.
74
+ throw new Error(`jump to undefined label '${e.label}' in function '${fn.name}'`);
75
+ }
76
+ throw e;
77
+ }
78
+ // Fell off end without explicit return.
79
+ return fn.returnType ? defaultEvalFor(fn.returnType) : { type: 'void', value: 0 };
80
+ }
81
+ function execBlock(ctx, env, block) {
82
+ const child = env.push();
83
+ // Pre-scan: collect label positions and detect duplicate variable names.
84
+ // Duplicate-decl detection has to run upfront because we use
85
+ // declareOrReset below — that quietly tolerates re-running a declaration
86
+ // (which is what backward `jump` does), but a real source-level duplicate
87
+ // like `integer x; integer x;` should still error.
88
+ let labels = null;
89
+ const declaredNames = new Set();
90
+ for (let i = 0; i < block.body.length; i++) {
91
+ const s = block.body[i];
92
+ if (s.kind === 'LabelStatement') {
93
+ if (!labels)
94
+ labels = new Map();
95
+ labels.set(s.name, i);
96
+ }
97
+ else if (s.kind === 'VariableDeclaration') {
98
+ if (declaredNames.has(s.name)) {
99
+ throw new Error(`duplicate declaration of '${s.name}' in block`);
100
+ }
101
+ declaredNames.add(s.name);
102
+ }
103
+ }
104
+ let i = 0;
105
+ while (i < block.body.length) {
106
+ const stmt = block.body[i];
107
+ try {
108
+ execStatement(ctx, child, stmt);
109
+ i++;
110
+ }
111
+ catch (e) {
112
+ if (e instanceof JumpSignal && labels && labels.has(e.label)) {
113
+ // Resume execution at the label.
114
+ i = labels.get(e.label) + 1;
115
+ continue;
116
+ }
117
+ throw e;
118
+ }
119
+ }
120
+ }
121
+ function execStatement(ctx, env, stmt) {
122
+ if (ctx.state.coverage)
123
+ ctx.state.coverage.hitStatement(stmt.loc);
124
+ switch (stmt.kind) {
125
+ case 'BlockStatement':
126
+ execBlock(ctx, env, stmt);
127
+ return;
128
+ case 'VariableDeclaration':
129
+ execVariableDeclaration(ctx, env, stmt);
130
+ return;
131
+ case 'ExpressionStatement':
132
+ evalExpression(ctx, env, stmt.expression);
133
+ return;
134
+ case 'IfStatement':
135
+ execIf(ctx, env, stmt);
136
+ return;
137
+ case 'WhileStatement':
138
+ execWhile(ctx, env, stmt);
139
+ return;
140
+ case 'DoWhileStatement':
141
+ execDoWhile(ctx, env, stmt);
142
+ return;
143
+ case 'ForStatement':
144
+ execFor(ctx, env, stmt);
145
+ return;
146
+ case 'ReturnStatement': {
147
+ const value = stmt.argument ? evalExpression(ctx, env, stmt.argument) : null;
148
+ throw new ReturnSignal(value);
149
+ }
150
+ case 'StateChangeStatement':
151
+ throw new StateChangeSignal(stmt.target);
152
+ case 'JumpStatement':
153
+ throw new JumpSignal(stmt.label);
154
+ case 'LabelStatement':
155
+ // No-op at execution time; labels are landing pads for `jump`.
156
+ return;
157
+ }
158
+ }
159
+ function execVariableDeclaration(ctx, env, stmt) {
160
+ const init = stmt.init ? evalExpression(ctx, env, stmt.init) : undefined;
161
+ // declareOrReset lets a backward `jump` re-execute a VariableDeclaration —
162
+ // the second pass updates the existing slot's value rather than throwing
163
+ // "already declared". The duplicate-source guard runs upfront in execBlock.
164
+ env.declareOrReset(stmt.name, stmt.typeName, init);
165
+ }
166
+ function execIf(ctx, env, stmt) {
167
+ const cov = ctx.state.coverage;
168
+ if (truthy(evalExpression(ctx, env, stmt.test))) {
169
+ if (cov)
170
+ cov.hitBranch(stmt.loc, true);
171
+ execStatement(ctx, env, stmt.consequent);
172
+ }
173
+ else {
174
+ if (cov)
175
+ cov.hitBranch(stmt.loc, false);
176
+ if (stmt.alternate)
177
+ execStatement(ctx, env, stmt.alternate);
178
+ }
179
+ }
180
+ function execWhile(ctx, env, stmt) {
181
+ const cov = ctx.state.coverage;
182
+ while (true) {
183
+ const t = truthy(evalExpression(ctx, env, stmt.test));
184
+ if (cov)
185
+ cov.hitBranch(stmt.loc, t);
186
+ if (!t)
187
+ break;
188
+ execStatement(ctx, env, stmt.body);
189
+ }
190
+ }
191
+ function execDoWhile(ctx, env, stmt) {
192
+ const cov = ctx.state.coverage;
193
+ while (true) {
194
+ execStatement(ctx, env, stmt.body);
195
+ const t = truthy(evalExpression(ctx, env, stmt.test));
196
+ if (cov)
197
+ cov.hitBranch(stmt.loc, t);
198
+ if (!t)
199
+ break;
200
+ }
201
+ }
202
+ function execFor(ctx, env, stmt) {
203
+ const child = env.push();
204
+ const cov = ctx.state.coverage;
205
+ for (const e of stmt.init)
206
+ evalExpression(ctx, child, e);
207
+ while (true) {
208
+ if (stmt.test) {
209
+ const t = truthy(evalExpression(ctx, child, stmt.test));
210
+ if (cov)
211
+ cov.hitBranch(stmt.loc, t);
212
+ if (!t)
213
+ break;
214
+ }
215
+ else if (cov) {
216
+ // Infinite loop: still useful to record "body entered".
217
+ cov.hitBranch(stmt.loc, true);
218
+ }
219
+ execStatement(ctx, child, stmt.body);
220
+ for (const e of stmt.update)
221
+ evalExpression(ctx, child, e);
222
+ }
223
+ }
224
+ // ---- Expressions ----
225
+ function evalExpression(ctx, env, expr) {
226
+ switch (expr.kind) {
227
+ case 'IntegerLiteral':
228
+ return { type: 'integer', value: expr.value | 0 };
229
+ case 'FloatLiteral':
230
+ return { type: 'float', value: expr.value };
231
+ case 'StringLiteral':
232
+ return { type: 'string', value: expr.value };
233
+ case 'VectorLiteral':
234
+ return evalVectorLiteral(ctx, env, expr);
235
+ case 'RotationLiteral':
236
+ return evalRotationLiteral(ctx, env, expr);
237
+ case 'ListLiteral':
238
+ return evalListLiteral(ctx, env, expr);
239
+ case 'Identifier':
240
+ return env.get(expr.name);
241
+ case 'CallExpression':
242
+ return evalCall(ctx, env, expr);
243
+ case 'UnaryExpression':
244
+ return applyUnary(expr.operator, evalExpression(ctx, env, expr.argument));
245
+ case 'BinaryExpression':
246
+ return evalBinary(ctx, env, expr);
247
+ case 'AssignmentExpression':
248
+ return evalAssignment(ctx, env, expr);
249
+ case 'CastExpression':
250
+ return coerce(evalExpression(ctx, env, expr.argument), expr.targetType);
251
+ case 'MemberExpression':
252
+ return evalMember(ctx, env, expr);
253
+ case 'UpdateExpression':
254
+ return evalUpdate(ctx, env, expr);
255
+ }
256
+ }
257
+ function evalVectorLiteral(ctx, env, e) {
258
+ const x = coerce(evalExpression(ctx, env, e.x), 'float').value;
259
+ const y = coerce(evalExpression(ctx, env, e.y), 'float').value;
260
+ const z = coerce(evalExpression(ctx, env, e.z), 'float').value;
261
+ return { type: 'vector', value: { x, y, z } };
262
+ }
263
+ function evalRotationLiteral(ctx, env, e) {
264
+ const x = coerce(evalExpression(ctx, env, e.x), 'float').value;
265
+ const y = coerce(evalExpression(ctx, env, e.y), 'float').value;
266
+ const z = coerce(evalExpression(ctx, env, e.z), 'float').value;
267
+ const s = coerce(evalExpression(ctx, env, e.s), 'float').value;
268
+ return { type: 'rotation', value: { x, y, z, s } };
269
+ }
270
+ function evalListLiteral(ctx, env, e) {
271
+ const elements = e.elements.map((el) => evalExpression(ctx, env, el).value);
272
+ return { type: 'list', value: elements };
273
+ }
274
+ function evalBinary(ctx, env, e) {
275
+ // LSL: && and || are NOT short-circuit. Eager evaluation matches the language.
276
+ const left = evalExpression(ctx, env, e.left);
277
+ const right = evalExpression(ctx, env, e.right);
278
+ return applyBinary(e.operator, left, right);
279
+ }
280
+ function evalAssignment(ctx, env, e) {
281
+ const newValue = evalExpression(ctx, env, e.value);
282
+ return assignTo(ctx, env, e.target, e.operator, newValue);
283
+ }
284
+ function assignTo(ctx, env, target, op, rhs) {
285
+ if (target.kind === 'Identifier') {
286
+ if (op === '=')
287
+ return env.set(target.name, rhs);
288
+ const current = env.get(target.name);
289
+ return env.set(target.name, reduceCompound(op, current, rhs));
290
+ }
291
+ if (target.kind === 'MemberExpression') {
292
+ return assignToMember(ctx, env, target, op, rhs);
293
+ }
294
+ throw new Error(`invalid assignment target: ${target.kind}`);
295
+ }
296
+ function assignToMember(ctx, env, target, op, rhs) {
297
+ if (target.object.kind !== 'Identifier') {
298
+ throw new Error('member assignment supported only on identifier targets');
299
+ }
300
+ const current = env.get(target.object.name);
301
+ if (!isVector(current.value) && !isRotation(current.value)) {
302
+ throw new Error(`cannot access member on ${current.type}`);
303
+ }
304
+ const obj = current.value;
305
+ const member = target.property;
306
+ if (!['x', 'y', 'z', 's'].includes(member)) {
307
+ throw new Error(`unknown member '${member}' (expected x|y|z|s)`);
308
+ }
309
+ if (member === 's' && !isRotation(obj)) {
310
+ throw new Error(`vector has no '.s' component`);
311
+ }
312
+ const oldField = {
313
+ type: 'float',
314
+ value: obj[member],
315
+ };
316
+ const newField = op === '='
317
+ ? coerce(rhs, 'float')
318
+ : reduceCompound(op, oldField, rhs);
319
+ const updated = { ...obj, [member]: newField.value };
320
+ const wrapped = isRotation(obj)
321
+ ? {
322
+ type: 'rotation',
323
+ value: {
324
+ x: updated.x,
325
+ y: updated.y,
326
+ z: updated.z,
327
+ s: updated.s,
328
+ },
329
+ }
330
+ : {
331
+ type: 'vector',
332
+ value: { x: updated.x, y: updated.y, z: updated.z },
333
+ };
334
+ env.set(target.object.name, wrapped);
335
+ return newField;
336
+ }
337
+ function evalMember(ctx, env, e) {
338
+ const obj = evalExpression(ctx, env, e.object);
339
+ if (!isVector(obj.value) && !isRotation(obj.value)) {
340
+ throw new Error(`cannot access member on ${obj.type}`);
341
+ }
342
+ const v = obj.value;
343
+ const member = e.property;
344
+ if (member === 's' && !isRotation(v)) {
345
+ throw new Error(`vector has no '.s' component`);
346
+ }
347
+ if (!['x', 'y', 'z', 's'].includes(member)) {
348
+ throw new Error(`unknown member '${member}' (expected x|y|z|s)`);
349
+ }
350
+ return { type: 'float', value: v[member] };
351
+ }
352
+ function evalUpdate(ctx, env, e) {
353
+ if (e.argument.kind !== 'Identifier' && e.argument.kind !== 'MemberExpression') {
354
+ throw new Error('++/-- only valid on identifiers or member expressions');
355
+ }
356
+ // Get current value
357
+ const current = evalExpression(ctx, env, e.argument);
358
+ const delta = { type: 'integer', value: e.operator === '++' ? 1 : -1 };
359
+ const updated = reduceCompound('+=', current, delta);
360
+ // Write back
361
+ assignTo(ctx, env, e.argument, '=', updated);
362
+ return e.prefix ? updated : current;
363
+ }
364
+ function evalCall(ctx, env, call) {
365
+ // Evaluate args eagerly (matches LSL semantics).
366
+ const evalArgs = call.args.map((a) => evalExpression(ctx, env, a));
367
+ // User-defined function?
368
+ const userFn = ctx.userFunctions.get(call.callee);
369
+ if (userFn) {
370
+ return callUserFunction(ctx, userFn, evalArgs);
371
+ }
372
+ // Builtin (real, generated stub, or user-mocked).
373
+ const rawArgs = evalArgs.map((r) => r.value);
374
+ const result = callBuiltin({ state: ctx.state, mocks: ctx.mocks, script: ctx.script }, call.callee, rawArgs);
375
+ const spec = specFor(call.callee);
376
+ const returnType = (spec?.returnType ?? 'void');
377
+ if (returnType === 'void')
378
+ return { type: 'void', value: 0 };
379
+ return { type: returnType, value: result ?? defaultEvalFor(returnType).value };
380
+ }
381
+ //# sourceMappingURL=interpreter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.js","sourceRoot":"","sources":["../src/interpreter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * LSL inventory item types. Numeric values come straight from the kwdb
3
+ * INVENTORY_* constants. MESH (22) has no kwdb constant.
4
+ */
5
+ export declare const InventoryType: {
6
+ readonly TEXTURE: number;
7
+ readonly SOUND: number;
8
+ readonly LANDMARK: number;
9
+ readonly CLOTHING: number;
10
+ readonly OBJECT: number;
11
+ readonly NOTECARD: number;
12
+ readonly SCRIPT: number;
13
+ readonly BODYPART: number;
14
+ readonly ANIMATION: number;
15
+ readonly GESTURE: number;
16
+ readonly MESH: 22;
17
+ readonly SETTING: number;
18
+ readonly MATERIAL: number;
19
+ };
20
+ export type InventoryTypeValue = (typeof InventoryType)[keyof typeof InventoryType];
21
+ /** Permission mask slots passed to llGetInventoryPermMask. */
22
+ export interface PermMask {
23
+ readonly base: number;
24
+ readonly owner: number;
25
+ readonly group: number;
26
+ readonly everyone: number;
27
+ readonly next: number;
28
+ }
29
+ /**
30
+ * A single item in a prim's inventory. For scripts, `script` references the
31
+ * `Script` instance; for notecards, `notecardLines` carries the text body.
32
+ * Other types are passive metadata.
33
+ */
34
+ export interface InventoryItem {
35
+ name: string;
36
+ type: InventoryTypeValue;
37
+ key: string;
38
+ creator: string;
39
+ description: string;
40
+ /** Virtual ms timestamp (relative to the linkset clock) when added. */
41
+ acquireTimeMs: number;
42
+ permMask: PermMask;
43
+ /** Set when type === INVENTORY_SCRIPT. */
44
+ script?: import('./script.js').Script;
45
+ /** Set when type === INVENTORY_NOTECARD. */
46
+ notecardLines?: ReadonlyArray<string>;
47
+ }
48
+ export declare function makeInventoryItem(partial: Partial<InventoryItem> & {
49
+ name: string;
50
+ type: InventoryTypeValue;
51
+ }): InventoryItem;
52
+ //# sourceMappingURL=inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../src/inventory.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;CAchB,CAAA;AAEV,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;AAEnF,8DAA8D;AAC9D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAUD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,kBAAkB,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,QAAQ,CAAA;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,aAAa,EAAE,MAAM,CAAA;IACrC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACtC;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC3E,aAAa,CAaf"}
@@ -0,0 +1,45 @@
1
+ import { NULL_KEY } from './values/types.js';
2
+ import { INVENTORY_TEXTURE, INVENTORY_SOUND, INVENTORY_LANDMARK, INVENTORY_CLOTHING, INVENTORY_OBJECT, INVENTORY_NOTECARD, INVENTORY_SCRIPT, INVENTORY_BODYPART, INVENTORY_ANIMATION, INVENTORY_GESTURE, INVENTORY_SETTING, INVENTORY_MATERIAL, PERM_ALL, } from './generated/constants.js';
3
+ /**
4
+ * LSL inventory item types. Numeric values come straight from the kwdb
5
+ * INVENTORY_* constants. MESH (22) has no kwdb constant.
6
+ */
7
+ export const InventoryType = {
8
+ TEXTURE: INVENTORY_TEXTURE,
9
+ SOUND: INVENTORY_SOUND,
10
+ LANDMARK: INVENTORY_LANDMARK,
11
+ CLOTHING: INVENTORY_CLOTHING,
12
+ OBJECT: INVENTORY_OBJECT,
13
+ NOTECARD: INVENTORY_NOTECARD,
14
+ SCRIPT: INVENTORY_SCRIPT,
15
+ BODYPART: INVENTORY_BODYPART,
16
+ ANIMATION: INVENTORY_ANIMATION,
17
+ GESTURE: INVENTORY_GESTURE,
18
+ MESH: 22,
19
+ SETTING: INVENTORY_SETTING,
20
+ MATERIAL: INVENTORY_MATERIAL,
21
+ };
22
+ const DEFAULT_PERMS = {
23
+ base: PERM_ALL,
24
+ owner: PERM_ALL,
25
+ group: 0,
26
+ everyone: 0,
27
+ next: PERM_ALL,
28
+ };
29
+ export function makeInventoryItem(partial) {
30
+ const item = {
31
+ name: partial.name,
32
+ type: partial.type,
33
+ key: partial.key ?? NULL_KEY,
34
+ creator: partial.creator ?? NULL_KEY,
35
+ description: partial.description ?? '',
36
+ acquireTimeMs: partial.acquireTimeMs ?? 0,
37
+ permMask: partial.permMask ?? DEFAULT_PERMS,
38
+ };
39
+ if (partial.script !== undefined)
40
+ item.script = partial.script;
41
+ if (partial.notecardLines !== undefined)
42
+ item.notecardLines = partial.notecardLines;
43
+ return item;
44
+ }
45
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","sourceRoot":"","sources":["../src/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,GACT,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,mBAAmB;IAC9B,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,iBAAiB;IAC1B,QAAQ,EAAE,kBAAkB;CACpB,CAAA;AAaV,MAAM,aAAa,GAAa;IAC9B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,QAAQ;CACf,CAAA;AAsBD,MAAM,UAAU,iBAAiB,CAC/B,OAA4E;IAE5E,MAAM,IAAI,GAAkB;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,QAAQ;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,CAAC;QACzC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,aAAa;KAC5C,CAAA;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC9D,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;QAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAA;IACnF,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { LinksetClock } from './clock.js';
2
+ import { Prim } from './prim.js';
3
+ import type { Script } from './script.js';
4
+ import type { LinksetDataEntry } from './builtins/linksetdata.js';
5
+ import type { LinkedMessageEntry } from './builtins/linked.js';
6
+ import { LINK_ROOT, LINK_SET, LINK_ALL_OTHERS, LINK_ALL_CHILDREN, LINK_THIS } from './generated/constants.js';
7
+ export { LINK_ROOT, LINK_SET, LINK_ALL_OTHERS, LINK_ALL_CHILDREN, LINK_THIS };
8
+ export interface LinksetOptions {
9
+ /** Owner key applied to all scripts in this linkset. */
10
+ readonly owner?: string;
11
+ }
12
+ /**
13
+ * A linkset owns the shared world state for its prims and scripts: the
14
+ * single virtual clock, the LSD store, the cross-script link_message
15
+ * capture, and the registry of prims + scripts. Per-script state stays on
16
+ * `Script` / `ScriptState`.
17
+ *
18
+ * Single-script default: when `new Script(ast, options)` is called without
19
+ * a host prim, a 1-prim/1-script linkset is auto-allocated. Existing tests
20
+ * see no behavioral change.
21
+ */
22
+ export declare class Linkset {
23
+ readonly clock: LinksetClock;
24
+ readonly prims: Prim[];
25
+ /** Linkset-wide LSD store (was per-script before multi-script support). */
26
+ readonly linksetData: Map<string, LinksetDataEntry>;
27
+ /**
28
+ * Cross-script capture of every `llMessageLinked` invocation in this
29
+ * linkset. Append-only; long-running tests should call
30
+ * `clearLinkedMessages()` between scenarios to keep memory bounded.
31
+ */
32
+ readonly linkedMessages: LinkedMessageEntry[];
33
+ /** Drop every captured cross-script linked-message entry. */
34
+ clearLinkedMessages(): void;
35
+ readonly owner: string;
36
+ constructor(opts?: LinksetOptions);
37
+ /** Add a prim to the linkset; assigns a 1-based linkNumber. */
38
+ addPrim(prim: Prim): Prim;
39
+ private recomputeLinkNumbers;
40
+ /** Flat list of every script in every prim, in prim/inventory order. */
41
+ allScripts(): Script[];
42
+ /** Locate the prim containing `script`, or undefined. */
43
+ primOf(script: Script): Prim | undefined;
44
+ /** Resolve LINK_* / specific link number to the set of target prims. */
45
+ resolveTargets(senderLink: number, target: number): Prim[];
46
+ /**
47
+ * Schedule `linkset_data` events on every script in the linkset. The
48
+ * caller is expected to have already mutated the shared LSD store before
49
+ * broadcasting.
50
+ */
51
+ broadcastLinksetData(action: number, name: string, value: string): void;
52
+ /**
53
+ * Send a `link_message` according to LSL fan-out semantics.
54
+ * `senderLink` is the calling prim's link number; the event payload's
55
+ * `sender_num` is set to that value. The capture array on the linkset
56
+ * records every invocation for cross-script test assertions.
57
+ */
58
+ deliverLinkMessage(senderLink: number, target: number, num: number, str: string, id: string): void;
59
+ /**
60
+ * Deliver chat to every script in the linkset whose listens match. Useful
61
+ * for region/world-level chat simulation. `Script.deliverChat` remains
62
+ * available for the single-script case (delivers only to that script).
63
+ */
64
+ deliverChat(opts: {
65
+ channel: number;
66
+ name: string;
67
+ key: string;
68
+ message: string;
69
+ }): void;
70
+ /**
71
+ * Advance the shared clock by `ms` and drain every event that becomes
72
+ * due, dispatching each to its target script.
73
+ */
74
+ advanceTime(ms: number): void;
75
+ /**
76
+ * Drain due events in chronological order. Each event is delivered to
77
+ * its target script via `script.deliver(event, payload)`. If a handler
78
+ * triggers more events (timers, chained chats, …) they may become due
79
+ * inside this loop and are picked up in the next iteration.
80
+ *
81
+ * The script roster is captured once per drain. Adding a script
82
+ * mid-drain is rare (and would require an explicit prim mutation by a
83
+ * builtin); when it happens, the new script's events are simply picked
84
+ * up on the next outer drain. Worth-the-trade for avoiding an O(scripts)
85
+ * allocation per event.
86
+ */
87
+ drainQueue(): void;
88
+ }
89
+ //# sourceMappingURL=linkset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkset.d.ts","sourceRoot":"","sources":["../src/linkset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,OAAO,EACL,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,SAAS,EACV,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAA;AAE7E,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;GASG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,KAAK,eAAqB;IACnC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAK;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAY;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,kBAAkB,EAAE,CAAK;IAElD,6DAA6D;IAC7D,mBAAmB,IAAI,IAAI;IAG3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,IAAI,GAAE,cAAmB;IAIrC,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAOzB,OAAO,CAAC,oBAAoB;IAW5B,wEAAwE;IACxE,UAAU,IAAI,MAAM,EAAE;IAQtB,yDAAyD;IACzD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIxC,wEAAwE;IACxE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IA0B1D;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOvE;;;;;OAKG;IACH,kBAAkB,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,GACT,IAAI;IAWP;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOxF;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK7B;;;;;;;;;;;OAWG;IACH,UAAU,IAAI,IAAI;CAuBnB"}