@scriptc/compiler 0.1.3 → 0.1.5

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 (217) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +275 -62
  2. package/dist/backend/c/async.d.ts +25 -0
  3. package/dist/backend/c/async.js +167 -0
  4. package/dist/backend/c/async.js.map +1 -1
  5. package/dist/backend/c/c-emitter.d.ts +15 -1
  6. package/dist/backend/c/c-emitter.js +36 -11
  7. package/dist/backend/c/c-emitter.js.map +1 -1
  8. package/dist/backend/c/exprs.d.ts +2 -2
  9. package/dist/backend/c/exprs.js +556 -71
  10. package/dist/backend/c/exprs.js.map +1 -1
  11. package/dist/backend/c/stmts.js +5 -3
  12. package/dist/backend/c/stmts.js.map +1 -1
  13. package/dist/backend/c/types.d.ts +2 -3
  14. package/dist/backend/c/types.js +10 -1
  15. package/dist/backend/c/types.js.map +1 -1
  16. package/dist/backend/c/walkers.js +1 -1
  17. package/dist/backend/c/walkers.js.map +1 -1
  18. package/dist/backend/link-plan.d.ts +3 -1
  19. package/dist/backend/link-plan.js +3 -1
  20. package/dist/backend/link-plan.js.map +1 -1
  21. package/dist/backend/llvm/dyn.js +1 -1
  22. package/dist/backend/llvm/dyn.js.map +1 -1
  23. package/dist/backend/llvm/emitter.js +42 -12
  24. package/dist/backend/llvm/emitter.js.map +1 -1
  25. package/dist/backend/llvm/expr-bytes.d.ts +1 -2
  26. package/dist/backend/llvm/expr-bytes.js +28 -23
  27. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  28. package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
  29. package/dist/backend/llvm/expr-callbacks.js +125 -0
  30. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  31. package/dist/backend/llvm/expr-containers.d.ts +1 -0
  32. package/dist/backend/llvm/expr-containers.js +32 -4
  33. package/dist/backend/llvm/expr-containers.js.map +1 -1
  34. package/dist/backend/llvm/expr-context.d.ts +19 -3
  35. package/dist/backend/llvm/expr-dispatch.js +1 -0
  36. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  37. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  38. package/dist/backend/llvm/expr-primitives.js +49 -13
  39. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  40. package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
  41. package/dist/backend/llvm/expr-primitives.test.js +38 -0
  42. package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
  43. package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
  44. package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
  45. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  46. package/dist/backend/llvm/lib-filesystem.js +80 -10
  47. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  48. package/dist/backend/llvm/lib-network.js +69 -10
  49. package/dist/backend/llvm/lib-network.js.map +1 -1
  50. package/dist/backend/llvm/lib-process.js +156 -6
  51. package/dist/backend/llvm/lib-process.js.map +1 -1
  52. package/dist/backend/llvm/lib-shared.js +100 -0
  53. package/dist/backend/llvm/lib-shared.js.map +1 -1
  54. package/dist/backend/llvm/lib-stream.js +23 -0
  55. package/dist/backend/llvm/lib-stream.js.map +1 -1
  56. package/dist/backend/native-toolchain.d.ts +5 -0
  57. package/dist/backend/native-toolchain.js +4 -1
  58. package/dist/backend/native-toolchain.js.map +1 -1
  59. package/dist/backend/runtime-pack.test.js +28 -10
  60. package/dist/backend/runtime-pack.test.js.map +1 -1
  61. package/dist/backend/targets.d.ts +7 -0
  62. package/dist/backend/targets.js +26 -0
  63. package/dist/backend/targets.js.map +1 -1
  64. package/dist/backend/targets.test.js +8 -1
  65. package/dist/backend/targets.test.js.map +1 -1
  66. package/dist/coverage/surface-manifest.js +14 -4
  67. package/dist/coverage/surface-manifest.js.map +1 -1
  68. package/dist/diagnostics/diagnostic.js +1 -1
  69. package/dist/diagnostics/diagnostic.js.map +1 -1
  70. package/dist/executable/executable-cache.d.ts +4 -0
  71. package/dist/executable/executable-cache.js +6 -1
  72. package/dist/executable/executable-cache.js.map +1 -1
  73. package/dist/executable/executable-cache.test.js +3 -3
  74. package/dist/executable/executable-cache.test.js.map +1 -1
  75. package/dist/frontend/fork-target.d.ts +17 -0
  76. package/dist/frontend/fork-target.js +256 -0
  77. package/dist/frontend/fork-target.js.map +1 -0
  78. package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
  79. package/dist/frontend/lowering/abstract-equality.js +250 -0
  80. package/dist/frontend/lowering/abstract-equality.js.map +1 -0
  81. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  82. package/dist/frontend/lowering/containers/bytes.js +6 -5
  83. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  84. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +7 -6
  85. package/dist/frontend/lowering/containers/string-and-regexp.js +237 -28
  86. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  87. package/dist/frontend/lowering/expressions/object-literals.js +8 -0
  88. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  89. package/dist/frontend/lowering/lower-assert.js +71 -2
  90. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  91. package/dist/frontend/lowering/lower-builtins.d.ts +54 -28
  92. package/dist/frontend/lowering/lower-builtins.js +957 -116
  93. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  94. package/dist/frontend/lowering/lower-calls.d.ts +32 -23
  95. package/dist/frontend/lowering/lower-calls.js +835 -206
  96. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  97. package/dist/frontend/lowering/lower-classes.js +41 -10
  98. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  99. package/dist/frontend/lowering/lower-containers.d.ts +7 -9
  100. package/dist/frontend/lowering/lower-containers.js +293 -51
  101. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  102. package/dist/frontend/lowering/lower-event-emitter.js +212 -21
  103. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  104. package/dist/frontend/lowering/lower-exprs.d.ts +12 -0
  105. package/dist/frontend/lowering/lower-exprs.js +263 -93
  106. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  107. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  108. package/dist/frontend/lowering/lower-inspect.js +1 -1
  109. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  110. package/dist/frontend/lowering/lower-island.d.ts +6 -3
  111. package/dist/frontend/lowering/lower-island.js +182 -12
  112. package/dist/frontend/lowering/lower-island.js.map +1 -1
  113. package/dist/frontend/lowering/lower-modules.d.ts +6 -0
  114. package/dist/frontend/lowering/lower-modules.js +184 -38
  115. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  116. package/dist/frontend/lowering/lower-namespaces.js +7 -0
  117. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  118. package/dist/frontend/lowering/lower-server.d.ts +3 -5
  119. package/dist/frontend/lowering/lower-server.js +413 -54
  120. package/dist/frontend/lowering/lower-server.js.map +1 -1
  121. package/dist/frontend/lowering/lower-stmts.js +122 -19
  122. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  123. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  124. package/dist/frontend/lowering/lower-stream.js +7 -0
  125. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  126. package/dist/frontend/lowering/lowerer.d.ts +86 -9
  127. package/dist/frontend/lowering/lowerer.js +449 -74
  128. package/dist/frontend/lowering/lowerer.js.map +1 -1
  129. package/dist/frontend/lowering/optional-arguments.d.ts +9 -1
  130. package/dist/frontend/lowering/optional-arguments.js +67 -1
  131. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  132. package/dist/frontend/lowering/pairs-snapshot.d.ts +3 -1
  133. package/dist/frontend/lowering/pairs-snapshot.js +12 -4
  134. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  135. package/dist/frontend/lowering/surfaces.d.ts +34 -14
  136. package/dist/frontend/lowering/surfaces.js +177 -104
  137. package/dist/frontend/lowering/surfaces.js.map +1 -1
  138. package/dist/frontend/npm-static-declarations.d.ts +4 -0
  139. package/dist/frontend/npm-static-declarations.js +56 -0
  140. package/dist/frontend/npm-static-declarations.js.map +1 -1
  141. package/dist/frontend/npm-static-declarations.test.js +23 -2
  142. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  143. package/dist/frontend/npm-static-prune.d.ts +6 -0
  144. package/dist/frontend/npm-static-prune.js +203 -0
  145. package/dist/frontend/npm-static-prune.js.map +1 -0
  146. package/dist/frontend/npm-static-prune.test.d.ts +1 -0
  147. package/dist/frontend/npm-static-prune.test.js +48 -0
  148. package/dist/frontend/npm-static-prune.test.js.map +1 -0
  149. package/dist/frontend/npm-static.js +6 -5
  150. package/dist/frontend/npm-static.js.map +1 -1
  151. package/dist/frontend/npm.d.ts +15 -3
  152. package/dist/frontend/npm.js +87 -14
  153. package/dist/frontend/npm.js.map +1 -1
  154. package/dist/frontend/npm.test.js +76 -9
  155. package/dist/frontend/npm.test.js.map +1 -1
  156. package/dist/frontend/program.js +107 -14
  157. package/dist/frontend/program.js.map +1 -1
  158. package/dist/frontend/provenance.js +8 -3
  159. package/dist/frontend/provenance.js.map +1 -1
  160. package/dist/frontend/resolve.d.ts +6 -0
  161. package/dist/frontend/resolve.js +7 -4
  162. package/dist/frontend/resolve.js.map +1 -1
  163. package/dist/frontend/type-mapper.d.ts +5 -0
  164. package/dist/frontend/type-mapper.js +80 -29
  165. package/dist/frontend/type-mapper.js.map +1 -1
  166. package/dist/index.d.ts +8 -3
  167. package/dist/index.js +34 -41
  168. package/dist/index.js.map +1 -1
  169. package/dist/ir/analysis.d.ts +5 -3
  170. package/dist/ir/analysis.js +25 -11
  171. package/dist/ir/analysis.js.map +1 -1
  172. package/dist/ir/analysis.test.js +50 -2
  173. package/dist/ir/analysis.test.js.map +1 -1
  174. package/dist/ir/constant-tables.d.ts +17 -0
  175. package/dist/ir/constant-tables.js +99 -0
  176. package/dist/ir/constant-tables.js.map +1 -0
  177. package/dist/ir/constant-tables.test.d.ts +1 -0
  178. package/dist/ir/constant-tables.test.js +78 -0
  179. package/dist/ir/constant-tables.test.js.map +1 -0
  180. package/dist/ir/integer-ranges.d.ts +13 -0
  181. package/dist/ir/integer-ranges.js +122 -0
  182. package/dist/ir/integer-ranges.js.map +1 -0
  183. package/dist/ir/integer-ranges.test.d.ts +1 -0
  184. package/dist/ir/integer-ranges.test.js +63 -0
  185. package/dist/ir/integer-ranges.test.js.map +1 -0
  186. package/dist/ir/ir.d.ts +130 -76
  187. package/dist/ir/ir.js +69 -4
  188. package/dist/ir/ir.js.map +1 -1
  189. package/dist/ir/ir.test.js +20 -1
  190. package/dist/ir/ir.test.js.map +1 -1
  191. package/dist/ir/scalar-records.d.ts +8 -0
  192. package/dist/ir/scalar-records.js +216 -0
  193. package/dist/ir/scalar-records.js.map +1 -0
  194. package/dist/ir/scalar-records.test.d.ts +1 -0
  195. package/dist/ir/scalar-records.test.js +142 -0
  196. package/dist/ir/scalar-records.test.js.map +1 -0
  197. package/dist/ir/serialize.d.ts +1 -1
  198. package/dist/ir/serialize.js +1 -1
  199. package/dist/ir/serialize.js.map +1 -1
  200. package/dist/ir/validate.js +256 -20
  201. package/dist/ir/validate.js.map +1 -1
  202. package/dist/ir/validate.test.d.ts +1 -0
  203. package/dist/ir/validate.test.js +31 -0
  204. package/dist/ir/validate.test.js.map +1 -0
  205. package/dist/library/cache-primitives.d.ts +1 -1
  206. package/dist/library/cache-primitives.js +3 -3
  207. package/dist/library/cache-primitives.js.map +1 -1
  208. package/dist/library/fence-eval.js +11 -4
  209. package/dist/library/fence-eval.js.map +1 -1
  210. package/dist/library/int-infer.test.js +4 -4
  211. package/dist/library/int-infer.test.js.map +1 -1
  212. package/dist/library/library-cache.js +0 -1
  213. package/dist/library/library-cache.js.map +1 -1
  214. package/dist/library/library-cache.test.js +8 -8
  215. package/dist/library/library-cache.test.js.map +1 -1
  216. package/package.json +17 -17
  217. package/surface-manifest.json +186 -79
