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
package/doc/unimplemented.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# xbintsc Unimplemented Syntax and Features
|
|
2
2
|
|
|
3
|
-
This
|
|
4
|
-
(`tests/`) file by file, and lists the syntax and features that are
|
|
3
|
+
This documentation was compiled by checking the source (`src/`, `runtime/`) and
|
|
4
|
+
tests (`tests/`) file by file, and lists the syntax and features that are
|
|
5
5
|
**currently unimplemented / only partially implemented / semantically different
|
|
6
6
|
from the standard**.
|
|
7
7
|
|
|
@@ -11,278 +11,21 @@ Criteria (ordered by severity):
|
|
|
11
11
|
2. **Parsed but codegen errors**: the AST / binding can be built, but `codegen` reports `UnsupportedFeature`.
|
|
12
12
|
3. **Parsed and compilable, but semantics are missing or differ**: a binary is produced, but the runtime result does not match ECMAScript / TypeScript semantics.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
> formatting / coercion (`toFixed` / `toPrecision` / `toExponential`, hex / octal
|
|
18
|
-
> / binary parsing, full `+` and relational `ToPrimitive`), `JSON.stringify`
|
|
19
|
-
> omission rules, default `Array.prototype.sort` (stable, string order),
|
|
20
|
-
> insertion-ordered integer keys, whole-chain optional chaining, `finally` on
|
|
21
|
-
> early `return` / `break` / `continue`, object-key insertion order, UTF-8-aware
|
|
22
|
-
> `console` inspection with circular references, `Array.prototype.splice`,
|
|
23
|
-
> `String.prototype.match` / `lastIndexOf` / `split` with limit, RegExp capture
|
|
24
|
-
> groups (`exec` / `match` / `replace` / `split` / `search`), immutable array
|
|
25
|
-
> methods (`toReversed` / `toSorted` / `toSpliced` / `with`),
|
|
26
|
-
> `Object.getOwnPropertyNames` / `groupBy`, global URI functions, labeled
|
|
27
|
-
> statements, `#private` fields / methods / statics, tagged templates (with raw
|
|
28
|
-
> strings and `String.raw`), and `import * as ns` for relative modules. The test
|
|
29
|
-
> suite now includes a **differential harness** that runs every case through both
|
|
30
|
-
> xbintsc and Node and compares output byte-for-byte.
|
|
31
|
-
|
|
32
|
-
> Also completed: `class` declarations / class expressions, `new` / `this`,
|
|
33
|
-
> inheritance `extends` / `super`, `instanceof`, methods / static members /
|
|
34
|
-
> instance fields / getters and setters / constructor parameter properties,
|
|
35
|
-
> `async` / `await` + `Promise`, multi-file `import` / `export` bundling
|
|
36
|
-
> (including `.js` → `.ts` specifier resolution and namespace imports), `Map` /
|
|
37
|
-
> `Set` / `Date` / `RegExp` / `JSON` / `BigInt`, destructuring bindings and
|
|
38
|
-
> parameters, `enum` / `const enum`, and **self-hosting** (the emitted LLVM IR
|
|
39
|
-
> reaches a byte-identical fixpoint).
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## 1. Unimplemented at the statement level
|
|
44
|
-
|
|
45
|
-
### 1.1 Parsed but codegen reports `UnsupportedFeature`
|
|
46
|
-
|
|
47
|
-
| Syntax | Status | Notes |
|
|
48
|
-
| --- | --- | --- |
|
|
49
|
-
| `namespace` / `module` declarations | parse ✓, codegen ✗ | → "does not yet support this statement (module declaration)" |
|
|
50
|
-
|
|
51
|
-
> Labeled statements (`label: statement`, `break label`, `continue label`) are
|
|
52
|
-
> implemented, including labels on non-loop statements.
|
|
53
|
-
|
|
54
|
-
### 1.2 Not supported by the parser (immediate syntax error)
|
|
55
|
-
|
|
56
|
-
None known at the statement level. The parser is intentionally permissive and
|
|
57
|
-
accepts most TypeScript statement syntax; unsupported forms are rejected later
|
|
58
|
-
by code generation (see above).
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## 2. Unimplemented at the expression level
|
|
63
|
-
|
|
64
|
-
### 2.1 Parsed but codegen reports `UnsupportedFeature`
|
|
65
|
-
|
|
66
|
-
None — generators are implemented.
|
|
67
|
-
|
|
68
|
-
> Tagged templates are implemented, including raw strings and `String.raw`.
|
|
69
|
-
> Generators (`function*`, `yield`, `yield*`) are implemented with stackful
|
|
70
|
-
> coroutines, including `next`/`throw`/`return`, `for...of`, spread and
|
|
71
|
-
> delegation. `import.meta` exposes `url`, `dirname` and `filename`, resolved
|
|
72
|
-
> from the running executable's path. `async function*` is **rejected with
|
|
73
|
-
> `UnsupportedFeature`** instead of silently producing a synchronous generator.
|
|
74
|
-
|
|
75
|
-
### 2.2 Not supported by the parser
|
|
76
|
-
|
|
77
|
-
None known at the expression level.
|
|
78
|
-
|
|
79
|
-
### 2.3 Unimplemented operators
|
|
80
|
-
|
|
81
|
-
| Operator | Status | Notes |
|
|
82
|
-
| --- | --- | --- |
|
|
83
|
-
| `new.target` | ✗ | parsed, then rejected with `UnsupportedFeature` (no `new.target` semantics) |
|
|
84
|
-
| `typeof` / `void` / `in` / `delete` / `instanceof` | ✓ | mapped to runtime helpers (`xt_typeof`, `xt_in`, `xt_delete`, `xt_instance_of`) |
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
## 3. Unimplemented standard library
|
|
89
|
-
|
|
90
|
-
### 3.1 Implemented (summary)
|
|
91
|
-
|
|
92
|
-
- Arrays: `push` `pop` `shift` `unshift` `join` `slice` `splice` `indexOf` `lastIndexOf` `includes` `concat` `reverse` `forEach` `map` `filter` `reduce` `reduceRight` `find` `findIndex` `findLast` `findLastIndex` `some` `every` `sort` `flat` `flatMap` `fill` `copyWithin` `at` `keys` `values` `entries` and the immutable `toReversed` / `toSorted` / `toSpliced` / `with`
|
|
93
|
-
- Strings: `charAt` `charCodeAt` `codePointAt` `indexOf` `lastIndexOf` `includes` `startsWith` `endsWith` `slice` `substring` `substr` `split` `match` `replace` `replaceAll` `search` `toUpperCase` `toLowerCase` `trim` `trimStart` `trimEnd` `padStart` `padEnd` `repeat` `concat` `at` `localeCompare` `valueOf`
|
|
94
|
-
- `Math`: full set of functions and constants
|
|
95
|
-
- `Object.keys` / `values` / `entries` / `assign` / `getOwnPropertyNames` / `groupBy`, object spread `{...obj}`
|
|
96
|
-
- Global functions: `parseInt` `parseFloat` `isNaN` `isFinite` `Number` `String` `Boolean` `encodeURI` `decodeURI` `encodeURIComponent` `decodeURIComponent`
|
|
97
|
-
- `console.log` / `info` / `warn` / `error` / `dir` / `trace` / `assert` / `count` / `group` / `table` / `time`
|
|
98
|
-
|
|
99
|
-
### 3.2 Completed
|
|
100
|
-
|
|
101
|
-
- `JSON.parse` / `JSON.stringify`
|
|
102
|
-
- `Date`, `RegExp` (POSIX ERE subset with capture groups), `Map`, `Set`, `Promise`, `BigInt`
|
|
103
|
-
- `Array` statics (`isArray/of/from`), `Object` statics, `Number` statics, `String` statics (`fromCharCode` / `fromCodePoint` / `raw`)
|
|
104
|
-
- Built-in constructors as first-class values (`const A = Array`, `new A(...)`, `A.isArray`, `x instanceof A`) and `Object.prototype` (`hasOwnProperty`, `toString`, `valueOf`, `isPrototypeOf`, `propertyIsEnumerable`, `__proto__`), with `Object.getPrototypeOf({}) === Object.prototype`
|
|
105
|
-
- `Error` family (`Error`, `TypeError`, `RangeError`, `SyntaxError`, `ReferenceError`, `EvalError`, `URIError`, `AggregateError`): `new`, `instanceof`, `extends`, `String(err)` / `err.toString()` and `.stack`
|
|
106
|
-
|
|
107
|
-
### 3.3 Still unimplemented
|
|
108
|
-
|
|
109
|
-
| Category | Status |
|
|
110
|
-
| --- | --- |
|
|
111
|
-
| `Symbol` constructor and symbol primitives | ✓ `Symbol(description)`, well-known symbols, `Symbol.for` / `Symbol.keyFor`, symbol property keys and `Object.getOwnPropertySymbols` |
|
|
112
|
-
| `String.prototype.normalize` | ✗ not implemented |
|
|
113
|
-
| `structuredClone` | ✗ not implemented |
|
|
114
|
-
| Built-in error subclasses (`TypeError`, `RangeError`, …) | ✓ first-class constructors and prototypes; `instanceof Error` holds for the whole family |
|
|
115
|
-
| `AggregateError` constructor | ✓ `new AggregateError(errors, message)`; `Promise.any` now rejects with one |
|
|
116
|
-
| Iterator protocol / `Symbol.iterator` / custom `for...of` iterables | ✓ arrays, strings, `Map`, `Set`, generators and any object exposing `[Symbol.iterator]()` are iterable in `for...of` / spread |
|
|
117
|
-
| Generators (`function*`, `yield`, `yield*`, `next`/`throw`/`return`) | ✓ implemented with stackful coroutines; `for...of`, spread and delegation supported. `return()` completes without running `finally` |
|
|
118
|
-
| Timers | ✓ `setTimeout` / `clearTimeout` / `setInterval` / `clearInterval` on the core event loop (numeric ids, no `Timeout` object; no `setImmediate` / `queueMicrotask`). A promise settled from a timer can be awaited: the async body suspends on the pending promise and resumes when the timer fires |
|
|
119
|
-
| I/O / process and other host APIs | only via extensions (e.g. Node `fs`) |
|
|
120
|
-
|
|
121
|
-
### 3.4 Typed arrays
|
|
122
|
-
|
|
123
|
-
Implemented: `Uint8Array`, `Int8Array`, `Uint8ClampedArray`, `Uint16Array`,
|
|
124
|
-
`Int16Array`, `Uint32Array`, `Int32Array`, `Float32Array`, `Float64Array` with
|
|
125
|
-
`new X(n)` / `new X(arrayLike)`, `X.from` / `X.of`, `BYTES_PER_ELEMENT`, coerced
|
|
126
|
-
element writes, and `fill` / `set` / `slice` / `subarray` / `join` / `toString` /
|
|
127
|
-
`indexOf` / `lastIndexOf` / `includes` / `forEach` / `map` / `filter` / `every` /
|
|
128
|
-
`some` / `find` / `findIndex` / `reduce` / `reverse` / `sort` / `copyWithin` /
|
|
129
|
-
`at` / `keys` / `values` / `entries`. Known divergences:
|
|
130
|
-
|
|
131
|
-
| Feature | Status |
|
|
132
|
-
| --- | --- |
|
|
133
|
-
| `subarray` | ~ returns a copy, not a view over a shared buffer |
|
|
134
|
-
| `keys` / `values` / `entries` | ~ return arrays, not iterator objects |
|
|
135
|
-
| `ArrayBuffer` / `DataView` / `.buffer` / `.byteOffset` semantics | ✗ no backing buffer type; `.byteOffset` is always 0 |
|
|
136
|
-
| `BigInt64Array` / `BigUint64Array` | ✗ not implemented |
|
|
137
|
-
| `instanceof` built-in constructors | ✓ `instanceof Array` / `Object` / `Map` / `Set` / `Date` / `RegExp` / `Promise` / `Error` family / typed arrays are recognised by name **and through a first-class constructor value** (`const A = Array; x instanceof A`); constructors can be stored, passed, aliased, called and used with `new` |
|
|
138
|
-
| Typed-array views over a `Buffer` / `ArrayBuffer` | ✗ constructors copy from a length / array-like / typed array only |
|
|
139
|
-
|
|
140
|
-
---
|
|
14
|
+
The pages are split by area so a limitation for one feature is recorded in one
|
|
15
|
+
small file. When a limitation is lifted, move the entry to the matching page
|
|
16
|
+
under [implemented](./implemented.md); git history records when it changed.
|
|
141
17
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
| Feature | Status |
|
|
145
|
-
| --- | --- |
|
|
146
|
-
| Multi-file / module resolution and linking | ✓ driver-layer AST bundling (`src/driver/modules.ts`): parse each module, rename top-level symbols by module prefix, rewrite references, merge into one file and rebind |
|
|
147
|
-
| Named import/export | ✓ `import { a, b as c }` / `export { a as b }` / `export const/let/var/function/class` |
|
|
148
|
-
| Default import/export | ✓ `export default` / `import d from` |
|
|
149
|
-
| Re-export `export { x } from` / `export * from` | ✓ (`export *` copies the dependency's exports) |
|
|
150
|
-
| Namespace import `import * as ns` | ✓ lowered to a synthetic object literal holding every export |
|
|
151
|
-
| Circular dependencies | ✗ errors out (no circular initialization semantics) |
|
|
152
|
-
| Live bindings | ✗ namespace objects and imported bindings are snapshots at module-evaluation time |
|
|
153
|
-
| ESM `node_modules` packages | ✓ bare specifiers resolve up the tree through `exports` / `module` / `main`, including scoped packages and subpaths; the package sources are bundled like relative modules |
|
|
154
|
-
| CommonJS `require` / `module.exports` | ✓ inside `node_modules` only: the bundler gives each CommonJS package a synthetic `module` / `exports` pair, lowers `require("x")` to the bundled dependency's exports, and hoists external/built-in `require`s into ESM imports. `require()` in user code (outside `node_modules`) is still rejected with a diagnostic pointing at the ESM `import` form. |
|
|
155
|
-
|
|
156
|
-
> Extension modules (such as `fs`) are importable by bare or `node:`-prefixed
|
|
157
|
-
> specifier — `import { readFileSync } from "fs"` / `import path from "path"` —
|
|
158
|
-
> and resolve to their runtime entries (named, default and namespace forms).
|
|
159
|
-
> Relative modules and ESM packages under `node_modules` are bundled at the driver layer.
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## 5. Unimplemented function features (or missing semantics)
|
|
164
|
-
|
|
165
|
-
| Feature | Parse | Semantics |
|
|
166
|
-
| --- | --- | --- |
|
|
167
|
-
| Default parameters `function f(a = 5)` | ✓ | ✓ implemented |
|
|
168
|
-
| Rest parameters `function f(...args)` | ✓ | ✓ implemented |
|
|
169
|
-
| Spread in call arguments `f(...args)` | ✓ | ✓ implemented |
|
|
170
|
-
| Destructuring parameters / bindings | ✓ | ✓ implemented |
|
|
171
|
-
| `arguments` object | ✓ (implicit) | ✓ implemented (arrow functions get their own parameters, not the outer function's `arguments`, unlike JS) |
|
|
172
|
-
| `this` binding / method call semantics | ✓ | ✓ implemented (`this` is threaded as the first ABI parameter; arrow functions inherit lexically) |
|
|
173
|
-
| `async` / `await` / Promise | ✓ | ✓ implemented with stackful-coroutine suspension: awaiting a pending promise pauses the body and the event loop resumes it (see the deviations table for the remaining differences) |
|
|
174
|
-
| `new.target` | ✗ | parsed, then rejected with `UnsupportedFeature` (no `new.target` semantics) |
|
|
175
|
-
| Generators / iterators / `yield` | ✓ implemented | `function*`, `yield`, `yield*`, `.next/.throw/.return`; `async` generators are rejected with `UnsupportedFeature` |
|
|
176
|
-
| Closure `arity` | — | `xt_closure_arity` is always -1, never filled in |
|
|
177
|
-
| `fn.call` / `fn.apply` / `fn.bind` | ✓ | ✓ implemented (the bound closure does not track partial-argument `length`) |
|
|
178
|
-
| `fn.name` / `fn.length` | ✓ | ✓ implemented (inferred from the declaration / assignment / property key; bound functions use `"bound ..."` and adjusted arity) |
|
|
179
|
-
| First-class built-in constructors (`const A = Array`, `new A(...)`, `typeof Map`) | ✓ | ✓ constructors are ordinary function values with `name`/`length`, a `prototype`, their statics (`A.isArray`) and the full `instanceof` protocol |
|
|
180
|
-
| First-class built-in methods (`typeof arr.map`, `const f = arr.push`, `obj.method?.()`) | ✓ | ✓ implemented as *unbound* method values: reading `arr.map` yields a function, `arr.map?.(cb)` and `obj.method?.()` bind the receiver as `this`, and a detached call (`const f = arr.map; f(cb)`) throws exactly like JavaScript. Method `name`/`length` are exposed |
|
|
181
|
-
| `fn.toString()` | ~ | returns a native-style placeholder (`function name() { [native code] }`) instead of the original source text |
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## 6. Classes and object orientation
|
|
186
|
-
|
|
187
|
-
| Feature | Status |
|
|
188
|
-
| --- | --- |
|
|
189
|
-
| `class` declarations / class expressions | ✓ implemented |
|
|
190
|
-
| `constructor` | ✓ |
|
|
191
|
-
| Instance fields / property declarations | ✓ |
|
|
192
|
-
| Methods | ✓ |
|
|
193
|
-
| `static` fields / methods | ✓ |
|
|
194
|
-
| Inheritance `extends` / `super` | ✓ (single level correct; `super` takes the prototype of `this`'s prototype — see section 8) |
|
|
195
|
-
| Prototype chain / method lookup | ✓ |
|
|
196
|
-
| `instanceof` | ✓ |
|
|
197
|
-
| `new` / instantiation | ✓ |
|
|
198
|
-
| `get` / `set` accessors | ✓ implemented |
|
|
199
|
-
| Parameter properties `constructor(public x: T)` | ✓ implemented |
|
|
200
|
-
| Private fields `#x` | ✓ implemented (stored under a literal `#x` key; no accessibility enforcement) |
|
|
201
|
-
| `enum` / `const enum` | ✓ implemented (forward + reverse mapping) |
|
|
202
|
-
| `private` / `protected` / `public` / `readonly` modifiers | ✗ no access control (erased) |
|
|
203
|
-
| `abstract` / `implements` | ✗ (erased) |
|
|
204
|
-
| Parent/child `#x` name collisions | ✗ may alias (same literal key) |
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
## 7. Unimplemented type system (parsed only, not checked)
|
|
209
|
-
|
|
210
|
-
Type syntax is parsed into the AST and then **erased entirely** during binding /
|
|
211
|
-
code generation; no type checking is performed:
|
|
212
|
-
|
|
213
|
-
- Type annotations, return types, type parameters, type aliases, interfaces, generic constraints, etc.: parse ✓, check ✗.
|
|
214
|
-
- Checker diagnostic codes (`TypeMismatch` `NotCallable` `PropertyNotFound` `ArgumentCountMismatch`) are defined but **unused**.
|
|
215
|
-
- `as` / `satisfies` / non-null assertion `!`: erased directly, no assertion semantics.
|
|
216
|
-
- Generics: no runtime instantiation; type parameters are ignored.
|
|
217
|
-
- Optional chaining `?.` type narrowing: none (runtime short-circuit is implemented, but there is no type-level narrowing).
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## 8. Runtime / semantics differing from the standard (known deviations)
|
|
222
|
-
|
|
223
|
-
These features **compile and run**, but the result does not fully match ECMAScript:
|
|
224
|
-
|
|
225
|
-
| Item | Deviation |
|
|
226
|
-
| --- | --- |
|
|
227
|
-
| RegExp byte-oriented matching | The engine matches UTF-8 bytes: literal multi-byte text works, but `.` and character classes consume one byte per repetition (`\d` / `\w` stay ASCII). Offsets returned by `exec` / `search` / replacement callbacks are converted to UTF-16 code units |
|
|
228
|
-
| Global RegExp `lastIndex` | `test` / `exec` do not advance or honour a caller-set `lastIndex` for `/g` / `/y` regexes |
|
|
229
|
-
| String `normalize` / `structuredClone` | Not implemented |
|
|
230
|
-
| First-class built-in methods | Implemented as unbound method values (see section 5); `fn.toString()` returns a placeholder rather than source text |
|
|
231
|
-
| `for...in` | Enumerates own keys of objects / arrays / strings; does not include prototype-chain properties |
|
|
232
|
-
| Array out-of-bounds / sparse | Out-of-bounds access returns `undefined`; assigning `arr.length` truncates / extends, but sparse holes are not tracked distinctly |
|
|
233
|
-
| Memory management | Non-moving mark-sweep collector behind `xt_alloc`: explicit roots, subsystem root providers and a conservative C-stack scan. Single-threaded and stop-the-world; no moving/compaction or generational mode |
|
|
234
|
-
| Function `arity` / argument count | No argument count validation; `fn.length` reports the declared arity but calls are never checked against it |
|
|
235
|
-
| `async` / `await` | Real suspension on a stackful coroutine, but `await` on a value that is **already settled** continues synchronously instead of queueing a microtask as the specification requires, so interleaving with pending `.then` callbacks can differ. Top-level `await` blocks on the event loop rather than yielding the module body. `fs/promises` still performs the I/O synchronously before settling; `fetch` is blocking; `async` generators are unsupported |
|
|
236
|
-
| `super` | `super.x` / `super(...)` takes the prototype of `this`'s prototype; single-level inheritance is correct, but depth > 1 may be inaccurate |
|
|
237
|
-
| `Error.stack` | Function-level frames only: each frame is `at name (file:line)` with the function's declaration line (updated to the construction line for the innermost frame); no column numbers and no frames for generator / `async` bodies (they switch stacks) |
|
|
238
|
-
| Module live bindings | Namespace imports and imported bindings are snapshots (see section 4) |
|
|
239
|
-
| `import.meta` | ✓ `import.meta.url` / `.dirname` / `.filename`, resolved from the executable path |
|
|
240
|
-
|
|
241
|
-
> Number formatting, loose equality, `+` / relational `ToPrimitive`, whole-chain
|
|
242
|
-
> optional chaining, `finally` on early exit and object-key ordering have all
|
|
243
|
-
> been brought in line with Node and are covered by the differential tests, so
|
|
244
|
-
> they are no longer listed as deviations.
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
## 9. Unimplemented toolchain / platform / engineering
|
|
249
|
-
|
|
250
|
-
| Item | Status |
|
|
251
|
-
| --- | --- |
|
|
252
|
-
| GC (garbage collection) | ✓ non-moving mark-sweep in `xt_alloc.c`, armed by a live-heap threshold (`XT_GC_THRESHOLD` pins it) or `xt_gc_collect()`; after each collection the threshold becomes twice the surviving heap (floor 1 MiB), so the resident set follows the live set instead of only growing. `XT_GC_TRACE=1` prints one line per collection to stderr. Explicit roots + root providers + conservative active-stack scan. No compaction, weak references or background collection — without weak references an extension must keep a strong reference to every value it caches (the GUI's element handles do) |
|
|
253
|
-
| Self-hosting | ✓ the compiler compiles itself: `xbintsc build src/cli/main.ts` produces a working binary, and the emitted IR is stable from generation 1 onward. The runtime is still C |
|
|
254
|
-
| Type checker | ✗ only diagnostic codes are defined; no checker |
|
|
255
|
-
| Full standard library | partial: Math / JSON / Date / Map / Set / RegExp / `Error` / `BigInt` / `Symbol` implemented; String.normalize / structuredClone missing |
|
|
256
|
-
| Multi-file module bundling | partial: relative-path `.ts` bundling, ESM `node_modules` packages, namespace imports and bare-specifier extension module imports implemented; circular dependencies / CommonJS / live bindings not implemented |
|
|
257
|
-
| Real async runtime | ✓ `async`/`await` suspends on pending promises on the `select(2)` reactor: timers, TCP sockets and promise callbacks resume the coroutine. Still missing: truly asynchronous I/O scheduling (`fs/promises` blocks before settling), a non-blocking `fetch` and worker threads (workers are child processes) |
|
|
258
|
-
| Windows binary artifact verification | adapted at the build layer (`.exe` suffix, link flag branch), verified in CI |
|
|
259
|
-
| Precise ECMAScript number / string / comparison semantics | partial, see section 8 |
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## 10. Quick reference: unimplemented / partially implemented list
|
|
264
|
-
|
|
265
|
-
```
|
|
266
|
-
Unimplemented (statements): namespace/module declarations
|
|
267
|
-
|
|
268
|
-
Unimplemented (expressions): new.target (clear UnsupportedFeature)
|
|
269
|
-
|
|
270
|
-
Unimplemented (functions): `fn.toString()` source text, async generators (rejected)
|
|
271
|
-
|
|
272
|
-
Unimplemented (classes/OO): abstract/implements, access control,
|
|
273
|
-
parent/child #x collision
|
|
274
|
-
|
|
275
|
-
Unimplemented (standard library): String.normalize, structuredClone
|
|
276
|
-
|
|
277
|
-
Unimplemented (modules): circular dependencies, live bindings, dynamic
|
|
278
|
-
`require(expr)`, `require.resolve` / `require.cache`,
|
|
279
|
-
`__dirname` / `__filename`
|
|
280
|
-
|
|
281
|
-
Unimplemented (type system): type checking, generic instantiation, assertion
|
|
282
|
-
semantics, optional-chaining narrowing
|
|
283
|
-
|
|
284
|
-
Unimplemented (runtime): asynchronous I/O scheduling,
|
|
285
|
-
global-regex lastIndex
|
|
18
|
+
> Language: **English** | [简体中文](./zh-CN/unimplemented.md)
|
|
286
19
|
|
|
287
|
-
|
|
288
|
-
|
|
20
|
+
## Contents
|
|
21
|
+
|
|
22
|
+
- [Statements](./unimplemented/statements.md) — statement forms that do not lower
|
|
23
|
+
- [Expressions and operators](./unimplemented/expressions.md) — expression forms and operators that do not lower
|
|
24
|
+
- [Standard library](./unimplemented/stdlib.md) — what the built-in objects are still missing, including typed arrays
|
|
25
|
+
- [Module system](./unimplemented/modules.md) — circular dependencies, live bindings, CommonJS boundaries
|
|
26
|
+
- [Functions](./unimplemented/functions.md) — missing function semantics
|
|
27
|
+
- [Classes and OO](./unimplemented/classes.md) — access control, `abstract`/`implements`, private-name collisions
|
|
28
|
+
- [Type system](./unimplemented/types.md) — parsed but never checked
|
|
29
|
+
- [Runtime deviations](./unimplemented/deviations.md) — compiles and runs, but differs from ECMAScript
|
|
30
|
+
- [Toolchain and platform](./unimplemented/toolchain.md) — type checker, async I/O, GC modes, platform gaps
|
|
31
|
+
- [Node extension](./unimplemented/node.md) — Node module gaps, one page per area
|
|
@@ -26,6 +26,18 @@
|
|
|
26
26
|
"description": "Optimization level (default: 2).",
|
|
27
27
|
"enum": ["0", "1", "2", "3"]
|
|
28
28
|
},
|
|
29
|
+
"lto": {
|
|
30
|
+
"type": "boolean",
|
|
31
|
+
"description": "Compile program and runtime to LTO bitcode and link with lld."
|
|
32
|
+
},
|
|
33
|
+
"pgo": {
|
|
34
|
+
"enum": ["generate", "use"],
|
|
35
|
+
"description": "Profile-guided optimization stage."
|
|
36
|
+
},
|
|
37
|
+
"pgoDir": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "Profile directory for pgo (default: <outDir>/pgo)."
|
|
40
|
+
},
|
|
29
41
|
"extensions": {
|
|
30
42
|
"type": "array",
|
|
31
43
|
"items": { "type": "string" },
|
package/doc/zh-CN/gui/api.md
CHANGED
|
@@ -64,6 +64,7 @@ win.documentTree() // 序列化的 DOM(调试用)
|
|
|
64
64
|
win.layoutTree() // 序列化的布局盒(调试用)
|
|
65
65
|
win.paintCount() // 显示列表中图形的数量
|
|
66
66
|
win.paintList() // 序列化的显示列表(调试用)
|
|
67
|
+
win.inlineSvg(selector) // 序列化的内联 <svg>:{ markup, width, height, shapes }
|
|
67
68
|
win.measureText(text, fontSize?, family?) // 整形后的推进宽度(像素)
|
|
68
69
|
win.fontMetrics(fontSize?, family?) // { ascent, descent, lineHeight, ready }
|
|
69
70
|
win.hitTest(x, y) // 最深的元素描述符,或 ""
|
|
@@ -72,6 +73,12 @@ win.advance(ms) // 推进 CSS transition 时钟(测试
|
|
|
72
73
|
win.stats() // 引擎/运行时计数器(内存排查用)
|
|
73
74
|
```
|
|
74
75
|
|
|
76
|
+
`win.inlineSvg(selector)` 返回引擎为第一个匹配 `selector` 的 `<svg>` 元素构建的
|
|
77
|
+
独立 SVG 文档(`markup`),以及 NanoSVG 从它解析出的固有尺寸与图形数量;没有
|
|
78
|
+
匹配或元素不是 `<svg>` 时返回 `undefined`。它让序列化器的规范大小写
|
|
79
|
+
(`viewBox`、`linearGradient`、`gradientUnits` 等)无需 GPU 即可测试——HTML
|
|
80
|
+
解析器会把它们全部小写化。
|
|
81
|
+
|
|
75
82
|
`win.stats()` 返回 `{ heapBytes, heapAllocations, treeNodes, detachedRoots,`
|
|
76
83
|
`detachedNodes, handles, handleSlots, listeners }`:运行时存活堆、DOM 树规模、
|
|
77
84
|
分离节点池(detached pool)以及元素句柄表。稳定状态下它们都应保持常量——若
|
package/doc/zh-CN/gui/build.md
CHANGED
|
@@ -19,10 +19,17 @@
|
|
|
19
19
|
- `src/extensions/gui/index.ts` 通过 `nativeObjects()` 暴露该归档(经由
|
|
20
20
|
`findRuntimeLibrary`,因此 `.a`/`.lib` 都可用),并通过 `linkerFlags()`
|
|
21
21
|
暴露操作系统框架。
|
|
22
|
+
- `scripts/build-gui.ts` 使用与驱动**相同**的 clang
|
|
23
|
+
(`src/driver/toolchain-provider.ts`);Windows 上就是 Visual Studio 自带的、
|
|
24
|
+
面向 MSVC 的 LLVM,并配套使用其同目录下的 `clang++`/`llvm-ar` 来配置 CMake、
|
|
25
|
+
编译引擎和合并归档。脚本不提供 `gcc`/`g++` 回退,Windows 上也始终使用
|
|
26
|
+
`llvm-ar`,因此归档不会混入其他目标文件格式或 C++ 运行时。Visual Studio
|
|
27
|
+
工具链按绝对路径查找,无需开发者命令提示符。Windows 上 SDL_GPU 会选择 Vulkan
|
|
28
|
+
后端,不需要 DXIL/`dxc` 工具链。
|
|
22
29
|
- CI 在组装发布归档之前构建 `gui.a`,因此它会随 `runtime/lib/<slug>/` 一起
|
|
23
30
|
发布(发布 tarball 会复制整个 `runtime/` 树)。归档在 Linux(Xvfb 下,
|
|
24
31
|
使用 lavapipe 软件 Vulkan 驱动)与 macOS 上构建并运行示例;Windows 为
|
|
25
|
-
|
|
32
|
+
试验性,因为托管 runner 没有 GPU/Vulkan 驱动。
|
|
26
33
|
- 现有的缓存指纹已经会对 `nativeObjects()` 的内容做哈希,因此重建 `gui.a`
|
|
27
34
|
会自动使缓存二进制失效。
|
|
28
35
|
- CMake 构建树位于其源码**旁边**(`vendor/sdl-build`、`vendor/freetype-build`、
|
|
@@ -55,8 +62,9 @@ xbintsc run examples/gui/hello.ts --ext gui
|
|
|
55
62
|
`volume` 驱动播放。媒体 `src` 相对于进程工作目录解析,因此从仓库根目录运行:
|
|
56
63
|
`xbintsc run examples/gui/media.ts --ext gui`。几何报告见该目录的 README。
|
|
57
64
|
|
|
58
|
-
这些测试套件在 Windows
|
|
59
|
-
|
|
65
|
+
这些测试套件在 Windows 上默认跳过(归档可以在本机通过 Vulkan 运行,但 CI
|
|
66
|
+
runner 没有可用的 GPU 驱动)。如果本机有 `gui.lib` 与可用的 GPU,可用
|
|
67
|
+
`xbintsc_GUI_TESTS=1` 选择启用:
|
|
60
68
|
|
|
61
69
|
```bat
|
|
62
70
|
set xbintsc_GUI_TESTS=1
|
|
@@ -23,13 +23,14 @@
|
|
|
23
23
|
`tests/e2e/gui-example-browser.test.ts` 中。
|
|
24
24
|
- **`display: none -> flex` 的重排。** 通过类名切换让隐藏元素显示在 flex 容器上时,也曾观察
|
|
25
25
|
到同样的崩溃;`examples/gui/pelican-bike` 改用 `opacity` 显示游戏结束遮罩。
|
|
26
|
-
- **SVG
|
|
27
|
-
|
|
28
|
-
`
|
|
29
|
-
`<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
- **SVG 是 NanoSVG 的子集。** SVG *文件*(`<img src="logo.svg">`)与内联
|
|
27
|
+
`<svg>` 子树共用 vendored 的 NanoSVG 解析/光栅化器(`runtime/ext_gui/svg.cpp`、
|
|
28
|
+
`inline_svg.cpp`),它会渲染 `path`/`rect`/`circle`/`ellipse`/`line`/
|
|
29
|
+
`polyline`/`polygon`、组、`defs` 渐变以及基于 `class` 的 `<style>` 规则。
|
|
30
|
+
`<text>`、`<use>`、滤镜、遮罩与裁剪路径不会渲染,文档层叠的 CSS 也不会进入
|
|
31
|
+
图像内部(这里的 `fill`/`stroke` 是 SVG 表现属性,不是 CSS 属性)。需要这些
|
|
32
|
+
能力的矢量美术必须预先光栅化、用盒子绘制,或限制在受支持的语法内。参见
|
|
33
|
+
[媒体](./media.md#图像m6a)。
|
|
33
34
|
|
|
34
35
|
## 待决问题
|
|
35
36
|
|
|
@@ -43,12 +44,16 @@
|
|
|
43
44
|
for 'RuntimeLibrary'`,外加满屏 `LNK2005: already defined`,最终表现为
|
|
44
45
|
`clang: linker command failed with exit code 1169`。现在
|
|
45
46
|
`src/extensions/gui/index.ts` 只列系统库(`user32`、`gdi32`、`d3d12` 等)。
|
|
46
|
-
Windows
|
|
47
|
+
Windows 链接不再需要手动准备 MSVC 环境:`scripts/build-gui.ts` 会解析与驱动
|
|
48
|
+
相同的、面向 MSVC 的 clang(`PATH` 上没有更新版本时就是 Visual Studio 自带的
|
|
49
|
+
LLVM)。
|
|
47
50
|
- Windows:`scripts/build-gui.ts` 会生成 MSVC 兼容的 `gui.lib`
|
|
48
51
|
(COFF 对象 + `ar -M`/`llvm-ar`),但尚未在 CI 中验证,因此 Windows 步骤
|
|
49
52
|
为试验性(job 保持绿色),`package` 会跳过它;在开发者机器上构建并运行
|
|
50
|
-
`examples/gui/pelican-svg` 与 `examples/gui/pelican-bike`
|
|
51
|
-
|
|
53
|
+
`examples/gui/pelican-svg` 与 `examples/gui/pelican-bike` 是可以的。那里
|
|
54
|
+
SDL_GPU 会选择 **Vulkan** 后端(`win.driver()` 返回 `"vulkan"`),因此归档
|
|
55
|
+
不需要 DXIL/`dxc` 工具链;托管 Windows runner 没有 GPU/Vulkan 驱动,这才是
|
|
56
|
+
CI 运行仍为试验性的原因。
|
|
52
57
|
- **Windows 上的媒体:** 媒体解码器(FFmpeg)只构建并合并进 POSIX 的
|
|
53
58
|
`gui.a`;Windows 的 `gui.lib` 不含它们,因此那里的 `<video>`/`<audio>` 为空
|
|
54
59
|
操作(失败会触发 `error`)。启用它需要 MSVC 兼容的 FFmpeg 构建,推迟到
|
|
@@ -57,4 +62,5 @@
|
|
|
57
62
|
- **D3D12 着色器:** SPIR-V(Vulkan)与 DXIL(Direct3D 12)二进制块均已构建并
|
|
58
63
|
内嵌,非 Metal 路径不再跳过几何绘制。但在 **SDL 3.2.10** 上 DXIL 仍不可用:
|
|
59
64
|
其 D3D12 后端会拒绝任何着色器中声明了 uniform buffer 的图形管线,而引擎正是
|
|
60
|
-
用这种方式传视口。
|
|
65
|
+
用这种方式传视口。Windows 实际会选择 Vulkan,因此不受影响;若将来强制走
|
|
66
|
+
D3D12,需在 SDL 升级后重新确认。
|
package/doc/zh-CN/gui/media.md
CHANGED
|
@@ -12,7 +12,8 @@ PNG/JPEG/BMP/GIF/TGA 解码为 RGBA8,并带有解码缓存与仅头文件的
|
|
|
12
12
|
`runtime/ext_gui/svg.{h,cpp}` 在其上增加 SVG:它封装 vendored **NanoSVG**
|
|
13
13
|
库(解析 + 抗锯齿扫描线光栅化),按扩展名或内容识别 SVG,并产出与既有管线
|
|
14
14
|
相同的 RGBA8 `Image`。`stb_image` 无法解码 SVG,这正是
|
|
15
|
-
`<img src="logo.svg">`
|
|
15
|
+
`<img src="logo.svg">` 能工作的原因。内联 `<svg>` 子树会先被序列化成一个
|
|
16
|
+
独立文档(`inline_svg.{h,cpp}`),再交给同一个解析器。
|
|
16
17
|
|
|
17
18
|
- `<img>` 是一个替换元素(`display: inline-block`):设置了 CSS 尺寸时布局
|
|
18
19
|
采用该尺寸,否则采用固有像素尺寸;当只约束一个轴时保持宽高比。构建盒树时
|
|
@@ -23,11 +24,34 @@ PNG/JPEG/BMP/GIF/TGA 解码为 RGBA8,并带有解码缓存与仅头文件的
|
|
|
23
24
|
**位图**按固有分辨率解码并按路径缓存;**矢量图**(SVG)按设备像素下的绘制
|
|
24
25
|
尺寸(逻辑尺寸 × 窗口像素密度)光栅化并保持 viewBox 宽高比,再按该尺寸缓存,
|
|
25
26
|
因此缩放或 HiDPI 得到的是清晰渲染而非放大的位图。
|
|
27
|
+
- **内联** `<svg>` 元素与 `<img>` 一样是替换元素,但它的来源就是 DOM 子树
|
|
28
|
+
本身。`runtime/ext_gui/inline_svg.{h,cpp}` 把该子树序列化回独立 SVG 文档,
|
|
29
|
+
还原 HTML 解析器会小写掉的、NanoSVG 又按大小写精确匹配的拼写(`viewBox`、
|
|
30
|
+
`preserveAspectRatio`、`linearGradient`、`gradientUnits` 等)。布局先取
|
|
31
|
+
`width`/`height` 属性、其次 `viewBox`、最后 300x150 作为固有尺寸;绘制把
|
|
32
|
+
markup 挂在图像 op 上,渲染器按绘制设备像素尺寸,通过与 SVG 文件相同的
|
|
33
|
+
NanoSVG 缓存解析并光栅化。DOM 变更会在下一次布局时重新序列化(因此
|
|
34
|
+
`setAttribute` 与 `innerHTML` 都会重绘图像),markup 缓存有界
|
|
35
|
+
(最近最少使用),动画文档不会让它无限增长。
|
|
26
36
|
- 解析结果按路径缓存;解析与光栅化器状态在 `xt_svg_shutdown`
|
|
27
37
|
(`xt_image_shutdown`)中释放。
|
|
28
38
|
|
|
39
|
+
文档 CSS 只作用于 `<svg>` **盒子**——尺寸、外边距、背景、边框、`transform`、
|
|
40
|
+
opacity、`display`——与任何其他元素一样。盒子内部的艺术内容保持 SVG 语义:
|
|
41
|
+
表现属性与 SVG `<style>` 中基于 `class` 的规则由 NanoSVG 读取,而不是 HTML
|
|
42
|
+
层叠,所以这里的 `fill`/`stroke` 不是 CSS 属性。对布局、绘制、命中测试与事件
|
|
43
|
+
而言整个 `<svg>` 就是一个替换盒:其子元素没有 DOM 盒,因此点击的 `e.target`
|
|
44
|
+
是 `<svg>` 元素而不是某个 `<rect>`。渲染器按 markup 与尺寸缓存纹理,所以每帧
|
|
45
|
+
重写艺术内容的程序会为每个变体保留一张纹理;更好的做法是用 `transform`、
|
|
46
|
+
`opacity` 给盒子做动画,或在一小组文档之间切换。
|
|
47
|
+
|
|
29
48
|
图像仍需完成:CSS `background-image: url(...)`、`data:` URI、`object-fit`、
|
|
30
|
-
|
|
49
|
+
九宫格边框。
|
|
50
|
+
|
|
51
|
+
两种 SVG 都受限于 NanoSVG 的子集:`path`、`rect`、`circle`、`ellipse`、
|
|
52
|
+
`line`、`polyline`、`polygon`、组(`g`)、带线性/径向渐变的 `defs` 以及基于
|
|
53
|
+
`class` 的 `<style>` 规则会被光栅化;`<text>`、`<use>`、滤镜、遮罩与裁剪路径
|
|
54
|
+
不会渲染(见[已知问题](./known-issues.md))。
|
|
31
55
|
|
|
32
56
|
## 视频与音频(M13)
|
|
33
57
|
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
各自的描述性名称。
|
|
38
38
|
需注意:SDL 3.2.10 的 Direct3D 12 后端无法创建着色器中声明了 uniform buffer 的
|
|
39
39
|
图形管线(返回 `E_INVALIDARG`);引擎正是用这种方式传视口,因此 DXIL 这条路已
|
|
40
|
-
构建但在上游修复前不可用。
|
|
40
|
+
构建但在上游修复前不可用。Windows 不受影响:SDL_GPU 在那里会选择 Vulkan 后端
|
|
41
|
+
(由 `win.driver()` 确认),使用 SPIR-V 二进制块。
|
|
41
42
|
- 图形片元着色器中的**圆角矩形距离场**提供抗锯齿填充;顶点携带
|
|
42
43
|
`position`、`local`、`half extents`、`radius` 与颜色,一个视口尺寸的
|
|
43
44
|
push constant 负责投影。启用 alpha 混合。
|
package/doc/zh-CN/gui.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 语言 / Language:[English](../gui.md) | **简体中文**
|
|
4
4
|
|
|
5
|
-
状态:**
|
|
5
|
+
状态:**M16** —— 功能(M1–M15)已全部完成:HTML 解析、CSS 选择器匹配、层叠(cascade)、计算样式与布局(块级、行内、Flexbox 与 CSS 定位)均已就位,引擎还会**绘制**:它构建一个由矩形、图像与排版后的文本 run 组成的显示列表,并通过 SDL_GPU 渲染。输入事件会经过命中测试并投递给原生 TS 处理器,`:hover`/`:focus` 会被动态匹配,`<img>` 依据其固有尺寸确定大小并从纹理绘制——位图(PNG/JPEG/…)与 SVG 文件皆可,后者按绘制尺寸光栅化,因此矢量图保持清晰——CSS transition 会为绘制属性做动画。**M16** 让内联 `<svg>` 子树获得同样的处理:子树被序列化回 SVG 文档,并按绘制设备尺寸光栅化,因此图标不再需要单独的文件。**M8** 增加了交互式 DOM:具有稳定标识的元素句柄、变更操作(`appendChild`、`textContent`、`classList`、`style` 等)以及支持捕获/冒泡的元素级事件。**M9** 会提前编译 `<script>` 主体(内联与 `<script src>`)——参见 `gui-scripts.md`。**M10** 增加 `requestAnimationFrame` 以及若干 DOM 辅助方法。**M11** 增加 `position: relative`/`absolute`/`fixed` 及其偏移,`examples/gui/pelican-bike`(一个可玩的 2D 游戏)就构建在它之上。**M12** 明确了 DOM 节点生命周期(哪些变更释放、哪些保留),并让引擎内存有界:参见[节点生命周期](./gui/dom.md)与[内存与 GC](./gui/runtime.md)。**M13** 真正播放
|
|
6
6
|
`<video>`/`<audio>`——一个 vendored 的最小 FFmpeg 在主线程解码,视频帧走图像
|
|
7
7
|
纹理路径、音频进入 SDL 流,DOM 媒体 API 暴露 `play`/`pause`/`currentTime`/…
|
|
8
8
|
与媒体事件。**M14** 增加了 `<canvas>`,配一个自研的 2D 软件光栅器(抗锯齿
|
|
@@ -143,8 +143,9 @@ FFmpeg `7.1`(可用 `SDL3_TAG` / `FREETYPE_VERSION` / `HARFBUZZ_VERSION` /
|
|
|
143
143
|
一起发布(`package-release` 复制整个 `runtime/`)。
|
|
144
144
|
- `vendor/`(SDL3/FreeType/HarfBuzz,缓慢的部分)按 OS/arch 缓存,以
|
|
145
145
|
`scripts/build-gui.ts` 为键。
|
|
146
|
-
- Windows(构建 +
|
|
147
|
-
|
|
146
|
+
- Windows(构建 + 运行)在 CI 中保持试验性:MSVC 兼容的 `gui.lib` 可在本机
|
|
147
|
+
通过 SDL_GPU 的 Vulkan 后端构建并运行,但托管 runner 没有 GPU/Vulkan
|
|
148
|
+
驱动。失败只记录日志而不标注运行(见[待决问题](./gui/known-issues.md))。
|
|
148
149
|
8. **M8 — 交互式 DOM** ✅
|
|
149
150
|
- 具有稳定标识的元素/文档句柄、通过运行时访问器读写属性、遍历/特性/查询、
|
|
150
151
|
带有延迟重算样式/重新布局的变更
|
|
@@ -211,6 +212,16 @@ FFmpeg `7.1`(可用 `SDL3_TAG` / `FREETYPE_VERSION` / `HARFBUZZ_VERSION` /
|
|
|
211
212
|
[布局](./gui/layout.md#变换m15)与[动画](./gui/animation.md#css-transformm15);
|
|
212
213
|
e2e 见 `tests/e2e/gui-transform.test.ts` 与
|
|
213
214
|
`tests/e2e/gui-example-svg.test.ts`。
|
|
215
|
+
16. **M16 — 内联 `<svg>`** ✅
|
|
216
|
+
- `<svg>` 是替换元素(`layout.*`):固有尺寸先取 `width`/`height` 属性,
|
|
217
|
+
其次 `viewBox`,最后 300x150;常规盒树遍历不再进入其子元素。
|
|
218
|
+
- `inline_svg.{h,cpp}` 把子树序列化为独立 SVG 文档,并还原 HTML 解析器
|
|
219
|
+
小写掉的、区分大小写的名称(`viewBox`、`preserveAspectRatio`、
|
|
220
|
+
`linearGradient`、`gradientUnits` 等)。
|
|
221
|
+
- 绘制把 markup 挂在图像 op 上(`PaintImage::svg`),渲染器按绘制设备尺寸、
|
|
222
|
+
通过与 SVG 文件相同的 NanoSVG 缓存(`svg.{h,cpp}`)解析并光栅化;markup
|
|
223
|
+
缓存有界,DOM 变更会在下一次布局时重新序列化。e2e 见
|
|
224
|
+
`tests/e2e/gui-inline-svg.test.ts`。
|
|
214
225
|
|
|
215
226
|
## 进度日志
|
|
216
227
|
|
|
@@ -298,4 +309,11 @@ FFmpeg `7.1`(可用 `SDL3_TAG` / `FREETYPE_VERSION` / `HARFBUZZ_VERSION` /
|
|
|
298
309
|
`getBoundingClientRect` 返回变换后的包围盒。`examples/gui/pelican-svg` 用它
|
|
299
310
|
为自己的画做动画;e2e 见 `tests/e2e/gui-transform.test.ts` 与
|
|
300
311
|
`tests/e2e/gui-example-svg.test.ts`。
|
|
312
|
+
- **M16** ✅ 内联 `<svg>`。`buildBoxTree` 把 `<svg>` 元素当作替换盒(固有尺寸
|
|
313
|
+
依次取 `width`/`height`、`viewBox`、300x150)并停止下探,
|
|
314
|
+
`inline_svg.{h,cpp}` 以规范 SVG 大小写序列化子树,绘制把 markup 放进
|
|
315
|
+
`PaintImage::svg`,`renderer_image.cpp` 通过 NanoSVG 缓存(`svg.{h,cpp}`,
|
|
316
|
+
markup 采用有界 LRU)按绘制设备像素尺寸光栅化。`win.inlineSvg` 诊断钩子
|
|
317
|
+
暴露序列化文档,`tests/e2e/gui-inline-svg.test.ts` 固定了尺寸、命中测试、
|
|
318
|
+
渐变、CSS 盒样式与 DOM 变更。
|
|
301
319
|
|
package/doc/zh-CN/icon.md
CHANGED
|
@@ -148,7 +148,8 @@ const unsigned int xt_app_icon_height;
|
|
|
148
148
|
|
|
149
149
|
- `src/cli/main.ts`:新增 `--icon`、`--bundle`、`--app-name`、`--app-id`、
|
|
150
150
|
`--config`、`--no-config`,并与配置合并(`mergeAppConfig`)。
|
|
151
|
-
- `src/driver/
|
|
151
|
+
- `src/driver/options.ts`:`BuildOptions.icon` 与 `BuildOptions.app`(由
|
|
152
|
+
`src/driver/build-key.ts` 计入缓存键)。
|
|
152
153
|
- 图标的**内容哈希**与打包选项计入可执行文件 `cacheKey`,图标变化即重建。
|
|
153
154
|
- 图标对象以及(win32 上)资源对象追加到链接输入。
|
|
154
155
|
- 链接后生成 macOS `.app` bundle;`BuildResult.bundlePath` 返回其路径
|
|
@@ -161,8 +162,8 @@ const unsigned int xt_app_icon_height;
|
|
|
161
162
|
1. PNG 输入被包进最小 ICO 容器(`ICONDIR` + 指向 PNG 载荷的 `ICONDIRENTRY`);
|
|
162
163
|
Vista+ 接受 PNG-in-ICO。
|
|
163
164
|
2. 在缓存中写入 `.rc`(`1 ICON "icon-<hash>.ico"`)。
|
|
164
|
-
3.
|
|
165
|
-
|
|
165
|
+
3. 运行 `llvm-rc /fo app.res app.rc`(解析出的 clang 同目录或 `PATH`)。
|
|
166
|
+
`llvm-rc` 用 `/?` 探测(它没有 `--version`)。可用 `xbintsc_RC` 覆盖。
|
|
166
167
|
4. 找不到资源编译器时继续构建(仅运行时图标),装饰性功能绝不导致构建硬失败。
|
|
167
168
|
|
|
168
169
|
#### macOS(`MyApp.app` bundle)—— `src/driver/mac-bundle.ts`
|
|
@@ -213,7 +214,7 @@ Wayland。
|
|
|
213
214
|
|
|
214
215
|
- `tests/driver/config.test.ts` —— 解析/校验、发现、路径解析。
|
|
215
216
|
- `tests/driver/icon.test.ts` —— 格式识别、生成的 C、ICO 转换、图标对象缓存、
|
|
216
|
-
`llvm-rc
|
|
217
|
+
`llvm-rc` 命令行、mac bundle 布局与退化路径,以及 `build()` 集成
|
|
217
218
|
(链接图标对象;图标缺失 ⇒ `DiagnosticCode.IOError`)。
|
|
218
219
|
- `tests/e2e/icon.test.ts` —— 用 `app.icon` 编译真实 GUI 程序,断言可执行文件中
|
|
219
220
|
存在 PNG 字节,并在无头模式运行;darwin 上校验 `.app` bundle 与 `.icns`。
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 异步、Promise 与生成器
|
|
2
|
+
|
|
3
|
+
> 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/async.md)
|
|
4
|
+
|
|
5
|
+
实现位置:`runtime/xt_async.c`、`runtime/xt_coroutine.c`、`runtime/xt_promise.c`、
|
|
6
|
+
`runtime/xt_generator.c`、`runtime/xt_loop.c`、`runtime/xt_async_io.c`、
|
|
7
|
+
`runtime/xt_performance.c`。
|
|
8
|
+
|
|
9
|
+
## async / await
|
|
10
|
+
|
|
11
|
+
- `async` 闭包用 `xt_function_set_async` 标记;调用时在栈式协程(`xt_coroutine.c`、`xt_async.c`)上运行函数体并立即返回 promise。
|
|
12
|
+
- 函数体同步执行到第一个等待**未 settle** promise 的 `await` 后挂起;promise settle 时排入微任务恢复协程。
|
|
13
|
+
- 逃出函数体的异常会让该 promise reject,而不是同步抛出。
|
|
14
|
+
- `await` 非 promise 或已 settle 的值仍走同步快路径,rejection 触发异常。
|
|
15
|
+
- 每次 `async` 调用拥有私有栈,切换异常帧栈与 GC 栈区间,因此 `await` 可跨越 `try`/`finally`、循环与闭包。由定时器、套接字回调或另一个协程 settle 的 promise 会在微任务队列上恢复挂起的函数体。
|
|
16
|
+
|
|
17
|
+
## 异步生成器
|
|
18
|
+
|
|
19
|
+
- `async function*` 闭包用 `xt_function_set_async_generator` 标记;每次 `.next()` / `.throw()` / `.return()` 入队一个请求并返回 promise。
|
|
20
|
+
- 函数体在生成器协程上运行,可在 `yield` 或 `await` 处挂起;`xt_generator_await` 将协程挂在被等待的 promise 上,并让当前请求保持 pending,直到下一次 yield 或函数体结束。
|
|
21
|
+
- `for await...of` 降级为 `xt_async_iter_open` / `xt_async_iter_next` + `xt_await`,因此同时支持异步可迭代对象与同步迭代协议。`Symbol.asyncIterator` 已支持。
|
|
22
|
+
|
|
23
|
+
## 生成器
|
|
24
|
+
|
|
25
|
+
- `function*` / `yield` / `yield*`,以及 `.next()` / `.throw()` / `.return()`,基于同一套栈式协程运行时实现。
|
|
26
|
+
- 支持 `for...of`、展开与委托。
|
|
27
|
+
|
|
28
|
+
## Promise
|
|
29
|
+
|
|
30
|
+
- 微任务队列(`xt_microtasks`);`xt_promise_ctor/resolve/reject/static`(含 `withResolvers`)、实例 `then` / `catch` / `finally`。
|
|
31
|
+
- `xt_drain_microtasks` 在程序结束时清空队列,事件循环也会在回调之间清空它。
|
|
32
|
+
- `xt_await` 对非 Promise / 已 settle 值排入一次微任务,对 pending promise 则挂起当前 async 协程直到 settle。
|
|
33
|
+
|
|
34
|
+
## 定时器与事件循环
|
|
35
|
+
|
|
36
|
+
- `setTimeout` / `clearTimeout` / `setInterval` / `clearInterval` / `setImmediate` / `clearImmediate` / `queueMicrotask` 与 `performance.now`(单调递增的小数毫秒)。
|
|
37
|
+
- 定时器使用数字 id;未实现 `Timeout` / `Immediate` 对象。
|
|
38
|
+
- 定时器 settle 的 promise 可以被 await:async 函数体在 pending promise 上挂起,定时器触发时恢复。套接字与服务端(`net`、`http`、`dgram`)的回调在同一事件循环上投递。
|
|
39
|
+
- `fetch` 与 `fs/promises` 由 reactor 驱动而不是阻塞 —— 见下一节。
|
|
40
|
+
|
|
41
|
+
## 异步 I/O offload
|
|
42
|
+
|
|
43
|
+
- `runtime/xt_async_io.c` 维护一个小型工作线程池(默认 4 个,惰性创建)。每个 job 分成两半:worker 上的 `run` 只能访问纯 C 内存;主线程上的 `complete` 才构造值并 settle promise。这个拆分让回收器与值模型保持单线程。
|
|
44
|
+
- job 完成后通过自管道(POSIX)或回环 UDP 套接字(Windows)唤醒 `select(2)`;reactor 也会轮询线程池,因此唤醒失败只会退化为短暂等待,而不会挂起。
|
|
45
|
+
- job 排队或运行期间,每个 job 最多四个值(promise;对 `fetch` 还有 headers 对象)保存在 job 的 root 槽中,由回收器扫描。
|
|
46
|
+
- `fetch` 把每一跳请求/重定向作为 job 执行;`fs/promises` 把每个文件与描述符操作作为 job 执行。两者都不会阻塞定时器、套接字或其他 `await`。
|
|
47
|
+
- 仍有 job 未完成时事件循环保持存活(`xt_loop_has_work`),线程池空闲后退出。
|
|
48
|
+
|
|
49
|
+
异步表面的已知限制(`fetch` 无 TLS/流式、`fs.watch` 不触发、线程池固定 4 个 worker)列在[运行时偏差](../unimplemented/deviations.md)与各 Node 页面。
|