xbintsc 0.5.6 → 0.5.20

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