xbintsc 0.5.6 → 0.5.21
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 +20 -10
- 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 +95 -234
- 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 +112 -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/extensions/node/fs/index.d.ts +4 -3
- package/dist/src/extensions/node/fs/index.js +12 -3
- package/dist/src/extensions/node/fs/index.js.map +1 -1
- package/dist/src/extensions/node/fs-promises/index.d.ts +5 -5
- package/dist/src/extensions/node/fs-promises/index.js +15 -6
- package/dist/src/extensions/node/fs-promises/index.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-await.test.js +1 -1
- package/dist/tests/e2e/async-fs.test.d.ts +9 -0
- package/dist/tests/e2e/async-fs.test.js +119 -0
- package/dist/tests/e2e/async-fs.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/fetch.test.js +24 -0
- package/dist/tests/e2e/fetch.test.js.map +1 -1
- 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-inline-svg.test.d.ts +11 -0
- package/dist/tests/e2e/gui-inline-svg.test.js +160 -0
- package/dist/tests/e2e/gui-inline-svg.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 +20 -16
- package/doc/ai/extensions.md +13 -10
- package/doc/ai/language-support.md +19 -14
- 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 +16 -15
- package/doc/ai/zh-CN/extensions.md +12 -9
- package/doc/ai/zh-CN/language-support.md +19 -15
- package/doc/ai/zh-CN/troubleshooting.md +9 -8
- package/doc/gui/api.md +8 -0
- package/doc/gui/build.md +13 -4
- package/doc/gui/known-issues.md +19 -14
- package/doc/gui/media.md +32 -3
- package/doc/gui/rendering.md +3 -1
- package/doc/gui.md +28 -5
- package/doc/icon.md +5 -4
- package/doc/implemented/async.md +51 -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 +44 -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 +49 -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 +20 -0
- package/doc/unimplemented/node/bun.md +9 -0
- package/doc/unimplemented/node/fs-promises.md +20 -0
- package/doc/unimplemented/node/fs.md +30 -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/api.md +7 -0
- package/doc/zh-CN/gui/build.md +11 -3
- package/doc/zh-CN/gui/known-issues.md +17 -11
- package/doc/zh-CN/gui/media.md +26 -2
- package/doc/zh-CN/gui/rendering.md +2 -1
- package/doc/zh-CN/gui.md +21 -3
- package/doc/zh-CN/icon.md +5 -4
- package/doc/zh-CN/implemented/async.md +49 -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 +31 -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 +30 -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 +20 -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/inline_svg.cpp +219 -0
- package/runtime/ext_gui/inline_svg.h +41 -0
- package/runtime/ext_gui/layout.cpp +18 -0
- package/runtime/ext_gui/layout.h +7 -0
- package/runtime/ext_gui/layout_flow.cpp +4 -3
- package/runtime/ext_gui/paint.cpp +14 -0
- package/runtime/ext_gui/paint.h +5 -1
- package/runtime/ext_gui/renderer_image.cpp +53 -25
- package/runtime/ext_gui/renderer_shaders.h +2 -2
- package/runtime/ext_gui/stb_image.h +1 -17
- package/runtime/ext_gui/style_ua.cpp +3 -0
- package/runtime/ext_gui/svg.cpp +122 -39
- package/runtime/ext_gui/svg.h +14 -3
- package/runtime/ext_gui/window.cpp +28 -0
- package/runtime/ext_node/child_process/child_process.c +173 -73
- package/runtime/ext_node/fs/async_api.c +314 -0
- package/runtime/ext_node/fs/async_complete.c +99 -0
- package/runtime/ext_node/fs/async_fh.c +206 -0
- package/runtime/ext_node/fs/async_job.c +81 -0
- package/runtime/ext_node/fs/async_job.h +132 -0
- package/runtime/ext_node/fs/async_worker.c +534 -0
- package/runtime/ext_node/fs/async_worker_dir.c +439 -0
- package/runtime/ext_node/fs/async_worker_dir.h +33 -0
- package/runtime/ext_node/fs/async_worker_fd.c +74 -0
- package/runtime/ext_node/fs/dir.c +60 -15
- package/runtime/ext_node/fs/fs_common.h +9 -0
- package/runtime/ext_node/fs/fs_ops.c +18 -29
- package/runtime/ext_node/fs/parts/builtins.inc +34 -0
- package/runtime/ext_node/fs/parts/platform.inc +66 -0
- package/runtime/ext_node/fs/promises.c +44 -234
- package/runtime/rt.h +15 -0
- package/runtime/rt_internal.h +108 -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_async_io.c +333 -0
- package/runtime/xt_async_io.h +47 -0
- 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_fetch/async.inc +295 -0
- package/runtime/xt_fetch/request.inc +6 -183
- package/runtime/xt_fetch/socket.inc +5 -4
- package/runtime/xt_fetch.c +6 -4
- package/runtime/xt_generator.c +299 -10
- package/runtime/xt_io/inspect.inc +112 -0
- package/runtime/xt_loop.c +79 -7
- 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 +94 -328
- 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 +134 -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/extensions/node/fs/index.ts +12 -3
- package/src/extensions/node/fs-promises/index.ts +15 -6
- 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,333 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xbintsc runtime — asynchronous I/O offload pool.
|
|
3
|
+
*
|
|
4
|
+
* JavaScript's `await` can suspend an `async` body on a pending promise, but
|
|
5
|
+
* the host still has to provide the work that eventually settles it. Sockets
|
|
6
|
+
* and timers are readiness based and live directly on the `select(2)` reactor;
|
|
7
|
+
* file I/O and DNS have no portable readiness notification, so they run on a
|
|
8
|
+
* small pool of worker threads and report back through the same reactor.
|
|
9
|
+
*
|
|
10
|
+
* The threading contract is the important part:
|
|
11
|
+
*
|
|
12
|
+
* - `job->run` executes on a worker thread and may only touch plain C memory
|
|
13
|
+
* (paths, buffers, syscalls). It must never call the `xt_*` value API, the
|
|
14
|
+
* collector, `xt_throw`, or the event loop.
|
|
15
|
+
* - `job->complete` executes on the main thread after the reactor wakes up.
|
|
16
|
+
* That is where results become `xt_value`s, promises settle, and a job may
|
|
17
|
+
* submit follow-up work (fetch redirects do exactly that).
|
|
18
|
+
* - `job->roots` keeps values needed across the suspension alive. They are
|
|
19
|
+
* written on the main thread and scanned by the collector like any other
|
|
20
|
+
* root.
|
|
21
|
+
*
|
|
22
|
+
* Completion wakes the reactor through a self-pipe (POSIX) or a loopback UDP
|
|
23
|
+
* socket (Windows, whose `select` only understands sockets). The reactor also
|
|
24
|
+
* polls the pool every iteration, so a failed wakeup degrades to a short wait
|
|
25
|
+
* rather than a hang.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
#include "rt_internal.h"
|
|
29
|
+
|
|
30
|
+
#include <stdlib.h>
|
|
31
|
+
#include <string.h>
|
|
32
|
+
|
|
33
|
+
#if defined(_WIN32)
|
|
34
|
+
#include <winsock2.h>
|
|
35
|
+
#include <windows.h>
|
|
36
|
+
#include <process.h>
|
|
37
|
+
#else
|
|
38
|
+
#include <errno.h>
|
|
39
|
+
#include <fcntl.h>
|
|
40
|
+
#include <pthread.h>
|
|
41
|
+
#include <unistd.h>
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
#define XT_ASYNC_WORKERS 4
|
|
45
|
+
/* A fallback bound for the reactor wait while work is outstanding. With a
|
|
46
|
+
* working wakeup the wait ends immediately when a job completes. */
|
|
47
|
+
#define XT_ASYNC_POLL_MS 10
|
|
48
|
+
|
|
49
|
+
static xt_async_job *xt_async_work_head = NULL;
|
|
50
|
+
static xt_async_job *xt_async_work_tail = NULL;
|
|
51
|
+
static xt_async_job *xt_async_done_head = NULL;
|
|
52
|
+
static xt_async_job *xt_async_done_tail = NULL;
|
|
53
|
+
|
|
54
|
+
/* Every submitted, not-yet-released job. Mutated only on the main thread. */
|
|
55
|
+
static xt_async_job *xt_async_live_head = NULL;
|
|
56
|
+
|
|
57
|
+
static int xt_async_pending_jobs = 0;
|
|
58
|
+
static int xt_async_workers_started = 0;
|
|
59
|
+
static int xt_async_worker_count = 0;
|
|
60
|
+
static int xt_async_roots_registered = 0;
|
|
61
|
+
static int xt_async_watcher_fd = -1;
|
|
62
|
+
|
|
63
|
+
#if defined(_WIN32)
|
|
64
|
+
/* Statically initialised like the POSIX primitives below: the reactor polls
|
|
65
|
+
* the pool on every timer/socket iteration, even when no async job was ever
|
|
66
|
+
* submitted, so the lock must be usable before `xt_async_submit` runs. */
|
|
67
|
+
static SRWLOCK xt_async_lock = SRWLOCK_INIT;
|
|
68
|
+
static CONDITION_VARIABLE xt_async_cond = CONDITION_VARIABLE_INIT;
|
|
69
|
+
static SOCKET xt_async_wake_socket = INVALID_SOCKET;
|
|
70
|
+
#define XT_ASYNC_LOCK() AcquireSRWLockExclusive(&xt_async_lock)
|
|
71
|
+
#define XT_ASYNC_UNLOCK() ReleaseSRWLockExclusive(&xt_async_lock)
|
|
72
|
+
static void xt_async_cond_wait(void) {
|
|
73
|
+
SleepConditionVariableSRW(&xt_async_cond, &xt_async_lock, INFINITE, 0);
|
|
74
|
+
}
|
|
75
|
+
static void xt_async_cond_signal(void) { WakeConditionVariable(&xt_async_cond); }
|
|
76
|
+
#else
|
|
77
|
+
static pthread_mutex_t xt_async_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
78
|
+
static pthread_cond_t xt_async_cond = PTHREAD_COND_INITIALIZER;
|
|
79
|
+
static int xt_async_wake_pipe[2] = {-1, -1};
|
|
80
|
+
#define XT_ASYNC_LOCK() pthread_mutex_lock(&xt_async_lock)
|
|
81
|
+
#define XT_ASYNC_UNLOCK() pthread_mutex_unlock(&xt_async_lock)
|
|
82
|
+
static void xt_async_cond_wait(void) { pthread_cond_wait(&xt_async_cond, &xt_async_lock); }
|
|
83
|
+
static void xt_async_cond_signal(void) { pthread_cond_signal(&xt_async_cond); }
|
|
84
|
+
#endif
|
|
85
|
+
|
|
86
|
+
static void xt_async_scan_roots(void);
|
|
87
|
+
|
|
88
|
+
/* -- wakeup channel ------------------------------------------------------- */
|
|
89
|
+
|
|
90
|
+
static int xt_async_wake_fd(void) {
|
|
91
|
+
#if defined(_WIN32)
|
|
92
|
+
return (int)xt_async_wake_socket;
|
|
93
|
+
#else
|
|
94
|
+
return xt_async_wake_pipe[0];
|
|
95
|
+
#endif
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static void xt_async_wake_create(void) {
|
|
99
|
+
#if defined(_WIN32)
|
|
100
|
+
if (xt_async_wake_socket != INVALID_SOCKET) return;
|
|
101
|
+
SOCKET socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
102
|
+
if (socket_fd == INVALID_SOCKET) return;
|
|
103
|
+
struct sockaddr_in address;
|
|
104
|
+
memset(&address, 0, sizeof(address));
|
|
105
|
+
address.sin_family = AF_INET;
|
|
106
|
+
address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
107
|
+
address.sin_port = 0;
|
|
108
|
+
if (bind(socket_fd, (struct sockaddr *)&address, sizeof(address)) != 0) {
|
|
109
|
+
closesocket(socket_fd);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
int length = (int)sizeof(address);
|
|
113
|
+
if (getsockname(socket_fd, (struct sockaddr *)&address, &length) != 0 ||
|
|
114
|
+
connect(socket_fd, (struct sockaddr *)&address, sizeof(address)) != 0) {
|
|
115
|
+
closesocket(socket_fd);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
u_long nonBlocking = 1;
|
|
119
|
+
ioctlsocket(socket_fd, FIONBIO, &nonBlocking);
|
|
120
|
+
xt_async_wake_socket = socket_fd;
|
|
121
|
+
#else
|
|
122
|
+
if (xt_async_wake_pipe[0] >= 0) return;
|
|
123
|
+
if (pipe(xt_async_wake_pipe) != 0) {
|
|
124
|
+
xt_async_wake_pipe[0] = -1;
|
|
125
|
+
xt_async_wake_pipe[1] = -1;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
for (int i = 0; i < 2; i++) {
|
|
129
|
+
int flags = fcntl(xt_async_wake_pipe[i], F_GETFL, 0);
|
|
130
|
+
if (flags >= 0) fcntl(xt_async_wake_pipe[i], F_SETFL, flags | O_NONBLOCK);
|
|
131
|
+
}
|
|
132
|
+
#endif
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Called by a worker after it queues a completion. */
|
|
136
|
+
static void xt_async_wakeup(void) {
|
|
137
|
+
#if defined(_WIN32)
|
|
138
|
+
if (xt_async_wake_socket == INVALID_SOCKET) return;
|
|
139
|
+
char byte = 1;
|
|
140
|
+
send(xt_async_wake_socket, &byte, 1, 0);
|
|
141
|
+
#else
|
|
142
|
+
if (xt_async_wake_pipe[1] < 0) return;
|
|
143
|
+
char byte = 1;
|
|
144
|
+
ssize_t ignored = write(xt_async_wake_pipe[1], &byte, 1);
|
|
145
|
+
(void)ignored;
|
|
146
|
+
#endif
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static void xt_async_wake_drain(void) {
|
|
150
|
+
#if defined(_WIN32)
|
|
151
|
+
if (xt_async_wake_socket == INVALID_SOCKET) return;
|
|
152
|
+
char buffer[256];
|
|
153
|
+
while (recv(xt_async_wake_socket, buffer, (int)sizeof(buffer), 0) > 0) {
|
|
154
|
+
}
|
|
155
|
+
#else
|
|
156
|
+
if (xt_async_wake_pipe[0] < 0) return;
|
|
157
|
+
char buffer[256];
|
|
158
|
+
while (read(xt_async_wake_pipe[0], buffer, sizeof(buffer)) > 0) {
|
|
159
|
+
}
|
|
160
|
+
#endif
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static void xt_async_wake_handler(void *userdata, int events) {
|
|
164
|
+
(void)userdata;
|
|
165
|
+
(void)events;
|
|
166
|
+
xt_async_poll();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* -- queue helpers (lock held) -------------------------------------------- */
|
|
170
|
+
|
|
171
|
+
static void xt_async_push_work(xt_async_job *job) {
|
|
172
|
+
job->next = NULL;
|
|
173
|
+
if (xt_async_work_tail) xt_async_work_tail->next = job;
|
|
174
|
+
else xt_async_work_head = job;
|
|
175
|
+
xt_async_work_tail = job;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
static void xt_async_push_done(xt_async_job *job) {
|
|
179
|
+
job->next = NULL;
|
|
180
|
+
if (xt_async_done_tail) xt_async_done_tail->next = job;
|
|
181
|
+
else xt_async_done_head = job;
|
|
182
|
+
xt_async_done_tail = job;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
static xt_async_job *xt_async_pop_work(void) {
|
|
186
|
+
xt_async_job *job = xt_async_work_head;
|
|
187
|
+
if (!job) return NULL;
|
|
188
|
+
xt_async_work_head = job->next;
|
|
189
|
+
if (!xt_async_work_head) xt_async_work_tail = NULL;
|
|
190
|
+
return job;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
static xt_async_job *xt_async_pop_done(void) {
|
|
194
|
+
xt_async_job *job = xt_async_done_head;
|
|
195
|
+
if (!job) return NULL;
|
|
196
|
+
xt_async_done_head = job->next;
|
|
197
|
+
if (!xt_async_done_head) xt_async_done_tail = NULL;
|
|
198
|
+
return job;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* -- live job registry (main thread only) --------------------------------- */
|
|
202
|
+
|
|
203
|
+
static void xt_async_live_add(xt_async_job *job) {
|
|
204
|
+
job->live_prev = NULL;
|
|
205
|
+
job->live_next = xt_async_live_head;
|
|
206
|
+
if (xt_async_live_head) xt_async_live_head->live_prev = job;
|
|
207
|
+
xt_async_live_head = job;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
static void xt_async_live_remove(xt_async_job *job) {
|
|
211
|
+
if (job->live_prev) job->live_prev->live_next = job->live_next;
|
|
212
|
+
else xt_async_live_head = job->live_next;
|
|
213
|
+
if (job->live_next) job->live_next->live_prev = job->live_prev;
|
|
214
|
+
job->live_next = NULL;
|
|
215
|
+
job->live_prev = NULL;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
static void xt_async_scan_roots(void) {
|
|
219
|
+
for (xt_async_job *job = xt_async_live_head; job; job = job->live_next) {
|
|
220
|
+
for (int i = 0; i < XT_ASYNC_ROOT_SLOTS; i++) xt_gc_mark_value(job->roots[i]);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
static void xt_async_register_roots(void) {
|
|
225
|
+
if (xt_async_roots_registered) return;
|
|
226
|
+
xt_async_roots_registered = 1;
|
|
227
|
+
xt_gc_register_root_provider(xt_async_scan_roots);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* -- worker threads -------------------------------------------------------- */
|
|
231
|
+
|
|
232
|
+
static void xt_async_worker_run(void) {
|
|
233
|
+
for (;;) {
|
|
234
|
+
XT_ASYNC_LOCK();
|
|
235
|
+
xt_async_job *job = xt_async_pop_work();
|
|
236
|
+
while (!job) {
|
|
237
|
+
xt_async_cond_wait();
|
|
238
|
+
job = xt_async_pop_work();
|
|
239
|
+
}
|
|
240
|
+
XT_ASYNC_UNLOCK();
|
|
241
|
+
if (job->run) job->run(job);
|
|
242
|
+
XT_ASYNC_LOCK();
|
|
243
|
+
xt_async_push_done(job);
|
|
244
|
+
XT_ASYNC_UNLOCK();
|
|
245
|
+
xt_async_wakeup();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#if defined(_WIN32)
|
|
250
|
+
static unsigned __stdcall xt_async_worker_entry(void *argument) {
|
|
251
|
+
(void)argument;
|
|
252
|
+
xt_async_worker_run();
|
|
253
|
+
return 0;
|
|
254
|
+
}
|
|
255
|
+
#else
|
|
256
|
+
static void *xt_async_worker_entry(void *argument) {
|
|
257
|
+
(void)argument;
|
|
258
|
+
xt_async_worker_run();
|
|
259
|
+
return NULL;
|
|
260
|
+
}
|
|
261
|
+
#endif
|
|
262
|
+
|
|
263
|
+
/* Spawn the pool lazily. Called with the lock held so a worker that starts
|
|
264
|
+
* immediately blocks until the queue is published. */
|
|
265
|
+
static void xt_async_start_workers(void) {
|
|
266
|
+
if (xt_async_workers_started) return;
|
|
267
|
+
xt_async_workers_started = 1;
|
|
268
|
+
for (int i = 0; i < XT_ASYNC_WORKERS; i++) {
|
|
269
|
+
#if defined(_WIN32)
|
|
270
|
+
uintptr_t handle = _beginthreadex(NULL, 0, xt_async_worker_entry, NULL, 0, NULL);
|
|
271
|
+
if (handle == 0) break;
|
|
272
|
+
CloseHandle((HANDLE)handle);
|
|
273
|
+
#else
|
|
274
|
+
pthread_t thread;
|
|
275
|
+
if (pthread_create(&thread, NULL, xt_async_worker_entry, NULL) != 0) break;
|
|
276
|
+
pthread_detach(thread);
|
|
277
|
+
#endif
|
|
278
|
+
xt_async_worker_count++;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* -- public API ------------------------------------------------------------ */
|
|
283
|
+
|
|
284
|
+
int xt_async_pending(void) { return xt_async_pending_jobs; }
|
|
285
|
+
|
|
286
|
+
void xt_async_submit(xt_async_job *job) {
|
|
287
|
+
if (!job || !job->run) {
|
|
288
|
+
if (job && job->release) job->release(job);
|
|
289
|
+
else free(job);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
xt_async_register_roots();
|
|
293
|
+
xt_async_live_add(job);
|
|
294
|
+
xt_async_pending_jobs++;
|
|
295
|
+
|
|
296
|
+
xt_async_wake_create();
|
|
297
|
+
if (xt_async_watcher_fd < 0 && xt_async_wake_fd() >= 0) {
|
|
298
|
+
if (xt_loop_add(xt_async_wake_fd(), XT_IO_READ, xt_async_wake_handler, NULL) == 0) {
|
|
299
|
+
xt_async_watcher_fd = xt_async_wake_fd();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
XT_ASYNC_LOCK();
|
|
304
|
+
xt_async_start_workers();
|
|
305
|
+
if (xt_async_worker_count > 0) {
|
|
306
|
+
xt_async_push_work(job);
|
|
307
|
+
xt_async_cond_signal();
|
|
308
|
+
XT_ASYNC_UNLOCK();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
/* No worker could be created: complete on the reactor's next poll. */
|
|
312
|
+
xt_async_push_done(job);
|
|
313
|
+
XT_ASYNC_UNLOCK();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
void xt_async_poll(void) {
|
|
317
|
+
if (xt_async_watcher_fd >= 0) xt_async_wake_drain();
|
|
318
|
+
for (;;) {
|
|
319
|
+
XT_ASYNC_LOCK();
|
|
320
|
+
xt_async_job *job = xt_async_pop_done();
|
|
321
|
+
XT_ASYNC_UNLOCK();
|
|
322
|
+
if (!job) break;
|
|
323
|
+
if (job->complete) job->complete(job);
|
|
324
|
+
xt_async_live_remove(job);
|
|
325
|
+
if (job->release) job->release(job);
|
|
326
|
+
else free(job);
|
|
327
|
+
xt_async_pending_jobs--;
|
|
328
|
+
}
|
|
329
|
+
if (xt_async_pending_jobs == 0 && xt_async_watcher_fd >= 0) {
|
|
330
|
+
xt_loop_remove(xt_async_watcher_fd);
|
|
331
|
+
xt_async_watcher_fd = -1;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xbintsc runtime — asynchronous I/O offload API.
|
|
3
|
+
*
|
|
4
|
+
* Declared separately from `rt_internal.h` so the internal header stays within
|
|
5
|
+
* the repository's file-size budget. Extensions that offload blocking work
|
|
6
|
+
* include `rt_internal.h`, which includes this header.
|
|
7
|
+
*/
|
|
8
|
+
#ifndef XT_RT_ASYNC_IO_H
|
|
9
|
+
#define XT_RT_ASYNC_IO_H
|
|
10
|
+
|
|
11
|
+
#include "rt.h"
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Some host operations (file I/O, DNS, a blocking HTTP exchange) have no
|
|
15
|
+
* portable readiness notification, so they run on a small worker pool and
|
|
16
|
+
* report back to the main thread. The contract is strict: `run` executes on a
|
|
17
|
+
* worker and may only touch plain C memory, while `complete` executes on the
|
|
18
|
+
* main thread and may build/consume `xt_value`s.
|
|
19
|
+
*
|
|
20
|
+
* A job begins with this struct. `roots` keeps up to four values alive while
|
|
21
|
+
* the job is queued or running: the slots are scanned by the collector and are
|
|
22
|
+
* only written from the main thread. `next` links the work/completion queue and
|
|
23
|
+
* is owned by the pool; callers never touch it. `release` (optional) frees the
|
|
24
|
+
* job after `complete` returns.
|
|
25
|
+
*/
|
|
26
|
+
#define XT_ASYNC_ROOT_SLOTS 4
|
|
27
|
+
|
|
28
|
+
typedef struct xt_async_job xt_async_job;
|
|
29
|
+
|
|
30
|
+
struct xt_async_job {
|
|
31
|
+
xt_async_job *next;
|
|
32
|
+
xt_async_job *live_next;
|
|
33
|
+
xt_async_job *live_prev;
|
|
34
|
+
void (*run)(xt_async_job *job);
|
|
35
|
+
void (*complete)(xt_async_job *job);
|
|
36
|
+
void (*release)(xt_async_job *job);
|
|
37
|
+
xt_value roots[XT_ASYNC_ROOT_SLOTS];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** Queue `job` on a worker (never blocks the caller). Takes ownership. */
|
|
41
|
+
void xt_async_submit(xt_async_job *job);
|
|
42
|
+
/** Number of submitted jobs whose completion has not run yet. */
|
|
43
|
+
int xt_async_pending(void);
|
|
44
|
+
/** Run completed jobs and drop the loop watcher when the queue becomes idle. */
|
|
45
|
+
void xt_async_poll(void);
|
|
46
|
+
|
|
47
|
+
#endif /* XT_RT_ASYNC_IO_H */
|
|
@@ -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;
|