@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.
- package/ambient/scriptc-node-fallback.d.ts +275 -62
- package/dist/backend/c/async.d.ts +25 -0
- package/dist/backend/c/async.js +167 -0
- package/dist/backend/c/async.js.map +1 -1
- package/dist/backend/c/c-emitter.d.ts +15 -1
- package/dist/backend/c/c-emitter.js +36 -11
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.d.ts +2 -2
- package/dist/backend/c/exprs.js +556 -71
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/stmts.js +5 -3
- package/dist/backend/c/stmts.js.map +1 -1
- package/dist/backend/c/types.d.ts +2 -3
- package/dist/backend/c/types.js +10 -1
- package/dist/backend/c/types.js.map +1 -1
- package/dist/backend/c/walkers.js +1 -1
- package/dist/backend/c/walkers.js.map +1 -1
- package/dist/backend/link-plan.d.ts +3 -1
- package/dist/backend/link-plan.js +3 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/dyn.js +1 -1
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.js +42 -12
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -2
- package/dist/backend/llvm/expr-bytes.js +28 -23
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
- package/dist/backend/llvm/expr-callbacks.js +125 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +1 -0
- package/dist/backend/llvm/expr-containers.js +32 -4
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +19 -3
- package/dist/backend/llvm/expr-dispatch.js +1 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +49 -13
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
- package/dist/backend/llvm/expr-primitives.test.js +38 -0
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +80 -10
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +69 -10
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +156 -6
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +100 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +23 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +5 -0
- package/dist/backend/native-toolchain.js +4 -1
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +28 -10
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/targets.d.ts +7 -0
- package/dist/backend/targets.js +26 -0
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +8 -1
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/coverage/surface-manifest.js +14 -4
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +4 -0
- package/dist/executable/executable-cache.js +6 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/fork-target.d.ts +17 -0
- package/dist/frontend/fork-target.js +256 -0
- package/dist/frontend/fork-target.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
- package/dist/frontend/lowering/abstract-equality.js +250 -0
- package/dist/frontend/lowering/abstract-equality.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
- package/dist/frontend/lowering/containers/bytes.js +6 -5
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +7 -6
- package/dist/frontend/lowering/containers/string-and-regexp.js +237 -28
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +8 -0
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +71 -2
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +54 -28
- package/dist/frontend/lowering/lower-builtins.js +957 -116
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +32 -23
- package/dist/frontend/lowering/lower-calls.js +835 -206
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +41 -10
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +7 -9
- package/dist/frontend/lowering/lower-containers.js +293 -51
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +212 -21
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +12 -0
- package/dist/frontend/lowering/lower-exprs.js +263 -93
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
- package/dist/frontend/lowering/lower-inspect.js +1 -1
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +6 -3
- package/dist/frontend/lowering/lower-island.js +182 -12
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +6 -0
- package/dist/frontend/lowering/lower-modules.js +184 -38
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +7 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +3 -5
- package/dist/frontend/lowering/lower-server.js +413 -54
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +122 -19
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +3 -0
- package/dist/frontend/lowering/lower-stream.js +7 -0
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +86 -9
- package/dist/frontend/lowering/lowerer.js +449 -74
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.d.ts +9 -1
- package/dist/frontend/lowering/optional-arguments.js +67 -1
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.d.ts +3 -1
- package/dist/frontend/lowering/pairs-snapshot.js +12 -4
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +34 -14
- package/dist/frontend/lowering/surfaces.js +177 -104
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-declarations.d.ts +4 -0
- package/dist/frontend/npm-static-declarations.js +56 -0
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +23 -2
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static-prune.d.ts +6 -0
- package/dist/frontend/npm-static-prune.js +203 -0
- package/dist/frontend/npm-static-prune.js.map +1 -0
- package/dist/frontend/npm-static-prune.test.d.ts +1 -0
- package/dist/frontend/npm-static-prune.test.js +48 -0
- package/dist/frontend/npm-static-prune.test.js.map +1 -0
- package/dist/frontend/npm-static.js +6 -5
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +15 -3
- package/dist/frontend/npm.js +87 -14
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +76 -9
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/program.js +107 -14
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/provenance.js +8 -3
- package/dist/frontend/provenance.js.map +1 -1
- package/dist/frontend/resolve.d.ts +6 -0
- package/dist/frontend/resolve.js +7 -4
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +5 -0
- package/dist/frontend/type-mapper.js +80 -29
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.js +34 -41
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +5 -3
- package/dist/ir/analysis.js +25 -11
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +50 -2
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/constant-tables.d.ts +17 -0
- package/dist/ir/constant-tables.js +99 -0
- package/dist/ir/constant-tables.js.map +1 -0
- package/dist/ir/constant-tables.test.d.ts +1 -0
- package/dist/ir/constant-tables.test.js +78 -0
- package/dist/ir/constant-tables.test.js.map +1 -0
- package/dist/ir/integer-ranges.d.ts +13 -0
- package/dist/ir/integer-ranges.js +122 -0
- package/dist/ir/integer-ranges.js.map +1 -0
- package/dist/ir/integer-ranges.test.d.ts +1 -0
- package/dist/ir/integer-ranges.test.js +63 -0
- package/dist/ir/integer-ranges.test.js.map +1 -0
- package/dist/ir/ir.d.ts +130 -76
- package/dist/ir/ir.js +69 -4
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +20 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +8 -0
- package/dist/ir/scalar-records.js +216 -0
- package/dist/ir/scalar-records.js.map +1 -0
- package/dist/ir/scalar-records.test.d.ts +1 -0
- package/dist/ir/scalar-records.test.js +142 -0
- package/dist/ir/scalar-records.test.js.map +1 -0
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.js +256 -20
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.d.ts +1 -0
- package/dist/ir/validate.test.js +31 -0
- package/dist/ir/validate.test.js.map +1 -0
- package/dist/library/cache-primitives.d.ts +1 -1
- package/dist/library/cache-primitives.js +3 -3
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/fence-eval.js +11 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/library-cache.js +0 -1
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +8 -8
- package/dist/library/library-cache.test.js.map +1 -1
- package/package.json +17 -17
- 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 {
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
3865
|
-
return
|
|
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
|
-
|
|
3883
|
-
return
|
|
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);
|