@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,594 @@
|
|
|
1
|
+
/* Focused LLVM library-call emission extracted from emitter.ts. */
|
|
2
|
+
import { InternalCompilerError } from "../../errors.js";
|
|
3
|
+
import { undefinedArmTag } from "../../ir/analysis.js";
|
|
4
|
+
import { DYN, F64, STRING } from "../../ir/ir.js";
|
|
5
|
+
import { mangleRecordNew } from "../mangle.js";
|
|
6
|
+
import { arrNewCall, traceArg, vAdapters } from "./shapes.js";
|
|
7
|
+
import { f64Lit } from "./common.js";
|
|
8
|
+
import { emitAlwaysThrowLibCall } from "./lib-shared.js";
|
|
9
|
+
const FS_ALWAYS_THROW_SYMS = {
|
|
10
|
+
"fs.mkdtempChk": "scr_fs_mkdtemp_chk",
|
|
11
|
+
"fs.readFileChk": "scr_fs_read_file_chk",
|
|
12
|
+
"fs.opendirChk": "scr_fs_opendir_chk",
|
|
13
|
+
"fs.watchFileChk": "scr_fs_watch_file_chk",
|
|
14
|
+
"fs.lchmodChk": "scr_fs_lchmod_chk",
|
|
15
|
+
"fs.readChk": "scr_fs_read_chk",
|
|
16
|
+
"fs.streamOptsChk": "scr_fs_stream_opts_chk",
|
|
17
|
+
};
|
|
18
|
+
export function emitWebLibCall(host, e) {
|
|
19
|
+
const B = host.B;
|
|
20
|
+
if (e.fn === "fetch.responseText" || e.fn === "fetch.responseBytes") {
|
|
21
|
+
if (e.type.kind !== "promise") {
|
|
22
|
+
throw new InternalCompilerError(`llvm emitter bug: ${e.fn} result`);
|
|
23
|
+
}
|
|
24
|
+
const response = host.emitExpr(e.args[0]);
|
|
25
|
+
const runtimeFn = e.fn === "fetch.responseText"
|
|
26
|
+
? "scr_fetch_response_text"
|
|
27
|
+
: "scr_fetch_response_bytes";
|
|
28
|
+
host.declare(`declare ptr @${runtimeFn}(ptr)`);
|
|
29
|
+
host.declare(`declare ptr @scr_promise_new()`);
|
|
30
|
+
host.declare(`declare void @scr_promise_race_add(ptr, ptr, ptr)`);
|
|
31
|
+
const sourceRaw = B.tmp();
|
|
32
|
+
B.line(`${sourceRaw} = call ptr @${runtimeFn}(ptr ${response.name})`);
|
|
33
|
+
const source = host.own({
|
|
34
|
+
name: sourceRaw,
|
|
35
|
+
type: { kind: "promise", inner: DYN },
|
|
36
|
+
});
|
|
37
|
+
const resultRaw = B.tmp();
|
|
38
|
+
B.line(`${resultRaw} = call ptr @scr_promise_new()`);
|
|
39
|
+
const result = host.own({ name: resultRaw, type: e.type });
|
|
40
|
+
B.line(`call void @scr_promise_race_add(ptr ${result.name}, ptr ${source.name}, ptr @${host.dynPromiseAdapter(e.type.inner)})`);
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
if (e.fn === "fetch.readerRead") {
|
|
44
|
+
if (e.type.kind !== "promise" || e.type.inner.kind !== "record") {
|
|
45
|
+
throw new InternalCompilerError("llvm emitter bug: fetch.readerRead result");
|
|
46
|
+
}
|
|
47
|
+
const reader = host.emitExpr(e.args[0]);
|
|
48
|
+
host.declare(`declare ptr @scr_fetch_reader_read(ptr)`);
|
|
49
|
+
host.declare(`declare ptr @scr_promise_new()`);
|
|
50
|
+
host.declare(`declare void @scr_promise_race_add(ptr, ptr, ptr)`);
|
|
51
|
+
const sourceRaw = B.tmp();
|
|
52
|
+
B.line(`${sourceRaw} = call ptr @scr_fetch_reader_read(ptr ${reader.name})`);
|
|
53
|
+
const source = host.own({
|
|
54
|
+
name: sourceRaw,
|
|
55
|
+
type: { kind: "promise", inner: DYN },
|
|
56
|
+
});
|
|
57
|
+
const resultRaw = B.tmp();
|
|
58
|
+
B.line(`${resultRaw} = call ptr @scr_promise_new()`);
|
|
59
|
+
const result = host.own({ name: resultRaw, type: e.type });
|
|
60
|
+
B.line(`call void @scr_promise_race_add(ptr ${result.name}, ptr ${source.name}, ptr @${host.dynPromiseAdapter(e.type.inner)})`);
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
if (e.fn === "fetch.streamFrom") {
|
|
64
|
+
const source = host.emitExpr(e.args[0]);
|
|
65
|
+
let sym = "scr_fetch_stream_from";
|
|
66
|
+
let extra = "";
|
|
67
|
+
if (source.type.kind === "array") {
|
|
68
|
+
sym = "scr_fetch_stream_from_array";
|
|
69
|
+
extra = `, ptr @${host.streamFromArrayAdapter(source.type)}`;
|
|
70
|
+
}
|
|
71
|
+
else if (source.type.kind === "bytes") {
|
|
72
|
+
sym = "scr_fetch_stream_from_bytes";
|
|
73
|
+
}
|
|
74
|
+
else if (source.type.kind === "string") {
|
|
75
|
+
sym = "scr_fetch_stream_from_string";
|
|
76
|
+
}
|
|
77
|
+
host.declare(`declare ptr @${sym}(ptr${source.type.kind === "array" ? ", ptr" : ""})`);
|
|
78
|
+
const raw = B.tmp();
|
|
79
|
+
B.line(`${raw} = call ptr @${sym}(ptr ${source.name}${extra})`);
|
|
80
|
+
const out = host.own({ name: raw, type: e.type });
|
|
81
|
+
host.emitPendingCheck();
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
// The handful with non-generic shapes first.
|
|
85
|
+
if (e.fn === "island.castFail") {
|
|
86
|
+
// The deferred boundary failure: the island value was evaluated
|
|
87
|
+
// (its side effects are real), the throw is unconditional
|
|
88
|
+
// (catchable TypeError naming the target type), and the typed
|
|
89
|
+
// dummy is NULL — the pending check abandons it.
|
|
90
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
91
|
+
host.declare(`declare void @scr_jsval_cast_fail(ptr, ptr)`);
|
|
92
|
+
B.line(`call void @scr_jsval_cast_fail(ptr ${args[0].name}, ptr ${args[1].name})`);
|
|
93
|
+
const out = host.own({ name: "null", type: e.type });
|
|
94
|
+
host.emitPendingCheck();
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
return host.emitGenericLibCall(e);
|
|
98
|
+
}
|
|
99
|
+
export function emitDynamicLibCall(host, e) {
|
|
100
|
+
const B = host.B;
|
|
101
|
+
if (e.fn === "global.undefRead") {
|
|
102
|
+
// A declare-d const nothing defines: Node's catchable
|
|
103
|
+
// ReferenceError at the access (always throws — the typed dummy is
|
|
104
|
+
// abandoned by the pending check's unwind; releases are
|
|
105
|
+
// NULL-tolerant). Borrows the name string.
|
|
106
|
+
const name = host.emitExpr(e.args[0]);
|
|
107
|
+
host.declare(`declare void @scr_undef_global_read(ptr)`);
|
|
108
|
+
B.line(`call void @scr_undef_global_read(ptr ${name.name})`);
|
|
109
|
+
const ty = host.llType(e.type);
|
|
110
|
+
const dummy = ty === "double" ? f64Lit(0) : ty === "i1" ? "false" : "null";
|
|
111
|
+
const out = host.own({ name: dummy, type: e.type });
|
|
112
|
+
host.emitPendingCheck();
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
return host.emitGenericLibCall(e);
|
|
116
|
+
}
|
|
117
|
+
export function emitFilesystemLibCall(host, e) {
|
|
118
|
+
const B = host.B;
|
|
119
|
+
const alwaysThrowSym = FS_ALWAYS_THROW_SYMS[e.fn];
|
|
120
|
+
if (alwaysThrowSym !== undefined) {
|
|
121
|
+
return emitAlwaysThrowLibCall(host, e, alwaysThrowSym);
|
|
122
|
+
}
|
|
123
|
+
if (e.fn === "fs.renameCb") {
|
|
124
|
+
// The callback MOVES into the next-turn operation. Its emitted
|
|
125
|
+
// adapter materializes the callback's Error | null union (or the
|
|
126
|
+
// checkJs dyn argument) from the runtime's borrowed ScrError.
|
|
127
|
+
host.usesTimers = true;
|
|
128
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
129
|
+
const cbT = e.args[2].type;
|
|
130
|
+
if (cbT.kind !== "func")
|
|
131
|
+
throw new InternalCompilerError("llvm emitter bug: fs.rename callback not a func");
|
|
132
|
+
host.moveTemp(args[2]);
|
|
133
|
+
const adapter = host.fsRenameThunkFor(cbT);
|
|
134
|
+
host.declare(`declare void @scr_fs_rename_async(ptr, ptr, ptr, ptr)`);
|
|
135
|
+
B.line(`call void @scr_fs_rename_async(ptr ${args[0].name}, ptr ${args[1].name}, ptr ${args[2].name}, ptr @${adapter})`);
|
|
136
|
+
return { name: "", type: e.type };
|
|
137
|
+
}
|
|
138
|
+
if (e.fn === "fileHandle.read" || e.fn === "fileHandle.writeBytes" || e.fn === "fileHandle.writeStr") {
|
|
139
|
+
if (e.type.kind !== "promise" || e.type.inner.kind !== "record") {
|
|
140
|
+
throw new InternalCompilerError(`llvm emitter bug: ${e.fn} result`);
|
|
141
|
+
}
|
|
142
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
143
|
+
const sym = e.fn === "fileHandle.read"
|
|
144
|
+
? "scr_file_handle_read"
|
|
145
|
+
: e.fn === "fileHandle.writeBytes"
|
|
146
|
+
? "scr_file_handle_write_bytes"
|
|
147
|
+
: "scr_file_handle_write_str";
|
|
148
|
+
const tail = e.fn === "fileHandle.writeStr"
|
|
149
|
+
? "ptr, ptr, double, ptr"
|
|
150
|
+
: "ptr, ptr, double, double, double, i1 zeroext";
|
|
151
|
+
host.declare(`declare double @${sym}(${tail})`);
|
|
152
|
+
const count = B.tmp();
|
|
153
|
+
B.line(`${count} = call double @${sym}(${args.map((a) => `${host.llType(a.type)} ${a.name}`).join(", ")})`);
|
|
154
|
+
const inner = e.type.inner;
|
|
155
|
+
const rec = B.tmp();
|
|
156
|
+
B.line(`${rec} = call ptr @${mangleRecordNew(inner.shapeId)}()`);
|
|
157
|
+
const countField = e.fn === "fileHandle.read" ? "bytesRead" : "bytesWritten";
|
|
158
|
+
host.storeField(host.recordFieldPtr(rec, inner.shapeId, countField).ptr, F64, count);
|
|
159
|
+
const payload = host.retainValue(args[1].name, e.args[1].type);
|
|
160
|
+
B.line(`store ptr ${payload}, ptr ${host.recordFieldPtr(rec, inner.shapeId, "buffer").ptr}`);
|
|
161
|
+
const rc = vAdapters(host, inner);
|
|
162
|
+
host.declare(`declare ptr @scr_promise_settled_ref(ptr, ptr, ptr, ptr)`);
|
|
163
|
+
const result = B.tmp();
|
|
164
|
+
B.line(`${result} = call ptr @scr_promise_settled_ref(ptr ${rec}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, inner)})`);
|
|
165
|
+
return host.own({ name: result, type: e.type });
|
|
166
|
+
}
|
|
167
|
+
if (e.fn === "fs.readFileSync" || e.fn === "fs.readFdSync") {
|
|
168
|
+
// args[1] is the (always-"utf8") encoding: evaluated for JS-exact
|
|
169
|
+
// side-effect order, ignored by the runtime. May throw.
|
|
170
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
171
|
+
const isFd = e.fn === "fs.readFdSync";
|
|
172
|
+
const sym = isFd ? "scr_fs_read_fd" : "scr_fs_read_file";
|
|
173
|
+
const argTy = isFd ? "double" : "ptr";
|
|
174
|
+
host.declare(`declare ptr @${sym}(${argTy})`);
|
|
175
|
+
const t = B.tmp();
|
|
176
|
+
B.line(`${t} = call ptr @${sym}(${argTy} ${args[0].name})`);
|
|
177
|
+
const out = host.own({ name: t, type: e.type });
|
|
178
|
+
host.emitPendingCheck();
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
if (e.fn === "fsp.readFile") {
|
|
182
|
+
// fs.promises.readFile(path, "utf8"): args[1] is the encoding —
|
|
183
|
+
// evaluated for JS-exact side-effect order, ignored by the runtime
|
|
184
|
+
// exactly like fs.readFileSync's. The C prototype takes ONLY the
|
|
185
|
+
// path, so the generic path (which passes every evaluated arg)
|
|
186
|
+
// would declare a second parameter the runtime never had. Settles
|
|
187
|
+
// the +1 promise instead of throwing — no pending check.
|
|
188
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
189
|
+
host.declare(`declare ptr @scr_fsp_read_file(ptr)`);
|
|
190
|
+
const t = B.tmp();
|
|
191
|
+
B.line(`${t} = call ptr @scr_fsp_read_file(ptr ${args[0].name})`);
|
|
192
|
+
return host.own({ name: t, type: e.type });
|
|
193
|
+
}
|
|
194
|
+
if (e.fn === "fs.watch") {
|
|
195
|
+
// The callback-less form: NULL listener/adapter. Throws Node-shaped
|
|
196
|
+
// fs errors when the path won't open; an open watcher holds the
|
|
197
|
+
// loop (usesTimers).
|
|
198
|
+
host.usesTimers = true;
|
|
199
|
+
const path = host.emitExpr(e.args[0]);
|
|
200
|
+
host.declare(`declare ptr @scr_fs_watch(ptr, ptr, ptr)`);
|
|
201
|
+
const t = B.tmp();
|
|
202
|
+
B.line(`${t} = call ptr @scr_fs_watch(ptr ${path.name}, ptr null, ptr null)`);
|
|
203
|
+
const out = host.own({ name: t, type: e.type });
|
|
204
|
+
host.emitPendingCheck();
|
|
205
|
+
return out;
|
|
206
|
+
}
|
|
207
|
+
if (e.fn === "fs.watchCb") {
|
|
208
|
+
// The callback MOVES into the watcher's registry; the adapter is
|
|
209
|
+
// runtime-provided per listener shape (zero-param, or the eventType
|
|
210
|
+
// string). May throw (ENOENT) — the standard pending check.
|
|
211
|
+
host.usesTimers = true;
|
|
212
|
+
const cbT = e.args[1].type;
|
|
213
|
+
if (cbT.kind !== "func")
|
|
214
|
+
throw new InternalCompilerError("llvm emitter bug: fs.watchCb callback not a func");
|
|
215
|
+
const path = host.emitExpr(e.args[0]);
|
|
216
|
+
const cb = host.emitExpr(e.args[1]);
|
|
217
|
+
host.moveTemp(cb);
|
|
218
|
+
const adapter = cbT.params.length === 0 ? "scr_watch_thunk0" : "scr_watch_thunk_event";
|
|
219
|
+
host.declare(`declare void @${adapter}(ptr, ptr)`);
|
|
220
|
+
host.declare(`declare ptr @scr_fs_watch(ptr, ptr, ptr)`);
|
|
221
|
+
const t = B.tmp();
|
|
222
|
+
B.line(`${t} = call ptr @scr_fs_watch(ptr ${path.name}, ptr ${cb.name}, ptr @${adapter})`);
|
|
223
|
+
const out = host.own({ name: t, type: e.type });
|
|
224
|
+
host.emitPendingCheck();
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
if (e.fn === "watcher.close") {
|
|
228
|
+
// Idempotent; never throws.
|
|
229
|
+
const w = host.emitExpr(e.args[0]);
|
|
230
|
+
host.declare(`declare void @scr_watcher_close(ptr)`);
|
|
231
|
+
B.line(`call void @scr_watcher_close(ptr ${w.name})`);
|
|
232
|
+
return { name: "", type: e.type };
|
|
233
|
+
}
|
|
234
|
+
if (e.fn === "fs.readdirTypesSync") {
|
|
235
|
+
// Dirent rows assembled inline from one scandir snapshot — the C
|
|
236
|
+
// emitter's flat loop. The snapshot call throws Node's scandir
|
|
237
|
+
// error and answers NULL then, so the pending check runs before
|
|
238
|
+
// any allocation.
|
|
239
|
+
if (e.type.kind !== "array" || e.type.elem.kind !== "record") {
|
|
240
|
+
throw new InternalCompilerError("llvm emitter bug: readdirTypesSync result is not a record array");
|
|
241
|
+
}
|
|
242
|
+
const recT = e.type.elem;
|
|
243
|
+
const path = host.emitExpr(e.args[0]);
|
|
244
|
+
host.declare(`declare ptr @scr_fs_scandir(ptr)`);
|
|
245
|
+
host.declare(`declare ${host.sizeType} @scr_fs_scandir_count(ptr)`);
|
|
246
|
+
host.declare(`declare ptr @scr_fs_scandir_name(ptr, ${host.sizeType})`);
|
|
247
|
+
host.declare(`declare double @scr_fs_scandir_type(ptr, ${host.sizeType})`);
|
|
248
|
+
host.declare(`declare void @scr_fs_scandir_free(ptr)`);
|
|
249
|
+
const snap = B.tmp();
|
|
250
|
+
B.line(`${snap} = call ptr @scr_fs_scandir(ptr ${path.name})`);
|
|
251
|
+
host.emitPendingCheck();
|
|
252
|
+
const cnt = B.tmp();
|
|
253
|
+
B.line(`${cnt} = call ${host.sizeType} @scr_fs_scandir_count(ptr ${snap})`);
|
|
254
|
+
const arr = B.tmp();
|
|
255
|
+
B.line(`${arr} = ${arrNewCall(host, recT, cnt)}`);
|
|
256
|
+
const out = host.own({ name: arr, type: e.type });
|
|
257
|
+
const iSlot = B.slot();
|
|
258
|
+
B.entryAllocas.push(`${iSlot} = alloca ${host.sizeType}`);
|
|
259
|
+
B.line(`store ${host.sizeType} 0, ptr ${iSlot}`);
|
|
260
|
+
const lc = B.newLabel("sd.c");
|
|
261
|
+
const lb = B.newLabel("sd.b");
|
|
262
|
+
const le = B.newLabel("sd.e");
|
|
263
|
+
B.br(lc);
|
|
264
|
+
B.startBlock(lc);
|
|
265
|
+
const i = B.tmp();
|
|
266
|
+
const cont = B.tmp();
|
|
267
|
+
B.line(`${i} = load ${host.sizeType}, ptr ${iSlot}`);
|
|
268
|
+
B.line(`${cont} = icmp ult ${host.sizeType} ${i}, ${cnt}`);
|
|
269
|
+
B.condBr(cont, lb, le);
|
|
270
|
+
B.startBlock(lb);
|
|
271
|
+
const row = B.tmp();
|
|
272
|
+
B.line(`${row} = call ptr @${mangleRecordNew(recT.shapeId)}()`);
|
|
273
|
+
const dt = B.tmp();
|
|
274
|
+
B.line(`${dt} = call double @scr_fs_scandir_type(ptr ${snap}, ${host.sizeType} ${i})`);
|
|
275
|
+
host.storeField(host.recordFieldPtr(row, recT.shapeId, "%dtype").ptr, F64, dt);
|
|
276
|
+
const nm = B.tmp();
|
|
277
|
+
B.line(`${nm} = call ptr @scr_fs_scandir_name(ptr ${snap}, ${host.sizeType} ${i}) ; +1`);
|
|
278
|
+
B.line(`store ptr ${nm}, ptr ${host.recordFieldPtr(row, recT.shapeId, "name").ptr}`);
|
|
279
|
+
B.line(`store ptr ${host.retainValue(path.name, STRING)}, ptr ${host.recordFieldPtr(row, recT.shapeId, "parentPath").ptr}`);
|
|
280
|
+
host.arrPush(arr, "ref", row); // push takes ownership of the row
|
|
281
|
+
const i2 = B.tmp();
|
|
282
|
+
B.line(`${i2} = add ${host.sizeType} ${i}, 1`);
|
|
283
|
+
B.line(`store ${host.sizeType} ${i2}, ptr ${iSlot}`);
|
|
284
|
+
B.br(lc);
|
|
285
|
+
B.startBlock(le);
|
|
286
|
+
B.line(`call void @scr_fs_scandir_free(ptr ${snap})`);
|
|
287
|
+
return out;
|
|
288
|
+
}
|
|
289
|
+
return host.emitGenericLibCall(e);
|
|
290
|
+
}
|
|
291
|
+
export function emitPathUrlLibCall(host, e) {
|
|
292
|
+
const B = host.B;
|
|
293
|
+
if (e.fn === "sp.get") {
|
|
294
|
+
// `string | null` — the sym.desc pattern with a null arm: the
|
|
295
|
+
// runtime answers a +1 string or NULL.
|
|
296
|
+
if (e.type.kind !== "union")
|
|
297
|
+
throw new InternalCompilerError("llvm emitter bug: sp.get result is not a union");
|
|
298
|
+
const def = host.unionsById.get(e.type.unionId);
|
|
299
|
+
const strTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
|
|
300
|
+
const nullTag = def ? def.arms.findIndex((a) => a.kind === "nullT") : -1;
|
|
301
|
+
if (strTag < 0 || nullTag < 0)
|
|
302
|
+
throw new InternalCompilerError("llvm emitter bug: sp.get union lacks its arms");
|
|
303
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
304
|
+
host.declare(`declare ptr @scr_sp_get(ptr, ptr)`);
|
|
305
|
+
const raw = B.tmp();
|
|
306
|
+
B.line(`${raw} = call ptr @scr_sp_get(ptr ${args[0].name}, ptr ${args[1].name})`);
|
|
307
|
+
return host.wrapNullable(raw, raw, STRING, strTag, e.type, nullTag);
|
|
308
|
+
}
|
|
309
|
+
if (e.fn === "qs.parse") {
|
|
310
|
+
// The ParsedUrlQuery dictionary: a fresh pure-index-signature
|
|
311
|
+
// record whose overflow map the runtime scan fills
|
|
312
|
+
// (scr_qs_parse_into groups repeats into string[] buckets) — the
|
|
313
|
+
// C emitter's shape exactly. The frontend verified the structure;
|
|
314
|
+
// lookups here only guard emitter bugs. Args: qs, sep, eq, maxKeys.
|
|
315
|
+
if (e.type.kind !== "record")
|
|
316
|
+
throw new InternalCompilerError("llvm emitter bug: qs.parse result is not a record");
|
|
317
|
+
const dictShape = host.recordsById.get(e.type.shapeId);
|
|
318
|
+
const iv = dictShape?.indexValue;
|
|
319
|
+
if (!dictShape || iv?.kind !== "union")
|
|
320
|
+
throw new InternalCompilerError("llvm emitter bug: qs.parse dict shape");
|
|
321
|
+
const ivDef = host.unionsById.get(iv.unionId);
|
|
322
|
+
const strTag = ivDef?.arms.findIndex((a) => a.kind === "string") ?? -1;
|
|
323
|
+
const arrTag = ivDef?.arms.findIndex((a) => a.kind === "array") ?? -1;
|
|
324
|
+
if (strTag < 0 || arrTag < 0)
|
|
325
|
+
throw new InternalCompilerError("llvm emitter bug: qs.parse index union lacks its arms");
|
|
326
|
+
const args = e.args.map((a) => host.emitExpr(a));
|
|
327
|
+
host.declare(`declare void @scr_qs_parse_into(ptr, ptr, ptr, ptr, double, i32, i32)`);
|
|
328
|
+
const dict = B.tmp();
|
|
329
|
+
B.line(`${dict} = call ptr @${mangleRecordNew(e.type.shapeId)}()`);
|
|
330
|
+
const out = host.own({ name: dict, type: e.type });
|
|
331
|
+
const ovf = host.recordOvfPtr(dict, e.type.shapeId);
|
|
332
|
+
B.line(`call void @scr_qs_parse_into(ptr ${ovf}, ptr ${args[0].name}, ptr ${args[1].name}, ptr ${args[2].name}, double ${args[3].name}, i32 ${strTag}, i32 ${arrTag})`);
|
|
333
|
+
return out;
|
|
334
|
+
}
|
|
335
|
+
if (e.fn === "os.networkInterfaces") {
|
|
336
|
+
// The Dict<NetworkInterfaceInfo[]> record, built inline from a
|
|
337
|
+
// getifaddrs(3) snapshot — exprs.ts's builder, block-lowered.
|
|
338
|
+
// Every shape/union/tag below comes from the call's own type; the
|
|
339
|
+
// frontend verified the structure, so lookups only guard against
|
|
340
|
+
// emitter bugs. Rows append to their interface's bucket in snapshot
|
|
341
|
+
// order; a first row makes the bucket (a fresh Info[] wrapped into
|
|
342
|
+
// the `Info[] | undefined` union arm the overflow map stores).
|
|
343
|
+
if (e.type.kind !== "record")
|
|
344
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces result is not a record");
|
|
345
|
+
const dictShape = host.recordsById.get(e.type.shapeId);
|
|
346
|
+
const iv = dictShape?.indexValue;
|
|
347
|
+
if (!dictShape || iv?.kind !== "union")
|
|
348
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces dict shape");
|
|
349
|
+
const ivDef = host.unionsById.get(iv.unionId);
|
|
350
|
+
const arrTag = ivDef?.arms.findIndex((a) => a.kind === "array") ?? -1;
|
|
351
|
+
const arrT = ivDef?.arms[arrTag];
|
|
352
|
+
if (arrT?.kind !== "array" || arrT.elem.kind !== "union")
|
|
353
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces bucket type");
|
|
354
|
+
const infoT = arrT.elem;
|
|
355
|
+
const infoDef = host.unionsById.get(infoT.unionId);
|
|
356
|
+
if (!infoDef || infoDef.arms.length !== 2)
|
|
357
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces Info union");
|
|
358
|
+
const tag6 = infoDef.arms.findIndex((a) => a.kind === "record" && host.recordsById.get(a.shapeId)?.fields.find((f) => f.name === "scopeid")?.type.kind === "f64");
|
|
359
|
+
const tag4 = 1 - tag6;
|
|
360
|
+
host.declare(`declare ptr @scr_os_ifaddrs()`);
|
|
361
|
+
host.declare(`declare ${host.sizeType} @scr_os_ifaddrs_count(ptr)`);
|
|
362
|
+
host.declare(`declare ptr @scr_os_ifaddrs_name(ptr, ${host.sizeType})`);
|
|
363
|
+
host.declare(`declare ptr @scr_os_ifaddrs_address(ptr, ${host.sizeType})`);
|
|
364
|
+
host.declare(`declare ptr @scr_os_ifaddrs_netmask(ptr, ${host.sizeType})`);
|
|
365
|
+
host.declare(`declare ptr @scr_os_ifaddrs_family(ptr, ${host.sizeType})`);
|
|
366
|
+
host.declare(`declare ptr @scr_os_ifaddrs_mac(ptr, ${host.sizeType})`);
|
|
367
|
+
host.declare(`declare zeroext i1 @scr_os_ifaddrs_internal(ptr, ${host.sizeType})`);
|
|
368
|
+
host.declare(`declare zeroext i1 @scr_os_ifaddrs_ipv6(ptr, ${host.sizeType})`);
|
|
369
|
+
host.declare(`declare ptr @scr_os_ifaddrs_cidr(ptr, ${host.sizeType})`);
|
|
370
|
+
host.declare(`declare double @scr_os_ifaddrs_scopeid(ptr, ${host.sizeType})`);
|
|
371
|
+
host.declare(`declare void @scr_os_ifaddrs_free(ptr)`);
|
|
372
|
+
host.declare(`declare ptr @scr_union_new_ref(i32, ptr, ptr, ptr, ptr)`);
|
|
373
|
+
host.declare(`declare ptr @scr_union_retain_v(ptr)`);
|
|
374
|
+
host.declare(`declare void @scr_union_release(ptr)`);
|
|
375
|
+
host.declare(`declare ptr @scr_str_retain_v(ptr)`);
|
|
376
|
+
host.declare(`declare void @scr_str_release_v(ptr)`);
|
|
377
|
+
host.declare(`declare void @scr_str_release(ptr)`);
|
|
378
|
+
host.declare(`declare ptr @scr_arr_retain_v(ptr)`);
|
|
379
|
+
host.declare(`declare void @scr_arr_release(ptr)`);
|
|
380
|
+
host.declare(`declare ptr @scr_map_get_str_ref(ptr, ptr)`);
|
|
381
|
+
host.declare(`declare void @scr_map_set_str_ref(ptr, ptr, ptr)`);
|
|
382
|
+
const dict = B.tmp();
|
|
383
|
+
B.line(`${dict} = call ptr @${mangleRecordNew(e.type.shapeId)}()`);
|
|
384
|
+
const out = host.own({ name: dict, type: e.type });
|
|
385
|
+
const ovf = host.recordOvfPtr(dict, e.type.shapeId);
|
|
386
|
+
const snap = B.tmp();
|
|
387
|
+
const cnt = B.tmp();
|
|
388
|
+
B.line(`${snap} = call ptr @scr_os_ifaddrs()`);
|
|
389
|
+
B.line(`${cnt} = call ${host.sizeType} @scr_os_ifaddrs_count(ptr ${snap})`);
|
|
390
|
+
const iSlot = B.slot();
|
|
391
|
+
const rowSlot = B.slot();
|
|
392
|
+
B.entryAllocas.push(`${iSlot} = alloca ${host.sizeType}`, `${rowSlot} = alloca ptr`);
|
|
393
|
+
B.line(`store ${host.sizeType} 0, ptr ${iSlot}`);
|
|
394
|
+
const lc = B.newLabel("ni.c");
|
|
395
|
+
const lb = B.newLabel("ni.b");
|
|
396
|
+
const le = B.newLabel("ni.e");
|
|
397
|
+
B.br(lc);
|
|
398
|
+
B.startBlock(lc);
|
|
399
|
+
const i = B.tmp();
|
|
400
|
+
const cont = B.tmp();
|
|
401
|
+
B.line(`${i} = load ${host.sizeType}, ptr ${iSlot}`);
|
|
402
|
+
B.line(`${cont} = icmp ult ${host.sizeType} ${i}, ${cnt}`);
|
|
403
|
+
B.condBr(cont, lb, le);
|
|
404
|
+
B.startBlock(lb);
|
|
405
|
+
const isV6 = B.tmp();
|
|
406
|
+
B.line(`${isV6} = call zeroext i1 @scr_os_ifaddrs_ipv6(ptr ${snap}, ${host.sizeType} ${i})`);
|
|
407
|
+
const l6 = B.newLabel("ni.v6");
|
|
408
|
+
const l4 = B.newLabel("ni.v4");
|
|
409
|
+
const lRow = B.newLabel("ni.r");
|
|
410
|
+
B.condBr(isV6, l6, l4);
|
|
411
|
+
const emitRow = (tag, v6) => {
|
|
412
|
+
const t = infoDef.arms[tag];
|
|
413
|
+
if (t?.kind !== "record")
|
|
414
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces Info arm");
|
|
415
|
+
const shape = host.recordsById.get(t.shapeId);
|
|
416
|
+
if (!shape)
|
|
417
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces Info shape");
|
|
418
|
+
const cidrT = shape.fields.find((f) => f.name === "cidr")?.type;
|
|
419
|
+
const cidrDef = cidrT?.kind === "union" ? host.unionsById.get(cidrT.unionId) : undefined;
|
|
420
|
+
if (cidrT?.kind !== "union" || !cidrDef)
|
|
421
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces cidr type");
|
|
422
|
+
const cidrStrTag = cidrDef.arms.findIndex((a) => a.kind === "string");
|
|
423
|
+
const cidrNullTag = cidrDef.arms.findIndex((a) => a.kind === "nullT");
|
|
424
|
+
const r = B.tmp();
|
|
425
|
+
B.line(`${r} = call ptr @${mangleRecordNew(t.shapeId)}()`);
|
|
426
|
+
for (const [field, sym] of [
|
|
427
|
+
["address", "scr_os_ifaddrs_address"],
|
|
428
|
+
["netmask", "scr_os_ifaddrs_netmask"],
|
|
429
|
+
["family", "scr_os_ifaddrs_family"],
|
|
430
|
+
["mac", "scr_os_ifaddrs_mac"],
|
|
431
|
+
]) {
|
|
432
|
+
const v = B.tmp();
|
|
433
|
+
B.line(`${v} = call ptr @${sym}(ptr ${snap}, ${host.sizeType} ${i}) ; +1`);
|
|
434
|
+
B.line(`store ptr ${v}, ptr ${host.recordFieldPtr(r, t.shapeId, field).ptr}`);
|
|
435
|
+
}
|
|
436
|
+
const internal = B.tmp();
|
|
437
|
+
B.line(`${internal} = call zeroext i1 @scr_os_ifaddrs_internal(ptr ${snap}, ${host.sizeType} ${i})`);
|
|
438
|
+
host.storeField(host.recordFieldPtr(r, t.shapeId, "internal").ptr, { kind: "bool" }, internal);
|
|
439
|
+
const cs = B.tmp();
|
|
440
|
+
B.line(`${cs} = call ptr @scr_os_ifaddrs_cidr(ptr ${snap}, ${host.sizeType} ${i}) ; +1 or null`);
|
|
441
|
+
const hasCidr = B.tmp();
|
|
442
|
+
B.line(`${hasCidr} = icmp ne ptr ${cs}, null`);
|
|
443
|
+
const lcs = B.newLabel("ni.cs");
|
|
444
|
+
const lcn = B.newLabel("ni.cn");
|
|
445
|
+
const lcj = B.newLabel("ni.cj");
|
|
446
|
+
const cidrSlot = B.slot();
|
|
447
|
+
B.entryAllocas.push(`${cidrSlot} = alloca ptr`);
|
|
448
|
+
B.condBr(hasCidr, lcs, lcn);
|
|
449
|
+
B.startBlock(lcs);
|
|
450
|
+
const cu = B.tmp();
|
|
451
|
+
B.line(`${cu} = call ptr @scr_union_new_ref(i32 ${cidrStrTag}, ptr ${cs}, ptr @scr_str_retain_v, ptr @scr_str_release_v, ptr null)`);
|
|
452
|
+
B.line(`store ptr ${cu}, ptr ${cidrSlot}`);
|
|
453
|
+
B.br(lcj);
|
|
454
|
+
B.startBlock(lcn);
|
|
455
|
+
const cn = B.tmp();
|
|
456
|
+
B.line(`${cn} = call ptr @scr_union_retain_v(ptr ${host.unitInstanceRef(cidrT.unionId, cidrNullTag)})`);
|
|
457
|
+
B.line(`store ptr ${cn}, ptr ${cidrSlot}`);
|
|
458
|
+
B.br(lcj);
|
|
459
|
+
B.startBlock(lcj);
|
|
460
|
+
const cv = B.tmp();
|
|
461
|
+
B.line(`${cv} = load ptr, ptr ${cidrSlot}`);
|
|
462
|
+
B.line(`store ptr ${cv}, ptr ${host.recordFieldPtr(r, t.shapeId, "cidr").ptr}`);
|
|
463
|
+
if (v6) {
|
|
464
|
+
const sc = B.tmp();
|
|
465
|
+
B.line(`${sc} = call double @scr_os_ifaddrs_scopeid(ptr ${snap}, ${host.sizeType} ${i})`);
|
|
466
|
+
host.storeField(host.recordFieldPtr(r, t.shapeId, "scopeid").ptr, F64, sc);
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
const st = shape.fields.find((f) => f.name === "scopeid")?.type;
|
|
470
|
+
if (st?.kind !== "union")
|
|
471
|
+
throw new InternalCompilerError("llvm emitter bug: networkInterfaces IPv4 scopeid type");
|
|
472
|
+
const undefTag = undefinedArmTag(st, host.unionsById);
|
|
473
|
+
const su = B.tmp();
|
|
474
|
+
B.line(`${su} = call ptr @scr_union_retain_v(ptr ${host.unitInstanceRef(st.unionId, undefTag)})`);
|
|
475
|
+
B.line(`store ptr ${su}, ptr ${host.recordFieldPtr(r, t.shapeId, "scopeid").ptr}`);
|
|
476
|
+
}
|
|
477
|
+
const rc = vAdapters(host, t);
|
|
478
|
+
const rowU = B.tmp();
|
|
479
|
+
B.line(`${rowU} = call ptr @scr_union_new_ref(i32 ${tag}, ptr ${r}, ptr ${rc.retain}, ptr ${rc.release}, ptr ${traceArg(host, t)})`);
|
|
480
|
+
B.line(`store ptr ${rowU}, ptr ${rowSlot}`);
|
|
481
|
+
B.br(lRow);
|
|
482
|
+
};
|
|
483
|
+
B.startBlock(l6);
|
|
484
|
+
emitRow(tag6, true);
|
|
485
|
+
B.startBlock(l4);
|
|
486
|
+
emitRow(tag4, false);
|
|
487
|
+
B.startBlock(lRow);
|
|
488
|
+
const row = B.tmp();
|
|
489
|
+
B.line(`${row} = load ptr, ptr ${rowSlot}`);
|
|
490
|
+
const nm = B.tmp();
|
|
491
|
+
B.line(`${nm} = call ptr @scr_os_ifaddrs_name(ptr ${snap}, ${host.sizeType} ${i}) ; +1`);
|
|
492
|
+
const cell = B.tmp();
|
|
493
|
+
B.line(`${cell} = call ptr @scr_map_get_str_ref(ptr ${ovf}, ptr ${nm})`);
|
|
494
|
+
const hasCell = B.tmp();
|
|
495
|
+
B.line(`${hasCell} = icmp ne ptr ${cell}, null`);
|
|
496
|
+
const lh = B.newLabel("ni.h");
|
|
497
|
+
const lm = B.newLabel("ni.m");
|
|
498
|
+
const lj = B.newLabel("ni.j");
|
|
499
|
+
const rowsSlot = B.slot();
|
|
500
|
+
B.entryAllocas.push(`${rowsSlot} = alloca ptr`);
|
|
501
|
+
B.condBr(hasCell, lh, lm);
|
|
502
|
+
B.startBlock(lh);
|
|
503
|
+
const peeked = host.unionPeek(cell);
|
|
504
|
+
const retained = B.tmp();
|
|
505
|
+
B.line(`${retained} = call ptr @scr_arr_retain_v(ptr ${peeked})`);
|
|
506
|
+
B.line(`store ptr ${retained}, ptr ${rowsSlot}`);
|
|
507
|
+
B.line(`call void @scr_union_release(ptr ${cell})`);
|
|
508
|
+
B.br(lj);
|
|
509
|
+
B.startBlock(lm);
|
|
510
|
+
const fresh = B.tmp();
|
|
511
|
+
B.line(`${fresh} = ${arrNewCall(host, infoT, "1")}`);
|
|
512
|
+
const arrRc = vAdapters(host, arrT);
|
|
513
|
+
const freshRet = B.tmp();
|
|
514
|
+
B.line(`${freshRet} = call ptr @scr_arr_retain_v(ptr ${fresh})`);
|
|
515
|
+
const bucketU = B.tmp();
|
|
516
|
+
B.line(`${bucketU} = call ptr @scr_union_new_ref(i32 ${arrTag}, ptr ${freshRet}, ptr ${arrRc.retain}, ptr ${arrRc.release}, ptr ${traceArg(host, arrT)})`);
|
|
517
|
+
B.line(`call void @scr_map_set_str_ref(ptr ${ovf}, ptr ${nm}, ptr ${bucketU})`);
|
|
518
|
+
B.line(`store ptr ${fresh}, ptr ${rowsSlot}`);
|
|
519
|
+
B.br(lj);
|
|
520
|
+
B.startBlock(lj);
|
|
521
|
+
const rows = B.tmp();
|
|
522
|
+
B.line(`${rows} = load ptr, ptr ${rowsSlot}`);
|
|
523
|
+
host.arrPush(rows, "ref", row); // push takes ownership of the row
|
|
524
|
+
B.line(`call void @scr_arr_release(ptr ${rows})`);
|
|
525
|
+
B.line(`call void @scr_str_release(ptr ${nm})`);
|
|
526
|
+
const i2 = B.tmp();
|
|
527
|
+
B.line(`${i2} = add ${host.sizeType} ${i}, 1`);
|
|
528
|
+
B.line(`store ${host.sizeType} ${i2}, ptr ${iSlot}`);
|
|
529
|
+
B.br(lc);
|
|
530
|
+
B.startBlock(le);
|
|
531
|
+
B.line(`call void @scr_os_ifaddrs_free(ptr ${snap})`);
|
|
532
|
+
return out;
|
|
533
|
+
}
|
|
534
|
+
return host.emitGenericLibCall(e);
|
|
535
|
+
}
|
|
536
|
+
export function emitPrimitiveLibCall(host, e) {
|
|
537
|
+
const B = host.B;
|
|
538
|
+
if (e.fn === "math.floor" || e.fn === "math.trunc" || e.fn === "math.ceil") {
|
|
539
|
+
const intr = e.fn === "math.floor" ? "floor" : e.fn === "math.trunc" ? "trunc" : "ceil";
|
|
540
|
+
const v = host.emitExpr(e.args[0]);
|
|
541
|
+
host.declare(`declare double @llvm.${intr}.f64(double)`);
|
|
542
|
+
const t = B.tmp();
|
|
543
|
+
B.line(`${t} = call double @llvm.${intr}.f64(double ${v.name})`);
|
|
544
|
+
return { name: t, type: e.type };
|
|
545
|
+
}
|
|
546
|
+
if (e.fn === "math.abs") {
|
|
547
|
+
const v = host.emitExpr(e.args[0]);
|
|
548
|
+
host.declare(`declare double @llvm.fabs.f64(double)`);
|
|
549
|
+
const t = B.tmp();
|
|
550
|
+
B.line(`${t} = call double @llvm.fabs.f64(double ${v.name})`);
|
|
551
|
+
return { name: t, type: e.type };
|
|
552
|
+
}
|
|
553
|
+
if (e.fn === "num.isNaN") {
|
|
554
|
+
const v = host.emitExpr(e.args[0]);
|
|
555
|
+
const t = B.tmp();
|
|
556
|
+
B.line(`${t} = fcmp uno double ${v.name}, ${f64Lit(0)}`);
|
|
557
|
+
return { name: t, type: e.type };
|
|
558
|
+
}
|
|
559
|
+
if (e.fn === "sym.newAnon") {
|
|
560
|
+
host.declare(`declare ptr @scr_sym_new(ptr)`);
|
|
561
|
+
const t = B.tmp();
|
|
562
|
+
B.line(`${t} = call ptr @scr_sym_new(ptr null)`);
|
|
563
|
+
return host.own({ name: t, type: e.type });
|
|
564
|
+
}
|
|
565
|
+
if (e.fn === "sym.desc" || e.fn === "sym.keyFor") {
|
|
566
|
+
// `string | undefined` — the runtime answers a +1 string or NULL;
|
|
567
|
+
// the union construction is type-directed here (envGet convention).
|
|
568
|
+
if (e.type.kind !== "union")
|
|
569
|
+
throw new InternalCompilerError(`llvm emitter bug: ${e.fn} result is not a union`);
|
|
570
|
+
const def = host.unionsById.get(e.type.unionId);
|
|
571
|
+
const strTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
|
|
572
|
+
const undefTag = undefinedArmTag(e.type, host.unionsById);
|
|
573
|
+
if (strTag < 0 || undefTag < 0)
|
|
574
|
+
throw new InternalCompilerError(`llvm emitter bug: ${e.fn} union lacks its arms`);
|
|
575
|
+
const v = host.emitExpr(e.args[0]);
|
|
576
|
+
const sym = e.fn === "sym.desc" ? "scr_sym_desc" : "scr_sym_key_for";
|
|
577
|
+
host.declare(`declare ptr @${sym}(ptr)`);
|
|
578
|
+
const raw = B.tmp();
|
|
579
|
+
B.line(`${raw} = call ptr @${sym}(ptr ${v.name})`);
|
|
580
|
+
return host.wrapNullable(raw, raw, STRING, strTag, e.type, undefTag);
|
|
581
|
+
}
|
|
582
|
+
if (e.fn === "string.fromCharCode") {
|
|
583
|
+
// One packed f64[] (the frontend built it) or one bytes value (the
|
|
584
|
+
// spread-typed-array form); +1 string.
|
|
585
|
+
const sym = e.args[0].type.kind === "bytes" ? "scr_str_from_char_code_bytes" : "scr_str_from_char_code";
|
|
586
|
+
const v = host.emitExpr(e.args[0]);
|
|
587
|
+
host.declare(`declare ptr @${sym}(ptr)`);
|
|
588
|
+
const t = B.tmp();
|
|
589
|
+
B.line(`${t} = call ptr @${sym}(ptr ${v.name})`);
|
|
590
|
+
return host.own({ name: t, type: e.type });
|
|
591
|
+
}
|
|
592
|
+
return host.emitGenericLibCall(e);
|
|
593
|
+
}
|
|
594
|
+
//# sourceMappingURL=lib-filesystem.js.map
|