@@ -66,6 +66,9 @@ import { endsWithJump, matchStringSelfConcat, streamTypedRefEligible } from "../
66
66
  import { emitLibraryIdentityLines } from "../library-identity-markers.js";
67
67
  import { CAUGHT, ffiCallbackType, isDynTypedRefType, isFfiContextParam, isRefCounted, isUnitType, moduleEmbedsBuiltin, moduleEmbedsCompressedNpm, moduleUsesChildProcess, moduleUsesDynInvoke, moduleUsesFetch, moduleUsesFsWatch, moduleUsesHttpServer, moduleUsesNet, moduleUsesNodeTest, moduleUsesProcessEvents, moduleUsesStream, moduleUsesTls, moduleUsesTlsCa, NPM_COMPRESS_MIN, POINTER_KINDS, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, typeKey, VOID } from "../../ir/ir.js";
68
68
  import { matchIntegerBytesForLoop } from "../../ir/integer-loops.js";
69
+ import { scalarizeNumericRecords } from "../../ir/scalar-records.js";
70
+ import { analyzeIntegerRanges } from "../../ir/integer-ranges.js";
71
+ import { findConstantNumericTables } from "../../ir/constant-tables.js";
69
72
  import { allocateFfiCallbackAdapters, hasForeignFfiCallback, hasRetainedFfiCallback } from "../ffi-callbacks.js";
