@rezless/vm 0.6.1 → 0.7.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 (104) hide show
  1. package/dist/builtins/base64.d.ts +5 -2
  2. package/dist/builtins/base64.d.ts.map +1 -1
  3. package/dist/builtins/base64.js +7 -5
  4. package/dist/builtins/base64.js.map +1 -1
  5. package/dist/builtins/detected.d.ts.map +1 -1
  6. package/dist/builtins/detected.js +1 -1
  7. package/dist/builtins/detected.js.map +1 -1
  8. package/dist/builtins/hash.d.ts +1 -0
  9. package/dist/builtins/hash.d.ts.map +1 -1
  10. package/dist/builtins/hash.js +12 -2
  11. package/dist/builtins/hash.js.map +1 -1
  12. package/dist/builtins/index.d.ts.map +1 -1
  13. package/dist/builtins/index.js +18 -7
  14. package/dist/builtins/index.js.map +1 -1
  15. package/dist/builtins/inventory.d.ts +7 -5
  16. package/dist/builtins/inventory.d.ts.map +1 -1
  17. package/dist/builtins/inventory.js +36 -14
  18. package/dist/builtins/inventory.js.map +1 -1
  19. package/dist/builtins/json.d.ts.map +1 -1
  20. package/dist/builtins/json.js +45 -34
  21. package/dist/builtins/json.js.map +1 -1
  22. package/dist/builtins/link-info.js +2 -2
  23. package/dist/builtins/link-info.js.map +1 -1
  24. package/dist/builtins/linksetdata.d.ts.map +1 -1
  25. package/dist/builtins/linksetdata.js +6 -9
  26. package/dist/builtins/linksetdata.js.map +1 -1
  27. package/dist/builtins/lists.d.ts +15 -0
  28. package/dist/builtins/lists.d.ts.map +1 -1
  29. package/dist/builtins/lists.js +126 -19
  30. package/dist/builtins/lists.js.map +1 -1
  31. package/dist/builtins/math.d.ts +2 -0
  32. package/dist/builtins/math.d.ts.map +1 -1
  33. package/dist/builtins/math.js +34 -8
  34. package/dist/builtins/math.js.map +1 -1
  35. package/dist/builtins/object.d.ts +5 -2
  36. package/dist/builtins/object.d.ts.map +1 -1
  37. package/dist/builtins/object.js +13 -5
  38. package/dist/builtins/object.js.map +1 -1
  39. package/dist/builtins/prim-accessors.d.ts +1 -0
  40. package/dist/builtins/prim-accessors.d.ts.map +1 -1
  41. package/dist/builtins/prim-accessors.js +51 -24
  42. package/dist/builtins/prim-accessors.js.map +1 -1
  43. package/dist/builtins/prim-params.d.ts.map +1 -1
  44. package/dist/builtins/prim-params.js +6 -2
  45. package/dist/builtins/prim-params.js.map +1 -1
  46. package/dist/builtins/script-control.d.ts +4 -3
  47. package/dist/builtins/script-control.d.ts.map +1 -1
  48. package/dist/builtins/script-control.js +22 -8
  49. package/dist/builtins/script-control.js.map +1 -1
  50. package/dist/builtins/strings.d.ts +6 -0
  51. package/dist/builtins/strings.d.ts.map +1 -1
  52. package/dist/builtins/strings.js +47 -6
  53. package/dist/builtins/strings.js.map +1 -1
  54. package/dist/builtins/time.d.ts +3 -5
  55. package/dist/builtins/time.d.ts.map +1 -1
  56. package/dist/builtins/time.js +4 -7
  57. package/dist/builtins/time.js.map +1 -1
  58. package/dist/clock.d.ts +16 -6
  59. package/dist/clock.d.ts.map +1 -1
  60. package/dist/clock.js +38 -11
  61. package/dist/clock.js.map +1 -1
  62. package/dist/dispatch.d.ts +3 -2
  63. package/dist/dispatch.d.ts.map +1 -1
  64. package/dist/dispatch.js +15 -10
  65. package/dist/dispatch.js.map +1 -1
  66. package/dist/interpreter.d.ts +5 -9
  67. package/dist/interpreter.d.ts.map +1 -1
  68. package/dist/interpreter.js +143 -70
  69. package/dist/interpreter.js.map +1 -1
  70. package/dist/linkset.d.ts +11 -3
  71. package/dist/linkset.d.ts.map +1 -1
  72. package/dist/linkset.js +32 -11
  73. package/dist/linkset.js.map +1 -1
  74. package/dist/memory.d.ts +5 -2
  75. package/dist/memory.d.ts.map +1 -1
  76. package/dist/memory.js +5 -2
  77. package/dist/memory.js.map +1 -1
  78. package/dist/prim-params.d.ts +27 -10
  79. package/dist/prim-params.d.ts.map +1 -1
  80. package/dist/prim-params.js +198 -122
  81. package/dist/prim-params.js.map +1 -1
  82. package/dist/prim.d.ts +1 -1
  83. package/dist/prim.d.ts.map +1 -1
  84. package/dist/prim.js +2 -2
  85. package/dist/prim.js.map +1 -1
  86. package/dist/runtime.d.ts +11 -3
  87. package/dist/runtime.d.ts.map +1 -1
  88. package/dist/script.d.ts +24 -10
  89. package/dist/script.d.ts.map +1 -1
  90. package/dist/script.js +118 -65
  91. package/dist/script.js.map +1 -1
  92. package/dist/typecheck.d.ts +3 -1
  93. package/dist/typecheck.d.ts.map +1 -1
  94. package/dist/typecheck.js +25 -5
  95. package/dist/typecheck.js.map +1 -1
  96. package/dist/values/coerce.d.ts +1 -1
  97. package/dist/values/coerce.d.ts.map +1 -1
  98. package/dist/values/coerce.js +10 -6
  99. package/dist/values/coerce.js.map +1 -1
  100. package/dist/values/format.d.ts +3 -1
  101. package/dist/values/format.d.ts.map +1 -1
  102. package/dist/values/format.js +12 -6
  103. package/dist/values/format.js.map +1 -1
  104. package/package.json +2 -2
