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.
Files changed (490) hide show
  1. package/AGENTS.md +20 -10
  2. package/README.md +8 -7
  3. package/README.zh-CN.md +6 -6
  4. package/dist/src/binder/declarations.js +14 -3
  5. package/dist/src/binder/declarations.js.map +1 -1
  6. package/dist/src/cli/hints.js +7 -1
  7. package/dist/src/cli/hints.js.map +1 -1
  8. package/dist/src/cli/main.js +115 -15
  9. package/dist/src/cli/main.js.map +1 -1
  10. package/dist/src/cli/watch.d.ts +25 -0
  11. package/dist/src/cli/watch.js +93 -0
  12. package/dist/src/cli/watch.js.map +1 -0
  13. package/dist/src/codegen/generator/calls/access.js +11 -2
  14. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  15. package/dist/src/codegen/generator/calls/closures.js +12 -4
  16. package/dist/src/codegen/generator/calls/closures.js.map +1 -1
  17. package/dist/src/codegen/generator/context.d.ts +8 -0
  18. package/dist/src/codegen/generator/context.js +22 -3
  19. package/dist/src/codegen/generator/context.js.map +1 -1
  20. package/dist/src/codegen/generator/expressions/operators.js +17 -15
  21. package/dist/src/codegen/generator/expressions/operators.js.map +1 -1
  22. package/dist/src/codegen/generator/expressions/primary.js +5 -0
  23. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  24. package/dist/src/codegen/generator/module.js +0 -7
  25. package/dist/src/codegen/generator/module.js.map +1 -1
  26. package/dist/src/codegen/generator/numeric.d.ts +6 -3
  27. package/dist/src/codegen/generator/numeric.js +54 -11
  28. package/dist/src/codegen/generator/numeric.js.map +1 -1
  29. package/dist/src/codegen/generator/state.js +23 -0
  30. package/dist/src/codegen/generator/state.js.map +1 -1
  31. package/dist/src/codegen/generator/statements/control-flow.js +1 -4
  32. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
  33. package/dist/src/codegen/generator/statements/loops.js +48 -16
  34. package/dist/src/codegen/generator/statements/loops.js.map +1 -1
  35. package/dist/src/codegen/generator/tables.js +26 -1
  36. package/dist/src/codegen/generator/tables.js.map +1 -1
  37. package/dist/src/diagnostics/diagnostic.d.ts +3 -1
  38. package/dist/src/diagnostics/diagnostic.js +23 -3
  39. package/dist/src/diagnostics/diagnostic.js.map +1 -1
  40. package/dist/src/driver/app-artifacts.d.ts +42 -0
  41. package/dist/src/driver/app-artifacts.js +53 -0
  42. package/dist/src/driver/app-artifacts.js.map +1 -0
  43. package/dist/src/driver/build-key.d.ts +29 -0
  44. package/dist/src/driver/build-key.js +35 -0
  45. package/dist/src/driver/build-key.js.map +1 -0
  46. package/dist/src/driver/bundler/graph.js +61 -12
  47. package/dist/src/driver/bundler/graph.js.map +1 -1
  48. package/dist/src/driver/bundler/merge.js +7 -1
  49. package/dist/src/driver/bundler/merge.js.map +1 -1
  50. package/dist/src/driver/compiler.d.ts +10 -67
  51. package/dist/src/driver/compiler.js +95 -234
  52. package/dist/src/driver/compiler.js.map +1 -1
  53. package/dist/src/driver/config.d.ts +3 -0
  54. package/dist/src/driver/config.js +8 -0
  55. package/dist/src/driver/config.js.map +1 -1
  56. package/dist/src/driver/frontend.d.ts +37 -0
  57. package/dist/src/driver/frontend.js +92 -0
  58. package/dist/src/driver/frontend.js.map +1 -0
  59. package/dist/src/driver/index.d.ts +1 -1
  60. package/dist/src/driver/index.js.map +1 -1
  61. package/dist/src/driver/options.d.ts +64 -0
  62. package/dist/src/driver/options.js +9 -0
  63. package/dist/src/driver/options.js.map +1 -0
  64. package/dist/src/driver/runtime-objects.d.ts +38 -0
  65. package/dist/src/driver/runtime-objects.js +112 -0
  66. package/dist/src/driver/runtime-objects.js.map +1 -0
  67. package/dist/src/driver/toolchain-provider.d.ts +4 -0
  68. package/dist/src/driver/toolchain-provider.js +4 -0
  69. package/dist/src/driver/toolchain-provider.js.map +1 -1
  70. package/dist/src/driver/toolchain.d.ts +32 -1
  71. package/dist/src/driver/toolchain.js +115 -11
  72. package/dist/src/driver/toolchain.js.map +1 -1
  73. package/dist/src/driver/version.d.ts +12 -0
  74. package/dist/src/driver/version.js +13 -0
  75. package/dist/src/driver/version.js.map +1 -0
  76. package/dist/src/driver/win-icon.d.ts +7 -9
  77. package/dist/src/driver/win-icon.js +37 -35
  78. package/dist/src/driver/win-icon.js.map +1 -1
  79. package/dist/src/extensions/node/fs/index.d.ts +4 -3
  80. package/dist/src/extensions/node/fs/index.js +12 -3
  81. package/dist/src/extensions/node/fs/index.js.map +1 -1
  82. package/dist/src/extensions/node/fs-promises/index.d.ts +5 -5
  83. package/dist/src/extensions/node/fs-promises/index.js +15 -6
  84. package/dist/src/extensions/node/fs-promises/index.js.map +1 -1
  85. package/dist/src/parser/declarations/classes.js +5 -0
  86. package/dist/src/parser/declarations/classes.js.map +1 -1
  87. package/dist/src/parser/declarations/functions.js +13 -1
  88. package/dist/src/parser/declarations/functions.js.map +1 -1
  89. package/dist/src/parser/modules.js +8 -3
  90. package/dist/src/parser/modules.js.map +1 -1
  91. package/dist/src/parser/parser.d.ts +1 -0
  92. package/dist/src/parser/parser.js +23 -0
  93. package/dist/src/parser/parser.js.map +1 -1
  94. package/dist/tests/cli/check.test.d.ts +6 -0
  95. package/dist/tests/cli/check.test.js +68 -0
  96. package/dist/tests/cli/check.test.js.map +1 -0
  97. package/dist/tests/cli/main.test.js +19 -0
  98. package/dist/tests/cli/main.test.js.map +1 -1
  99. package/dist/tests/cli/watch.test.d.ts +6 -0
  100. package/dist/tests/cli/watch.test.js +72 -0
  101. package/dist/tests/cli/watch.test.js.map +1 -0
  102. package/dist/tests/codegen/expressions.test.js +15 -3
  103. package/dist/tests/codegen/expressions.test.js.map +1 -1
  104. package/dist/tests/codegen/llvm.test.js +16 -0
  105. package/dist/tests/codegen/llvm.test.js.map +1 -1
  106. package/dist/tests/diagnostics/diagnostic.test.js +8 -0
  107. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -1
  108. package/dist/tests/docs/structure.test.d.ts +1 -0
  109. package/dist/tests/docs/structure.test.js +92 -0
  110. package/dist/tests/docs/structure.test.js.map +1 -0
  111. package/dist/tests/driver/compiler.test.js +6 -0
  112. package/dist/tests/driver/compiler.test.js.map +1 -1
  113. package/dist/tests/driver/config.test.js +9 -0
  114. package/dist/tests/driver/config.test.js.map +1 -1
  115. package/dist/tests/driver/icon.test.js +19 -32
  116. package/dist/tests/driver/icon.test.js.map +1 -1
  117. package/dist/tests/driver/invalid-input.test.d.ts +10 -0
  118. package/dist/tests/driver/invalid-input.test.js +29 -0
  119. package/dist/tests/driver/invalid-input.test.js.map +1 -0
  120. package/dist/tests/driver/modules.test.js +42 -3
  121. package/dist/tests/driver/modules.test.js.map +1 -1
  122. package/dist/tests/driver/toolchain-provider.test.js +27 -1
  123. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  124. package/dist/tests/driver/toolchain.test.js +60 -2
  125. package/dist/tests/driver/toolchain.test.js.map +1 -1
  126. package/dist/tests/e2e/array-buffer.test.d.ts +5 -0
  127. package/dist/tests/e2e/array-buffer.test.js +38 -0
  128. package/dist/tests/e2e/array-buffer.test.js.map +1 -0
  129. package/dist/tests/e2e/array-from-iterables.test.d.ts +7 -0
  130. package/dist/tests/e2e/array-from-iterables.test.js +34 -0
  131. package/dist/tests/e2e/array-from-iterables.test.js.map +1 -0
  132. package/dist/tests/e2e/array-symbol-iterator.test.d.ts +8 -0
  133. package/dist/tests/e2e/array-symbol-iterator.test.js +42 -0
  134. package/dist/tests/e2e/array-symbol-iterator.test.js.map +1 -0
  135. package/dist/tests/e2e/async-await.test.js +1 -1
  136. package/dist/tests/e2e/async-fs.test.d.ts +9 -0
  137. package/dist/tests/e2e/async-fs.test.js +119 -0
  138. package/dist/tests/e2e/async-fs.test.js.map +1 -0
  139. package/dist/tests/e2e/async-generators.test.d.ts +1 -0
  140. package/dist/tests/e2e/async-generators.test.js +154 -0
  141. package/dist/tests/e2e/async-generators.test.js.map +1 -0
  142. package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
  143. package/dist/tests/e2e/await-ordering.test.js +37 -0
  144. package/dist/tests/e2e/await-ordering.test.js.map +1 -0
  145. package/dist/tests/e2e/compile-builtins.test.js +1 -1
  146. package/dist/tests/e2e/compile-modules.test.js +7 -0
  147. package/dist/tests/e2e/compile-modules.test.js.map +1 -1
  148. package/dist/tests/e2e/date-parse.test.d.ts +8 -0
  149. package/dist/tests/e2e/date-parse.test.js +38 -0
  150. package/dist/tests/e2e/date-parse.test.js.map +1 -0
  151. package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
  152. package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
  153. package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
  154. package/dist/tests/e2e/fetch.test.js +24 -0
  155. package/dist/tests/e2e/fetch.test.js.map +1 -1
  156. package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
  157. package/dist/tests/e2e/globals-microtask.test.js +37 -0
  158. package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
  159. package/dist/tests/e2e/gui-inline-svg.test.d.ts +11 -0
  160. package/dist/tests/e2e/gui-inline-svg.test.js +160 -0
  161. package/dist/tests/e2e/gui-inline-svg.test.js.map +1 -0
  162. package/dist/tests/e2e/gui-media.test.js +8 -1
  163. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  164. package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
  165. package/dist/tests/e2e/inspect-builtins.test.js +43 -0
  166. package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
  167. package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
  168. package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
  169. package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
  170. package/dist/tests/e2e/json-circular.test.d.ts +6 -0
  171. package/dist/tests/e2e/json-circular.test.js +43 -0
  172. package/dist/tests/e2e/json-circular.test.js.map +1 -0
  173. package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
  174. package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
  175. package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
  176. package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
  177. package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
  178. package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
  179. package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
  180. package/dist/tests/e2e/json-stringify-space.test.js +23 -0
  181. package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
  182. package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
  183. package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
  184. package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
  185. package/dist/tests/e2e/native-extensions.test.js +1 -1
  186. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  187. package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
  188. package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
  189. package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
  190. package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
  191. package/dist/tests/e2e/property-descriptors.test.js +25 -0
  192. package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
  193. package/dist/tests/e2e/property-ic.test.d.ts +1 -0
  194. package/dist/tests/e2e/property-ic.test.js +55 -0
  195. package/dist/tests/e2e/property-ic.test.js.map +1 -0
  196. package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
  197. package/dist/tests/e2e/runtime-errors.test.js +52 -0
  198. package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
  199. package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
  200. package/dist/tests/e2e/structured-clone.test.js +49 -0
  201. package/dist/tests/e2e/structured-clone.test.js.map +1 -0
  202. package/dist/tests/e2e/text-codec.test.d.ts +6 -0
  203. package/dist/tests/e2e/text-codec.test.js +24 -0
  204. package/dist/tests/e2e/text-codec.test.js.map +1 -0
  205. package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
  206. package/dist/tests/e2e/typed-array-views.test.js +39 -0
  207. package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
  208. package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
  209. package/dist/tests/e2e/url-search-params.test.js +30 -0
  210. package/dist/tests/e2e/url-search-params.test.js.map +1 -0
  211. package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
  212. package/dist/tests/e2e/weak-collections.test.js +88 -0
  213. package/dist/tests/e2e/weak-collections.test.js.map +1 -0
  214. package/dist/tests/parser/declarations.test.js +12 -0
  215. package/dist/tests/parser/declarations.test.js.map +1 -1
  216. package/dist/tests/parser/module-syntax.test.js +9 -0
  217. package/dist/tests/parser/module-syntax.test.js.map +1 -1
  218. package/dist/tests/parser/parser.test.js +7 -0
  219. package/dist/tests/parser/parser.test.js.map +1 -1
  220. package/dist/tests/version.test.js +5 -1
  221. package/dist/tests/version.test.js.map +1 -1
  222. package/doc/ai/README.md +4 -3
  223. package/doc/ai/cli.md +41 -0
  224. package/doc/ai/contributing.md +20 -16
  225. package/doc/ai/extensions.md +13 -10
  226. package/doc/ai/language-support.md +19 -14
  227. package/doc/ai/troubleshooting.md +11 -9
  228. package/doc/ai/zh-CN/README.md +3 -2
  229. package/doc/ai/zh-CN/cli.md +35 -0
  230. package/doc/ai/zh-CN/contributing.md +16 -15
  231. package/doc/ai/zh-CN/extensions.md +12 -9
  232. package/doc/ai/zh-CN/language-support.md +19 -15
  233. package/doc/ai/zh-CN/troubleshooting.md +9 -8
  234. package/doc/gui/api.md +8 -0
  235. package/doc/gui/build.md +13 -4
  236. package/doc/gui/known-issues.md +19 -14
  237. package/doc/gui/media.md +32 -3
  238. package/doc/gui/rendering.md +3 -1
  239. package/doc/gui.md +28 -5
  240. package/doc/icon.md +5 -4
  241. package/doc/implemented/async.md +51 -0
  242. package/doc/implemented/binder.md +13 -0
  243. package/doc/implemented/cli.md +47 -0
  244. package/doc/implemented/codegen.md +33 -0
  245. package/doc/implemented/collections.md +26 -0
  246. package/doc/implemented/driver.md +19 -0
  247. package/doc/implemented/extensions.md +19 -0
  248. package/doc/implemented/fetch.md +44 -0
  249. package/doc/implemented/lexer.md +23 -0
  250. package/doc/implemented/modules.md +28 -0
  251. package/doc/implemented/node/assert.md +17 -0
  252. package/doc/implemented/node/buffer.md +29 -0
  253. package/doc/implemented/node/child-process.md +29 -0
  254. package/doc/implemented/node/crypto.md +9 -0
  255. package/doc/implemented/node/dgram.md +15 -0
  256. package/doc/implemented/node/events.md +37 -0
  257. package/doc/implemented/node/fs-promises.md +49 -0
  258. package/doc/implemented/node/fs.md +112 -0
  259. package/doc/implemented/node/http.md +21 -0
  260. package/doc/implemented/node/net.md +17 -0
  261. package/doc/implemented/node/os.md +22 -0
  262. package/doc/implemented/node/path.md +33 -0
  263. package/doc/implemented/node/process.md +23 -0
  264. package/doc/implemented/node/querystring.md +20 -0
  265. package/doc/implemented/node/stream-promises.md +8 -0
  266. package/doc/implemented/node/stream.md +19 -0
  267. package/doc/implemented/node/test.md +10 -0
  268. package/doc/implemented/node/url.md +8 -0
  269. package/doc/implemented/node/util.md +25 -0
  270. package/doc/implemented/node/worker-threads.md +10 -0
  271. package/doc/implemented/node/zlib.md +8 -0
  272. package/doc/implemented/node.md +48 -0
  273. package/doc/implemented/operators.md +38 -0
  274. package/doc/implemented/parser.md +58 -0
  275. package/doc/implemented/pipeline.md +28 -0
  276. package/doc/implemented/runtime-core.md +32 -0
  277. package/doc/implemented/stdlib.md +78 -0
  278. package/doc/implemented/strings.md +27 -0
  279. package/doc/implemented/tests.md +10 -0
  280. package/doc/implemented/typed-arrays.md +26 -0
  281. package/doc/implemented/value-model.md +18 -0
  282. package/doc/implemented.md +54 -355
  283. package/doc/node-implemented.md +3 -585
  284. package/doc/node-unimplemented.md +3 -164
  285. package/doc/requirements.md +23 -8
  286. package/doc/unimplemented/classes.md +22 -0
  287. package/doc/unimplemented/deviations.md +27 -0
  288. package/doc/unimplemented/expressions.md +26 -0
  289. package/doc/unimplemented/functions.md +21 -0
  290. package/doc/unimplemented/modules.md +22 -0
  291. package/doc/unimplemented/node/async.md +20 -0
  292. package/doc/unimplemented/node/bun.md +9 -0
  293. package/doc/unimplemented/node/fs-promises.md +20 -0
  294. package/doc/unimplemented/node/fs.md +30 -0
  295. package/doc/unimplemented/node/globals.md +23 -0
  296. package/doc/unimplemented/node/modules.md +21 -0
  297. package/doc/unimplemented/node.md +21 -0
  298. package/doc/unimplemented/statements.md +18 -0
  299. package/doc/unimplemented/stdlib.md +54 -0
  300. package/doc/unimplemented/toolchain.md +14 -0
  301. package/doc/unimplemented/types.md +12 -0
  302. package/doc/unimplemented.md +18 -275
  303. package/doc/xbintsc.config.schema.json +12 -0
  304. package/doc/zh-CN/gui/api.md +7 -0
  305. package/doc/zh-CN/gui/build.md +11 -3
  306. package/doc/zh-CN/gui/known-issues.md +17 -11
  307. package/doc/zh-CN/gui/media.md +26 -2
  308. package/doc/zh-CN/gui/rendering.md +2 -1
  309. package/doc/zh-CN/gui.md +21 -3
  310. package/doc/zh-CN/icon.md +5 -4
  311. package/doc/zh-CN/implemented/async.md +49 -0
  312. package/doc/zh-CN/implemented/binder.md +13 -0
  313. package/doc/zh-CN/implemented/cli.md +46 -0
  314. package/doc/zh-CN/implemented/codegen.md +33 -0
  315. package/doc/zh-CN/implemented/collections.md +26 -0
  316. package/doc/zh-CN/implemented/driver.md +19 -0
  317. package/doc/zh-CN/implemented/extensions.md +19 -0
  318. package/doc/zh-CN/implemented/fetch.md +31 -0
  319. package/doc/zh-CN/implemented/lexer.md +23 -0
  320. package/doc/zh-CN/implemented/modules.md +28 -0
  321. package/doc/zh-CN/implemented/node/assert.md +17 -0
  322. package/doc/zh-CN/implemented/node/buffer.md +25 -0
  323. package/doc/zh-CN/implemented/node/child-process.md +27 -0
  324. package/doc/zh-CN/implemented/node/crypto.md +9 -0
  325. package/doc/zh-CN/implemented/node/dgram.md +15 -0
  326. package/doc/zh-CN/implemented/node/events.md +36 -0
  327. package/doc/zh-CN/implemented/node/fs-promises.md +30 -0
  328. package/doc/zh-CN/implemented/node/fs.md +105 -0
  329. package/doc/zh-CN/implemented/node/http.md +17 -0
  330. package/doc/zh-CN/implemented/node/net.md +17 -0
  331. package/doc/zh-CN/implemented/node/os.md +21 -0
  332. package/doc/zh-CN/implemented/node/path.md +26 -0
  333. package/doc/zh-CN/implemented/node/process.md +23 -0
  334. package/doc/zh-CN/implemented/node/querystring.md +20 -0
  335. package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
  336. package/doc/zh-CN/implemented/node/stream.md +15 -0
  337. package/doc/zh-CN/implemented/node/test.md +10 -0
  338. package/doc/zh-CN/implemented/node/url.md +8 -0
  339. package/doc/zh-CN/implemented/node/util.md +25 -0
  340. package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
  341. package/doc/zh-CN/implemented/node/zlib.md +8 -0
  342. package/doc/zh-CN/implemented/node.md +45 -0
  343. package/doc/zh-CN/implemented/operators.md +38 -0
  344. package/doc/zh-CN/implemented/parser.md +58 -0
  345. package/doc/zh-CN/implemented/pipeline.md +25 -0
  346. package/doc/zh-CN/implemented/runtime-core.md +31 -0
  347. package/doc/zh-CN/implemented/stdlib.md +76 -0
  348. package/doc/zh-CN/implemented/strings.md +27 -0
  349. package/doc/zh-CN/implemented/tests.md +10 -0
  350. package/doc/zh-CN/implemented/typed-arrays.md +26 -0
  351. package/doc/zh-CN/implemented/value-model.md +18 -0
  352. package/doc/zh-CN/implemented.md +50 -350
  353. package/doc/zh-CN/node-implemented.md +4 -531
  354. package/doc/zh-CN/node-unimplemented.md +4 -139
  355. package/doc/zh-CN/plan-require-node-modules.md +4 -4
  356. package/doc/zh-CN/requirements.md +20 -6
  357. package/doc/zh-CN/unimplemented/classes.md +22 -0
  358. package/doc/zh-CN/unimplemented/deviations.md +24 -0
  359. package/doc/zh-CN/unimplemented/expressions.md +24 -0
  360. package/doc/zh-CN/unimplemented/functions.md +21 -0
  361. package/doc/zh-CN/unimplemented/modules.md +19 -0
  362. package/doc/zh-CN/unimplemented/node/async.md +20 -0
  363. package/doc/zh-CN/unimplemented/node/bun.md +8 -0
  364. package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
  365. package/doc/zh-CN/unimplemented/node/fs.md +24 -0
  366. package/doc/zh-CN/unimplemented/node/globals.md +14 -0
  367. package/doc/zh-CN/unimplemented/node/modules.md +15 -0
  368. package/doc/zh-CN/unimplemented/node.md +18 -0
  369. package/doc/zh-CN/unimplemented/statements.md +15 -0
  370. package/doc/zh-CN/unimplemented/stdlib.md +54 -0
  371. package/doc/zh-CN/unimplemented/toolchain.md +14 -0
  372. package/doc/zh-CN/unimplemented/types.md +11 -0
  373. package/doc/zh-CN/unimplemented.md +14 -237
  374. package/llms.txt +32 -4
  375. package/package.json +1 -1
  376. package/runtime/ext_gui/inline_svg.cpp +219 -0
  377. package/runtime/ext_gui/inline_svg.h +41 -0
  378. package/runtime/ext_gui/layout.cpp +18 -0
  379. package/runtime/ext_gui/layout.h +7 -0
  380. package/runtime/ext_gui/layout_flow.cpp +4 -3
  381. package/runtime/ext_gui/paint.cpp +14 -0
  382. package/runtime/ext_gui/paint.h +5 -1
  383. package/runtime/ext_gui/renderer_image.cpp +53 -25
  384. package/runtime/ext_gui/renderer_shaders.h +2 -2
  385. package/runtime/ext_gui/stb_image.h +1 -17
  386. package/runtime/ext_gui/style_ua.cpp +3 -0
  387. package/runtime/ext_gui/svg.cpp +122 -39
  388. package/runtime/ext_gui/svg.h +14 -3
  389. package/runtime/ext_gui/window.cpp +28 -0
  390. package/runtime/ext_node/child_process/child_process.c +173 -73
  391. package/runtime/ext_node/fs/async_api.c +314 -0
  392. package/runtime/ext_node/fs/async_complete.c +99 -0
  393. package/runtime/ext_node/fs/async_fh.c +206 -0
  394. package/runtime/ext_node/fs/async_job.c +81 -0
  395. package/runtime/ext_node/fs/async_job.h +132 -0
  396. package/runtime/ext_node/fs/async_worker.c +534 -0
  397. package/runtime/ext_node/fs/async_worker_dir.c +439 -0
  398. package/runtime/ext_node/fs/async_worker_dir.h +33 -0
  399. package/runtime/ext_node/fs/async_worker_fd.c +74 -0
  400. package/runtime/ext_node/fs/dir.c +60 -15
  401. package/runtime/ext_node/fs/fs_common.h +9 -0
  402. package/runtime/ext_node/fs/fs_ops.c +18 -29
  403. package/runtime/ext_node/fs/parts/builtins.inc +34 -0
  404. package/runtime/ext_node/fs/parts/platform.inc +66 -0
  405. package/runtime/ext_node/fs/promises.c +44 -234
  406. package/runtime/rt.h +15 -0
  407. package/runtime/rt_internal.h +108 -0
  408. package/runtime/xt_alloc.c +43 -7
  409. package/runtime/xt_array_buffer.c +284 -0
  410. package/runtime/xt_async.c +46 -21
  411. package/runtime/xt_async_io.c +333 -0
  412. package/runtime/xt_async_io.h +47 -0
  413. package/runtime/xt_bigint/helpers.inc +3 -3
  414. package/runtime/xt_builtins.c +21 -17
  415. package/runtime/xt_constructors.c +12 -2
  416. package/runtime/xt_containers/access.inc +148 -3
  417. package/runtime/xt_containers/objects.inc +26 -2
  418. package/runtime/xt_containers/shapes.inc +71 -0
  419. package/runtime/xt_containers.c +1 -0
  420. package/runtime/xt_coroutine.c +17 -0
  421. package/runtime/xt_fetch/async.inc +295 -0
  422. package/runtime/xt_fetch/request.inc +6 -183
  423. package/runtime/xt_fetch/socket.inc +5 -4
  424. package/runtime/xt_fetch.c +6 -4
  425. package/runtime/xt_generator.c +299 -10
  426. package/runtime/xt_io/inspect.inc +112 -0
  427. package/runtime/xt_loop.c +79 -7
  428. package/runtime/xt_performance.c +37 -0
  429. package/runtime/xt_promise.c +63 -1
  430. package/runtime/xt_stdlib/arrays.inc +1 -1
  431. package/runtime/xt_stdlib/dispatch.inc +46 -11
  432. package/runtime/xt_stdlib/strings.inc +1 -1
  433. package/runtime/xt_stdlib2/array-statics.inc +25 -0
  434. package/runtime/xt_stdlib2/arrays.inc +5 -3
  435. package/runtime/xt_stdlib2/container.inc +5 -0
  436. package/runtime/xt_stdlib2/date.inc +111 -3
  437. package/runtime/xt_stdlib2/error.inc +24 -0
  438. package/runtime/xt_stdlib2/json.inc +310 -19
  439. package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
  440. package/runtime/xt_stdlib2/objects.inc +122 -0
  441. package/runtime/xt_stdlib2/set.inc +1 -1
  442. package/runtime/xt_structured_clone.c +159 -0
  443. package/runtime/xt_symbol.c +2 -2
  444. package/runtime/xt_text_codec.c +69 -0
  445. package/runtime/xt_typed_array/construction.inc +35 -5
  446. package/runtime/xt_typed_array/elements.inc +159 -0
  447. package/runtime/xt_typed_array/methods.inc +21 -5
  448. package/runtime/xt_typed_array.c +7 -10
  449. package/runtime/xt_url.c +375 -0
  450. package/runtime/xt_values/arithmetic.inc +2 -2
  451. package/runtime/xt_values/conversions.inc +1 -1
  452. package/runtime/xt_weak.c +281 -0
  453. package/scripts/build-gui.ts +133 -60
  454. package/scripts/check-version.ts +3 -3
  455. package/src/binder/declarations.ts +14 -3
  456. package/src/cli/hints.ts +8 -1
  457. package/src/cli/main.ts +119 -18
  458. package/src/cli/watch.ts +101 -0
  459. package/src/codegen/generator/calls/access.ts +10 -2
  460. package/src/codegen/generator/calls/closures.ts +12 -4
  461. package/src/codegen/generator/context.ts +23 -3
  462. package/src/codegen/generator/expressions/operators.ts +27 -13
  463. package/src/codegen/generator/expressions/primary.ts +4 -0
  464. package/src/codegen/generator/module.ts +0 -7
  465. package/src/codegen/generator/numeric.ts +85 -11
  466. package/src/codegen/generator/state.ts +23 -0
  467. package/src/codegen/generator/statements/control-flow.ts +1 -4
  468. package/src/codegen/generator/statements/loops.ts +50 -16
  469. package/src/codegen/generator/tables.ts +26 -1
  470. package/src/diagnostics/diagnostic.ts +23 -3
  471. package/src/driver/app-artifacts.ts +77 -0
  472. package/src/driver/build-key.ts +55 -0
  473. package/src/driver/bundler/graph.ts +63 -13
  474. package/src/driver/bundler/merge.ts +4 -1
  475. package/src/driver/compiler.ts +94 -328
  476. package/src/driver/config.ts +11 -0
  477. package/src/driver/frontend.ts +120 -0
  478. package/src/driver/index.ts +0 -1
  479. package/src/driver/options.ts +70 -0
  480. package/src/driver/runtime-objects.ts +134 -0
  481. package/src/driver/toolchain-provider.ts +4 -0
  482. package/src/driver/toolchain.ts +154 -10
  483. package/src/driver/version.ts +12 -0
  484. package/src/driver/win-icon.ts +36 -36
  485. package/src/extensions/node/fs/index.ts +12 -3
  486. package/src/extensions/node/fs-promises/index.ts +15 -6
  487. package/src/parser/declarations/classes.ts +4 -0
  488. package/src/parser/declarations/functions.ts +12 -1
  489. package/src/parser/modules.ts +8 -4
  490. package/src/parser/parser.ts +28 -0