70
73
  import { RUNTIME_ABI_MARKER } from "../runtime-abi.js";
71
74
  import { computeMayThrow } from "../c/may-throw.js";
@@ -79,10 +82,10 @@ import { emitDynamicExpr } from "./expr-dynamic.js";
79
82
  import { emitIntrinsicExpr, emitSerializationExpr, emitAsyncExpr } from "./expr-async.js";
80
83
  import { emitJsInteropExpr, emitExpr } from "./expr-dispatch.js";
81
84
  import { emitJsMarshal, emitJsOp, emitJsExit, islandAdapter, islandTypedAdapter } from "./expr-island.js";
82
- import { dynKind, raceAdapterFor, genResultThunkFor, childExitThunkFor, childExitSignalThunkFor, childDataThunkFor, emitterFixedAdapter, wrapEmitterListener, unwrapNullableClosure, closeBindThunkFor, closeOverrideWrapFor } from "./expr-callbacks.js";
83
- import { streamDataAdapter, streamDoneFnFor, cryptoBytesThunkFor, fsRenameThunkFor, streamCbThunkFor } from "./expr-stream-callbacks.js";
84
- import { resolveThunkFor, tagInSet, arrPush, emitArrayCopyLoop, emitStrIntrinsic, emitArrIntrinsic, wrapNullable, emitMapNew, mapSet, emitMapLikeIntrinsic, emitSetNew } from "./expr-containers.js";
85
- import { emitBytesReceiver, emitIntegerLoopIndex, emitBytesIndex, emitBytesData, emitBytesLength, emitBytesGet, emitBytesU32, emitBytesSet, emitBytesIntrinsic } from "./expr-bytes.js";
85
+ import { dynKind, raceAdapterFor, genResultThunkFor, childExitThunkFor, childExitSignalThunkFor, childDataThunkFor, execFileThunkFor, ipcMessageThunkFor, ipcSendThunkFor, emitterFixedAdapter, wrapEmitterListener, unwrapNullableClosure, closeBindThunkFor, closeOverrideWrapFor } from "./expr-callbacks.js";
86
+ import { streamDataAdapter, streamDoneFnFor, cryptoBytesThunkFor, fsRenameThunkFor, streamCbThunkFor, zlibBytesThunkFor } from "./expr-stream-callbacks.js";
87
+ import { emitStableReceiver, resolveThunkFor, tagInSet, arrPush, emitArrayCopyLoop, emitStrIntrinsic, emitArrIntrinsic, wrapNullable, emitMapNew, mapSet, emitMapLikeIntrinsic, emitSetNew } from "./expr-containers.js";
88
+ import { emitIntegerLoopIndex, emitBytesIndex, emitBytesData, emitBytesLength, emitBytesGet, emitToUint32, emitBytesSet, emitBytesIntrinsic } from "./expr-bytes.js";
86
89
  import { emitRegexIntrinsic, emitRecordKeyGet, keyedRecordReadInto } from "./expr-records.js";