package/dist/clock.d.ts CHANGED
@@ -2,9 +2,9 @@
2
2
  * Virtual clock + event queue.
3
3
  *
4
4
  * The clock is the only source of "time" in the VM. Tests advance it
5
- * explicitly (`vm.advanceTime` / `linkset.advanceTime`); LSL scripts advance
6
- * it by calling `llSleep` or `llSetTimerEvent`. Real wall-clock time is
7
- * never read.
5
+ * explicitly (`vm.advanceTime` / `linkset.advanceTime`); a script in
6
+ * `llSleep` or a builtin delay is suspended until its wake time while the
7
+ * clock runs other scripts' events. Real wall-clock time is never read.
8
8
  *
9
9
  * The queue is **linkset-wide**, or world-wide for linksets in a `World`:
10
10
  * every script shares one `now` and one event queue. Each queued event carries a `target: Script`
@@ -43,8 +43,11 @@ export declare class LinksetClock {
43
43
  advance(ms: number): void;
44
44
  /**
45
45
  * Pop and return the next due event (`at <= horizon`, default `now`) considering all queued
46
- * one-shots and every script's recurring timer. Returns `null` when no
47
- * event is ready.
46
+ * one-shots, every script's recurring timer and every sleeping script's wake
47
+ * (a synthetic `__wake` event). Returns `null` when no event is ready. A
48
+ * sleeping script gets no events but `__reset` until it finishes, and wakes
49
+ * at its wake time or, if paused past it, on resume. At the same instant a
50
+ * queued event comes first, then a timer, then a wake.
48
51
  *
49
52
  * Recurring timers fire once per script per interval; their next fire
50
53
  * timestamp is advanced by `at + interval` (not `now + interval`) so that
@@ -55,6 +58,13 @@ export declare class LinksetClock {
55
58
  takeNextDue(scripts: ReadonlyArray<Script>, horizon?: number): QueuedEvent | null;
56
59
  /** Snapshot of the pending one-shot queue. Read-only; for inspection/tests. */
57
60
  pendingEvents(): readonly QueuedEvent[];
61
+ /**
62
+ * Move `script`'s events that are due by now behind every other queued
63
+ * event, in their order. Called when a handler that took time finishes,
64
+ * so the events that waited for it follow other scripts' events at that
65
+ * instant.
66
+ */
67
+ requeue(script: Script): void;
58
68
  /**
59
69
  * Remove every queued event whose target is `script` and that is due by
60
70
  * `upTo` (default: all of them), except events named `keep`. Used on reset
@@ -86,7 +96,7 @@ export declare class ScriptClockView {
86
96
  scheduleOn(target: Script, at: number, event: string, payload?: Record<string, unknown>): void;
87
97
  cancelTimer(): void;
88
98
  setTimer(intervalMs: number): void;
89
- /** Advances the linkset clock — used by `llSleep`. */
99
+ /** Advances the linkset clock. */
90
100
  advance(ms: number): void;
91
101
  /** Wall-clock time in microseconds since the Unix epoch, floored. */
92
102
  unixMicros(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,oDAAoD;AACpD,qBAAa,YAAY;IAKX,QAAQ,CAAC,aAAa;IAJlC,2EAA2E;IAC3E,GAAG,SAAI;IAEP,iEAAiE;IACjE,YAAqB,aAAa,SAAI,EAAI;IAE1C,qEAAqE;IACrE,UAAU,IAAI,MAAM,CAEnB;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAO/F;IAED,qEAAqE;IACrE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGxB;IAED;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,SAAW,GAAG,WAAW,GAAG,IAAI,CAsClF;IAED,+EAA+E;IAC/E,aAAa,IAAI,SAAS,WAAW,EAAE,CAEtC;IAED;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAKhE;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAWxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXvB,mHAAmH;IACnH,eAAe,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,eAAe,SAAI;IACnB,wDAAwD;IACxD,eAAe,SAAI;IACnB,qGAAqG;IACrG,WAAW,SAAI;IAEf,YACmB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,MAAM,EAGpC;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,gDAAgD;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAE/E;IAED,sDAAsD;IACtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAEjG;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAOjC;IAED,sDAAsD;IACtD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,UAAU,IAAI,MAAM,CAEnB;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,cAAc,IAAI,IAAI,CAErB;CACF"}
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,oDAAoD;AACpD,qBAAa,YAAY;IAKX,QAAQ,CAAC,aAAa;IAJlC,2EAA2E;IAC3E,GAAG,SAAI;IAEP,iEAAiE;IACjE,YAAqB,aAAa,SAAI,EAAI;IAE1C,qEAAqE;IACrE,UAAU,IAAI,MAAM,CAEnB;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAO/F;IAED,qEAAqE;IACrE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGxB;IAED;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,SAAW,GAAG,WAAW,GAAG,IAAI,CAmDlF;IAED,+EAA+E;IAC/E,aAAa,IAAI,SAAS,WAAW,EAAE,CAEtC;IAED;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI5B;IAED;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAKhE;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAWxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXvB,mHAAmH;IACnH,eAAe,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,eAAe,SAAI;IACnB,wDAAwD;IACxD,eAAe,SAAI;IACnB,qGAAqG;IACrG,WAAW,SAAI;IAEf,YACmB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,MAAM,EAGpC;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,gDAAgD;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAE/E;IAED,sDAAsD;IACtD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAEjG;IAED,WAAW,IAAI,IAAI,CAGlB;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAOjC;IAED,kCAAkC;IAClC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,UAAU,IAAI,MAAM,CAEnB;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,cAAc,IAAI,IAAI,CAErB;CACF"}
package/dist/clock.js CHANGED
@@ -38,8 +38,11 @@ export class LinksetClock {
38
38
  }
39
39
  /**
40
40
  * Pop and return the next due event (`at <= horizon`, default `now`) considering all queued
41
- * one-shots and every script's recurring timer. Returns `null` when no
42
- * event is ready.
41
+ * one-shots, every script's recurring timer and every sleeping script's wake
42
+ * (a synthetic `__wake` event). Returns `null` when no event is ready. A
43
+ * sleeping script gets no events but `__reset` until it finishes, and wakes
44
+ * at its wake time or, if paused past it, on resume. At the same instant a
45
+ * queued event comes first, then a timer, then a wake.
43
46
  *
44
47
  * Recurring timers fire once per script per interval; their next fire
45
48
  * timestamp is advanced by `at + interval` (not `now + interval`) so that
@@ -52,19 +55,31 @@ export class LinksetClock {
52
55
  let bestAt = Infinity;
53
56
  for (let i = 0; i < this.queue.length; i++) {
54
57
  const e = this.queue[i];
55
- if (e.at <= horizon && e.at < bestAt) {
56
- bestAt = e.at;
58
+ // An event that waited for its target's handler is due when that handler finished.
59
+ const due = Math.max(e.at, e.target.clockView.busyUntilMs);
60
+ if (due <= horizon && due < bestAt && (e.event === '__reset' || e.target.wakeAt === undefined)) {
61
+ bestAt = due;
57
62
  bestIdx = i;
58
63
  }
59
64
  }
60
65
  let bestTimerScript = null;
61
66
  let bestTimerAt = Infinity;
67
+ let waking = null;
68
+ let wakeAt = Infinity;
62
69
  for (const s of scripts) {
63
70
  // Per LSL: dead and stopped scripts don't generate timer events. Skip
64
71
  // their timer state so we don't waste catch-up iterations or accumulate
65
72
  // back-logged events that flood the script on resume.
66
73
  if (s.dead || !s.running)
67
74
  continue;
75
+ const w = s.wakeAt === undefined ? undefined : Math.max(s.wakeAt, this.now);
76
+ if (w !== undefined) {
77
+ if (w <= horizon && w < wakeAt) {
78
+ wakeAt = w;
79
+ waking = s;
80
+ }
81
+ continue;
82
+ }
68
83
  const v = s.clockView;
69
84
  if (v.timerIntervalMs > 0 && v.timerNextFireMs <= horizon) {
70
85
  const due = Math.max(v.timerNextFireMs, v.busyUntilMs);
@@ -74,22 +89,34 @@ export class LinksetClock {
74
89
  }
75
90
  }
76
91
  }
77
- if (bestIdx === -1 && bestTimerScript === null)
78
- return null;
79
- if (bestTimerScript && bestTimerAt <= bestAt) {
92
+ if (bestIdx !== -1 && bestAt <= bestTimerAt && bestAt <= wakeAt) {
93
+ const ev = this.queue[bestIdx];
94
+ this.queue.splice(bestIdx, 1);
95
+ return ev;
96
+ }
97
+ if (bestTimerScript && bestTimerAt <= wakeAt) {
80
98
  const at = bestTimerAt;
81
99
  const v = bestTimerScript.clockView;
82
100
  v.timerNextFireMs = at + v.timerIntervalMs;
83
101
  return { at, target: bestTimerScript, event: 'timer', payload: {} };
84
102
  }
85
- const ev = this.queue[bestIdx];
86
- this.queue.splice(bestIdx, 1);
87
- return ev;
103
+ return waking && { at: wakeAt, target: waking, event: '__wake', payload: {} };
88
104
  }
89
105
  /** Snapshot of the pending one-shot queue. Read-only; for inspection/tests. */
90
106
  pendingEvents() {
91
107
  return this.queue.slice();
92
108
  }
109
+ /**
110
+ * Move `script`'s events that are due by now behind every other queued
111
+ * event, in their order. Called when a handler that took time finishes,
112
+ * so the events that waited for it follow other scripts' events at that
113
+ * instant.
114
+ */
115
+ requeue(script) {
116
+ const waited = this.queue.filter((e) => e.target === script && e.at <= this.now);
117
+ this.purgeTarget(script, this.now);
118
+ this.queue.push(...waited);
119
+ }
93
120
  /**
94
121
  * Remove every queued event whose target is `script` and that is due by
95
122
  * `upTo` (default: all of them), except events named `keep`. Used on reset
@@ -147,7 +174,7 @@ export class ScriptClockView {
147
174
  this.timerIntervalMs = intervalMs;
148
175
  this.timerNextFireMs = this.now + intervalMs;
149
176
  }
150
- /** Advances the linkset clock — used by `llSleep`. */
177
+ /** Advances the linkset clock. */
151
178
  advance(ms) {
152
179
  this.linksetClock.advance(ms);
153
180
  }
package/dist/clock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { BuiltinImpl, ScriptState } from './runtime.js';
1
+ import type { BuiltinImpl, Run, ScriptState } from './runtime.js';
2
2
  import type { LslValue } from './values/types.js';
3
3
  import type { BuiltinSpec } from './generated/functions.js';
4
4
  import type { Script } from './script.js';
@@ -14,6 +14,7 @@ export interface DispatchContext {
14
14
  *
15
15
  * Resolution order: user mock > real built-in > generated stub > error.
16
16
  * Every successful call (including stubs) is appended to ScriptState.calls.
17
+ * A builtin that sleeps or has a delay suspends the script after it returns.
17
18
  */
18
- export declare function callBuiltin(dctx: DispatchContext, name: string, args: ReadonlyArray<LslValue>): LslValue | undefined;
19
+ export declare function callBuiltin(dctx: DispatchContext, name: string, args: ReadonlyArray<LslValue>): Run<LslValue | undefined>;
19
20
  //# sourceMappingURL=dispatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAIzC,8DAA8D;AAC9D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE7D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC5B,QAAQ,GAAG,SAAS,CAoBtB"}
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAIzC,8DAA8D;AAC9D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE7D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;GAMG;AACH,wBAAiB,WAAW,CAC1B,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC5B,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,CAsB3B"}
package/dist/dispatch.js CHANGED
@@ -2,7 +2,7 @@ import { defaultValueFor } from './values/types.js';
2
2
  import { BUILTIN_SPECS } from './generated/functions.js';
3
3
  import { REAL_BUILTINS } from './builtins/index.js';
4
4
  import { own } from './own.js';
5
- import { ScriptRemovedSignal } from './builtins/inventory.js';
5
+ import { HaltSignal } from './builtins/object.js';
6
6
  /** Look up the generated spec for a function name, if any. */
7
7
  export function specFor(name) {
8
8
  return own(BUILTIN_SPECS, name);
@@ -12,27 +12,32 @@ export function specFor(name) {
12
12
  *
13
13
  * Resolution order: user mock > real built-in > generated stub > error.
14
14
  * Every successful call (including stubs) is appended to ScriptState.calls.
15
+ * A builtin that sleeps or has a delay suspends the script after it returns.
15
16
  */
16
- export function callBuiltin(dctx, name, args) {
17
+ export function* callBuiltin(dctx, name, args) {
17
18
  const spec = specFor(name);
18
19
  const impl = dctx.mocks[name] ?? own(REAL_BUILTINS, name) ?? makeStub(dctx.script, name);
20
+ let sleptMs = null;
19
21
  const ctx = {
20
22
  state: dctx.state,
21
23
  spec,
22
24
  script: dctx.script,
23
25
  prim: dctx.script.host,
24
26
  linkset: dctx.script.linkset,
27
+ sleep: (ms) => {
28
+ sleptMs = (sleptMs ?? 0) + ms;
29
+ },
25
30
  };
26
- const startedAt = dctx.state.clock.now;
31
+ const dying = dctx.state.lifecycle.dying;
32
+ if (dctx.state.lifecycle.removed && name !== 'llOwnerSay')
33
+ throw new HaltSignal();
27
34
  const result = impl(ctx, args);
28
35
  dctx.state.calls.push({ name, args, returned: result });
29
- // Call log timestamps when the script invoked the function (pre-delay);
30
- // advance the clock after the push so subsequent calls see the throttle.
31
- if (spec && spec.delay > 0) {
32
- dctx.state.clock.advance(spec.delay * 1000);
33
- }
34
- if (dctx.state.lifecycle.removed && dctx.state.clock.now > startedAt)
35
- throw new ScriptRemovedSignal();
36
+ if (dying)
37
+ throw new HaltSignal();
38
+ const delayMs = spec ? spec.delay * 1000 : 0;
39
+ if (sleptMs !== null || delayMs > 0)
40
+ yield { until: dctx.state.clock.now + (sleptMs ?? 0) + delayMs };
36
41
  return result;
37
42
  }
38
43
  function makeStub(script, name) {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,8DAA8D;AAC9D,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC,aAA4C,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,IAAqB,EACrB,IAAY,EACZ,IAA6B;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACxF,MAAM,GAAG,GAAgB;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;KAC7B,CAAA;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAA;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;IAC7C,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS;QAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;IACrG,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qFAAqF,CAAC,CAAA;QAC7H,CAAC,CAAA;IACH,CAAC;IACD,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACvB,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,8DAA8D;AAC9D,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC,aAA4C,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,SAAS,CAAC,CAAC,WAAW,CAC1B,IAAqB,EACrB,IAAY,EACZ,IAA6B;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACxF,IAAI,OAAO,GAAkB,IAAI,CAAA;IACjC,MAAM,GAAG,GAAgB;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAC5B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;YACZ,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;QAC/B,CAAC;KACF,CAAA;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAA;IACxC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,KAAK,YAAY;QAAE,MAAM,IAAI,UAAU,EAAE,CAAA;IACjF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,IAAI,KAAK;QAAE,MAAM,IAAI,UAAU,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAA;IACrG,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qFAAqF,CAAC,CAAA;QAC7H,CAAC,CAAA;IACH,CAAC;IACD,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACvB,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,CAAA;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { EventHandler, FunctionDeclaration } from '@rezless/parser';
2
- import type { BuiltinImpl, ScriptState } from './runtime.js';
1
+ import type { EventHandler, FunctionDeclaration, Node } from '@rezless/parser';
2
+ import type { BuiltinImpl, Run, ScriptState } from './runtime.js';
3
3
  import type { FunctionSignature, Script } from './script.js';
4
4
  import type { EvalResult } from './values/types.js';
5
5
  import { Env } from './env.js';
@@ -22,6 +22,8 @@ export interface InterpreterContext {
22
22
  readonly userFunctions: ReadonlyMap<string, FunctionDeclaration>;
23
23
  /** Functions outside the LSL definitions declared through `ScriptOptions.functions`. */
24
24
  readonly functions: Readonly<Record<string, FunctionSignature>>;
25
+ /** Functions and handlers that halt the script when entered. */
26
+ readonly invalidPrograms: ReadonlySet<Node>;
25
27
  /** Owning script — passed through to builtins via dispatch. */
26
28
  readonly script: Script;
27
29
  readonly prim: import('./prim.js').Prim;
@@ -31,11 +33,5 @@ export declare class StateChangeSignal {
31
33
  readonly target: string;
32
34
  constructor(target: string);
33
35
  }
34
- export declare function execHandler(ctx: InterpreterContext, handler: EventHandler, args?: ReadonlyArray<EvalResult>): void;
35
- /**
36
- * Invoke a user-defined function. Pushes a fresh env (no closures —
37
- * functions see globals only), binds args to params, runs the body,
38
- * and unwraps a ReturnSignal into the function's return value.
39
- */
40
- export declare function callUserFunction(ctx: InterpreterContext, fn: FunctionDeclaration, args: ReadonlyArray<EvalResult>): EvalResult;
36
+ export declare function execHandler(ctx: InterpreterContext, handler: EventHandler, args?: ReadonlyArray<EvalResult>): Run<void>;
41
37
  //# sourceMappingURL=interpreter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../src/interpreter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,YAAY,EAiBZ,mBAAmB,EAEpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAuC,MAAM,mBAAmB,CAAA;AAKxF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAI9B;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAA;IACrB,mFAAmF;IACnF,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAChE,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAC/D,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,EAAE,IAAI,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,cAAc,EAAE,OAAO,CAAA;CACjD;AAUD,qBAAa,iBAAiB;aACA,MAAM,EAAE,MAAM;IAA1C,YAA4B,MAAM,EAAE,MAAM,EAAI;CAC/C;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,YAAY,EACrB,IAAI,GAAE,aAAa,CAAC,UAAU,CAAM,GACnC,IAAI,CAsBN;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,mBAAmB,EACvB,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,GAC9B,UAAU,CAsCZ"}
1
+ {"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../src/interpreter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,YAAY,EAiBZ,mBAAmB,EACnB,IAAI,EAEL,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAc,MAAM,cAAc,CAAA;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAuC,MAAM,mBAAmB,CAAA;AAKxF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAa9B;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAA;IACrB,mFAAmF;IACnF,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAChE,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAC/D,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IAC3C,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,EAAE,IAAI,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,cAAc,EAAE,OAAO,CAAA;CACjD;AAUD,qBAAa,iBAAiB;aACA,MAAM,EAAE,MAAM;IAA1C,YAA4B,MAAM,EAAE,MAAM,EAAI;CAC/C;AAUD,wBAAgB,WAAW,CACzB,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,YAAY,EACrB,IAAI,GAAE,aAAa,CAAC,UAAU,CAAM,GACnC,GAAG,CAAC,IAAI,CAAC,CAEX"}