@@ -35,9 +35,131 @@ static xt_value xt_object_group_by(xt_value value, xt_value fn) {
35
35
  return result;
36
36
  }
37
37
 
38
+ /* -- property descriptors ------------------------------------------------- */
39
+
40
+ /* `attr` defaults for `defineProperty` are all false; literal properties are
41
+ * all true. Store the bits per key under a symbol so the flag table stays out
42
+ * of Object.keys / JSON. Writable/enumerable are reported truthfully, but the
43
+ * runtime does not enforce them on later writes or enumeration yet. */
44
+ static xt_value xt_object_descriptor_flags_key_value = XT_UNDEFINED;
45
+
46
+ static xt_value xt_object_descriptor_flags_key(void) {
47
+ if (!xt_is_symbol(xt_object_descriptor_flags_key_value)) {
48
+ xt_object_descriptor_flags_key_value =
49
+ xt_symbol_new(xt_string_from_cstr("__propertyDescriptorFlags"));
50
+ xt_gc_add_root(&xt_object_descriptor_flags_key_value);
51
+ }
52
+ return xt_object_descriptor_flags_key_value;
53
+ }
54
+
55
+ static xt_value xt_object_descriptor_flags(xt_value target) {
56
+ if (!XT_IS_OBJECT(target)) return XT_UNDEFINED;
57
+ xt_value flags = xt_object_get(target, xt_object_descriptor_flags_key());
58
+ if (!XT_IS_OBJECT(flags)) {
59
+ flags = xt_object_new();
60
+ xt_object_set(target, xt_object_descriptor_flags_key(), flags);
61
+ }
62
+ return flags;
63
+ }
64
+
65
+ static int xt_object_descriptor_mask(xt_value target, xt_value key) {
66
+ if (!XT_IS_OBJECT(target)) return 7;
67
+ xt_value flags = xt_object_get(target, xt_object_descriptor_flags_key());
68
+ if (!XT_IS_OBJECT(flags)) return 7;
69
+ xt_value mask = xt_object_get(flags, key);
70
+ return mask == XT_UNDEFINED ? 7 : xt_to_int32(mask);
71
+ }
72
+
73
+ static xt_value xt_object_data_descriptor(xt_value value, int enumerable, int configurable,
74
+ int writable) {
75
+ xt_value descriptor = xt_object_new();
76
+ xt_object_set(descriptor, xt_string_from_cstr("value"), value);
77
+ xt_object_set(descriptor, xt_string_from_cstr("writable"), xt_bool(writable));
78
+ xt_object_set(descriptor, xt_string_from_cstr("enumerable"), xt_bool(enumerable));
79
+ xt_object_set(descriptor, xt_string_from_cstr("configurable"), xt_bool(configurable));
80
+ return descriptor;
81
+ }
82
+
83
+ static xt_value xt_object_get_own_property_descriptor(xt_value target, xt_value key) {
84
+ if (XT_IS_ARRAY(target)) {
85
+ if (XT_IS_STRING(key) && xt_as_string(key)->length == 6 &&
86
+ memcmp(xt_string_bytes(xt_as_string(key)), "length", 6) == 0) {
87
+ return xt_object_data_descriptor(xt_array_length(target), 0, 0, 1);
88
+ }
89
+ xt_value item = xt_get(target, key);
90
+ if (item != XT_UNDEFINED) return xt_object_data_descriptor(item, 1, 1, 1);
91
+ return XT_UNDEFINED;
92
+ }
93
+ if (!XT_IS_OBJECT(target)) return XT_UNDEFINED;
94
+ xt_object *object = (xt_object *)XT_GET_PTR(target);
95
+ if (object->header.kind != XT_OBJECT_KIND_OBJECT && object->header.kind != XT_OBJECT_KIND_ERROR) {
96
+ return XT_UNDEFINED;
97
+ }
98
+ xt_property *property = xt_object_find_property(object, xt_to_property_key(key));
99
+ if (!property) return XT_UNDEFINED;
100
+ int mask = xt_object_descriptor_mask(target, key);
101
+ if (property->getter != XT_UNDEFINED || property->setter != XT_UNDEFINED) {
102
+ xt_value descriptor = xt_object_new();
103
+ if (property->getter != XT_UNDEFINED) {
104
+ xt_object_set(descriptor, xt_string_from_cstr("get"), property->getter);
105
+ }
106
+ if (property->setter != XT_UNDEFINED) {
107
+ xt_object_set(descriptor, xt_string_from_cstr("set"), property->setter);
108
+ }
109
+ xt_object_set(descriptor, xt_string_from_cstr("enumerable"), xt_bool((mask & 2) != 0));
110
+ xt_object_set(descriptor, xt_string_from_cstr("configurable"), xt_bool((mask & 4) != 0));
111
+ return descriptor;
112
+ }
113
+ return xt_object_data_descriptor(property->value, (mask & 2) != 0, (mask & 4) != 0,
114
+ (mask & 1) != 0);
115
+ }
116
+
117
+ static xt_value xt_object_define_property(xt_value target, xt_value key, xt_value descriptor) {
118
+ if (!XT_IS_OBJECT(descriptor)) return target;
119
+ int writable = xt_truthy(xt_object_get(descriptor, xt_string_from_cstr("writable")));
120
+ int enumerable = xt_truthy(xt_object_get(descriptor, xt_string_from_cstr("enumerable")));
121
+ int configurable = xt_truthy(xt_object_get(descriptor, xt_string_from_cstr("configurable")));
122
+ int mask = (writable ? 1 : 0) | (enumerable ? 2 : 0) | (configurable ? 4 : 0);
123
+ xt_value flags = xt_object_descriptor_flags(target);
124
+ if (XT_IS_OBJECT(flags)) xt_object_set(flags, key, xt_number((double)mask));
125
+ xt_value getter = xt_object_get(descriptor, xt_string_from_cstr("get"));
126
+ xt_value setter = xt_object_get(descriptor, xt_string_from_cstr("set"));
127
+ if (getter != XT_UNDEFINED || setter != XT_UNDEFINED) {
128
+ if (getter != XT_UNDEFINED) xt_object_define_getter(target, key, getter);
129
+ if (setter != XT_UNDEFINED) xt_object_define_setter(target, key, setter);
130
+ return target;
131
+ }
132
+ if (xt_object_has_own(descriptor, xt_string_from_cstr("value"))) {
133
+ xt_set(target, key, xt_object_get(descriptor, xt_string_from_cstr("value")));
134
+ }
135
+ return target;
136
+ }
137
+
138
+ static xt_value xt_object_get_own_property_descriptors(xt_value target) {
139
+ xt_value result = xt_object_new();
140
+ xt_value names = xt_object_own_property_names(target);
141
+ xt_array *keys = xt_as_array(names);
142
+ if (!keys) return result;
143
+ for (uint32_t i = 0; i < keys->length; i++) {
144
+ xt_value descriptor = xt_object_get_own_property_descriptor(target, keys->items[i]);
145
+ if (descriptor != XT_UNDEFINED) xt_object_set(result, keys->items[i], descriptor);
146
+ }
147
+ return result;
148
+ }
149
+
38
150
  xt_value xt_object_static(xt_value name, int32_t argc, xt_value *argv) {
39
151
  const char *fn = xt_string_data(name);
40
152
  if (!fn) return XT_UNDEFINED;
153
+ if (strcmp(fn, "getOwnPropertyDescriptor") == 0) {
154
+ return xt_object_get_own_property_descriptor(xt_arg_at(argc, argv, 0), xt_arg_at(argc, argv, 1));
155
+ }
156
+ if (strcmp(fn, "getOwnPropertyDescriptors") == 0) {
157
+ return xt_object_get_own_property_descriptors(xt_arg_at(argc, argv, 0));
158
+ }
159
+ if (strcmp(fn, "defineProperty") == 0) {
160
+ return xt_object_define_property(xt_arg_at(argc, argv, 0), xt_arg_at(argc, argv, 1),
161
+ xt_arg_at(argc, argv, 2));
162
+ }
41
163
  if (strcmp(fn, "keys") == 0) return xt_object_keys(xt_arg_at(argc, argv, 0));
42
164
  if (strcmp(fn, "getOwnPropertyNames") == 0) return xt_object_own_property_names(xt_arg_at(argc, argv, 0));
43
165
  if (strcmp(fn, "getOwnPropertySymbols") == 0) return xt_object_own_property_symbols(xt_arg_at(argc, argv, 0));
@@ -55,7 +55,7 @@ xt_value xt_iter_open(xt_value value) {
55
55
  return XT_FROM_PTR(XT_TAG_OBJECT, state);
56
56
  }
57
57
  }
