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