@scriptc/compiler 0.0.35 → 0.1.1
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 +14 -11
- package/ambient/scriptc-overrides.d.ts +0 -7
- package/ambient/scriptc.d.ts +1 -1
- package/dist/backend/build-cache.d.ts +44 -0
- package/dist/backend/build-cache.js +241 -0
- package/dist/backend/build-cache.js.map +1 -0
- package/dist/backend/{emission/emit-async.d.ts → c/async.d.ts} +21 -30
- package/dist/backend/{emission/emit-async.js → c/async.js} +270 -286
- package/dist/backend/c/async.js.map +1 -0
- package/dist/backend/{emission/emitter.d.ts → c/c-emitter.d.ts} +6 -23
- package/dist/backend/{emission/emitter.js → c/c-emitter.js} +53 -107
- package/dist/backend/c/c-emitter.js.map +1 -0
- package/dist/backend/c/exprs.d.ts +8 -0
- package/dist/backend/c/exprs.js +7937 -0
- package/dist/backend/c/exprs.js.map +1 -0
- package/dist/backend/{emission/emit-island.d.ts → c/island.d.ts} +5 -5
- package/dist/backend/{emission/emit-island.js → c/island.js} +24 -22
- package/dist/backend/c/island.js.map +1 -0
- package/dist/backend/{emission → c}/may-throw.d.ts +1 -1
- package/dist/backend/{emission → c}/may-throw.js +4 -1
- package/dist/backend/c/may-throw.js.map +1 -0
- package/dist/backend/{emission/emit-shapes.d.ts → c/shapes.d.ts} +19 -19
- package/dist/backend/{emission/emit-shapes.js → c/shapes.js} +78 -87
- package/dist/backend/c/shapes.js.map +1 -0
- package/dist/backend/{emission/emit-stmts.d.ts → c/stmts.d.ts} +12 -12
- package/dist/backend/{emission/emit-stmts.js → c/stmts.js} +395 -343
- package/dist/backend/c/stmts.js.map +1 -0
- package/dist/backend/{emission/emit-types.d.ts → c/types.d.ts} +1 -1
- package/dist/backend/{emission/emit-types.js → c/types.js} +42 -286
- package/dist/backend/c/types.js.map +1 -0
- package/dist/backend/c/types.test.js +25 -0
- package/dist/backend/c/types.test.js.map +1 -0
- package/dist/backend/{emission/emit-walkers.d.ts → c/walkers.d.ts} +19 -41
- package/dist/backend/{emission/emit-walkers.js → c/walkers.js} +242 -304
- package/dist/backend/c/walkers.js.map +1 -0
- package/dist/backend/external-c.d.ts +33 -0
- package/dist/backend/external-c.js +51 -0
- package/dist/backend/external-c.js.map +1 -0
- package/dist/backend/ffi-callbacks.d.ts +1 -1
- package/dist/backend/ffi-callbacks.js +4 -3
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/{library-identity.d.ts → library-identity-markers.d.ts} +0 -4
- package/dist/backend/{library-identity.js → library-identity-markers.js} +10 -9
- package/dist/backend/library-identity-markers.js.map +1 -0
- package/dist/backend/link-plan.d.ts +37 -0
- package/dist/backend/link-plan.js +26 -0
- package/dist/backend/link-plan.js.map +1 -0
- package/dist/backend/linker.d.ts +22 -0
- package/dist/backend/linker.js +236 -0
- package/dist/backend/linker.js.map +1 -0
- package/dist/backend/llvm/blocks.d.ts +4 -0
- package/dist/backend/llvm/blocks.js +29 -0
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/classes.d.ts +2 -19
- package/dist/backend/llvm/classes.js +20 -52
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +4 -0
- package/dist/backend/llvm/common.js +27 -0
- package/dist/backend/llvm/common.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +3 -8
- package/dist/backend/llvm/dyn.js +159 -224
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +4 -1
- package/dist/backend/llvm/emitter.js +548 -9988
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.d.ts +4 -0
- package/dist/backend/llvm/expr-async.js +726 -0
- package/dist/backend/llvm/expr-async.js.map +1 -0
- package/dist/backend/llvm/expr-bytes.d.ts +13 -0
- package/dist/backend/llvm/expr-bytes.js +456 -0
- package/dist/backend/llvm/expr-bytes.js.map +1 -0
- package/dist/backend/llvm/expr-callbacks.d.ts +22 -0
- package/dist/backend/llvm/expr-callbacks.js +520 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -0
- package/dist/backend/llvm/expr-calls.d.ts +2 -0
- package/dist/backend/llvm/expr-calls.js +618 -0
- package/dist/backend/llvm/expr-calls.js.map +1 -0
- package/dist/backend/llvm/expr-containers.d.ts +25 -0
- package/dist/backend/llvm/expr-containers.js +637 -0
- package/dist/backend/llvm/expr-containers.js.map +1 -0
- package/dist/backend/llvm/expr-context.d.ts +255 -0
- package/dist/backend/llvm/expr-context.js +2 -0
- package/dist/backend/llvm/expr-context.js.map +1 -0
- package/dist/backend/llvm/expr-control.d.ts +2 -0
- package/dist/backend/llvm/expr-control.js +473 -0
- package/dist/backend/llvm/expr-control.js.map +1 -0
- package/dist/backend/llvm/expr-dispatch.d.ts +4 -0
- package/dist/backend/llvm/expr-dispatch.js +153 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -0
- package/dist/backend/llvm/expr-dynamic.d.ts +2 -0
- package/dist/backend/llvm/expr-dynamic.js +810 -0
- package/dist/backend/llvm/expr-dynamic.js.map +1 -0
- package/dist/backend/llvm/expr-island.d.ts +15 -0
- package/dist/backend/llvm/expr-island.js +690 -0
- package/dist/backend/llvm/expr-island.js.map +1 -0
- package/dist/backend/llvm/expr-primitives.d.ts +6 -0
- package/dist/backend/llvm/expr-primitives.js +642 -0
- package/dist/backend/llvm/expr-primitives.js.map +1 -0
- package/dist/backend/llvm/expr-records.d.ts +9 -0
- package/dist/backend/llvm/expr-records.js +299 -0
- package/dist/backend/llvm/expr-records.js.map +1 -0
- package/dist/backend/llvm/expr-stream-bridges.d.ts +13 -0
- package/dist/backend/llvm/expr-stream-bridges.js +420 -0
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +12 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +360 -0
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -0
- package/dist/backend/llvm/lib-dispatch.d.ts +5 -0
- package/dist/backend/llvm/lib-dispatch.js +267 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -0
- package/dist/backend/llvm/lib-filesystem.d.ts +6 -0
- package/dist/backend/llvm/lib-filesystem.js +594 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -0
- package/dist/backend/llvm/lib-network.d.ts +2 -0
- package/dist/backend/llvm/lib-network.js +429 -0
- package/dist/backend/llvm/lib-network.js.map +1 -0
- package/dist/backend/llvm/lib-process.d.ts +5 -0
- package/dist/backend/llvm/lib-process.js +585 -0
- package/dist/backend/llvm/lib-process.js.map +1 -0
- package/dist/backend/llvm/lib-shared.d.ts +6 -0
- package/dist/backend/llvm/lib-shared.js +687 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -0
- package/dist/backend/llvm/lib-stream.d.ts +2 -0
- package/dist/backend/llvm/lib-stream.js +470 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +12 -2
- package/dist/backend/llvm/shapes.js +66 -307
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +52 -0
- package/dist/backend/llvm/shapes.test.js.map +1 -0
- package/dist/backend/llvm/unsupported.d.ts +1 -1
- package/dist/backend/llvm/walkers.d.ts +2 -3
- package/dist/backend/llvm/walkers.js +195 -222
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native-codegen.d.ts +45 -0
- package/dist/backend/native-codegen.js +275 -0
- package/dist/backend/native-codegen.js.map +1 -0
- package/dist/backend/native-codegen.test.js +226 -0
- package/dist/backend/native-codegen.test.js.map +1 -0
- package/dist/backend/native-link-info.d.ts +96 -0
- package/dist/backend/native-link-info.js +243 -0
- package/dist/backend/native-link-info.js.map +1 -0
- package/dist/backend/native-link-info.test.d.ts +1 -0
- package/dist/backend/native-link-info.test.js +134 -0
- package/dist/backend/native-link-info.test.js.map +1 -0
- package/dist/backend/{cc.d.ts → native-toolchain.d.ts} +54 -34
- package/dist/backend/{cc.js → native-toolchain.js} +231 -810
- package/dist/backend/native-toolchain.js.map +1 -0
- package/dist/backend/native-toolchain.test.d.ts +1 -0
- package/dist/backend/{cc-cache.test.js → native-toolchain.test.js} +219 -7
- package/dist/backend/native-toolchain.test.js.map +1 -0
- package/dist/backend/object-localize.js +1 -1
- package/dist/backend/runtime-abi.d.ts +10 -0
- package/dist/backend/runtime-abi.js +11 -0
- package/dist/backend/runtime-abi.js.map +1 -0
- package/dist/backend/runtime-pack-targets.test.d.ts +1 -0
- package/dist/backend/runtime-pack-targets.test.js +54 -0
- package/dist/backend/runtime-pack-targets.test.js.map +1 -0
- package/dist/backend/runtime-pack.d.ts +112 -0
- package/dist/backend/runtime-pack.js +305 -0
- package/dist/backend/runtime-pack.js.map +1 -0
- package/dist/backend/runtime-pack.test.d.ts +1 -0
- package/dist/backend/runtime-pack.test.js +473 -0
- package/dist/backend/runtime-pack.test.js.map +1 -0
- package/dist/backend/targets.d.ts +76 -0
- package/dist/backend/targets.js +262 -0
- package/dist/backend/targets.js.map +1 -0
- package/dist/backend/targets.test.d.ts +1 -0
- package/dist/backend/targets.test.js +41 -0
- package/dist/backend/targets.test.js.map +1 -0
- package/dist/backend/vendor-archives.d.ts +41 -0
- package/dist/backend/vendor-archives.js +462 -0
- package/dist/backend/vendor-archives.js.map +1 -0
- package/dist/compat/fetch-profile.d.ts +0 -1
- package/dist/compat/fetch-profile.js +0 -1
- package/dist/compat/fetch-profile.js.map +1 -1
- package/dist/coverage/report.js +3 -3
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/surface-manifest.js +35 -33
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +11 -12
- package/dist/diagnostics/diagnostic.js +19 -17
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/diagnostics/render.d.ts +1 -1
- package/dist/diagnostics/render.js +1 -1
- package/dist/diagnostics/render.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/executable/{early-cache.d.ts → executable-cache.d.ts} +2 -2
- package/dist/executable/{early-cache.js → executable-cache.js} +36 -98
- package/dist/executable/executable-cache.js.map +1 -0
- package/dist/executable/executable-cache.test.d.ts +1 -0
- package/dist/executable/{early-cache.test.js → executable-cache.test.js} +3 -3
- package/dist/executable/executable-cache.test.js.map +1 -0
- package/dist/ffi/{profile.js → ffi-manifest.js} +1 -1
- package/dist/ffi/ffi-manifest.js.map +1 -0
- package/dist/frontend/builtin-modules.d.ts +21 -0
- package/dist/frontend/builtin-modules.js +82 -0
- package/dist/frontend/builtin-modules.js.map +1 -0
- package/dist/frontend/cjs-lexer.d.ts +7 -0
- package/dist/frontend/cjs-lexer.js +15 -17
- package/dist/frontend/cjs-lexer.js.map +1 -1
- package/dist/frontend/dts-paths.d.ts +26 -0
- package/dist/frontend/dts-paths.js +41 -0
- package/dist/frontend/dts-paths.js.map +1 -0
- package/dist/frontend/input-tracker.d.ts +0 -2
- package/dist/frontend/input-tracker.js +1 -4
- package/dist/frontend/input-tracker.js.map +1 -1
- package/dist/frontend/lib-contract.d.ts +1 -5
- package/dist/frontend/lib-contract.js +1 -1
- package/dist/frontend/lib-contract.js.map +1 -1
- package/dist/frontend/lib-exports.d.ts +1 -1
- package/dist/frontend/lowering/array-values.d.ts +8 -0
- package/dist/frontend/lowering/array-values.js +60 -0
- package/dist/frontend/lowering/array-values.js.map +1 -0
- package/dist/frontend/lowering/call-position.d.ts +4 -0
- package/dist/frontend/lowering/call-position.js +7 -0
- package/dist/frontend/lowering/call-position.js.map +1 -0
- package/dist/frontend/lowering/callback-arg.d.ts +20 -0
- package/dist/frontend/lowering/callback-arg.js +44 -0
- package/dist/frontend/lowering/callback-arg.js.map +1 -0
- package/dist/frontend/lowering/lib-boundary.d.ts +1 -1
- package/dist/frontend/lowering/lib-boundary.js +34 -34
- package/dist/frontend/lowering/lib-boundary.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.d.ts +22 -0
- package/dist/frontend/lowering/lower-array-sort.js +619 -0
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.d.ts +3 -3
- package/dist/frontend/lowering/lower-assert.js +214 -241
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +74 -146
- package/dist/frontend/lowering/lower-builtins.js +1285 -1233
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +59 -192
- package/dist/frontend/lowering/lower-calls.js +1644 -1506
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +62 -125
- package/dist/frontend/lowering/lower-classes.js +832 -866
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-comptime.d.ts +5 -12
- package/dist/frontend/lowering/lower-comptime.js +32 -31
- package/dist/frontend/lowering/lower-comptime.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +35 -135
- package/dist/frontend/lowering/lower-containers.js +1984 -2227
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.d.ts +3 -7
- package/dist/frontend/lowering/lower-dgram.js +97 -111
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-enums.d.ts +4 -4
- package/dist/frontend/lowering/lower-enums.js +30 -30
- package/dist/frontend/lowering/lower-enums.js.map +1 -1
- package/dist/frontend/lowering/{lower-emitter.d.ts → lower-event-emitter.d.ts} +7 -18
- package/dist/frontend/lowering/{lower-emitter.js → lower-event-emitter.js} +172 -174
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -0
- package/dist/frontend/lowering/lower-expando.d.ts +5 -5
- package/dist/frontend/lowering/lower-expando.js +40 -40
- package/dist/frontend/lowering/lower-expando.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +60 -264
- package/dist/frontend/lowering/lower-exprs.js +2361 -1765
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +6 -6
- package/dist/frontend/lowering/lower-generators.js +73 -72
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +5 -17
- package/dist/frontend/lowering/lower-inspect.js +273 -261
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +39 -49
- package/dist/frontend/lowering/lower-island.js +447 -513
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-mixins.d.ts +7 -10
- package/dist/frontend/lowering/lower-mixins.js +85 -85
- package/dist/frontend/lowering/lower-mixins.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +12 -18
- package/dist/frontend/lowering/lower-modules.js +284 -283
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.d.ts +23 -49
- package/dist/frontend/lowering/lower-namespaces.js +123 -115
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +18 -25
- package/dist/frontend/lowering/lower-server.js +909 -899
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +30 -149
- package/dist/frontend/lowering/lower-stmts.js +1463 -1285
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +12 -12
- package/dist/frontend/lowering/lower-stream.js +300 -301
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.d.ts +5 -5
- package/dist/frontend/lowering/lower-test.js +82 -82
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +134 -22
- package/dist/frontend/lowering/lowerer.js +1277 -126
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.d.ts +11 -0
- package/dist/frontend/lowering/pairs-snapshot.js +85 -0
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -0
- package/dist/frontend/lowering/static-this.d.ts +6 -0
- package/dist/frontend/lowering/static-this.js +24 -0
- package/dist/frontend/lowering/static-this.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +24 -35
- package/dist/frontend/lowering/surfaces.js +78 -66
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-rewrite.js +6 -28
- package/dist/frontend/npm-static-rewrite.js.map +1 -1
- package/dist/frontend/npm-static.d.ts +0 -10
- package/dist/frontend/npm-static.js +4 -7
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +0 -24
- package/dist/frontend/npm.js +11 -85
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/program.d.ts +3 -1
- package/dist/frontend/program.js +9 -4
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/provenance-registry.d.ts +0 -2
- package/dist/frontend/provenance-registry.js +0 -10
- package/dist/frontend/provenance-registry.js.map +1 -1
- package/dist/frontend/provenance.js +4 -7
- package/dist/frontend/provenance.js.map +1 -1
- package/dist/frontend/resolve.d.ts +7 -2
- package/dist/frontend/resolve.js +12 -17
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.d.ts +1 -0
- package/dist/frontend/resolve.test.js +29 -0
- package/dist/frontend/resolve.test.js.map +1 -0
- package/dist/frontend/ts7/adapter.d.ts +2 -2
- package/dist/frontend/ts7/adapter.js +1 -1
- package/dist/frontend/ts7/adapter.js.map +1 -1
- package/dist/frontend/ts7/checker.js +2 -36
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/ts7/enums.js +2 -1
- package/dist/frontend/ts7/enums.js.map +1 -1
- package/dist/frontend/ts7/{program.js → program-adapter.js} +7 -6
- package/dist/frontend/ts7/program-adapter.js.map +1 -0
- package/dist/frontend/ts7/world-check.d.ts +1 -3
- package/dist/frontend/ts7/world-check.js +3 -1
- package/dist/frontend/ts7/world-check.js.map +1 -1
- package/dist/frontend/tsc-codes.d.ts +8 -0
- package/dist/frontend/tsc-codes.js +109 -0
- package/dist/frontend/tsc-codes.js.map +1 -0
- package/dist/frontend/{types.d.ts → type-mapper.d.ts} +2 -25
- package/dist/frontend/{types.js → type-mapper.js} +12 -11
- package/dist/frontend/type-mapper.js.map +1 -0
- package/dist/frontend/workspace-registry.d.ts +26 -0
- package/dist/frontend/workspace-registry.js +71 -0
- package/dist/frontend/workspace-registry.js.map +1 -0
- package/dist/index.d.ts +113 -31
- package/dist/index.js +536 -128
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +37 -0
- package/dist/ir/analysis.js +118 -0
- package/dist/ir/analysis.js.map +1 -0
- package/dist/ir/analysis.test.d.ts +1 -0
- package/dist/ir/analysis.test.js +21 -0
- package/dist/ir/analysis.test.js.map +1 -0
- package/dist/ir/build.d.ts +9 -0
- package/dist/ir/build.js +33 -0
- package/dist/ir/build.js.map +1 -0
- package/dist/ir/integer-loops.d.ts +1 -1
- package/dist/ir/{nodes.d.ts → ir.d.ts} +119 -37
- package/dist/ir/{nodes.js → ir.js} +170 -166
- package/dist/ir/ir.js.map +1 -0
- package/dist/ir/ir.test.d.ts +1 -0
- package/dist/ir/ir.test.js +17 -0
- package/dist/ir/ir.test.js.map +1 -0
- package/dist/ir/serialize.d.ts +2 -2
- package/dist/ir/serialize.js +3 -2
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.d.ts +1 -1
- package/dist/ir/validate.js +93 -41
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/cache-primitives.d.ts +24 -0
- package/dist/library/cache-primitives.js +83 -0
- package/dist/library/cache-primitives.js.map +1 -0
- package/dist/library/cache-reset.test.d.ts +1 -0
- package/dist/library/cache-reset.test.js +47 -0
- package/dist/library/cache-reset.test.js.map +1 -0
- package/dist/library/{implementation-identity.js → compiler-self-identity.js} +1 -1
- package/dist/library/compiler-self-identity.js.map +1 -0
- package/dist/library/fence-eval.d.ts +3 -1
- package/dist/library/fence-eval.js +8 -2
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/int-infer.d.ts +1 -36
- package/dist/library/int-infer.js +29 -18
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/{early-cache.d.ts → library-cache.d.ts} +1 -1
- package/dist/library/{early-cache.js → library-cache.js} +34 -89
- package/dist/library/library-cache.js.map +1 -0
- package/dist/library/library-cache.test.d.ts +1 -0
- package/dist/library/{early-cache.test.js → library-cache.test.js} +7 -7
- package/dist/library/library-cache.test.js.map +1 -0
- package/dist/library/{profile.d.ts → library-profile.d.ts} +4 -7
- package/dist/library/{profile.js → library-profile.js} +18 -11
- package/dist/library/library-profile.js.map +1 -0
- package/dist/library/semantic-source.js +2 -1
- package/dist/library/semantic-source.js.map +1 -1
- package/dist/library/sidecar.d.ts +5 -2
- package/dist/library/sidecar.js +11 -5
- package/dist/library/sidecar.js.map +1 -1
- package/dist/startup-cache.d.ts +11 -3
- package/dist/startup-cache.js +17 -2
- package/dist/startup-cache.js.map +1 -1
- package/package.json +19 -2
- package/surface-manifest.json +5 -5
- package/dist/backend/cc-cache.test.js.map +0 -1
- package/dist/backend/cc.js.map +0 -1
- package/dist/backend/emission/emit-async.js.map +0 -1
- package/dist/backend/emission/emit-exprs.d.ts +0 -13
- package/dist/backend/emission/emit-exprs.js +0 -7407
- package/dist/backend/emission/emit-exprs.js.map +0 -1
- package/dist/backend/emission/emit-island.js.map +0 -1
- package/dist/backend/emission/emit-shapes.js.map +0 -1
- package/dist/backend/emission/emit-stmts.js.map +0 -1
- package/dist/backend/emission/emit-types.js.map +0 -1
- package/dist/backend/emission/emit-walkers.js.map +0 -1
- package/dist/backend/emission/emitter.js.map +0 -1
- package/dist/backend/emission/may-throw.js.map +0 -1
- package/dist/backend/library-identity.js.map +0 -1
- package/dist/executable/early-cache.js.map +0 -1
- package/dist/executable/early-cache.test.js.map +0 -1
- package/dist/ffi/profile.js.map +0 -1
- package/dist/frontend/lowering/lower-emitter.js.map +0 -1
- package/dist/frontend/shared.d.ts +0 -82
- package/dist/frontend/shared.js +0 -308
- package/dist/frontend/shared.js.map +0 -1
- package/dist/frontend/ts7/program.js.map +0 -1
- package/dist/frontend/types.js.map +0 -1
- package/dist/ir/nodes.js.map +0 -1
- package/dist/library/early-cache.js.map +0 -1
- package/dist/library/early-cache.test.js.map +0 -1
- package/dist/library/implementation-identity.js.map +0 -1
- package/dist/library/profile.js.map +0 -1
- /package/dist/backend/{cc-cache.test.d.ts → c/types.test.d.ts} +0 -0
- /package/dist/{executable/early-cache.test.d.ts → backend/llvm/shapes.test.d.ts} +0 -0
- /package/dist/{library/early-cache.test.d.ts → backend/native-codegen.test.d.ts} +0 -0
- /package/dist/ffi/{profile.d.ts → ffi-manifest.d.ts} +0 -0
- /package/dist/frontend/ts7/{program.d.ts → program-adapter.d.ts} +0 -0
- /package/dist/library/{implementation-identity.d.ts → compiler-self-identity.d.ts} +0 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
/* Focused LLVM expression emission extracted from emitter.ts. */
|
|
2
|
+
import { InternalCompilerError } from "../../errors.js";
|
|
3
|
+
import { newValueMayThrow } from "../../ir/analysis.js";
|
|
4
|
+
import { isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isRefCounted } from "../../ir/ir.js";
|
|
5
|
+
import { collectFfiRetainedOps, parseFfiCallbackKey } from "../ffi-callbacks.js";
|
|
6
|
+
import { mangleClassNew, mangleClassRetain, mangleFnClosure, mangleFunction, mangleLocal, mangleVtStruct } from "../mangle.js";
|
|
7
|
+
import { classStructSym } from "./classes.js";
|
|
8
|
+
import { LlvmUnsupportedError } from "./unsupported.js";
|
|
9
|
+
import { f64Lit, ffiNativeTypeLl } from "./common.js";
|
|
10
|
+
export function emitCallExpr(host, e) {
|
|
11
|
+
const B = host.B;
|
|
12
|
+
switch (e.kind) {
|
|
13
|
+
case "call": {
|
|
14
|
+
const callee = host.fnByName.get(e.callee);
|
|
15
|
+
if (!callee)
|
|
16
|
+
throw new InternalCompilerError(`llvm emitter bug: unknown callee ${e.callee}`);
|
|
17
|
+
if (callee.captures !== undefined)
|
|
18
|
+
throw new InternalCompilerError(`llvm emitter bug: direct call to lifted function ${e.callee}`);
|
|
19
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
20
|
+
for (const a of args)
|
|
21
|
+
host.moveTemp(a); // callees own their params
|
|
22
|
+
const argList = args
|
|
23
|
+
.map((a, i) => `${host.llType(callee.params[i].type)} ${a.name}`)
|
|
24
|
+
.join(", ");
|
|
25
|
+
// Async callee: the spawn wrapper runs the body eagerly to its
|
|
26
|
+
// first suspension and returns the promise (+1). The call itself
|
|
27
|
+
// never unwinds — rejections surface at await (computeMayThrow's
|
|
28
|
+
// async exclusion).
|
|
29
|
+
const target = `@${host.callTarget(e.callee)}`;
|
|
30
|
+
if (e.type.kind === "void") {
|
|
31
|
+
B.line(`call void ${target}(${argList})`);
|
|
32
|
+
if (host.mayThrow.has(e.callee))
|
|
33
|
+
host.emitPendingCheck();
|
|
34
|
+
return { name: "", type: e.type };
|
|
35
|
+
}
|
|
36
|
+
const t = B.tmp();
|
|
37
|
+
B.line(`${t} = call ${host.llType(e.type)} ${target}(${argList})`);
|
|
38
|
+
const out = host.own({ name: t, type: e.type });
|
|
39
|
+
if (host.mayThrow.has(e.callee))
|
|
40
|
+
host.emitPendingCheck();
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
case "ffiCall": {
|
|
44
|
+
// LIBRARY mode: every ffiCall is a profile-declared host-callback
|
|
45
|
+
// channel (the library lane loads no native-FFI manifest). Fetch
|
|
46
|
+
// the slot's registered pointer — scr_library_cb_require delivers
|
|
47
|
+
// the channel's trap constant through the funnel (SC4025) when the
|
|
48
|
+
// host never registered — then brackets the typed indirect call,
|
|
49
|
+
// opaque context first. The bracket makes callback-time ABI re-entry
|
|
50
|
+
// a deterministic SC4026 trap. Marshalling matches the native ffiCall's value
|
|
51
|
+
// classes exactly; the host cannot raise a scriptc exception, so
|
|
52
|
+
// no pending check follows.
|
|
53
|
+
const libCb = host.mod.lib?.callbacks?.find((c) => c.name === e.import);
|
|
54
|
+
if (libCb !== undefined) {
|
|
55
|
+
const cbArgs = e.args.map((arg) => host.emitExpr(arg));
|
|
56
|
+
const natTypes = ["ptr"];
|
|
57
|
+
const natArgs = [];
|
|
58
|
+
libCb.params.forEach((cls, i) => {
|
|
59
|
+
const arg = cbArgs[i];
|
|
60
|
+
switch (cls) {
|
|
61
|
+
case "f64":
|
|
62
|
+
natTypes.push("double");
|
|
63
|
+
natArgs.push(`double ${arg.name}`);
|
|
64
|
+
break;
|
|
65
|
+
case "bool": {
|
|
66
|
+
const widened = B.tmp();
|
|
67
|
+
B.line(`${widened} = zext i1 ${arg.name} to i8`);
|
|
68
|
+
natTypes.push("i8");
|
|
69
|
+
natArgs.push(`i8 ${widened}`);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case "u8":
|
|
73
|
+
case "u32": {
|
|
74
|
+
host.declare(`declare double @scr_bit_ushr(double, double)`);
|
|
75
|
+
const asDouble = B.tmp();
|
|
76
|
+
const asU32 = B.tmp();
|
|
77
|
+
B.line(`${asDouble} = call double @scr_bit_ushr(double ${arg.name}, double ${f64Lit(0)})`);
|
|
78
|
+
B.line(`${asU32} = fptoui double ${asDouble} to i32`);
|
|
79
|
+
if (cls === "u8") {
|
|
80
|
+
const asU8 = B.tmp();
|
|
81
|
+
B.line(`${asU8} = trunc i32 ${asU32} to i8`);
|
|
82
|
+
natTypes.push("i8");
|
|
83
|
+
natArgs.push(`i8 ${asU8}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
natTypes.push("i32");
|
|
87
|
+
natArgs.push(`i32 ${asU32}`);
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "i32": {
|
|
92
|
+
host.declare(`declare double @scr_bit_or(double, double)`);
|
|
93
|
+
const asDouble = B.tmp();
|
|
94
|
+
const asI32 = B.tmp();
|
|
95
|
+
B.line(`${asDouble} = call double @scr_bit_or(double ${arg.name}, double ${f64Lit(0)})`);
|
|
96
|
+
B.line(`${asI32} = fptosi double ${asDouble} to i32`);
|
|
97
|
+
natTypes.push("i32");
|
|
98
|
+
natArgs.push(`i32 ${asI32}`);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case "string": {
|
|
102
|
+
const lenPtr = B.tmp();
|
|
103
|
+
const len = B.tmp();
|
|
104
|
+
const data = B.tmp();
|
|
105
|
+
B.line(`${lenPtr} = getelementptr inbounds %ScrStr, ptr ${arg.name}, i64 0, i32 1`);
|
|
106
|
+
B.line(`${len} = load i64, ptr ${lenPtr}`);
|
|
107
|
+
B.line(`${data} = getelementptr inbounds i8, ptr ${arg.name}, i64 24`);
|
|
108
|
+
natTypes.push("ptr", "i64");
|
|
109
|
+
natArgs.push(`ptr ${data}`, `i64 ${len}`);
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case "bytes": {
|
|
113
|
+
const lenPtr = B.tmp();
|
|
114
|
+
const len = B.tmp();
|
|
115
|
+
const dataPtr = B.tmp();
|
|
116
|
+
const data = B.tmp();
|
|
117
|
+
B.line(`${lenPtr} = getelementptr inbounds i8, ptr ${arg.name}, i64 8`);
|
|
118
|
+
B.line(`${len} = load i64, ptr ${lenPtr}`);
|
|
119
|
+
B.line(`${dataPtr} = getelementptr inbounds i8, ptr ${arg.name}, i64 24`);
|
|
120
|
+
B.line(`${data} = load ptr, ptr ${dataPtr}`);
|
|
121
|
+
natTypes.push("ptr", "i64");
|
|
122
|
+
natArgs.push(`ptr ${data}`, `i64 ${len}`);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
host.declare(`declare ptr @scr_library_cb_require(${host.sizeType}, ptr)`);
|
|
128
|
+
host.declare(`declare ptr @scr_library_cb_ctx(${host.sizeType})`);
|
|
129
|
+
host.declare(`declare void @scr_library_callback_begin()`);
|
|
130
|
+
host.declare(`declare void @scr_library_callback_end()`);
|
|
131
|
+
const fn = B.tmp();
|
|
132
|
+
B.line(`${fn} = call ptr @scr_library_cb_require(${host.sizeType} ${libCb.slot}, ptr @sc_lib_cb_trap_${libCb.slot})`);
|
|
133
|
+
const ctx = B.tmp();
|
|
134
|
+
B.line(`${ctx} = call ptr @scr_library_cb_ctx(${host.sizeType} ${libCb.slot})`);
|
|
135
|
+
const retTy = ffiNativeTypeLl(libCb.returns);
|
|
136
|
+
const call = `call ${retTy} ${fn}(${[`ptr ${ctx}`, ...natArgs].join(", ")})`;
|
|
137
|
+
if (libCb.returns === "void") {
|
|
138
|
+
B.line(`call void @scr_library_callback_begin()`);
|
|
139
|
+
B.line(call);
|
|
140
|
+
B.line(`call void @scr_library_callback_end()`);
|
|
141
|
+
return { name: "", type: e.type };
|
|
142
|
+
}
|
|
143
|
+
const raw = B.tmp();
|
|
144
|
+
B.line(`call void @scr_library_callback_begin()`);
|
|
145
|
+
B.line(`${raw} = ${call}`);
|
|
146
|
+
B.line(`call void @scr_library_callback_end()`);
|
|
147
|
+
if (libCb.returns === "f64")
|
|
148
|
+
return { name: raw, type: e.type };
|
|
149
|
+
if (libCb.returns === "bool") {
|
|
150
|
+
const value = B.tmp();
|
|
151
|
+
B.line(`${value} = icmp ne i8 ${raw}, 0`);
|
|
152
|
+
return { name: value, type: e.type };
|
|
153
|
+
}
|
|
154
|
+
const value = B.tmp();
|
|
155
|
+
const op = libCb.returns === "i32" ? "sitofp" : "uitofp";
|
|
156
|
+
B.line(`${value} = ${op} ${retTy} ${raw} to double`);
|
|
157
|
+
return { name: value, type: e.type };
|
|
158
|
+
}
|
|
159
|
+
const entry = host.ffiByName.get(e.import);
|
|
160
|
+
if (!entry)
|
|
161
|
+
throw new InternalCompilerError(`llvm emitter bug: unknown FFI import ${e.import}`);
|
|
162
|
+
const args = e.args.map((arg) => host.emitExpr(arg));
|
|
163
|
+
const sourceArgs = new Map();
|
|
164
|
+
const callbackArgs = new Map();
|
|
165
|
+
let sourceIndex = 0;
|
|
166
|
+
entry.params.forEach((param, abiIndex) => {
|
|
167
|
+
if (isFfiContextParam(param))
|
|
168
|
+
return;
|
|
169
|
+
const arg = args[sourceIndex++];
|
|
170
|
+
sourceArgs.set(abiIndex, arg);
|
|
171
|
+
if (isFfiCallbackParam(param))
|
|
172
|
+
callbackArgs.set(param.callback.id, arg);
|
|
173
|
+
if (isFfiReleaseParam(param))
|
|
174
|
+
callbackArgs.set(param.callback.release, arg);
|
|
175
|
+
});
|
|
176
|
+
const { registrations: retainedRegistrations, releases: retainedReleases } = collectFfiRetainedOps(entry, callbackArgs, (binding, id) => host.ffiCallbackAdapter(binding, id));
|
|
177
|
+
if (retainedRegistrations.length > 0) {
|
|
178
|
+
host.declare(`declare void @scr_ffi_retain(ptr, ptr)`);
|
|
179
|
+
if (retainedRegistrations.some((registration) => registration.global !== null)) {
|
|
180
|
+
host.declare(`declare void @scr_ffi_retain_slot(ptr, ptr, ptr)`);
|
|
181
|
+
host.declare(`declare void @scr_ffi_commit_slot(ptr, ptr)`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (retainedReleases.length > 0) {
|
|
185
|
+
host.declare(`declare void @scr_ffi_require(ptr, ptr)`);
|
|
186
|
+
if (retainedReleases.some((release) => release.foreign)) {
|
|
187
|
+
host.declare(`declare void @scr_ffi_require_foreign(ptr, ptr)`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Pin before registration. Raw retained descriptors are native
|
|
191
|
+
// singletons: the incoming closure is pinned (and an EMPTY slot
|
|
192
|
+
// armed) before the native set call, but a replaced registration
|
|
193
|
+
// stays live and dispatching until the call returns — a native
|
|
194
|
+
// setter may flush the outgoing callback one last time mid-replace.
|
|
195
|
+
// scr_ffi_commit_slot below repoints the slot and retires the
|
|
196
|
+
// superseded pins after the call.
|
|
197
|
+
for (const registration of retainedRegistrations) {
|
|
198
|
+
if (registration.global !== null) {
|
|
199
|
+
B.line(`call void @scr_ffi_retain_slot(ptr @${registration.table}, ptr @${registration.global}, ptr ${registration.callback.name})`);
|
|
200
|
+
}
|
|
201
|
+
else if (registration.foreign) {
|
|
202
|
+
host.declare(`declare void @scr_ffi_retain_foreign(ptr, ptr)`);
|
|
203
|
+
B.line(`call void @scr_ffi_retain_foreign(ptr @${registration.table}, ptr ${registration.callback.name})`);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
B.line(`call void @scr_ffi_retain(ptr @${registration.table}, ptr ${registration.callback.name})`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Validate releases BEFORE the native removal call runs: a bogus
|
|
210
|
+
// release traps without native code observing any side effect. The
|
|
211
|
+
// registration itself is unpinned only after the call returns.
|
|
212
|
+
for (const release of retainedReleases) {
|
|
213
|
+
B.line(`call void @scr_ffi_require${release.foreign ? "_foreign" : ""}(ptr @${release.table}, ptr ${release.callback.name})`);
|
|
214
|
+
}
|
|
215
|
+
const rawContexts = [];
|
|
216
|
+
for (const param of entry.params) {
|
|
217
|
+
if (!isFfiCallbackParam(param))
|
|
218
|
+
continue;
|
|
219
|
+
const adapter = host.ffiCallbackAdapter(entry.name, param.callback.id);
|
|
220
|
+
if (adapter.tls === null)
|
|
221
|
+
continue;
|
|
222
|
+
const callback = callbackArgs.get(param.callback.id);
|
|
223
|
+
const previous = B.tmp();
|
|
224
|
+
B.line(`${previous} = load ptr, ptr @${adapter.tls}`);
|
|
225
|
+
B.line(`store ptr ${callback.name}, ptr @${adapter.tls}`);
|
|
226
|
+
rawContexts.push({ tls: adapter.tls, previous });
|
|
227
|
+
}
|
|
228
|
+
const nativeArgs = [];
|
|
229
|
+
const nativeParamTypes = [];
|
|
230
|
+
entry.params.forEach((param, i) => {
|
|
231
|
+
if (isFfiCallbackParam(param)) {
|
|
232
|
+
const adapter = host.ffiCallbackAdapter(entry.name, param.callback.id);
|
|
233
|
+
nativeParamTypes.push("ptr");
|
|
234
|
+
nativeArgs.push(`ptr @${adapter.symbol}`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (isFfiReleaseParam(param)) {
|
|
238
|
+
const { binding, id } = parseFfiCallbackKey(param.callback.release);
|
|
239
|
+
const adapter = host.ffiCallbackAdapter(binding, id);
|
|
240
|
+
nativeParamTypes.push("ptr");
|
|
241
|
+
nativeArgs.push(`ptr @${adapter.symbol}`);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (isFfiContextParam(param)) {
|
|
245
|
+
const callback = callbackArgs.get(param.context);
|
|
246
|
+
if (!callback)
|
|
247
|
+
throw new InternalCompilerError(`llvm emitter bug: FFI context '${param.context}' has no callback arg`);
|
|
248
|
+
nativeParamTypes.push("ptr");
|
|
249
|
+
nativeArgs.push(`ptr ${callback.name}`);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const arg = sourceArgs.get(i);
|
|
253
|
+
switch (param) {
|
|
254
|
+
case "f64":
|
|
255
|
+
nativeParamTypes.push("double");
|
|
256
|
+
nativeArgs.push(`double ${arg.name}`);
|
|
257
|
+
break;
|
|
258
|
+
case "bool": {
|
|
259
|
+
const widened = B.tmp();
|
|
260
|
+
B.line(`${widened} = zext i1 ${arg.name} to i8`);
|
|
261
|
+
nativeParamTypes.push("i8");
|
|
262
|
+
nativeArgs.push(`i8 ${widened}`);
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case "u8":
|
|
266
|
+
case "u32": {
|
|
267
|
+
host.declare(`declare double @scr_bit_ushr(double, double)`);
|
|
268
|
+
const asDouble = B.tmp();
|
|
269
|
+
const asU32 = B.tmp();
|
|
270
|
+
B.line(`${asDouble} = call double @scr_bit_ushr(double ${arg.name}, double ${f64Lit(0)})`);
|
|
271
|
+
B.line(`${asU32} = fptoui double ${asDouble} to i32`);
|
|
272
|
+
if (param === "u8") {
|
|
273
|
+
const asU8 = B.tmp();
|
|
274
|
+
B.line(`${asU8} = trunc i32 ${asU32} to i8`);
|
|
275
|
+
nativeParamTypes.push("i8");
|
|
276
|
+
nativeArgs.push(`i8 ${asU8}`);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
nativeParamTypes.push("i32");
|
|
280
|
+
nativeArgs.push(`i32 ${asU32}`);
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
case "i32": {
|
|
285
|
+
host.declare(`declare double @scr_bit_or(double, double)`);
|
|
286
|
+
const asDouble = B.tmp();
|
|
287
|
+
const asI32 = B.tmp();
|
|
288
|
+
B.line(`${asDouble} = call double @scr_bit_or(double ${arg.name}, double ${f64Lit(0)})`);
|
|
289
|
+
B.line(`${asI32} = fptosi double ${asDouble} to i32`);
|
|
290
|
+
nativeParamTypes.push("i32");
|
|
291
|
+
nativeArgs.push(`i32 ${asI32}`);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case "string": {
|
|
295
|
+
const lenPtr = B.tmp();
|
|
296
|
+
const len = B.tmp();
|
|
297
|
+
const data = B.tmp();
|
|
298
|
+
B.line(`${lenPtr} = getelementptr inbounds %ScrStr, ptr ${arg.name}, i64 0, i32 1`);
|
|
299
|
+
B.line(`${len} = load i64, ptr ${lenPtr}`);
|
|
300
|
+
B.line(`${data} = getelementptr inbounds i8, ptr ${arg.name}, i64 24`);
|
|
301
|
+
nativeParamTypes.push("ptr", "i64");
|
|
302
|
+
nativeArgs.push(`ptr ${data}`, `i64 ${len}`);
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
case "bytes": {
|
|
306
|
+
const lenPtr = B.tmp();
|
|
307
|
+
const len = B.tmp();
|
|
308
|
+
const dataPtr = B.tmp();
|
|
309
|
+
const data = B.tmp();
|
|
310
|
+
B.line(`${lenPtr} = getelementptr inbounds i8, ptr ${arg.name}, i64 8`);
|
|
311
|
+
B.line(`${len} = load i64, ptr ${lenPtr}`);
|
|
312
|
+
B.line(`${dataPtr} = getelementptr inbounds i8, ptr ${arg.name}, i64 24`);
|
|
313
|
+
B.line(`${data} = load ptr, ptr ${dataPtr}`);
|
|
314
|
+
nativeParamTypes.push("ptr", "i64");
|
|
315
|
+
nativeArgs.push(`ptr ${data}`, `i64 ${len}`);
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
const retTy = ffiNativeTypeLl(entry.returns);
|
|
321
|
+
host.declare(`declare ${retTy} @${entry.symbol}(${nativeParamTypes.join(", ")})`);
|
|
322
|
+
const call = `call ${retTy} @${entry.symbol}(${nativeArgs.join(", ")})`;
|
|
323
|
+
const restoreRawContexts = () => {
|
|
324
|
+
for (let i = rawContexts.length - 1; i >= 0; i--) {
|
|
325
|
+
const saved = rawContexts[i];
|
|
326
|
+
B.line(`store ptr ${saved.previous}, ptr @${saved.tls}`);
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const finishRetainedReleases = () => {
|
|
330
|
+
// Commit raw replacements first (repoint the slot, retire the
|
|
331
|
+
// superseded pins), then unpin explicit releases — the runtime
|
|
332
|
+
// disarms the slot itself when the released closure holds it.
|
|
333
|
+
for (const registration of retainedRegistrations) {
|
|
334
|
+
if (registration.global !== null) {
|
|
335
|
+
B.line(`call void @scr_ffi_commit_slot(ptr @${registration.table}, ptr ${registration.callback.name})`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (retainedReleases.some((release) => !release.foreign)) {
|
|
339
|
+
host.declare(`declare void @scr_ffi_release(ptr, ptr)`);
|
|
340
|
+
}
|
|
341
|
+
if (retainedReleases.some((release) => release.foreign)) {
|
|
342
|
+
host.declare(`declare void @scr_ffi_release_foreign(ptr, ptr)`);
|
|
343
|
+
}
|
|
344
|
+
for (const release of retainedReleases) {
|
|
345
|
+
B.line(`call void @scr_ffi_release${release.foreign ? "_foreign" : ""}(ptr @${release.table}, ptr ${release.callback.name})`);
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
const callbacksMayThrow = callbackArgs.size > 0 || host.ffiHasRetainedCallback;
|
|
349
|
+
if (entry.returns === "void") {
|
|
350
|
+
B.line(call);
|
|
351
|
+
restoreRawContexts();
|
|
352
|
+
finishRetainedReleases();
|
|
353
|
+
if (callbacksMayThrow)
|
|
354
|
+
host.emitPendingCheck();
|
|
355
|
+
return { name: "", type: e.type };
|
|
356
|
+
}
|
|
357
|
+
const raw = B.tmp();
|
|
358
|
+
B.line(`${raw} = ${call}`);
|
|
359
|
+
restoreRawContexts();
|
|
360
|
+
finishRetainedReleases();
|
|
361
|
+
if (entry.returns === "f64") {
|
|
362
|
+
const result = { name: raw, type: e.type };
|
|
363
|
+
if (callbacksMayThrow)
|
|
364
|
+
host.emitPendingCheck();
|
|
365
|
+
return result;
|
|
366
|
+
}
|
|
367
|
+
if (entry.returns === "bool") {
|
|
368
|
+
const value = B.tmp();
|
|
369
|
+
B.line(`${value} = icmp ne i8 ${raw}, 0`);
|
|
370
|
+
const result = { name: value, type: e.type };
|
|
371
|
+
if (callbacksMayThrow)
|
|
372
|
+
host.emitPendingCheck();
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
const value = B.tmp();
|
|
376
|
+
const op = entry.returns === "i32" ? "sitofp" : "uitofp";
|
|
377
|
+
B.line(`${value} = ${op} ${retTy} ${raw} to double`);
|
|
378
|
+
const result = { name: value, type: e.type };
|
|
379
|
+
if (callbacksMayThrow)
|
|
380
|
+
host.emitPendingCheck();
|
|
381
|
+
return result;
|
|
382
|
+
}
|
|
383
|
+
case "closure": {
|
|
384
|
+
const target = host.fnByName.get(e.fnName);
|
|
385
|
+
if (!target)
|
|
386
|
+
throw new InternalCompilerError(`llvm emitter bug: closure over unknown function ${e.fnName}`);
|
|
387
|
+
if (target.captures === undefined) {
|
|
388
|
+
// Declared function as a value: the interned immortal closure —
|
|
389
|
+
// every mention yields the same pointer, so `f === f` is true.
|
|
390
|
+
host.fnValues.add(e.fnName);
|
|
391
|
+
return host.own({
|
|
392
|
+
name: host.retainValue(`@${mangleFnClosure(e.fnName)}`, e.type),
|
|
393
|
+
type: e.type,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
// Lifted async lambdas enter through their spawn wrapper (which
|
|
397
|
+
// takes sc_env first, like every lifted function).
|
|
398
|
+
host.declare(`declare ptr @scr_closure_new(ptr, ${host.sizeType})`);
|
|
399
|
+
const c = B.tmp();
|
|
400
|
+
B.line(`${c} = call ptr @scr_closure_new(ptr @${host.callTarget(e.fnName)}, ${host.sizeType} ${e.captures.length})`);
|
|
401
|
+
const out = host.own({ name: c, type: e.type });
|
|
402
|
+
e.captures.forEach((localId, i) => {
|
|
403
|
+
const box = host.loadBox(`%${mangleLocal(localId)}`);
|
|
404
|
+
const retained = host.retainBox(box);
|
|
405
|
+
const caps = B.tmp();
|
|
406
|
+
const capp = B.tmp();
|
|
407
|
+
B.line(`${caps} = getelementptr inbounds %ScrClosure, ptr ${c}, i64 1 ; caps`);
|
|
408
|
+
B.line(`${capp} = getelementptr inbounds ptr, ptr ${caps}, ${host.sizeType} ${i} ; caps[${i}]`);
|
|
409
|
+
B.line(`store ptr ${retained}, ptr ${capp}`);
|
|
410
|
+
});
|
|
411
|
+
return out;
|
|
412
|
+
}
|
|
413
|
+
case "callValue": {
|
|
414
|
+
// Calling through a closure value: load the fn pointer, pass the
|
|
415
|
+
// closure itself first (the callValue ABI), then the declared
|
|
416
|
+
// params — callees own their refcounted params.
|
|
417
|
+
if (e.callee.type.kind !== "func")
|
|
418
|
+
throw new InternalCompilerError("llvm emitter bug: callValue on non-func");
|
|
419
|
+
const ft = e.callee.type;
|
|
420
|
+
if (e.args.length !== ft.params.length)
|
|
421
|
+
throw new LlvmUnsupportedError("callValue:arity", e.loc);
|
|
422
|
+
const callee = host.emitExpr(e.callee);
|
|
423
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
424
|
+
for (const a of args)
|
|
425
|
+
host.moveTemp(a);
|
|
426
|
+
const fnp = B.tmp();
|
|
427
|
+
const fn = B.tmp();
|
|
428
|
+
B.line(`${fnp} = getelementptr inbounds %ScrClosure, ptr ${callee.name}, i64 0, i32 1`);
|
|
429
|
+
B.line(`${fn} = load ptr, ptr ${fnp}`);
|
|
430
|
+
const argList = [
|
|
431
|
+
`ptr ${callee.name}`,
|
|
432
|
+
...args.map((a, i) => `${host.llType(ft.params[i])} ${a.name}`),
|
|
433
|
+
].join(", ");
|
|
434
|
+
if (e.type.kind === "void") {
|
|
435
|
+
B.line(`call void ${fn}(${argList})`);
|
|
436
|
+
if (host.indirectMayThrow)
|
|
437
|
+
host.emitPendingCheck();
|
|
438
|
+
return { name: "", type: e.type };
|
|
439
|
+
}
|
|
440
|
+
const t = B.tmp();
|
|
441
|
+
B.line(`${t} = call ${host.llType(e.type)} ${fn}(${argList})`);
|
|
442
|
+
// The check runs AFTER the result temp joins the frame: an unwind
|
|
443
|
+
// releases it (the dummy is NULL for refcounted returns).
|
|
444
|
+
const out = host.own({ name: t, type: e.type });
|
|
445
|
+
if (host.indirectMayThrow)
|
|
446
|
+
host.emitPendingCheck();
|
|
447
|
+
return out;
|
|
448
|
+
}
|
|
449
|
+
case "selfRef":
|
|
450
|
+
// The running closure itself (env is borrowed; the result owned).
|
|
451
|
+
return host.own({ name: host.retainValue("%sc_env", e.type), type: e.type });
|
|
452
|
+
case "new": {
|
|
453
|
+
// Allocate (fields zeroed, vt stamped), then run the ctor. The
|
|
454
|
+
// ctor owns and releases its `this` param like any callee, so it
|
|
455
|
+
// receives a +1 distinct from the one this expression returns.
|
|
456
|
+
// A throwing constructor unwinds like any call; the half-built
|
|
457
|
+
// object is in this frame and releases with it.
|
|
458
|
+
const ctor = host.fnByName.get(`%${e.className}.constructor`);
|
|
459
|
+
if (!ctor)
|
|
460
|
+
throw new InternalCompilerError(`llvm emitter bug: new ${e.className} without a constructor`);
|
|
461
|
+
const o = B.tmp();
|
|
462
|
+
B.line(`${o} = call ptr @${mangleClassNew(e.className)}()`);
|
|
463
|
+
const out = host.own({ name: o, type: e.type });
|
|
464
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
465
|
+
for (const a of args)
|
|
466
|
+
host.moveTemp(a);
|
|
467
|
+
const r = B.tmp();
|
|
468
|
+
B.line(`${r} = call ptr @${mangleClassRetain(e.className)}(ptr ${o})`);
|
|
469
|
+
const argList = [
|
|
470
|
+
`ptr ${r}`,
|
|
471
|
+
...args.map((a, i) => `${host.llType(ctor.params[i + 1].type)} ${a.name}`),
|
|
472
|
+
].join(", ");
|
|
473
|
+
B.line(`call void @${mangleFunction(`%${e.className}.constructor`)}(${argList})`);
|
|
474
|
+
if (host.mayThrow.has(`%${e.className}.constructor`))
|
|
475
|
+
host.emitPendingCheck();
|
|
476
|
+
return out;
|
|
477
|
+
}
|
|
478
|
+
case "classRef": {
|
|
479
|
+
// The class itself as a value: the immortal class object's
|
|
480
|
+
// address. The +1 retain is a no-op on immortals but keeps the
|
|
481
|
+
// owned-temps discipline uniform (the regexLit pattern).
|
|
482
|
+
const sym = host.classObjSym(e.className);
|
|
483
|
+
return host.own({ name: host.retainValue(`@${sym}`, e.type), type: e.type });
|
|
484
|
+
}
|
|
485
|
+
case "newValue": {
|
|
486
|
+
// Construction through a class VALUE: call the class object's
|
|
487
|
+
// construct thunk. Every value legally in the slot shares the
|
|
488
|
+
// static class's constructor ABI (the frontend's flow rule).
|
|
489
|
+
if (e.callee.type.kind !== "classval")
|
|
490
|
+
throw new InternalCompilerError("llvm emitter bug: newValue on non-classval callee");
|
|
491
|
+
const cls = e.callee.type.className;
|
|
492
|
+
const ctor = host.fnByName.get(`%${cls}.constructor`);
|
|
493
|
+
if (!ctor)
|
|
494
|
+
throw new InternalCompilerError(`llvm emitter bug: newValue on ${cls} without a constructor`);
|
|
495
|
+
const callee = host.emitExpr(e.callee);
|
|
496
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
497
|
+
for (const a of args)
|
|
498
|
+
host.moveTemp(a); // the constructor owns its params
|
|
499
|
+
const ctorp = B.tmp();
|
|
500
|
+
const thunk = B.tmp();
|
|
501
|
+
B.line(`${ctorp} = getelementptr inbounds %ScrClassObj, ptr ${callee.name}, i64 0, i32 3`);
|
|
502
|
+
B.line(`${thunk} = load ptr, ptr ${ctorp}`);
|
|
503
|
+
const argList = args
|
|
504
|
+
.map((a, i) => `${host.llType(ctor.params[i + 1].type)} ${a.name}`)
|
|
505
|
+
.join(", ");
|
|
506
|
+
const t = B.tmp();
|
|
507
|
+
B.line(`${t} = call ptr ${thunk}(${argList})`);
|
|
508
|
+
const out = host.own({ name: t, type: e.type });
|
|
509
|
+
if (newValueMayThrow(cls, host.classMeta, host.mayThrow))
|
|
510
|
+
host.emitPendingCheck();
|
|
511
|
+
return out;
|
|
512
|
+
}
|
|
513
|
+
case "instanceOfValue": {
|
|
514
|
+
// The interval check with the target loaded from the class object
|
|
515
|
+
// (same numbering the vtables carry). Frontend guarantees both
|
|
516
|
+
// sides are hierarchy members, so the operand has a vt word.
|
|
517
|
+
if (e.value.type.kind !== "object")
|
|
518
|
+
throw new InternalCompilerError("llvm emitter bug: instanceOfValue on a non-object");
|
|
519
|
+
const v = host.emitExpr(e.value);
|
|
520
|
+
const target = host.emitExpr(e.classValue);
|
|
521
|
+
const pre = host.loadVtPre(v.name, e.value.type.className);
|
|
522
|
+
const tprep = B.tmp();
|
|
523
|
+
const tpre = B.tmp();
|
|
524
|
+
const tpostp = B.tmp();
|
|
525
|
+
const tpost = B.tmp();
|
|
526
|
+
B.line(`${tprep} = getelementptr inbounds %ScrClassObj, ptr ${target.name}, i64 0, i32 1`);
|
|
527
|
+
B.line(`${tpre} = load ${host.sizeType}, ptr ${tprep}`);
|
|
528
|
+
B.line(`${tpostp} = getelementptr inbounds %ScrClassObj, ptr ${target.name}, i64 0, i32 2`);
|
|
529
|
+
B.line(`${tpost} = load ${host.sizeType}, ptr ${tpostp}`);
|
|
530
|
+
const ge = B.tmp();
|
|
531
|
+
const le = B.tmp();
|
|
532
|
+
const t = B.tmp();
|
|
533
|
+
B.line(`${ge} = icmp sge ${host.sizeType} ${pre}, ${tpre}`);
|
|
534
|
+
B.line(`${le} = icmp sle ${host.sizeType} ${pre}, ${tpost}`);
|
|
535
|
+
B.line(`${t} = and i1 ${ge}, ${le}`);
|
|
536
|
+
return { name: t, type: e.type };
|
|
537
|
+
}
|
|
538
|
+
case "promiseVoidWiden": {
|
|
539
|
+
// One ScrPromise* either way — ownership transfers, type-only
|
|
540
|
+
// (the C emitter's rule).
|
|
541
|
+
const v = host.emitExpr(e.value);
|
|
542
|
+
host.moveTemp(v);
|
|
543
|
+
return host.own({ name: v.name, type: e.type });
|
|
544
|
+
}
|
|
545
|
+
case "upcast":
|
|
546
|
+
case "downcast": {
|
|
547
|
+
// Prefix layout: both directions are reinterprets of the SAME
|
|
548
|
+
// pointer — no RC traffic, ownership transfers from the operand
|
|
549
|
+
// temp to the result temp (struck so the one +1 releases exactly
|
|
550
|
+
// once, under the RESULT type's release).
|
|
551
|
+
const v = host.emitExpr(e.value);
|
|
552
|
+
if (isRefCounted(v.type))
|
|
553
|
+
host.moveTemp(v);
|
|
554
|
+
return host.own({ name: v.name, type: e.type });
|
|
555
|
+
}
|
|
556
|
+
case "instanceOf": {
|
|
557
|
+
// O(1) preorder-interval test against the vtable the object
|
|
558
|
+
// carries; the target's interval is a compile-time constant.
|
|
559
|
+
if (e.value.type.kind !== "object")
|
|
560
|
+
throw new InternalCompilerError("llvm emitter bug: instanceOf on a non-object");
|
|
561
|
+
const v = host.emitExpr(e.value);
|
|
562
|
+
const target = host.classMetaOf(e.className);
|
|
563
|
+
const pre = host.loadVtPre(v.name, e.value.type.className);
|
|
564
|
+
const ge = B.tmp();
|
|
565
|
+
const le = B.tmp();
|
|
566
|
+
const t = B.tmp();
|
|
567
|
+
B.line(`${ge} = icmp sge ${host.sizeType} ${pre}, ${target.pre}`);
|
|
568
|
+
B.line(`${le} = icmp sle ${host.sizeType} ${pre}, ${target.post}`);
|
|
569
|
+
B.line(`${t} = and i1 ${ge}, ${le} ; instanceof ${e.className}`);
|
|
570
|
+
return { name: t, type: e.type };
|
|
571
|
+
}
|
|
572
|
+
case "virtualCall": {
|
|
573
|
+
// Dispatch through the receiver's vtable: the slot lives on the
|
|
574
|
+
// method's root-most declaring class; every implementation shares
|
|
575
|
+
// the slot's LLVM signature (override exactness), so the stored
|
|
576
|
+
// pointer is the method function itself — no adapters (see
|
|
577
|
+
// classes.ts).
|
|
578
|
+
const meta = host.classMetaOf(e.className);
|
|
579
|
+
const slotIdx = meta.root.slots.findIndex((sl) => sl.method === e.method && sl.declarer.pre <= meta.pre && meta.pre <= sl.declarer.post);
|
|
580
|
+
if (slotIdx < 0)
|
|
581
|
+
throw new InternalCompilerError(`llvm emitter bug: no vtable slot for ${e.className}.${e.method}`);
|
|
582
|
+
const slot = meta.root.slots[slotIdx];
|
|
583
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
584
|
+
for (const a of args)
|
|
585
|
+
host.moveTemp(a); // callees own their params
|
|
586
|
+
const recv = args[0].name;
|
|
587
|
+
const vtp = B.tmp();
|
|
588
|
+
const vt = B.tmp();
|
|
589
|
+
const fnp = B.tmp();
|
|
590
|
+
const fn = B.tmp();
|
|
591
|
+
B.line(`${vtp} = getelementptr inbounds %${classStructSym(e.className)}, ptr ${recv}, i64 0, i32 1`);
|
|
592
|
+
B.line(`${vt} = load ptr, ptr ${vtp}`);
|
|
593
|
+
B.line(`${fnp} = getelementptr inbounds %${mangleVtStruct(meta.root.def.name)}, ptr ${vt}, i64 0, i32 ${slotIdx + 1}`);
|
|
594
|
+
B.line(`${fn} = load ptr, ptr ${fnp} ; ${e.method}`);
|
|
595
|
+
const argList = args
|
|
596
|
+
.map((a, i) => `${host.llType(slot.fn.params[i].type)} ${a.name}`)
|
|
597
|
+
.join(", ");
|
|
598
|
+
if (e.type.kind === "void") {
|
|
599
|
+
B.line(`call void ${fn}(${argList})`);
|
|
600
|
+
if (host.mayThrowMethods.has(e.method))
|
|
601
|
+
host.emitPendingCheck();
|
|
602
|
+
return { name: "", type: e.type };
|
|
603
|
+
}
|
|
604
|
+
const t = B.tmp();
|
|
605
|
+
B.line(`${t} = call ${host.llType(e.type)} ${fn}(${argList})`);
|
|
606
|
+
const out = host.own({ name: t, type: e.type });
|
|
607
|
+
if (host.mayThrowMethods.has(e.method))
|
|
608
|
+
host.emitPendingCheck();
|
|
609
|
+
return out;
|
|
610
|
+
}
|
|
611
|
+
default: {
|
|
612
|
+
const _exhaustive = e;
|
|
613
|
+
void _exhaustive;
|
|
614
|
+
throw new InternalCompilerError("unreachable");
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
//# sourceMappingURL=expr-calls.js.map
|