58
- xt_throw(xt_string_from_cstr("TypeError: value is not iterable"));
58
+ xt_throw(xt_error_from_message("TypeError: value is not iterable"));
59
59
  return XT_UNDEFINED;
60
60
  }
61
61
 
@@ -0,0 +1,159 @@
1
+ /*
2
+ * xbintsc runtime — `structuredClone`.
3
+ *
4
+ * Deep-clones arrays, plain objects, Map, Set, Date, RegExp and typed arrays,
5
+ * preserving shared references and cycles. Functions, symbols, promises,
6
+ * generators and iterators cannot be cloned, matching the platform API.
7
+ *
8
+ * The clone table maps source pointer -> clone. It lives on the C stack for
9
+ * the duration of the call; every clone is also reachable from its parent (or
10
+ * the current frame) while it is being filled, so the conservative stack scan
11
+ * keeps it alive across the allocations that happen during cloning.
12
+ */
13
+
14
+ #include "rt_internal.h"
15
+
16
+ #include <stdio.h>
17
+ #include <stdlib.h>
18
+ #include <string.h>
19
+
20
+ typedef struct {
21
+ xt_value source;
22
+ xt_value clone;
23
+ } xt_clone_entry;
24
+
25
+ typedef struct {
26
+ xt_clone_entry *entries;
27
+ uint32_t count;
28
+ uint32_t capacity;
29
+ } xt_clone_context;
30
+
31
+ static _Noreturn void xt_clone_fail(const char *kind) {
32
+ char message[160];
33
+ snprintf(message, sizeof(message), "%s could not be cloned.", kind);
34
+ xt_value argument = xt_string_from_cstr(message);
35
+ xt_throw(xt_type_error_ctor(1, &argument));
36
+ abort();
37
+ }
38
+
39
+ static xt_value xt_clone_lookup(xt_clone_context *context, xt_value source) {
40
+ for (uint32_t i = 0; i < context->count; i++) {
41
+ if (context->entries[i].source == source) return context->entries[i].clone;
42
+ }
43
+ return XT_UNDEFINED;
44
+ }
45
+
46
+ static void xt_clone_remember(xt_clone_context *context, xt_value source, xt_value clone) {
47
+ if (context->count >= context->capacity) {
48
+ uint32_t capacity = context->capacity == 0 ? 8 : context->capacity * 2;
49
+ xt_clone_entry *entries =
50
+ (xt_clone_entry *)realloc(context->entries, sizeof(xt_clone_entry) * capacity);
51
+ if (!entries) abort();
52
+ context->entries = entries;
53
+ context->capacity = capacity;
54
+ }
55
+ context->entries[context->count].source = source;
56
+ context->entries[context->count].clone = clone;
57
+ context->count++;
58
+ }
59
+
60
+ static xt_value xt_clone_value(xt_clone_context *context, xt_value value) {
61
+ if (value == XT_UNDEFINED || value == XT_NULL || XT_IS_BOOL(value) || XT_IS_NUMBER(value) ||
62
+ XT_IS_STRING(value) || XT_IS_BIGINT(value)) {
63
+ return value;
64
+ }
65
+ if (XT_IS_FUNCTION(value)) xt_clone_fail("function");
66
+ if (xt_is_symbol(value)) xt_clone_fail("symbol");
67
+
68
+ xt_value existing = xt_clone_lookup(context, value);
69
+ if (existing != XT_UNDEFINED) return existing;
70
+
71
+ /* A typed array's own `slice` already produces an element-wise copy of the
72
+ * same concrete type. */
73
+ if (xt_typed_array_kind_of(value) >= 0) {
74
+ return xt_call_method(value, xt_string_from_cstr("slice"), 0, NULL);
75
+ }
76
+
77
+ if (XT_IS_ARRAY(value)) {
78
+ xt_value clone = xt_array_new(0, NULL);
79
+ xt_clone_remember(context, value, clone);
80
+ xt_array *array = xt_as_array(value);
81
+ for (uint32_t i = 0; i < array->length; i++) {
82
+ xt_array_push(clone, xt_clone_value(context, array->items[i]));
83
+ }
84
+ return clone;
85
+ }
86
+
87
+ if (!XT_IS_OBJECT(value)) xt_clone_fail("value");
88
+ xt_object *object = (xt_object *)XT_GET_PTR(value);
89
+
90
+ if (object->header.kind == XT_OBJECT_KIND_MAP) {
91
+ xt_map *map = (xt_map *)object;
92
+ xt_value clone = xt_map_ctor(0, NULL);
93
+ xt_clone_remember(context, value, clone);
94
+ for (uint32_t i = 0; i < map->count; i++) {
95
+ xt_value args[2] = {xt_clone_value(context, map->keys[i]),
96
+ xt_clone_value(context, map->values[i])};
97
+ xt_call_method(clone, xt_string_from_cstr("set"), 2, args);
98
+ }
99
+ return clone;
100
+ }
101
+
102
+ if (object->header.kind == XT_OBJECT_KIND_SET) {
103
+ xt_set_object *set = (xt_set_object *)object;
104
+ xt_value clone = xt_set_ctor(0, NULL);
105
+ xt_clone_remember(context, value, clone);
106
+ for (uint32_t i = 0; i < set->count; i++) {
107
+ xt_value args[1] = {xt_clone_value(context, set->values[i])};
108
+ xt_call_method(clone, xt_string_from_cstr("add"), 1, args);
109
+ }
110
+ return clone;
111
+ }
112
+
113
+ if (object->header.kind == XT_OBJECT_KIND_DATE) {
114
+ xt_value time = xt_call_method(value, xt_string_from_cstr("getTime"), 0, NULL);
115
+ xt_value clone = xt_date_ctor(1, &time);
116
+ xt_clone_remember(context, value, clone);
117
+ return clone;
118
+ }
119
+
120
+ if (object->header.kind == XT_OBJECT_KIND_REGEXP) {
121
+ xt_value args[2] = {xt_get(value, xt_string_from_cstr("source")),
122
+ xt_get(value, xt_string_from_cstr("flags"))};
123
+ xt_value clone = xt_regexp_ctor(2, args);
124
+ xt_clone_remember(context, value, clone);
125
+ return clone;
126
+ }
127
+
128
+ if (object->header.kind == XT_OBJECT_KIND_PROMISE) xt_clone_fail("Promise");
129
+ if (object->header.kind == XT_OBJECT_KIND_WEAK_MAP) xt_clone_fail("WeakMap");
130
+ if (object->header.kind == XT_OBJECT_KIND_WEAK_SET) xt_clone_fail("WeakSet");
131
+ if (object->header.kind == XT_OBJECT_KIND_WEAK_REF) xt_clone_fail("WeakRef");
132
+ if (object->header.kind == XT_OBJECT_KIND_GENERATOR) xt_clone_fail("generator");
133
+ if (object->header.kind == XT_OBJECT_KIND_ITERATOR) xt_clone_fail("iterator");
134
+ if (object->header.kind == XT_OBJECT_KIND_ASYNC) xt_clone_fail("async function");
135
+
136
+ /* Plain objects and Errors are cloned as data: own enumerable string keys,
137
+ * no prototype. That is what the platform algorithm does for ordinary
138
+ * objects and class instances. */
139
+ if (object->header.kind != XT_OBJECT_KIND_OBJECT && object->header.kind != XT_OBJECT_KIND_ERROR) {
140
+ xt_clone_fail("value");
141
+ }
142
+ xt_value clone = xt_object_new();
143
+ xt_clone_remember(context, value, clone);
144
+ xt_value keys = xt_object_keys(value);
145
+ xt_array *keyArray = xt_as_array(keys);
146
+ if (!keyArray) return clone;
147
+ for (uint32_t i = 0; i < keyArray->length; i++) {
148
+ xt_value key = keyArray->items[i];
149
+ xt_object_set(clone, key, xt_clone_value(context, xt_object_get(value, key)));
150
+ }
151
+ return clone;
152
+ }
153
+
154
+ xt_value xt_structured_clone(int32_t argc, xt_value *argv) {
155
+ xt_clone_context context = {NULL, 0, 0};
156
+ xt_value clone = xt_clone_value(&context, xt_arg_at(argc, argv, 0));
157
+ free(context.entries);
158
+ return clone;
159
+ }
@@ -89,7 +89,7 @@ xt_value xt_symbol_description(xt_value value) {
89
89
  xt_value xt_symbol_to_string(xt_value value) {
90
90
  xt_symbol_data *symbol = xt_as_symbol(value);
91
91
  if (!symbol) {
92
- xt_throw(xt_string_from_cstr(
92
+ xt_throw(xt_error_from_message(
93
93
  "TypeError: Symbol.prototype.toString requires that 'this' be a Symbol"));
94
94
  }
95
95
  xt_string *description =
@@ -129,7 +129,7 @@ xt_value xt_symbol_for(xt_value key) {
129
129
 
130
130
  xt_value xt_symbol_key_for(xt_value value) {
131
131
  if (!xt_is_symbol(value)) {
132
- xt_throw(xt_string_from_cstr("TypeError: Symbol.keyFor requires a symbol"));
132
+ xt_throw(xt_error_from_message("TypeError: Symbol.keyFor requires a symbol"));
133
133
  }
134
134
  if (g_symbol_registry == XT_UNDEFINED) return XT_UNDEFINED;
135
135
  xt_value keys = xt_object_keys(g_symbol_registry);
@@ -0,0 +1,69 @@
1
+ /*
2
+ * xbintsc runtime — TextEncoder / TextDecoder.
3
+ *
4
+ * Strings are stored as UTF-8 (lone surrogate halves as WTF-8), so encoding is
5
+ * a byte copy and decoding is a byte copy back. The constructors return plain
6
+ * objects holding the method closures, which is the same shape the rest of the
7
+ * runtime uses for first-class methods.
8
+ */
9
+
10
+ #include "rt_internal.h"
11
+
12
+ #include <stdlib.h>
13
+
14
+ static xt_value xt_text_encoder_encode(xt_value thisValue, xt_value env, int32_t argc,
15
+ xt_value *argv) {
16
+ (void)thisValue;
17
+ (void)env;
18
+ xt_value input = xt_arg_at(argc, argv, 0);
19
+ /* `encode()` with no argument encodes the empty string, like the web API. */
20
+ xt_value text = input == XT_UNDEFINED ? xt_string_from_cstr("") : xt_to_string(input);
21
+ xt_string *string = xt_as_string(text);
22
+ const char *bytes = xt_string_bytes(string);
23
+ xt_value length = xt_number((double)string->length);
24
+ xt_value array = xt_typed_array_ctor_by_name(xt_string_from_cstr("Uint8Array"), 1, &length);
25
+ for (uint32_t i = 0; i < string->length; i++) {
26
+ xt_set(array, xt_number((double)i), xt_number((double)(unsigned char)bytes[i]));
27
+ }
28
+ return array;
29
+ }
30
+
31
+ static xt_value xt_text_decoder_decode(xt_value thisValue, xt_value env, int32_t argc,
32
+ xt_value *argv) {
33
+ (void)thisValue;
34
+ (void)env;
35
+ xt_value input = xt_arg_at(argc, argv, 0);
36
+ if (input == XT_UNDEFINED) return xt_string_from_cstr("");
37
+ uint32_t length = (uint32_t)xt_to_number(xt_get(input, xt_string_from_cstr("length")));
38
+ char *bytes = (char *)malloc(length == 0 ? 1 : length);
39
+ if (!bytes) abort();
40
+ for (uint32_t i = 0; i < length; i++) {
41
+ double byte = xt_to_number(xt_get(input, xt_number((double)i)));
42
+ bytes[i] = (char)((int)byte & 0xff);
43
+ }
44
+ xt_value result = xt_string_new(bytes, length);
45
+ free(bytes);
46
+ return result;
47
+ }
48
+
49
+ xt_value xt_text_encoder_ctor(int32_t argc, xt_value *argv) {
50
+ (void)argc;
51
+ (void)argv;
52
+ xt_value encoder = xt_object_new();
53
+ xt_object_set(encoder, xt_string_from_cstr("encode"),
54
+ xt_closure_new((void *)xt_text_encoder_encode, 0, NULL));
55
+ xt_object_set(encoder, xt_string_from_cstr("encoding"), xt_string_from_cstr("utf-8"));
56
+ return encoder;
57
+ }
58
+
59
+ xt_value xt_text_decoder_ctor(int32_t argc, xt_value *argv) {
60
+ (void)argv;
61
+ xt_value decoder = xt_object_new();
62
+ xt_object_set(decoder, xt_string_from_cstr("decode"),
63
+ xt_closure_new((void *)xt_text_decoder_decode, 0, NULL));
64
+ /* The only supported encoding is UTF-8; report the canonical label even when
65
+ * the caller passed "utf8" (as TextDecoder does). */
66
+ (void)argc;
67
+ xt_object_set(decoder, xt_string_from_cstr("encoding"), xt_string_from_cstr("utf-8"));
68
+ return decoder;
69
+ }
@@ -21,7 +21,7 @@ static xt_value xt_ta_proto(int kind) {
21
21
  xt_ta_define(proto, "fill", (void *)xt_ta_method_fill);
22
22
  xt_ta_define(proto, "set", (void *)xt_ta_method_set);
23
23
  xt_ta_define(proto, "slice", (void *)xt_ta_method_slice);
24
- xt_ta_define(proto, "subarray", (void *)xt_ta_method_slice);
24
+ xt_ta_define(proto, "subarray", (void *)xt_ta_method_subarray);
25
25
  xt_ta_define(proto, "join", (void *)xt_ta_method_join);
26
26
  xt_ta_define(proto, "toString", (void *)xt_ta_method_to_string);
27
27
  xt_ta_define(proto, "toLocaleString", (void *)xt_ta_method_to_string);
@@ -50,15 +50,23 @@ static xt_value xt_ta_proto(int kind) {
50
50
  return proto;
51
51
  }
52
52
 
53
- static xt_value xt_ta_new(int kind, uint32_t length) {
53
+ static xt_value xt_ta_view(int kind, xt_value buffer, uint32_t byteOffset, uint32_t length) {
54
54
  xt_value array = xt_object_new_with_proto(xt_ta_proto(kind));
55
55
  xt_object_set(array, xt_string_from_cstr("length"), xt_number((double)length));
56
- xt_object_set(array, xt_string_from_cstr("byteLength"), xt_number((double)length * xt_ta_bytes[kind]));
57
- xt_object_set(array, xt_string_from_cstr("byteOffset"), xt_number(0));
58
- for (uint32_t i = 0; i < length; i++) xt_ta_store(array, kind, i, 0);
56
+ xt_object_set(array, xt_string_from_cstr("byteLength"),
57
+ xt_number((double)length * xt_ta_bytes[kind]));
58
+ xt_object_set(array, xt_string_from_cstr("byteOffset"), xt_number((double)byteOffset));
59
+ xt_object_set(array, xt_ta_buffer_key(), buffer);
60
+ xt_object_set(array, xt_ta_offset_key(), xt_number((double)byteOffset));
59
61
  return array;
60
62
  }
61
63
 
64
+ static xt_value xt_ta_new(int kind, uint32_t length) {
65
+ xt_value byteLength = xt_number((double)length * xt_ta_bytes[kind]);
66
+ xt_value buffer = xt_array_buffer_ctor(1, &byteLength);
67
+ return xt_ta_view(kind, buffer, 0, length);
68
+ }
69
+
62
70
  /* Length of any value a typed array can be built from, or 0 when it is not
63
71
  * array-like (strings/iterables are intentionally not treated as element
64
72
  * sources yet). */
@@ -106,6 +114,28 @@ static xt_value xt_ta_from_value(int kind, xt_value value, xt_value mapFn, xt_va
106
114
  static xt_value xt_ta_ctor_impl(int kind, int32_t argc, xt_value *argv) {
107
115
  if (argc == 0) return xt_ta_new(kind, 0);
108
116
  xt_value argument = argv[0];
117
+ if (xt_is_array_buffer(argument)) {
118
+ uint32_t bufferLength = xt_array_buffer_byte_length(argument);
119
+ double rawOffset = argc > 1 ? xt_to_number(argv[1]) : 0;
120
+ uint32_t offset = rawOffset > 0 ? (uint32_t)rawOffset : 0;
121
+ uint32_t width = (uint32_t)xt_ta_bytes[kind];
122
+ if (offset % width != 0 || offset > bufferLength) {
123
+ xt_value message = xt_string_from_cstr("start offset is not aligned or out of bounds");
124
+ xt_throw(xt_range_error_ctor(1, &message));
125
+ }
126
+ uint32_t length;
127
+ if (argc > 2 && argv[2] != XT_UNDEFINED) {
128
+ double rawLength = xt_to_number(argv[2]);
129
+ length = rawLength > 0 ? (uint32_t)rawLength : 0;
130
+ } else {
131
+ length = (bufferLength - offset) / width;
132
+ }
133
+ if (length > (bufferLength - offset) / width) {
134
+ xt_value message = xt_string_from_cstr("Invalid typed array length");
135
+ xt_throw(xt_range_error_ctor(1, &message));
136
+ }
137
+ return xt_ta_view(kind, argument, offset, length);
138
+ }
109
139
  /* Objects (arrays / typed arrays / array-likes / iterables) are copied
110
140
  * element-wise; every other argument is a length via `ToIndex`. */
111
141
  if (XT_IS_ARRAY(argument) || XT_IS_OBJECT(argument)) {
@@ -53,6 +53,158 @@ int xt_typed_array_kind_of(xt_value value) {
53
53
  return -1;
54
54
  }
55
55
 
56
+ const char *xt_typed_array_name_of(int kind) {
57
+ if (kind < 0 || kind >= XT_TA_KIND_COUNT) return NULL;
58
+ return xt_ta_names[kind];
59
+ }
60
+
61
+ /* -- buffer-backed views -------------------------------------------------- */
62
+
63
+ /* The backing ArrayBuffer and byte offset live under private symbols, so a
64
+ * typed array's observable own properties stay `length`/`byteLength`/
65
+ * `byteOffset` plus `.buffer` (handled in access.inc). */
66
+ static xt_value xt_ta_buffer_key_value = XT_UNDEFINED;
67
+ static xt_value xt_ta_offset_key_value = XT_UNDEFINED;
68
+
69
+ static xt_value xt_ta_buffer_key(void) {
70
+ if (!xt_is_symbol(xt_ta_buffer_key_value)) {
71
+ xt_ta_buffer_key_value = xt_symbol_new(xt_string_from_cstr("__typedArrayBuffer"));
72
+ xt_gc_add_root(&xt_ta_buffer_key_value);
73
+ }
74
+ return xt_ta_buffer_key_value;
75
+ }
76
+
77
+ static xt_value xt_ta_offset_key(void) {
78
+ if (!xt_is_symbol(xt_ta_offset_key_value)) {
79
+ xt_ta_offset_key_value = xt_symbol_new(xt_string_from_cstr("__typedArrayOffset"));
80
+ xt_gc_add_root(&xt_ta_offset_key_value);
81
+ }
82
+ return xt_ta_offset_key_value;
83
+ }
84
+
85
+ xt_value xt_typed_array_buffer_of(xt_value array) {
86
+ if (xt_typed_array_kind_of(array) < 0) return XT_UNDEFINED;
87
+ return xt_object_get(array, xt_ta_buffer_key());
88
+ }
89
+
90
+ uint32_t xt_typed_array_byte_offset_of(xt_value array) {
91
+ if (xt_typed_array_kind_of(array) < 0) return 0;
92
+ return (uint32_t)xt_to_number(xt_object_get(array, xt_ta_offset_key()));
93
+ }
94
+
95
+ xt_value xt_typed_array_read(xt_value array, uint32_t index) {
96
+ int kind = xt_typed_array_kind_of(array);
97
+ if (kind < 0) return XT_UNDEFINED;
98
+ xt_value buffer = xt_typed_array_buffer_of(array);
99
+ if (!xt_is_array_buffer(buffer)) {
100
+ char key[24];
101
+ snprintf(key, sizeof(key), "%u", index);
102
+ return xt_object_get_cstr(array, key);
103
+ }
104
+ uint32_t width = (uint32_t)xt_ta_bytes[kind];
105
+ uint32_t offset = xt_typed_array_byte_offset_of(array) + index * width;
106
+ if (offset + width > xt_array_buffer_byte_length(buffer)) return XT_UNDEFINED;
107
+ uint8_t raw[8];
108
+ for (uint32_t i = 0; i < width; i++) raw[i] = xt_array_buffer_get_byte(buffer, offset + i);
109
+ switch (kind) {
110
+ case XT_TA_U8:
111
+ return xt_number((double)raw[0]);
112
+ case XT_TA_I8:
113
+ return xt_number((double)(int8_t)raw[0]);
114
+ case XT_TA_U8C:
115
+ return xt_number((double)raw[0]);
116
+ case XT_TA_U16: {
117
+ uint16_t value;
118
+ memcpy(&value, raw, sizeof(value));
119
+ return xt_number((double)value);
120
+ }
121
+ case XT_TA_I16: {
122
+ int16_t value;
123
+ memcpy(&value, raw, sizeof(value));
124
+ return xt_number((double)value);
125
+ }
126
+ case XT_TA_U32: {
127
+ uint32_t value;
128
+ memcpy(&value, raw, sizeof(value));
129
+ return xt_number((double)value);
130
+ }
131
+ case XT_TA_I32: {
132
+ int32_t value;
133
+ memcpy(&value, raw, sizeof(value));
134
+ return xt_number((double)value);
135
+ }
136
+ case XT_TA_F32: {
137
+ float value;
138
+ memcpy(&value, raw, sizeof(value));
139
+ return xt_number((double)value);
140
+ }
141
+ default: {
142
+ double value;
143
+ memcpy(&value, raw, sizeof(value));
144
+ return xt_number(value);
145
+ }
146
+ }
147
+ }
148
+
149
+ void xt_typed_array_write(xt_value array, uint32_t index, xt_value value) {
150
+ int kind = xt_typed_array_kind_of(array);
151
+ if (kind < 0) return;
152
+ xt_value buffer = xt_typed_array_buffer_of(array);
153
+ if (!xt_is_array_buffer(buffer)) {
154
+ char key[24];
155
+ snprintf(key, sizeof(key), "%u", index);
156
+ xt_object_set(array, xt_string_from_cstr(key),
157
+ xt_number(xt_typed_array_coerce(kind, xt_to_number(value))));
158
+ return;
159
+ }
160
+ uint32_t width = (uint32_t)xt_ta_bytes[kind];
161
+ uint32_t offset = xt_typed_array_byte_offset_of(array) + index * width;
162
+ if (offset + width > xt_array_buffer_byte_length(buffer)) return;
163
+ double coerced = xt_typed_array_coerce(kind, xt_to_number(value));
164
+ uint8_t raw[8];
165
+ memset(raw, 0, sizeof(raw));
166
+ switch (kind) {
167
+ case XT_TA_U8:
168
+ case XT_TA_U8C:
169
+ raw[0] = (uint8_t)coerced;
170
+ break;
171
+ case XT_TA_I8:
172
+ raw[0] = (uint8_t)(int8_t)coerced;
173
+ break;
174
+ case XT_TA_U16: {
175
+ uint16_t stored = (uint16_t)coerced;
176
+ memcpy(raw, &stored, sizeof(stored));
177
+ break;
178
+ }
179
+ case XT_TA_I16: {
180
+ int16_t stored = (int16_t)coerced;
181
+ memcpy(raw, &stored, sizeof(stored));
182
+ break;
183
+ }
184
+ case XT_TA_U32: {
185
+ uint32_t stored = (uint32_t)coerced;
186
+ memcpy(raw, &stored, sizeof(stored));
187
+ break;
188
+ }
189
+ case XT_TA_I32: {
190
+ int32_t stored = (int32_t)coerced;
191
+ memcpy(raw, &stored, sizeof(stored));
192
+ break;
193
+ }
194
+ case XT_TA_F32: {
195
+ float stored = (float)coerced;
196
+ memcpy(raw, &stored, sizeof(stored));
197
+ break;
198
+ }
199
+ default: {
200
+ double stored = coerced;
201
+ memcpy(raw, &stored, sizeof(stored));
202
+ break;
203
+ }
204
+ }
205
+ for (uint32_t i = 0; i < width; i++) xt_array_buffer_set_byte(buffer, offset + i, raw[i]);
206
+ }
207
+
56
208
  /* -- element storage ------------------------------------------------------ */
57
209
 
58
210
  static uint32_t xt_ta_length(xt_value array) {
@@ -62,12 +214,19 @@ static uint32_t xt_ta_length(xt_value array) {
62
214
  }
63
215
 
64
216
  static xt_value xt_ta_element(xt_value array, uint32_t index) {
217
+ if (xt_is_array_buffer(xt_typed_array_buffer_of(array))) {
218
+ return xt_typed_array_read(array, index);
219
+ }
65
220
  char key[24];
66
221
  snprintf(key, sizeof(key), "%u", index);
67
222
  return xt_object_get_cstr(array, key);
68
223
  }
69
224
 
70
225
  static void xt_ta_store(xt_value array, int kind, uint32_t index, double value) {
226
+ if (xt_is_array_buffer(xt_typed_array_buffer_of(array))) {
227
+ xt_typed_array_write(array, index, xt_number(value));
228
+ return;
229
+ }
71
230
  char key[24];
72
231
  snprintf(key, sizeof(key), "%u", index);
73
232
  xt_object_set(array, xt_string_from_cstr(key), xt_number(xt_typed_array_coerce(kind, value)));