xbintsc 0.5.6 → 0.5.20
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/AGENTS.md +16 -8
- package/README.md +8 -7
- package/README.zh-CN.md +6 -6
- package/dist/src/binder/declarations.js +14 -3
- package/dist/src/binder/declarations.js.map +1 -1
- package/dist/src/cli/hints.js +7 -1
- package/dist/src/cli/hints.js.map +1 -1
- package/dist/src/cli/main.js +115 -15
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/watch.d.ts +25 -0
- package/dist/src/cli/watch.js +93 -0
- package/dist/src/cli/watch.js.map +1 -0
- package/dist/src/codegen/generator/calls/access.js +11 -2
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/closures.js +12 -4
- package/dist/src/codegen/generator/calls/closures.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +8 -0
- package/dist/src/codegen/generator/context.js +22 -3
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/expressions/operators.js +17 -15
- package/dist/src/codegen/generator/expressions/operators.js.map +1 -1
- package/dist/src/codegen/generator/expressions/primary.js +5 -0
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/module.js +0 -7
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/numeric.d.ts +6 -3
- package/dist/src/codegen/generator/numeric.js +54 -11
- package/dist/src/codegen/generator/numeric.js.map +1 -1
- package/dist/src/codegen/generator/state.js +23 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.js +1 -4
- package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
- package/dist/src/codegen/generator/statements/loops.js +48 -16
- package/dist/src/codegen/generator/statements/loops.js.map +1 -1
- package/dist/src/codegen/generator/tables.js +26 -1
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/diagnostics/diagnostic.d.ts +3 -1
- package/dist/src/diagnostics/diagnostic.js +23 -3
- package/dist/src/diagnostics/diagnostic.js.map +1 -1
- package/dist/src/driver/app-artifacts.d.ts +42 -0
- package/dist/src/driver/app-artifacts.js +53 -0
- package/dist/src/driver/app-artifacts.js.map +1 -0
- package/dist/src/driver/build-key.d.ts +29 -0
- package/dist/src/driver/build-key.js +35 -0
- package/dist/src/driver/build-key.js.map +1 -0
- package/dist/src/driver/bundler/graph.js +61 -12
- package/dist/src/driver/bundler/graph.js.map +1 -1
- package/dist/src/driver/bundler/merge.js +7 -1
- package/dist/src/driver/bundler/merge.js.map +1 -1
- package/dist/src/driver/compiler.d.ts +10 -67
- package/dist/src/driver/compiler.js +94 -233
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/config.d.ts +3 -0
- package/dist/src/driver/config.js +8 -0
- package/dist/src/driver/config.js.map +1 -1
- package/dist/src/driver/frontend.d.ts +37 -0
- package/dist/src/driver/frontend.js +92 -0
- package/dist/src/driver/frontend.js.map +1 -0
- package/dist/src/driver/index.d.ts +1 -1
- package/dist/src/driver/index.js.map +1 -1
- package/dist/src/driver/options.d.ts +64 -0
- package/dist/src/driver/options.js +9 -0
- package/dist/src/driver/options.js.map +1 -0
- package/dist/src/driver/runtime-objects.d.ts +38 -0
- package/dist/src/driver/runtime-objects.js +111 -0
- package/dist/src/driver/runtime-objects.js.map +1 -0
- package/dist/src/driver/toolchain-provider.d.ts +4 -0
- package/dist/src/driver/toolchain-provider.js +4 -0
- package/dist/src/driver/toolchain-provider.js.map +1 -1
- package/dist/src/driver/toolchain.d.ts +32 -1
- package/dist/src/driver/toolchain.js +115 -11
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/driver/version.d.ts +12 -0
- package/dist/src/driver/version.js +13 -0
- package/dist/src/driver/version.js.map +1 -0
- package/dist/src/driver/win-icon.d.ts +7 -9
- package/dist/src/driver/win-icon.js +37 -35
- package/dist/src/driver/win-icon.js.map +1 -1
- package/dist/src/parser/declarations/classes.js +5 -0
- package/dist/src/parser/declarations/classes.js.map +1 -1
- package/dist/src/parser/declarations/functions.js +13 -1
- package/dist/src/parser/declarations/functions.js.map +1 -1
- package/dist/src/parser/modules.js +8 -3
- package/dist/src/parser/modules.js.map +1 -1
- package/dist/src/parser/parser.d.ts +1 -0
- package/dist/src/parser/parser.js +23 -0
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/tests/cli/check.test.d.ts +6 -0
- package/dist/tests/cli/check.test.js +68 -0
- package/dist/tests/cli/check.test.js.map +1 -0
- package/dist/tests/cli/main.test.js +19 -0
- package/dist/tests/cli/main.test.js.map +1 -1
- package/dist/tests/cli/watch.test.d.ts +6 -0
- package/dist/tests/cli/watch.test.js +72 -0
- package/dist/tests/cli/watch.test.js.map +1 -0
- package/dist/tests/codegen/expressions.test.js +15 -3
- package/dist/tests/codegen/expressions.test.js.map +1 -1
- package/dist/tests/codegen/llvm.test.js +16 -0
- package/dist/tests/codegen/llvm.test.js.map +1 -1
- package/dist/tests/diagnostics/diagnostic.test.js +8 -0
- package/dist/tests/diagnostics/diagnostic.test.js.map +1 -1
- package/dist/tests/docs/structure.test.d.ts +1 -0
- package/dist/tests/docs/structure.test.js +92 -0
- package/dist/tests/docs/structure.test.js.map +1 -0
- package/dist/tests/driver/compiler.test.js +6 -0
- package/dist/tests/driver/compiler.test.js.map +1 -1
- package/dist/tests/driver/config.test.js +9 -0
- package/dist/tests/driver/config.test.js.map +1 -1
- package/dist/tests/driver/icon.test.js +19 -32
- package/dist/tests/driver/icon.test.js.map +1 -1
- package/dist/tests/driver/invalid-input.test.d.ts +10 -0
- package/dist/tests/driver/invalid-input.test.js +29 -0
- package/dist/tests/driver/invalid-input.test.js.map +1 -0
- package/dist/tests/driver/modules.test.js +42 -3
- package/dist/tests/driver/modules.test.js.map +1 -1
- package/dist/tests/driver/toolchain-provider.test.js +27 -1
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
- package/dist/tests/driver/toolchain.test.js +60 -2
- package/dist/tests/driver/toolchain.test.js.map +1 -1
- package/dist/tests/e2e/array-buffer.test.d.ts +5 -0
- package/dist/tests/e2e/array-buffer.test.js +38 -0
- package/dist/tests/e2e/array-buffer.test.js.map +1 -0
- package/dist/tests/e2e/array-from-iterables.test.d.ts +7 -0
- package/dist/tests/e2e/array-from-iterables.test.js +34 -0
- package/dist/tests/e2e/array-from-iterables.test.js.map +1 -0
- package/dist/tests/e2e/array-symbol-iterator.test.d.ts +8 -0
- package/dist/tests/e2e/array-symbol-iterator.test.js +42 -0
- package/dist/tests/e2e/array-symbol-iterator.test.js.map +1 -0
- package/dist/tests/e2e/async-generators.test.d.ts +1 -0
- package/dist/tests/e2e/async-generators.test.js +154 -0
- package/dist/tests/e2e/async-generators.test.js.map +1 -0
- package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
- package/dist/tests/e2e/await-ordering.test.js +37 -0
- package/dist/tests/e2e/await-ordering.test.js.map +1 -0
- package/dist/tests/e2e/compile-builtins.test.js +1 -1
- package/dist/tests/e2e/compile-modules.test.js +7 -0
- package/dist/tests/e2e/compile-modules.test.js.map +1 -1
- package/dist/tests/e2e/date-parse.test.d.ts +8 -0
- package/dist/tests/e2e/date-parse.test.js +38 -0
- package/dist/tests/e2e/date-parse.test.js.map +1 -0
- package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
- package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
- package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
- package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
- package/dist/tests/e2e/globals-microtask.test.js +37 -0
- package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
- package/dist/tests/e2e/gui-media.test.js +8 -1
- package/dist/tests/e2e/gui-media.test.js.map +1 -1
- package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
- package/dist/tests/e2e/inspect-builtins.test.js +43 -0
- package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
- package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
- package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
- package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
- package/dist/tests/e2e/json-circular.test.d.ts +6 -0
- package/dist/tests/e2e/json-circular.test.js +43 -0
- package/dist/tests/e2e/json-circular.test.js.map +1 -0
- package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
- package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
- package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
- package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
- package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
- package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
- package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
- package/dist/tests/e2e/json-stringify-space.test.js +23 -0
- package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
- package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
- package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
- package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
- package/dist/tests/e2e/native-extensions.test.js +1 -1
- package/dist/tests/e2e/native-extensions.test.js.map +1 -1
- package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
- package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
- package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
- package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
- package/dist/tests/e2e/property-descriptors.test.js +25 -0
- package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
- package/dist/tests/e2e/property-ic.test.d.ts +1 -0
- package/dist/tests/e2e/property-ic.test.js +55 -0
- package/dist/tests/e2e/property-ic.test.js.map +1 -0
- package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
- package/dist/tests/e2e/runtime-errors.test.js +52 -0
- package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
- package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
- package/dist/tests/e2e/structured-clone.test.js +49 -0
- package/dist/tests/e2e/structured-clone.test.js.map +1 -0
- package/dist/tests/e2e/text-codec.test.d.ts +6 -0
- package/dist/tests/e2e/text-codec.test.js +24 -0
- package/dist/tests/e2e/text-codec.test.js.map +1 -0
- package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
- package/dist/tests/e2e/typed-array-views.test.js +39 -0
- package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
- package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
- package/dist/tests/e2e/url-search-params.test.js +30 -0
- package/dist/tests/e2e/url-search-params.test.js.map +1 -0
- package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
- package/dist/tests/e2e/weak-collections.test.js +88 -0
- package/dist/tests/e2e/weak-collections.test.js.map +1 -0
- package/dist/tests/parser/declarations.test.js +12 -0
- package/dist/tests/parser/declarations.test.js.map +1 -1
- package/dist/tests/parser/module-syntax.test.js +9 -0
- package/dist/tests/parser/module-syntax.test.js.map +1 -1
- package/dist/tests/parser/parser.test.js +7 -0
- package/dist/tests/parser/parser.test.js.map +1 -1
- package/dist/tests/version.test.js +5 -1
- package/dist/tests/version.test.js.map +1 -1
- package/doc/ai/README.md +4 -3
- package/doc/ai/cli.md +41 -0
- package/doc/ai/contributing.md +18 -15
- package/doc/ai/extensions.md +9 -7
- package/doc/ai/language-support.md +17 -13
- package/doc/ai/troubleshooting.md +11 -9
- package/doc/ai/zh-CN/README.md +3 -2
- package/doc/ai/zh-CN/cli.md +35 -0
- package/doc/ai/zh-CN/contributing.md +15 -14
- package/doc/ai/zh-CN/extensions.md +8 -6
- package/doc/ai/zh-CN/language-support.md +17 -14
- package/doc/ai/zh-CN/troubleshooting.md +9 -8
- package/doc/gui/build.md +13 -4
- package/doc/gui/known-issues.md +9 -5
- package/doc/gui/rendering.md +3 -1
- package/doc/gui.md +4 -3
- package/doc/icon.md +5 -4
- package/doc/implemented/async.md +38 -0
- package/doc/implemented/binder.md +13 -0
- package/doc/implemented/cli.md +47 -0
- package/doc/implemented/codegen.md +33 -0
- package/doc/implemented/collections.md +26 -0
- package/doc/implemented/driver.md +19 -0
- package/doc/implemented/extensions.md +19 -0
- package/doc/implemented/fetch.md +12 -0
- package/doc/implemented/lexer.md +23 -0
- package/doc/implemented/modules.md +28 -0
- package/doc/implemented/node/assert.md +17 -0
- package/doc/implemented/node/buffer.md +29 -0
- package/doc/implemented/node/child-process.md +29 -0
- package/doc/implemented/node/crypto.md +9 -0
- package/doc/implemented/node/dgram.md +15 -0
- package/doc/implemented/node/events.md +37 -0
- package/doc/implemented/node/fs-promises.md +38 -0
- package/doc/implemented/node/fs.md +112 -0
- package/doc/implemented/node/http.md +21 -0
- package/doc/implemented/node/net.md +17 -0
- package/doc/implemented/node/os.md +22 -0
- package/doc/implemented/node/path.md +33 -0
- package/doc/implemented/node/process.md +23 -0
- package/doc/implemented/node/querystring.md +20 -0
- package/doc/implemented/node/stream-promises.md +8 -0
- package/doc/implemented/node/stream.md +19 -0
- package/doc/implemented/node/test.md +10 -0
- package/doc/implemented/node/url.md +8 -0
- package/doc/implemented/node/util.md +25 -0
- package/doc/implemented/node/worker-threads.md +10 -0
- package/doc/implemented/node/zlib.md +8 -0
- package/doc/implemented/node.md +48 -0
- package/doc/implemented/operators.md +38 -0
- package/doc/implemented/parser.md +58 -0
- package/doc/implemented/pipeline.md +28 -0
- package/doc/implemented/runtime-core.md +32 -0
- package/doc/implemented/stdlib.md +78 -0
- package/doc/implemented/strings.md +27 -0
- package/doc/implemented/tests.md +10 -0
- package/doc/implemented/typed-arrays.md +26 -0
- package/doc/implemented/value-model.md +18 -0
- package/doc/implemented.md +54 -355
- package/doc/node-implemented.md +3 -585
- package/doc/node-unimplemented.md +3 -164
- package/doc/requirements.md +23 -8
- package/doc/unimplemented/classes.md +22 -0
- package/doc/unimplemented/deviations.md +27 -0
- package/doc/unimplemented/expressions.md +26 -0
- package/doc/unimplemented/functions.md +21 -0
- package/doc/unimplemented/modules.md +22 -0
- package/doc/unimplemented/node/async.md +17 -0
- package/doc/unimplemented/node/bun.md +9 -0
- package/doc/unimplemented/node/fs-promises.md +16 -0
- package/doc/unimplemented/node/fs.md +31 -0
- package/doc/unimplemented/node/globals.md +23 -0
- package/doc/unimplemented/node/modules.md +21 -0
- package/doc/unimplemented/node.md +21 -0
- package/doc/unimplemented/statements.md +18 -0
- package/doc/unimplemented/stdlib.md +54 -0
- package/doc/unimplemented/toolchain.md +14 -0
- package/doc/unimplemented/types.md +12 -0
- package/doc/unimplemented.md +18 -275
- package/doc/xbintsc.config.schema.json +12 -0
- package/doc/zh-CN/gui/build.md +11 -3
- package/doc/zh-CN/gui/known-issues.md +9 -4
- package/doc/zh-CN/gui/rendering.md +2 -1
- package/doc/zh-CN/gui.md +3 -2
- package/doc/zh-CN/icon.md +5 -4
- package/doc/zh-CN/implemented/async.md +38 -0
- package/doc/zh-CN/implemented/binder.md +13 -0
- package/doc/zh-CN/implemented/cli.md +46 -0
- package/doc/zh-CN/implemented/codegen.md +33 -0
- package/doc/zh-CN/implemented/collections.md +26 -0
- package/doc/zh-CN/implemented/driver.md +19 -0
- package/doc/zh-CN/implemented/extensions.md +19 -0
- package/doc/zh-CN/implemented/fetch.md +12 -0
- package/doc/zh-CN/implemented/lexer.md +23 -0
- package/doc/zh-CN/implemented/modules.md +28 -0
- package/doc/zh-CN/implemented/node/assert.md +17 -0
- package/doc/zh-CN/implemented/node/buffer.md +25 -0
- package/doc/zh-CN/implemented/node/child-process.md +27 -0
- package/doc/zh-CN/implemented/node/crypto.md +9 -0
- package/doc/zh-CN/implemented/node/dgram.md +15 -0
- package/doc/zh-CN/implemented/node/events.md +36 -0
- package/doc/zh-CN/implemented/node/fs-promises.md +27 -0
- package/doc/zh-CN/implemented/node/fs.md +105 -0
- package/doc/zh-CN/implemented/node/http.md +17 -0
- package/doc/zh-CN/implemented/node/net.md +17 -0
- package/doc/zh-CN/implemented/node/os.md +21 -0
- package/doc/zh-CN/implemented/node/path.md +26 -0
- package/doc/zh-CN/implemented/node/process.md +23 -0
- package/doc/zh-CN/implemented/node/querystring.md +20 -0
- package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
- package/doc/zh-CN/implemented/node/stream.md +15 -0
- package/doc/zh-CN/implemented/node/test.md +10 -0
- package/doc/zh-CN/implemented/node/url.md +8 -0
- package/doc/zh-CN/implemented/node/util.md +25 -0
- package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
- package/doc/zh-CN/implemented/node/zlib.md +8 -0
- package/doc/zh-CN/implemented/node.md +45 -0
- package/doc/zh-CN/implemented/operators.md +38 -0
- package/doc/zh-CN/implemented/parser.md +58 -0
- package/doc/zh-CN/implemented/pipeline.md +25 -0
- package/doc/zh-CN/implemented/runtime-core.md +31 -0
- package/doc/zh-CN/implemented/stdlib.md +76 -0
- package/doc/zh-CN/implemented/strings.md +27 -0
- package/doc/zh-CN/implemented/tests.md +10 -0
- package/doc/zh-CN/implemented/typed-arrays.md +26 -0
- package/doc/zh-CN/implemented/value-model.md +18 -0
- package/doc/zh-CN/implemented.md +50 -350
- package/doc/zh-CN/node-implemented.md +4 -531
- package/doc/zh-CN/node-unimplemented.md +4 -139
- package/doc/zh-CN/plan-require-node-modules.md +4 -4
- package/doc/zh-CN/requirements.md +20 -6
- package/doc/zh-CN/unimplemented/classes.md +22 -0
- package/doc/zh-CN/unimplemented/deviations.md +24 -0
- package/doc/zh-CN/unimplemented/expressions.md +24 -0
- package/doc/zh-CN/unimplemented/functions.md +21 -0
- package/doc/zh-CN/unimplemented/modules.md +19 -0
- package/doc/zh-CN/unimplemented/node/async.md +17 -0
- package/doc/zh-CN/unimplemented/node/bun.md +8 -0
- package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
- package/doc/zh-CN/unimplemented/node/fs.md +24 -0
- package/doc/zh-CN/unimplemented/node/globals.md +14 -0
- package/doc/zh-CN/unimplemented/node/modules.md +15 -0
- package/doc/zh-CN/unimplemented/node.md +18 -0
- package/doc/zh-CN/unimplemented/statements.md +15 -0
- package/doc/zh-CN/unimplemented/stdlib.md +54 -0
- package/doc/zh-CN/unimplemented/toolchain.md +14 -0
- package/doc/zh-CN/unimplemented/types.md +11 -0
- package/doc/zh-CN/unimplemented.md +14 -237
- package/llms.txt +32 -4
- package/package.json +1 -1
- package/runtime/ext_gui/renderer_shaders.h +2 -2
- package/runtime/ext_gui/stb_image.h +1 -17
- package/runtime/ext_node/child_process/child_process.c +173 -73
- package/runtime/rt.h +15 -0
- package/runtime/rt_internal.h +106 -0
- package/runtime/xt_alloc.c +43 -7
- package/runtime/xt_array_buffer.c +284 -0
- package/runtime/xt_async.c +46 -21
- package/runtime/xt_bigint/helpers.inc +3 -3
- package/runtime/xt_builtins.c +21 -17
- package/runtime/xt_constructors.c +12 -2
- package/runtime/xt_containers/access.inc +148 -3
- package/runtime/xt_containers/objects.inc +26 -2
- package/runtime/xt_containers/shapes.inc +71 -0
- package/runtime/xt_containers.c +1 -0
- package/runtime/xt_coroutine.c +17 -0
- package/runtime/xt_generator.c +299 -10
- package/runtime/xt_io/inspect.inc +112 -0
- package/runtime/xt_loop.c +35 -4
- package/runtime/xt_performance.c +37 -0
- package/runtime/xt_promise.c +63 -1
- package/runtime/xt_stdlib/arrays.inc +1 -1
- package/runtime/xt_stdlib/dispatch.inc +46 -11
- package/runtime/xt_stdlib/strings.inc +1 -1
- package/runtime/xt_stdlib2/array-statics.inc +25 -0
- package/runtime/xt_stdlib2/arrays.inc +5 -3
- package/runtime/xt_stdlib2/container.inc +5 -0
- package/runtime/xt_stdlib2/date.inc +111 -3
- package/runtime/xt_stdlib2/error.inc +24 -0
- package/runtime/xt_stdlib2/json.inc +310 -19
- package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
- package/runtime/xt_stdlib2/objects.inc +122 -0
- package/runtime/xt_stdlib2/set.inc +1 -1
- package/runtime/xt_structured_clone.c +159 -0
- package/runtime/xt_symbol.c +2 -2
- package/runtime/xt_text_codec.c +69 -0
- package/runtime/xt_typed_array/construction.inc +35 -5
- package/runtime/xt_typed_array/elements.inc +159 -0
- package/runtime/xt_typed_array/methods.inc +21 -5
- package/runtime/xt_typed_array.c +7 -10
- package/runtime/xt_url.c +375 -0
- package/runtime/xt_values/arithmetic.inc +2 -2
- package/runtime/xt_values/conversions.inc +1 -1
- package/runtime/xt_weak.c +281 -0
- package/scripts/build-gui.ts +133 -60
- package/scripts/check-version.ts +3 -3
- package/src/binder/declarations.ts +14 -3
- package/src/cli/hints.ts +8 -1
- package/src/cli/main.ts +119 -18
- package/src/cli/watch.ts +101 -0
- package/src/codegen/generator/calls/access.ts +10 -2
- package/src/codegen/generator/calls/closures.ts +12 -4
- package/src/codegen/generator/context.ts +23 -3
- package/src/codegen/generator/expressions/operators.ts +27 -13
- package/src/codegen/generator/expressions/primary.ts +4 -0
- package/src/codegen/generator/module.ts +0 -7
- package/src/codegen/generator/numeric.ts +85 -11
- package/src/codegen/generator/state.ts +23 -0
- package/src/codegen/generator/statements/control-flow.ts +1 -4
- package/src/codegen/generator/statements/loops.ts +50 -16
- package/src/codegen/generator/tables.ts +26 -1
- package/src/diagnostics/diagnostic.ts +23 -3
- package/src/driver/app-artifacts.ts +77 -0
- package/src/driver/build-key.ts +55 -0
- package/src/driver/bundler/graph.ts +63 -13
- package/src/driver/bundler/merge.ts +4 -1
- package/src/driver/compiler.ts +93 -327
- package/src/driver/config.ts +11 -0
- package/src/driver/frontend.ts +120 -0
- package/src/driver/index.ts +0 -1
- package/src/driver/options.ts +70 -0
- package/src/driver/runtime-objects.ts +133 -0
- package/src/driver/toolchain-provider.ts +4 -0
- package/src/driver/toolchain.ts +154 -10
- package/src/driver/version.ts +12 -0
- package/src/driver/win-icon.ts +36 -36
- package/src/parser/declarations/classes.ts +4 -0
- package/src/parser/declarations/functions.ts +12 -1
- package/src/parser/modules.ts +8 -4
- package/src/parser/parser.ts +28 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xbintsc runtime — ArrayBuffer and DataView.
|
|
3
|
+
*
|
|
4
|
+
* An ArrayBuffer is a plain object holding its bytes as an array of numbers
|
|
5
|
+
* under a private symbol, plus a public `byteLength`. A DataView is another
|
|
6
|
+
* plain object that points at the buffer and exposes the get/set accessors;
|
|
7
|
+
* every accessor assembles the bytes explicitly, so the default big-endian
|
|
8
|
+
* order and the optional `littleEndian` argument follow ECMAScript.
|
|
9
|
+
*
|
|
10
|
+
* Keeping both as ordinary objects means the garbage collector, property
|
|
11
|
+
* lookup and the rest of the runtime need no new object kind. Typed arrays
|
|
12
|
+
* are buffer-backed views over this object and share its bytes; `new
|
|
13
|
+
* Uint8Array(buffer, offset, length)`, `.buffer` and `subarray` are handled by
|
|
14
|
+
* xt_typed_array.c.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include "rt_internal.h"
|
|
18
|
+
|
|
19
|
+
#include <math.h>
|
|
20
|
+
#include <stdlib.h>
|
|
21
|
+
#include <string.h>
|
|
22
|
+
|
|
23
|
+
static xt_value xt_ab_data_key_value = XT_UNDEFINED;
|
|
24
|
+
|
|
25
|
+
static xt_value xt_ab_data_key(void) {
|
|
26
|
+
/* A symbol key keeps the backing bytes out of Object.keys / JSON.stringify,
|
|
27
|
+
* like the platform's internal [[ArrayBufferData]] slot. */
|
|
28
|
+
if (!xt_is_symbol(xt_ab_data_key_value)) {
|
|
29
|
+
xt_ab_data_key_value = xt_symbol_new(xt_string_from_cstr("__arrayBufferData"));
|
|
30
|
+
xt_gc_add_root(&xt_ab_data_key_value);
|
|
31
|
+
}
|
|
32
|
+
return xt_ab_data_key_value;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static xt_value xt_ab_data(xt_value buffer) { if (!XT_IS_OBJECT(buffer)) return XT_UNDEFINED;
|
|
36
|
+
return xt_object_get(buffer, xt_ab_data_key());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static int xt_ab_is_buffer(xt_value value) {
|
|
40
|
+
return XT_IS_ARRAY(xt_ab_data(value));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static xt_value xt_ab_new(uint32_t length) {
|
|
44
|
+
xt_value buffer = xt_object_new();
|
|
45
|
+
xt_object_set(buffer, xt_string_from_cstr("byteLength"), xt_number((double)length));
|
|
46
|
+
xt_value data = xt_array_new(0, NULL);
|
|
47
|
+
for (uint32_t i = 0; i < length; i++) xt_array_push(data, xt_number(0));
|
|
48
|
+
xt_object_set(buffer, xt_ab_data_key(), data);
|
|
49
|
+
return buffer;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static xt_value xt_ab_slice(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv);
|
|
53
|
+
static void xt_ab_install(xt_value object, const char *name, void *fn);
|
|
54
|
+
|
|
55
|
+
xt_value xt_array_buffer_ctor(int32_t argc, xt_value *argv) {
|
|
56
|
+
double length = xt_to_number(xt_arg_at(argc, argv, 0));
|
|
57
|
+
if (!(length >= 0) || length > 4294967295.0) length = 0;
|
|
58
|
+
xt_value buffer = xt_ab_new((uint32_t)length);
|
|
59
|
+
xt_ab_install(buffer, "slice", (void *)xt_ab_slice);
|
|
60
|
+
return buffer;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
int xt_is_array_buffer(xt_value value) { return xt_ab_is_buffer(value); }
|
|
64
|
+
|
|
65
|
+
uint32_t xt_array_buffer_byte_length(xt_value value) {
|
|
66
|
+
if (!xt_ab_is_buffer(value)) return 0;
|
|
67
|
+
return (uint32_t)xt_to_number(xt_get(value, xt_string_from_cstr("byteLength")));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
uint8_t xt_array_buffer_get_byte(xt_value buffer, uint32_t index) {
|
|
71
|
+
xt_value data = xt_ab_data(buffer);
|
|
72
|
+
if (!XT_IS_ARRAY(data)) return 0;
|
|
73
|
+
return (uint8_t)xt_to_int32(xt_get(data, xt_number((double)index)));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void xt_array_buffer_set_byte(xt_value buffer, uint32_t index, uint8_t value) {
|
|
77
|
+
xt_value data = xt_ab_data(buffer);
|
|
78
|
+
if (!XT_IS_ARRAY(data)) return;
|
|
79
|
+
xt_set(data, xt_number((double)index), xt_number((double)value));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static xt_value xt_ab_slice(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
83
|
+
(void)env;
|
|
84
|
+
xt_value data = xt_ab_data(thisValue);
|
|
85
|
+
if (!XT_IS_ARRAY(data)) return xt_ab_new(0);
|
|
86
|
+
int32_t length = xt_to_int32(xt_array_length(data));
|
|
87
|
+
int32_t start = argc > 0 && argv[0] != XT_UNDEFINED ? xt_to_int32(argv[0]) : 0;
|
|
88
|
+
int32_t end = argc > 1 && argv[1] != XT_UNDEFINED ? xt_to_int32(argv[1]) : length;
|
|
89
|
+
if (start < 0) start += length;
|
|
90
|
+
if (end < 0) end += length;
|
|
91
|
+
if (start < 0) start = 0;
|
|
92
|
+
if (end > length) end = length;
|
|
93
|
+
if (end < start) end = start;
|
|
94
|
+
xt_value result = xt_ab_new(0);
|
|
95
|
+
xt_ab_install(result, "slice", (void *)xt_ab_slice);
|
|
96
|
+
xt_value source = xt_ab_data(result);
|
|
97
|
+
for (int32_t i = start; i < end; i++) xt_array_push(source, xt_get(data, xt_number((double)i)));
|
|
98
|
+
xt_object_set(result, xt_string_from_cstr("byteLength"), xt_number((double)(end - start)));
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
static void xt_ab_install(xt_value object, const char *name, void *fn) {
|
|
103
|
+
xt_object_set(object, xt_string_from_cstr(name), xt_closure_new(fn, 0, NULL));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
xt_value xt_array_buffer_static(xt_value name, int32_t argc, xt_value *argv) {
|
|
107
|
+
const char *method = xt_string_data(name);
|
|
108
|
+
if (!method) return XT_UNDEFINED;
|
|
109
|
+
if (strcmp(method, "isView") == 0) {
|
|
110
|
+
xt_value value = xt_arg_at(argc, argv, 0);
|
|
111
|
+
if (xt_typed_array_kind_of(value) >= 0) return XT_TRUE;
|
|
112
|
+
if (!XT_IS_OBJECT(value)) return XT_FALSE;
|
|
113
|
+
if (((xt_object *)XT_GET_PTR(value))->header.kind != XT_OBJECT_KIND_OBJECT) return XT_FALSE;
|
|
114
|
+
xt_value buffer = xt_object_get(value, xt_string_from_cstr("buffer"));
|
|
115
|
+
return xt_bool(xt_ab_is_buffer(buffer) &&
|
|
116
|
+
xt_object_get(value, xt_string_from_cstr("byteLength")) != XT_UNDEFINED);
|
|
117
|
+
}
|
|
118
|
+
return XT_UNDEFINED;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* -- DataView ------------------------------------------------------------- */
|
|
122
|
+
|
|
123
|
+
enum {
|
|
124
|
+
XT_DV_U8,
|
|
125
|
+
XT_DV_I8,
|
|
126
|
+
XT_DV_U16,
|
|
127
|
+
XT_DV_I16,
|
|
128
|
+
XT_DV_U32,
|
|
129
|
+
XT_DV_I32,
|
|
130
|
+
XT_DV_F32,
|
|
131
|
+
XT_DV_F64,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
static uint32_t xt_dv_width(int kind) {
|
|
135
|
+
switch (kind) {
|
|
136
|
+
case XT_DV_U8:
|
|
137
|
+
case XT_DV_I8:
|
|
138
|
+
return 1;
|
|
139
|
+
case XT_DV_U16:
|
|
140
|
+
case XT_DV_I16:
|
|
141
|
+
return 2;
|
|
142
|
+
case XT_DV_U32:
|
|
143
|
+
case XT_DV_I32:
|
|
144
|
+
case XT_DV_F32:
|
|
145
|
+
return 4;
|
|
146
|
+
default:
|
|
147
|
+
return 8;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
static int xt_dv_signed(int kind) {
|
|
152
|
+
return kind == XT_DV_I8 || kind == XT_DV_I16 || kind == XT_DV_I32;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static xt_value xt_dv_data(xt_value view) {
|
|
156
|
+
return xt_ab_data(xt_get(view, xt_string_from_cstr("buffer")));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
static uint32_t xt_dv_offset(xt_value view) {
|
|
160
|
+
return (uint32_t)xt_to_number(xt_get(view, xt_string_from_cstr("byteOffset")));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static uint32_t xt_dv_length(xt_value view) {
|
|
164
|
+
return (uint32_t)xt_to_number(xt_get(view, xt_string_from_cstr("byteLength")));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static int xt_dv_check(xt_value view, xt_value indexValue, uint32_t width, uint32_t *out) {
|
|
168
|
+
double raw = xt_to_number(indexValue);
|
|
169
|
+
if (!(raw >= 0)) raw = -1;
|
|
170
|
+
int64_t index = (int64_t)raw;
|
|
171
|
+
if (index < 0 || (uint64_t)index + width > xt_dv_length(view)) {
|
|
172
|
+
xt_value message = xt_string_from_cstr("Offset is outside the bounds of the DataView");
|
|
173
|
+
xt_throw(xt_range_error_ctor(1, &message));
|
|
174
|
+
}
|
|
175
|
+
*out = xt_dv_offset(view) + (uint32_t)index;
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static uint64_t xt_dv_read_bits(xt_value view, uint32_t offset, uint32_t width, int little) {
|
|
180
|
+
xt_value data = xt_dv_data(view);
|
|
181
|
+
uint64_t value = 0;
|
|
182
|
+
for (uint32_t i = 0; i < width; i++) {
|
|
183
|
+
uint32_t index = little ? offset + width - 1 - i : offset + i;
|
|
184
|
+
uint64_t byte = (uint64_t)xt_to_number(xt_get(data, xt_number((double)index)));
|
|
185
|
+
value = (value << 8) | (byte & 0xff);
|
|
186
|
+
}
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static void xt_dv_write_bits(xt_value view, uint32_t offset, uint32_t width, uint64_t value,
|
|
191
|
+
int little) {
|
|
192
|
+
xt_value data = xt_dv_data(view);
|
|
193
|
+
for (uint32_t i = 0; i < width; i++) {
|
|
194
|
+
uint32_t shift = little ? i * 8 : (width - 1 - i) * 8;
|
|
195
|
+
uint32_t index = offset + i;
|
|
196
|
+
xt_set(data, xt_number((double)index), xt_number((double)((value >> shift) & 0xff)));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
static xt_value xt_dv_method(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
201
|
+
int kind = (int)xt_to_number(xt_closure_env(env, 0));
|
|
202
|
+
int setter = (int)xt_to_number(xt_closure_env(env, 1));
|
|
203
|
+
uint32_t width = xt_dv_width(kind);
|
|
204
|
+
uint32_t offset = 0;
|
|
205
|
+
xt_dv_check(thisValue, xt_arg_at(argc, argv, 0), width, &offset);
|
|
206
|
+
int little = argc > (setter ? 2 : 1) && xt_truthy(xt_arg_at(argc, argv, setter ? 2 : 1));
|
|
207
|
+
if (setter) {
|
|
208
|
+
double value = xt_to_number(xt_arg_at(argc, argv, 1));
|
|
209
|
+
uint64_t bits;
|
|
210
|
+
if (kind == XT_DV_F32) {
|
|
211
|
+
float narrowed = (float)value;
|
|
212
|
+
uint32_t raw;
|
|
213
|
+
memcpy(&raw, &narrowed, sizeof(raw));
|
|
214
|
+
bits = raw;
|
|
215
|
+
} else if (kind == XT_DV_F64) {
|
|
216
|
+
double raw = value;
|
|
217
|
+
memcpy(&bits, &raw, sizeof(bits));
|
|
218
|
+
} else if (kind == XT_DV_I8) {
|
|
219
|
+
bits = (uint64_t)(uint8_t)(int8_t)xt_to_int32(xt_number(value));
|
|
220
|
+
} else if (kind == XT_DV_I16) {
|
|
221
|
+
bits = (uint64_t)(uint16_t)(int16_t)xt_to_int32(xt_number(value));
|
|
222
|
+
} else if (kind == XT_DV_I32) {
|
|
223
|
+
bits = (uint64_t)(uint32_t)(int32_t)xt_to_int32(xt_number(value));
|
|
224
|
+
} else {
|
|
225
|
+
bits = (uint64_t)(uint32_t)xt_to_int32(xt_number(value));
|
|
226
|
+
}
|
|
227
|
+
xt_dv_write_bits(thisValue, offset, width, bits, little);
|
|
228
|
+
return XT_UNDEFINED;
|
|
229
|
+
}
|
|
230
|
+
uint64_t bits = xt_dv_read_bits(thisValue, offset, width, little);
|
|
231
|
+
if (kind == XT_DV_F32) {
|
|
232
|
+
uint32_t raw = (uint32_t)bits;
|
|
233
|
+
float value;
|
|
234
|
+
memcpy(&value, &raw, sizeof(value));
|
|
235
|
+
return xt_number((double)value);
|
|
236
|
+
}
|
|
237
|
+
if (kind == XT_DV_F64) {
|
|
238
|
+
double value;
|
|
239
|
+
memcpy(&value, &bits, sizeof(value));
|
|
240
|
+
return xt_number(value);
|
|
241
|
+
}
|
|
242
|
+
if (xt_dv_signed(kind)) {
|
|
243
|
+
int64_t signedValue = (int64_t)bits;
|
|
244
|
+
if (width < 8) {
|
|
245
|
+
uint64_t signBit = 1ULL << (width * 8 - 1);
|
|
246
|
+
if (bits & signBit) signedValue = (int64_t)(bits | (~0ULL << (width * 8)));
|
|
247
|
+
}
|
|
248
|
+
return xt_number((double)signedValue);
|
|
249
|
+
}
|
|
250
|
+
return xt_number((double)bits);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
xt_value xt_data_view_ctor(int32_t argc, xt_value *argv) {
|
|
254
|
+
xt_value buffer = xt_arg_at(argc, argv, 0);
|
|
255
|
+
if (!xt_ab_is_buffer(buffer)) {
|
|
256
|
+
xt_value message = xt_string_from_cstr("First argument to DataView constructor must be an ArrayBuffer");
|
|
257
|
+
xt_throw(xt_type_error_ctor(1, &message));
|
|
258
|
+
}
|
|
259
|
+
uint32_t bufferLength = (uint32_t)xt_to_number(xt_get(buffer, xt_string_from_cstr("byteLength")));
|
|
260
|
+
double rawOffset = argc > 1 ? xt_to_number(argv[1]) : 0;
|
|
261
|
+
uint32_t offset = rawOffset > 0 ? (uint32_t)rawOffset : 0;
|
|
262
|
+
double rawLength = argc > 2 && argv[2] != XT_UNDEFINED ? xt_to_number(argv[2]) : (double)(bufferLength - offset);
|
|
263
|
+
uint32_t length = rawLength > 0 ? (uint32_t)rawLength : 0;
|
|
264
|
+
if (offset > bufferLength || length > bufferLength - offset) {
|
|
265
|
+
xt_value message = xt_string_from_cstr("Invalid DataView length");
|
|
266
|
+
xt_throw(xt_range_error_ctor(1, &message));
|
|
267
|
+
}
|
|
268
|
+
xt_value view = xt_object_new();
|
|
269
|
+
xt_object_set(view, xt_string_from_cstr("buffer"), buffer);
|
|
270
|
+
xt_object_set(view, xt_string_from_cstr("byteOffset"), xt_number((double)offset));
|
|
271
|
+
xt_object_set(view, xt_string_from_cstr("byteLength"), xt_number((double)length));
|
|
272
|
+
static const char *const getters[] = {"getUint8", "getInt8", "getUint16", "getInt16",
|
|
273
|
+
"getUint32", "getInt32", "getFloat32", "getFloat64"};
|
|
274
|
+
static const char *const setters[] = {"setUint8", "setInt8", "setUint16", "setInt16",
|
|
275
|
+
"setUint32", "setInt32", "setFloat32", "setFloat64"};
|
|
276
|
+
for (int kind = 0; kind < 8; kind++) {
|
|
277
|
+
for (int isSetter = 0; isSetter < 2; isSetter++) {
|
|
278
|
+
xt_value environment[2] = {xt_number((double)kind), xt_number((double)isSetter)};
|
|
279
|
+
xt_value closure = xt_closure_new((void *)xt_dv_method, 2, environment);
|
|
280
|
+
xt_object_set(view, xt_string_from_cstr(isSetter ? setters[kind] : getters[kind]), closure);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return view;
|
|
284
|
+
}
|
package/runtime/xt_async.c
CHANGED
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
* a real C stack, `try`/`finally`, loops and locals all survive the suspension
|
|
12
12
|
* without a state-machine transform.
|
|
13
13
|
*
|
|
14
|
-
* `await`
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* `await` always yields: even a non-promise or an already-settled promise
|
|
15
|
+
* queues a microtask before the body resumes, matching the specification's
|
|
16
|
+
* interleaving with pending `.then` callbacks. (Top-level `await`, with no
|
|
17
|
+
* coroutine to suspend, still blocks on the event loop.)
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
#include "rt_internal.h"
|
|
@@ -103,32 +103,50 @@ xt_value xt_async_call(xt_value function, xt_value thisValue, int32_t argc, xt_v
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
void xt_async_wake(void *asyncPointer, xt_value value, int rejected) {
|
|
106
|
+
if (!asyncPointer) return;
|
|
107
|
+
/* Async generators park the same kind of waiter, but their completion sends
|
|
108
|
+
* a promise to the current `.next()` request instead of settling a single
|
|
109
|
+
* `async` promise. */
|
|
110
|
+
if (((xt_header *)asyncPointer)->kind == XT_OBJECT_KIND_GENERATOR) {
|
|
111
|
+
xt_generator_wake(asyncPointer, value, rejected);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
106
114
|
xt_async *async = (xt_async *)asyncPointer;
|
|
107
|
-
if (
|
|
115
|
+
if (async->done || !async->coroutine) return;
|
|
108
116
|
async->resume_value = value;
|
|
109
117
|
async->await_threw = rejected;
|
|
110
118
|
xt_async_resume(async);
|
|
111
119
|
}
|
|
112
120
|
|
|
113
|
-
/* `await value`:
|
|
114
|
-
*
|
|
121
|
+
/* `await value`: every await yields once. A settled promise (or a plain value)
|
|
122
|
+
* queues a microtask before resuming, so an await always interleaves with
|
|
123
|
+
* pending `.then` callbacks exactly like the specification. */
|
|
115
124
|
xt_value xt_await(xt_value value) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return XT_UNDEFINED;
|
|
121
|
-
}
|
|
122
|
-
if (state == XT_PROMISE_FULFILLED) return xt_promise_value_of(value);
|
|
125
|
+
/* An `await` inside an async generator suspends that generator's coroutine
|
|
126
|
+
* while leaving the current `.next()` promise pending. */
|
|
127
|
+
xt_value generatorResult;
|
|
128
|
+
if (xt_generator_await(value, &generatorResult)) return generatorResult;
|
|
123
129
|
|
|
130
|
+
int state = xt_promise_state_of(value);
|
|
124
131
|
xt_async *async = g_active_async;
|
|
125
|
-
if (async && async->coroutine) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
+
if (async && async->coroutine && xt_coroutine_is_current(async->coroutine)) {
|
|
133
|
+
if (state == XT_PROMISE_PENDING) {
|
|
134
|
+
async->await_threw = 0;
|
|
135
|
+
async->resume_value = XT_UNDEFINED;
|
|
136
|
+
xt_promise_add_async_waiter(value, async);
|
|
137
|
+
xt_coroutine_leave(async->coroutine);
|
|
138
|
+
} else {
|
|
139
|
+
int rejected = state == XT_PROMISE_REJECTED;
|
|
140
|
+
xt_value settled = (state == XT_PROMISE_FULFILLED || rejected)
|
|
141
|
+
? xt_promise_value_of(value)
|
|
142
|
+
: value;
|
|
143
|
+
async->await_threw = rejected;
|
|
144
|
+
async->resume_value = settled;
|
|
145
|
+
xt_promise_queue_async_wake(async, settled, rejected);
|
|
146
|
+
xt_coroutine_leave(async->coroutine);
|
|
147
|
+
}
|
|
148
|
+
/* The waiter/queued microtask resumed us. A rejection is rethrown inside
|
|
149
|
+
* the coroutine so its own `try`/`catch` and `finally` see it. */
|
|
132
150
|
if (async->await_threw) {
|
|
133
151
|
async->await_threw = 0;
|
|
134
152
|
xt_throw(async->resume_value);
|
|
@@ -137,6 +155,13 @@ xt_value xt_await(xt_value value) {
|
|
|
137
155
|
return async->resume_value;
|
|
138
156
|
}
|
|
139
157
|
|
|
158
|
+
if (state < 0) return value;
|
|
159
|
+
if (state == XT_PROMISE_REJECTED) {
|
|
160
|
+
xt_throw(xt_promise_value_of(value));
|
|
161
|
+
return XT_UNDEFINED;
|
|
162
|
+
}
|
|
163
|
+
if (state == XT_PROMISE_FULFILLED) return xt_promise_value_of(value);
|
|
164
|
+
|
|
140
165
|
/* No coroutine to suspend (top-level `await`, or `await` reached outside an
|
|
141
166
|
* async function): block on the reactor until the promise settles, exactly
|
|
142
167
|
* like a synchronous embedder waiting for the event loop. The loop returns
|
|
@@ -54,7 +54,7 @@ static void bi_throw_type(const char *message) {
|
|
|
54
54
|
size_t len = strlen(message);
|
|
55
55
|
char *buffer = (char *)malloc(len + 16);
|
|
56
56
|
snprintf(buffer, len + 16, "TypeError: %s", message);
|
|
57
|
-
xt_throw(
|
|
57
|
+
xt_throw(xt_error_from_message(buffer));
|
|
58
58
|
free(buffer);
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -62,7 +62,7 @@ static void bi_throw_range(const char *message) {
|
|
|
62
62
|
size_t len = strlen(message);
|
|
63
63
|
char *buffer = (char *)malloc(len + 16);
|
|
64
64
|
snprintf(buffer, len + 16, "RangeError: %s", message);
|
|
65
|
-
xt_throw(
|
|
65
|
+
xt_throw(xt_error_from_message(buffer));
|
|
66
66
|
free(buffer);
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -70,7 +70,7 @@ static void bi_throw_syntax(const char *message) {
|
|
|
70
70
|
size_t len = strlen(message);
|
|
71
71
|
char *buffer = (char *)malloc(len + 16);
|
|
72
72
|
snprintf(buffer, len + 16, "SyntaxError: %s", message);
|
|
73
|
-
xt_throw(
|
|
73
|
+
xt_throw(xt_error_from_message(buffer));
|
|
74
74
|
free(buffer);
|
|
75
75
|
}
|
|
76
76
|
|
package/runtime/xt_builtins.c
CHANGED
|
@@ -87,7 +87,7 @@ static void xt_object_rest_copy(xt_value target, xt_value key, xt_value value, i
|
|
|
87
87
|
*/
|
|
88
88
|
xt_value xt_object_rest(xt_value source, int32_t argc, xt_value *argv) {
|
|
89
89
|
if (source == XT_UNDEFINED || source == XT_NULL) {
|
|
90
|
-
xt_throw(
|
|
90
|
+
xt_throw(xt_error_from_message("TypeError: Cannot destructure null or undefined"));
|
|
91
91
|
return XT_UNDEFINED;
|
|
92
92
|
}
|
|
93
93
|
xt_value result = xt_object_new();
|
|
@@ -201,7 +201,7 @@ xt_value xt_is_finite(int32_t argc, xt_value *argv) {
|
|
|
201
201
|
static _Noreturn void xt_throw_uri_error(const char *message) {
|
|
202
202
|
char buffer[96];
|
|
203
203
|
snprintf(buffer, sizeof(buffer), "URIError: %s", message);
|
|
204
|
-
xt_throw(
|
|
204
|
+
xt_throw(xt_error_from_message(buffer));
|
|
205
205
|
abort();
|
|
206
206
|
}
|
|
207
207
|
|
|
@@ -378,6 +378,10 @@ XT_BUILTIN_TRAMPOLINE(xt_builtin_value_setTimeout, xt_set_timeout)
|
|
|
378
378
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_clearTimeout, xt_clear_timeout)
|
|
379
379
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_setInterval, xt_set_interval)
|
|
380
380
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_clearInterval, xt_clear_interval)
|
|
381
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_setImmediate, xt_set_immediate)
|
|
382
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_clearImmediate, xt_clear_immediate)
|
|
383
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_queueMicrotask, xt_queue_microtask)
|
|
384
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_structuredClone, xt_structured_clone)
|
|
381
385
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_fetch, xt_fetch)
|
|
382
386
|
|
|
383
387
|
xt_value xt_in(xt_value key, xt_value value) {
|
|
@@ -410,6 +414,7 @@ xt_value xt_delete(xt_value value, xt_value key) {
|
|
|
410
414
|
if (xt_property_key_equals(obj->properties[i].key, k)) {
|
|
411
415
|
for (uint32_t j = i + 1; j < obj->count; j++) obj->properties[j - 1] = obj->properties[j];
|
|
412
416
|
obj->count--;
|
|
417
|
+
xt_object_shape_changed(obj);
|
|
413
418
|
break;
|
|
414
419
|
}
|
|
415
420
|
}
|
|
@@ -448,8 +453,7 @@ xt_value xt_closure_new(void *fn, int32_t env_count, xt_value *env) {
|
|
|
448
453
|
function->properties = NULL;
|
|
449
454
|
function->environment = NULL;
|
|
450
455
|
function->prototype = XT_UNDEFINED;
|
|
451
|
-
function->is_generator = 0;
|
|
452
|
-
function->is_async = 0;
|
|
456
|
+
function->is_generator = function->is_async = function->is_async_generator = 0;
|
|
453
457
|
function->builtin_name = NULL;
|
|
454
458
|
if (env_count > 0) {
|
|
455
459
|
function->environment = (xt_value *)malloc(sizeof(xt_value) * (size_t)env_count);
|
|
@@ -464,12 +468,13 @@ xt_value xt_closure_call(xt_value value, int32_t argc, xt_value *argv) {
|
|
|
464
468
|
|
|
465
469
|
xt_value xt_call_with_this(xt_value value, xt_value thisValue, int32_t argc, xt_value *argv) {
|
|
466
470
|
if (!XT_IS_FUNCTION(value)) {
|
|
467
|
-
xt_throw(
|
|
471
|
+
xt_throw(xt_error_from_message("TypeError: value is not a function"));
|
|
468
472
|
return XT_UNDEFINED;
|
|
469
473
|
}
|
|
470
474
|
xt_function *function = (xt_function *)XT_GET_PTR(value);
|
|
471
475
|
/* Calling a generator function returns a suspended generator instead of
|
|
472
|
-
* running the body.
|
|
476
|
+
* running the body. `async function*` is a generator whose `.next()` returns
|
|
477
|
+
* promises; `xt_generator_new` reads the marker from the closure. */
|
|
473
478
|
if (function->is_generator) return xt_generator_new(value, thisValue, argc, argv);
|
|
474
479
|
/* An `async` function runs its body on a coroutine and returns a promise,
|
|
475
480
|
* which may already be settled or may resolve after an event-loop turn. */
|
|
@@ -493,7 +498,7 @@ xt_value xt_function_get_prototype(xt_value value) {
|
|
|
493
498
|
|
|
494
499
|
xt_value xt_new(xt_value ctor, int32_t argc, xt_value *argv) {
|
|
495
500
|
if (!XT_IS_FUNCTION(ctor)) {
|
|
496
|
-
xt_throw(
|
|
501
|
+
xt_throw(xt_error_from_message("TypeError: constructor is not a function"));
|
|
497
502
|
return XT_UNDEFINED;
|
|
498
503
|
}
|
|
499
504
|
xt_function *function = (xt_function *)XT_GET_PTR(ctor);
|
|
@@ -538,6 +543,7 @@ enum {
|
|
|
538
543
|
XT_INSTANCE_DATE = 5,
|
|
539
544
|
XT_INSTANCE_REGEXP = 6,
|
|
540
545
|
XT_INSTANCE_PROMISE = 7,
|
|
546
|
+
XT_INSTANCE_WEAK_MAP = 8, XT_INSTANCE_WEAK_SET = 9, XT_INSTANCE_WEAK_REF = 10,
|
|
541
547
|
XT_INSTANCE_TYPED_ARRAY_FIRST = 16,
|
|
542
548
|
XT_INSTANCE_TYPED_ARRAY_LAST = 24
|
|
543
549
|
};
|
|
@@ -554,16 +560,14 @@ xt_value xt_instance_of_builtin(xt_value value, int32_t id) {
|
|
|
554
560
|
return xt_bool(XT_IS_OBJECT(value) || XT_IS_ARRAY(value) || XT_IS_FUNCTION(value));
|
|
555
561
|
case XT_INSTANCE_FUNCTION:
|
|
556
562
|
return xt_bool(XT_IS_FUNCTION(value));
|
|
557
|
-
case XT_INSTANCE_MAP:
|
|
558
|
-
|
|
559
|
-
case
|
|
560
|
-
|
|
561
|
-
case
|
|
562
|
-
|
|
563
|
-
case XT_INSTANCE_REGEXP:
|
|
564
|
-
|
|
565
|
-
case XT_INSTANCE_PROMISE:
|
|
566
|
-
return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_PROMISE));
|
|
563
|
+
case XT_INSTANCE_MAP: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_MAP));
|
|
564
|
+
case XT_INSTANCE_SET: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_SET));
|
|
565
|
+
case XT_INSTANCE_WEAK_MAP: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_WEAK_MAP));
|
|
566
|
+
case XT_INSTANCE_WEAK_SET: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_WEAK_SET));
|
|
567
|
+
case XT_INSTANCE_WEAK_REF: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_WEAK_REF));
|
|
568
|
+
case XT_INSTANCE_DATE: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_DATE));
|
|
569
|
+
case XT_INSTANCE_REGEXP: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_REGEXP));
|
|
570
|
+
case XT_INSTANCE_PROMISE: return xt_bool(xt_value_has_kind(value, XT_OBJECT_KIND_PROMISE));
|
|
567
571
|
default:
|
|
568
572
|
if (id >= XT_INSTANCE_TYPED_ARRAY_FIRST && id <= XT_INSTANCE_TYPED_ARRAY_LAST) {
|
|
569
573
|
return xt_bool(xt_typed_array_kind_of(value) == id - XT_INSTANCE_TYPED_ARRAY_FIRST);
|
|
@@ -45,6 +45,9 @@ typedef struct {
|
|
|
45
45
|
X(Function, 1, XT_PROTO_FUNCTION) \
|
|
46
46
|
X(Map, 0, XT_PROTO_PLAIN) \
|
|
47
47
|
X(Set, 0, XT_PROTO_PLAIN) \
|
|
48
|
+
X(WeakMap, 0, XT_PROTO_PLAIN) \
|
|
49
|
+
X(WeakSet, 0, XT_PROTO_PLAIN) \
|
|
50
|
+
X(WeakRef, 1, XT_PROTO_PLAIN) \
|
|
48
51
|
X(Date, 7, XT_PROTO_PLAIN) \
|
|
49
52
|
X(RegExp, 2, XT_PROTO_PLAIN) \
|
|
50
53
|
X(Promise, 1, XT_PROTO_PLAIN) \
|
|
@@ -126,7 +129,7 @@ xt_value xt_array_ctor(int32_t argc, xt_value *argv) {
|
|
|
126
129
|
if (argc == 1 && XT_IS_NUMBER(argv[0])) {
|
|
127
130
|
double length = xt_to_number(argv[0]);
|
|
128
131
|
if (!(length >= 0) || floor(length) != length || length > 4294967295.0) {
|
|
129
|
-
xt_throw(
|
|
132
|
+
xt_throw(xt_error_from_message("RangeError: Invalid array length"));
|
|
130
133
|
return XT_UNDEFINED;
|
|
131
134
|
}
|
|
132
135
|
xt_value array = xt_array_new(0, NULL);
|
|
@@ -166,6 +169,9 @@ static xt_value xt_builtin_ctor_call(const char *name, int32_t argc, xt_value *a
|
|
|
166
169
|
}
|
|
167
170
|
if (strcmp(name, "Map") == 0) return xt_map_ctor(argc, argv);
|
|
168
171
|
if (strcmp(name, "Set") == 0) return xt_set_ctor(argc, argv);
|
|
172
|
+
if (strcmp(name, "WeakMap") == 0) return xt_weak_map_ctor(argc, argv);
|
|
173
|
+
if (strcmp(name, "WeakSet") == 0) return xt_weak_set_ctor(argc, argv);
|
|
174
|
+
if (strcmp(name, "WeakRef") == 0) return xt_weak_ref_ctor(argc, argv);
|
|
169
175
|
if (strcmp(name, "Date") == 0) return xt_date_ctor(argc, argv);
|
|
170
176
|
if (strcmp(name, "RegExp") == 0) return xt_regexp_ctor(argc, argv);
|
|
171
177
|
if (strcmp(name, "Promise") == 0) return xt_promise_ctor(argc, argv);
|
|
@@ -264,6 +270,7 @@ static const char *const XT_OBJECT_STATICS[] = {
|
|
|
264
270
|
"keys", "values", "entries", "assign", "getOwnPropertyNames",
|
|
265
271
|
"getOwnPropertySymbols", "groupBy", "freeze", "isFrozen", "fromEntries",
|
|
266
272
|
"getPrototypeOf", "setPrototypeOf", "hasOwn", "is", "create",
|
|
273
|
+
"defineProperty", "getOwnPropertyDescriptor", "getOwnPropertyDescriptors",
|
|
267
274
|
};
|
|
268
275
|
static const char *const XT_NUMBER_STATICS[] = {
|
|
269
276
|
"isInteger", "isSafeInteger", "isFinite", "isNaN", "parseFloat", "parseInt",
|
|
@@ -277,7 +284,7 @@ static const char *const XT_BIGINT_STATICS[] = {"asIntN", "asUintN"};
|
|
|
277
284
|
static const char *const XT_SYMBOL_STATICS[] = {"for", "keyFor"};
|
|
278
285
|
static const char *const XT_DATE_STATICS[] = {"now", "parse", "UTC"};
|
|
279
286
|
static const char *const XT_PROMISE_STATICS[] = {
|
|
280
|
-
"resolve", "reject", "all", "allSettled", "race", "any",
|
|
287
|
+
"resolve", "reject", "all", "allSettled", "race", "any", "withResolvers",
|
|
281
288
|
};
|
|
282
289
|
static const char *const XT_TYPED_ARRAY_STATICS[] = {"from", "of"};
|
|
283
290
|
|
|
@@ -378,6 +385,9 @@ xt_value xt_builtin_prototype_for_kind(int32_t kind) {
|
|
|
378
385
|
switch (kind) {
|
|
379
386
|
case XT_OBJECT_KIND_MAP: name = "Map"; break;
|
|
380
387
|
case XT_OBJECT_KIND_SET: name = "Set"; break;
|
|
388
|
+
case XT_OBJECT_KIND_WEAK_MAP: name = "WeakMap"; break;
|
|
389
|
+
case XT_OBJECT_KIND_WEAK_SET: name = "WeakSet"; break;
|
|
390
|
+
case XT_OBJECT_KIND_WEAK_REF: name = "WeakRef"; break;
|
|
381
391
|
case XT_OBJECT_KIND_DATE: name = "Date"; break;
|
|
382
392
|
case XT_OBJECT_KIND_REGEXP: name = "RegExp"; break;
|
|
383
393
|
case XT_OBJECT_KIND_PROMISE: name = "Promise"; break;
|