87
90
  import { dynPromiseAdapter, streamTypedRefCommitAdapter, liveDynUnionRefAdapter, streamTypedRefBoxValue, streamTypedRefMaterializeAdapter, streamFromArrayAdapter } from "./expr-stream-bridges.js";
88
91
  import { emitWebLibCall, emitDynamicLibCall, emitFilesystemLibCall, emitPathUrlLibCall, emitPrimitiveLibCall } from "./lib-filesystem.js";
@@ -111,7 +114,7 @@ function ffiCallbackDummyLl(callback) {
111
114
  }
112
115
  }
113
116
  export function emitLlvmModule(mod, options = {}) {
114
- return new LlEmitter(mod, options).emit();
117
+ return new LlEmitter(scalarizeNumericRecords(mod), options).emit();
115
118
  }
116
119
  /** LLVM c"..." payload for a UTF-8 literal, NUL-terminated like the C
117
120
  * emitter's flexible-array-member initializer. */
@@ -185,6 +188,7 @@ class LlEmitter {
185
188
  ffiHasRetainedCallback;
186
189
  ffiHasForeignCallback;
187
190
  globalTypes = new Map();
191
+ constantNumericTables;
188
192
  /** May-throw analysis (the C emitter's computeMayThrow, shared): pending
189
193
  * checks are emitted only after calls that can actually raise. */
190
194
  mayThrow;
@@ -249,6 +253,7 @@ class LlEmitter {
249
253
  captureIds = new Set();
250
254
  /** Active canonical byte-loop induction bindings: local id → size_t slot. */
251
255
  integerLoopBindings = new Map();
256
+ integerRanges = new Map();
252
257
  /** Enclosing try-with-FINALLY regions, innermost last: a `return`
253
258
  * inside one runs every crossed finally (innermost first) before the
254
259
  * actual ret — the C emitter's pending-return path, with the finally
@@ -280,6 +285,7 @@ class LlEmitter {
280
285
  logArgSlots = 0;
281
286
  constructor(mod, options) {
282
287
  this.mod = mod;
288
+ this.constantNumericTables = findConstantNumericTables(mod);
283
289
  this.sizeType = options.pointerBits === 32 ? "i32" : "i64";
284
290
  this.wasi = options.wasi === true;
285
291
  this.emitLibraryIdentity = options.emitLibraryIdentity !== false;
@@ -767,6 +773,8 @@ class LlEmitter {
767
773
  // unchanged.
768
774
  const hasRefGlobals = globals.some((g) => isRefCounted(g.type)) || fnValueProps.length > 0;
769
775
  const inlineExitListeners = usesEvents && (hasRefGlobals || this.ffiHasRetainedCallback);
776
+ if (!usesNodeTest && !usesIsland)
777
+ this.declare(`declare i32 @scr_exit_code_hint_get()`);
770
778
  if (inlineExitListeners) {
771
779
  this.declare(`declare void @scr_run_exit_listeners(double)`);
772
780
  this.declare(`declare i32 @scr_exit_code_hint_get()`);
@@ -888,6 +896,8 @@ class LlEmitter {
888
896
  // Helpers assemble BEFORE the declaration table flushes (they add
889
897
  // write/abort declarations).
890
898
  const helpers = this.helperDefs();
899
+ if (this.constantNumericTables.size > 0)
900
+ this.declare(`declare double @scr_arr_get_number(ptr, double)`);
891
901
  const out = [
892
902
  `; Generated by scriptc (LLVM backend) from ${this.mod.sourceFile}. Do not edit.`,
893
903
  ``,
@@ -957,6 +967,13 @@ class LlEmitter {
957
967
  for (const d of this.decls)
958
968
  out.push(d);
959
969
  out.push(``);
970
+ for (const table of this.constantNumericTables.values()) {
971
+ const n = table.values.length;
972
+ out.push(`@${table.symbol} = private constant [${n} x double] [${table.values.map((v) => `double ${f64Lit(v)}`).join(", ")}]`, `define internal double @${table.symbol}_get(ptr %a, double %i) alwaysinline #0 {`, `entry:`, ` %initialized = icmp ne ptr %a, null`, ` %nonnegative = fcmp oge double %i, ${f64Lit(0)}`, ` %below = fcmp olt double %i, ${f64Lit(n)}`, ` %range = and i1 %nonnegative, %below`, ` %safe = and i1 %initialized, %range`, ` br i1 %safe, label %convert, label %fallback`, `convert:`,
973
+ // The branch must dominate fptoui: NaN/out-of-range conversion
974
+ // would produce poison. Fractional indices also need a fallback.
975
+ ` %index = fptoui double %i to ${this.sizeType}`, ` %roundtrip = uitofp ${this.sizeType} %index to double`, ` %integer = fcmp oeq double %roundtrip, %i`, ` br i1 %integer, label %read, label %fallback`, `read:`, ` %slot = getelementptr inbounds [${n} x double], ptr @${table.symbol}, ${this.sizeType} 0, ${this.sizeType} %index`, ` %value = load double, ptr %slot`, ` ret double %value`, `fallback:`, ` %generic = call double @scr_arr_get_number(ptr %a, double %i)`, ` ret double %generic`, `}`, ``);
976
+ }
960
977
  for (const [text, lit] of this.literals) {
961
978
  // Immortal interned ScrStr: { rc = SIZE_MAX, len, cap = len, bytes\0 } —
962
979
  // the C emitter's static table, retain/release skip rc == SIZE_MAX.
@@ -1208,7 +1225,7 @@ class LlEmitter {
1208
1225
  ? [` %test_exit = call i32 @scr_test_exit_code()`, ` ret i32 %test_exit`]
1209
1226
  : usesIsland
1210
1227
  ? [` %island_exit = call i32 @scr_island_exit_code()`, ` ret i32 %island_exit`]
1211
- : [` ret i32 0`]), `}`, ``,
1228
+ : [` %native_exit = call i32 @scr_exit_code_hint_get()`, ` ret i32 %native_exit`]), `}`, ``,
1212
1229
  // sanitize_address is inert under the plain pipeline; the sanitized
1213
1230
  // lane's -fsanitize=address link activates instrumentation over the
1214
1231
  // emitted functions too (the runtime TUs get theirs from clang).
@@ -2530,6 +2547,7 @@ class LlEmitter {
2530
2547
  this.currentLocals = new Map(fn.locals.map((l) => [l.id, l]));
2531
2548
  this.captureIds = new Set((fn.captures ?? []).map((c) => c.localId));
2532
2549
  this.integerLoopBindings.clear();
2550
+ this.integerRanges = analyzeIntegerRanges(fn);
2533
2551
  this.chainSlots.clear();
2534
2552
  this.finallyStack = [];
2535
2553
  this.tryStack = [];
@@ -2839,7 +2857,7 @@ class LlEmitter {
2839
2857
  // JS-exactly), so no ownership moves. Any invalid index traps — no
2840
2858
  // append. IrBytesElem is static, so never rediscover it through the
2841
2859
  // generic runtime switch in a hot loop.
2842
- const arr = this.emitBytesReceiver(s.arr, [s.index, s.value]);
2860
+ const arr = this.emitStableReceiver(s.arr, [s.index, s.value]);
2843
2861
  const integerIndex = this.emitIntegerLoopIndex(s.index);
2844
2862
  const idx = integerIndex ?? this.emitExpr(s.index).name;
2845
2863
  const v = this.emitExpr(s.value);
@@ -3131,7 +3149,7 @@ class LlEmitter {
3131
3149
  B.br(lc);
3132
3150
  B.startBlock(lc);
3133
3151
  if (integerLoop && integerSlot) {
3134
- const receiver = this.emitBytesReceiver(integerLoop.limitReceiver, []);
3152
+ const receiver = this.emitStableReceiver(integerLoop.limitReceiver, []);
3135
3153
  const lenPtr = B.tmp();
3136
3154
  const len = B.tmp();
3137
3155
  const index = B.tmp();
@@ -3792,6 +3810,15 @@ class LlEmitter {
3792
3810
  childExitThunkFor(param) {
3793
3811
  return childExitThunkFor(this.expressionContext(), param);
3794
3812
  }
3813
+ execFileThunkFor(cbT) {
3814
+ return execFileThunkFor(this.expressionContext(), cbT);
3815
+ }
3816
+ ipcMessageThunkFor(cbT) {
3817
+ return ipcMessageThunkFor(this.expressionContext(), cbT);
3818
+ }
3819
+ ipcSendThunkFor(cbT) {
3820
+ return ipcSendThunkFor(this.expressionContext(), cbT);
3821
+ }
3795
3822
  childExitSignalThunkFor(codeParam, sigParam) {
3796
3823
  return childExitSignalThunkFor(this.expressionContext(), codeParam, sigParam);
3797
3824
  }
@@ -3825,6 +3852,9 @@ class LlEmitter {
3825
3852
  cryptoBytesThunkFor(cbT) {
3826
3853
  return cryptoBytesThunkFor(this.expressionContext(), cbT);
3827
3854
  }
3855
+ zlibBytesThunkFor(cbT) {
3856
+ return zlibBytesThunkFor(this.expressionContext(), cbT);
3857
+ }
3828
3858
  streamCbThunkFor(kind, cbT) {
3829
3859
  return streamCbThunkFor(this.expressionContext(), kind, cbT);
3830
3860
  }
@@ -3861,8 +3891,8 @@ class LlEmitter {
3861
3891
  emitSetNew(e) {
3862
3892
  return emitSetNew(this.expressionContext(), e);
3863
3893
  }
3864
- emitBytesReceiver(receiver, following) {
3865
- return emitBytesReceiver(this.expressionContext(), receiver, following);
3894
+ emitStableReceiver(receiver, following) {
3895
+ return emitStableReceiver(this.expressionContext(), receiver, following);
3866
3896
  }
3867
3897
  emitIntegerLoopIndex(expr) {
3868
3898
  return emitIntegerLoopIndex(this.expressionContext(), expr);
@@ -3879,8 +3909,8 @@ class LlEmitter {
3879
3909
  emitBytesGet(elem, receiver, index, integerIndex = false) {
3880
3910
  return emitBytesGet(this.expressionContext(), elem, receiver, index, integerIndex);
3881
3911
  }
3882
- emitBytesU32(value) {
3883
- return emitBytesU32(this.expressionContext(), value);
3912
+ emitToUint32(value, expr) {
3913
+ return emitToUint32(this.expressionContext(), value, expr);
3884
3914
  }
3885
3915
  emitBytesSet(elem, receiver, index, value, integerIndex = false) {
3886
3916
  return emitBytesSet(this.expressionContext(), elem, receiver, index, value, integerIndex);