xbintsc 0.3.87 → 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 (458) hide show
  1. package/AGENTS.md +23 -11
  2. package/README.md +11 -9
  3. package/README.zh-CN.md +7 -7
  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 +17 -4
  14. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  15. package/dist/src/codegen/generator/calls/closures.js +13 -1
  16. package/dist/src/codegen/generator/calls/closures.js.map +1 -1
  17. package/dist/src/codegen/generator/calls/invocation.js +4 -3
  18. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  19. package/dist/src/codegen/generator/context.d.ts +8 -0
  20. package/dist/src/codegen/generator/context.js +22 -3
  21. package/dist/src/codegen/generator/context.js.map +1 -1
  22. package/dist/src/codegen/generator/expressions/operators.js +17 -15
  23. package/dist/src/codegen/generator/expressions/operators.js.map +1 -1
  24. package/dist/src/codegen/generator/expressions/primary.js +11 -1
  25. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  26. package/dist/src/codegen/generator/module.d.ts +0 -1
  27. package/dist/src/codegen/generator/module.js +10 -17
  28. package/dist/src/codegen/generator/module.js.map +1 -1
  29. package/dist/src/codegen/generator/numeric.d.ts +6 -3
  30. package/dist/src/codegen/generator/numeric.js +54 -11
  31. package/dist/src/codegen/generator/numeric.js.map +1 -1
  32. package/dist/src/codegen/generator/state.js +27 -0
  33. package/dist/src/codegen/generator/state.js.map +1 -1
  34. package/dist/src/codegen/generator/statements/control-flow.js +2 -7
  35. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
  36. package/dist/src/codegen/generator/statements/loops.js +48 -16
  37. package/dist/src/codegen/generator/statements/loops.js.map +1 -1
  38. package/dist/src/codegen/generator/tables.d.ts +9 -0
  39. package/dist/src/codegen/generator/tables.js +100 -3
  40. package/dist/src/codegen/generator/tables.js.map +1 -1
  41. package/dist/src/diagnostics/diagnostic.d.ts +3 -1
  42. package/dist/src/diagnostics/diagnostic.js +23 -3
  43. package/dist/src/diagnostics/diagnostic.js.map +1 -1
  44. package/dist/src/driver/app-artifacts.d.ts +42 -0
  45. package/dist/src/driver/app-artifacts.js +53 -0
  46. package/dist/src/driver/app-artifacts.js.map +1 -0
  47. package/dist/src/driver/build-key.d.ts +29 -0
  48. package/dist/src/driver/build-key.js +35 -0
  49. package/dist/src/driver/build-key.js.map +1 -0
  50. package/dist/src/driver/bundler/graph.js +61 -12
  51. package/dist/src/driver/bundler/graph.js.map +1 -1
  52. package/dist/src/driver/bundler/merge.js +7 -1
  53. package/dist/src/driver/bundler/merge.js.map +1 -1
  54. package/dist/src/driver/compiler.d.ts +10 -67
  55. package/dist/src/driver/compiler.js +94 -230
  56. package/dist/src/driver/compiler.js.map +1 -1
  57. package/dist/src/driver/config.d.ts +3 -0
  58. package/dist/src/driver/config.js +8 -0
  59. package/dist/src/driver/config.js.map +1 -1
  60. package/dist/src/driver/frontend.d.ts +37 -0
  61. package/dist/src/driver/frontend.js +92 -0
  62. package/dist/src/driver/frontend.js.map +1 -0
  63. package/dist/src/driver/index.d.ts +1 -1
  64. package/dist/src/driver/index.js.map +1 -1
  65. package/dist/src/driver/options.d.ts +64 -0
  66. package/dist/src/driver/options.js +9 -0
  67. package/dist/src/driver/options.js.map +1 -0
  68. package/dist/src/driver/runtime-objects.d.ts +38 -0
  69. package/dist/src/driver/runtime-objects.js +111 -0
  70. package/dist/src/driver/runtime-objects.js.map +1 -0
  71. package/dist/src/driver/toolchain-provider.d.ts +4 -0
  72. package/dist/src/driver/toolchain-provider.js +4 -0
  73. package/dist/src/driver/toolchain-provider.js.map +1 -1
  74. package/dist/src/driver/toolchain.d.ts +32 -1
  75. package/dist/src/driver/toolchain.js +115 -11
  76. package/dist/src/driver/toolchain.js.map +1 -1
  77. package/dist/src/driver/version.d.ts +12 -0
  78. package/dist/src/driver/version.js +13 -0
  79. package/dist/src/driver/version.js.map +1 -0
  80. package/dist/src/driver/win-icon.d.ts +7 -9
  81. package/dist/src/driver/win-icon.js +37 -35
  82. package/dist/src/driver/win-icon.js.map +1 -1
  83. package/dist/src/parser/declarations/classes.js +5 -0
  84. package/dist/src/parser/declarations/classes.js.map +1 -1
  85. package/dist/src/parser/declarations/functions.js +13 -1
  86. package/dist/src/parser/declarations/functions.js.map +1 -1
  87. package/dist/src/parser/modules.js +8 -3
  88. package/dist/src/parser/modules.js.map +1 -1
  89. package/dist/src/parser/parser.d.ts +1 -0
  90. package/dist/src/parser/parser.js +23 -0
  91. package/dist/src/parser/parser.js.map +1 -1
  92. package/dist/tests/cli/check.test.d.ts +6 -0
  93. package/dist/tests/cli/check.test.js +68 -0
  94. package/dist/tests/cli/check.test.js.map +1 -0
  95. package/dist/tests/cli/main.test.js +19 -0
  96. package/dist/tests/cli/main.test.js.map +1 -1
  97. package/dist/tests/cli/watch.test.d.ts +6 -0
  98. package/dist/tests/cli/watch.test.js +72 -0
  99. package/dist/tests/cli/watch.test.js.map +1 -0
  100. package/dist/tests/codegen/closures.test.js +8 -0
  101. package/dist/tests/codegen/closures.test.js.map +1 -1
  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.d.ts +10 -0
  136. package/dist/tests/e2e/async-await.test.js +247 -0
  137. package/dist/tests/e2e/async-await.test.js.map +1 -0
  138. package/dist/tests/e2e/async-generators.test.d.ts +1 -0
  139. package/dist/tests/e2e/async-generators.test.js +154 -0
  140. package/dist/tests/e2e/async-generators.test.js.map +1 -0
  141. package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
  142. package/dist/tests/e2e/await-ordering.test.js +37 -0
  143. package/dist/tests/e2e/await-ordering.test.js.map +1 -0
  144. package/dist/tests/e2e/compile-builtins.test.js +1 -1
  145. package/dist/tests/e2e/compile-modules.test.js +7 -0
  146. package/dist/tests/e2e/compile-modules.test.js.map +1 -1
  147. package/dist/tests/e2e/date-parse.test.d.ts +8 -0
  148. package/dist/tests/e2e/date-parse.test.js +38 -0
  149. package/dist/tests/e2e/date-parse.test.js.map +1 -0
  150. package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
  151. package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
  152. package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
  153. package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
  154. package/dist/tests/e2e/globals-microtask.test.js +37 -0
  155. package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
  156. package/dist/tests/e2e/gui-media.test.js +8 -1
  157. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  158. package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
  159. package/dist/tests/e2e/inspect-builtins.test.js +43 -0
  160. package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
  161. package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
  162. package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
  163. package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
  164. package/dist/tests/e2e/json-circular.test.d.ts +6 -0
  165. package/dist/tests/e2e/json-circular.test.js +43 -0
  166. package/dist/tests/e2e/json-circular.test.js.map +1 -0
  167. package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
  168. package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
  169. package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
  170. package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
  171. package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
  172. package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
  173. package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
  174. package/dist/tests/e2e/json-stringify-space.test.js +23 -0
  175. package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
  176. package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
  177. package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
  178. package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
  179. package/dist/tests/e2e/native-extensions.test.js +1 -1
  180. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  181. package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
  182. package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
  183. package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
  184. package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
  185. package/dist/tests/e2e/property-descriptors.test.js +25 -0
  186. package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
  187. package/dist/tests/e2e/property-ic.test.d.ts +1 -0
  188. package/dist/tests/e2e/property-ic.test.js +55 -0
  189. package/dist/tests/e2e/property-ic.test.js.map +1 -0
  190. package/dist/tests/e2e/runtime-coverage-globals.test.js +46 -0
  191. package/dist/tests/e2e/runtime-coverage-globals.test.js.map +1 -1
  192. package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
  193. package/dist/tests/e2e/runtime-errors.test.js +52 -0
  194. package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
  195. package/dist/tests/e2e/string-utf16.test.d.ts +6 -0
  196. package/dist/tests/e2e/string-utf16.test.js +133 -0
  197. package/dist/tests/e2e/string-utf16.test.js.map +1 -0
  198. package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
  199. package/dist/tests/e2e/structured-clone.test.js +49 -0
  200. package/dist/tests/e2e/structured-clone.test.js.map +1 -0
  201. package/dist/tests/e2e/text-codec.test.d.ts +6 -0
  202. package/dist/tests/e2e/text-codec.test.js +24 -0
  203. package/dist/tests/e2e/text-codec.test.js.map +1 -0
  204. package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
  205. package/dist/tests/e2e/typed-array-views.test.js +39 -0
  206. package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
  207. package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
  208. package/dist/tests/e2e/url-search-params.test.js +30 -0
  209. package/dist/tests/e2e/url-search-params.test.js.map +1 -0
  210. package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
  211. package/dist/tests/e2e/weak-collections.test.js +88 -0
  212. package/dist/tests/e2e/weak-collections.test.js.map +1 -0
  213. package/dist/tests/parser/declarations.test.js +12 -0
  214. package/dist/tests/parser/declarations.test.js.map +1 -1
  215. package/dist/tests/parser/module-syntax.test.js +9 -0
  216. package/dist/tests/parser/module-syntax.test.js.map +1 -1
  217. package/dist/tests/parser/parser.test.js +7 -0
  218. package/dist/tests/parser/parser.test.js.map +1 -1
  219. package/dist/tests/version.test.js +5 -1
  220. package/dist/tests/version.test.js.map +1 -1
  221. package/doc/ai/README.md +4 -3
  222. package/doc/ai/cli.md +41 -0
  223. package/doc/ai/contributing.md +26 -21
  224. package/doc/ai/extensions.md +12 -9
  225. package/doc/ai/language-support.md +26 -19
  226. package/doc/ai/troubleshooting.md +15 -12
  227. package/doc/ai/zh-CN/README.md +3 -2
  228. package/doc/ai/zh-CN/cli.md +35 -0
  229. package/doc/ai/zh-CN/contributing.md +19 -18
  230. package/doc/ai/zh-CN/extensions.md +10 -7
  231. package/doc/ai/zh-CN/language-support.md +26 -20
  232. package/doc/ai/zh-CN/troubleshooting.md +12 -10
  233. package/doc/gui/build.md +13 -4
  234. package/doc/gui/known-issues.md +9 -5
  235. package/doc/gui/rendering.md +3 -1
  236. package/doc/gui.md +4 -3
  237. package/doc/icon.md +5 -4
  238. package/doc/implemented/async.md +38 -0
  239. package/doc/implemented/binder.md +13 -0
  240. package/doc/implemented/cli.md +47 -0
  241. package/doc/implemented/codegen.md +33 -0
  242. package/doc/implemented/collections.md +26 -0
  243. package/doc/implemented/driver.md +19 -0
  244. package/doc/implemented/extensions.md +19 -0
  245. package/doc/implemented/fetch.md +12 -0
  246. package/doc/implemented/lexer.md +23 -0
  247. package/doc/implemented/modules.md +28 -0
  248. package/doc/implemented/node/assert.md +17 -0
  249. package/doc/implemented/node/buffer.md +29 -0
  250. package/doc/implemented/node/child-process.md +29 -0
  251. package/doc/implemented/node/crypto.md +9 -0
  252. package/doc/implemented/node/dgram.md +15 -0
  253. package/doc/implemented/node/events.md +37 -0
  254. package/doc/implemented/node/fs-promises.md +38 -0
  255. package/doc/implemented/node/fs.md +112 -0
  256. package/doc/implemented/node/http.md +21 -0
  257. package/doc/implemented/node/net.md +17 -0
  258. package/doc/implemented/node/os.md +22 -0
  259. package/doc/implemented/node/path.md +33 -0
  260. package/doc/implemented/node/process.md +23 -0
  261. package/doc/implemented/node/querystring.md +20 -0
  262. package/doc/implemented/node/stream-promises.md +8 -0
  263. package/doc/implemented/node/stream.md +19 -0
  264. package/doc/implemented/node/test.md +10 -0
  265. package/doc/implemented/node/url.md +8 -0
  266. package/doc/implemented/node/util.md +25 -0
  267. package/doc/implemented/node/worker-threads.md +10 -0
  268. package/doc/implemented/node/zlib.md +8 -0
  269. package/doc/implemented/node.md +48 -0
  270. package/doc/implemented/operators.md +38 -0
  271. package/doc/implemented/parser.md +58 -0
  272. package/doc/implemented/pipeline.md +28 -0
  273. package/doc/implemented/runtime-core.md +32 -0
  274. package/doc/implemented/stdlib.md +78 -0
  275. package/doc/implemented/strings.md +27 -0
  276. package/doc/implemented/tests.md +10 -0
  277. package/doc/implemented/typed-arrays.md +26 -0
  278. package/doc/implemented/value-model.md +18 -0
  279. package/doc/implemented.md +54 -352
  280. package/doc/node-implemented.md +3 -585
  281. package/doc/node-unimplemented.md +3 -164
  282. package/doc/requirements.md +23 -8
  283. package/doc/unimplemented/classes.md +22 -0
  284. package/doc/unimplemented/deviations.md +27 -0
  285. package/doc/unimplemented/expressions.md +26 -0
  286. package/doc/unimplemented/functions.md +21 -0
  287. package/doc/unimplemented/modules.md +22 -0
  288. package/doc/unimplemented/node/async.md +17 -0
  289. package/doc/unimplemented/node/bun.md +9 -0
  290. package/doc/unimplemented/node/fs-promises.md +16 -0
  291. package/doc/unimplemented/node/fs.md +31 -0
  292. package/doc/unimplemented/node/globals.md +23 -0
  293. package/doc/unimplemented/node/modules.md +21 -0
  294. package/doc/unimplemented/node.md +21 -0
  295. package/doc/unimplemented/statements.md +18 -0
  296. package/doc/unimplemented/stdlib.md +54 -0
  297. package/doc/unimplemented/toolchain.md +14 -0
  298. package/doc/unimplemented/types.md +12 -0
  299. package/doc/unimplemented.md +18 -274
  300. package/doc/xbintsc.config.schema.json +12 -0
  301. package/doc/zh-CN/gui/build.md +11 -3
  302. package/doc/zh-CN/gui/known-issues.md +9 -4
  303. package/doc/zh-CN/gui/rendering.md +2 -1
  304. package/doc/zh-CN/gui.md +3 -2
  305. package/doc/zh-CN/icon.md +5 -4
  306. package/doc/zh-CN/implemented/async.md +38 -0
  307. package/doc/zh-CN/implemented/binder.md +13 -0
  308. package/doc/zh-CN/implemented/cli.md +46 -0
  309. package/doc/zh-CN/implemented/codegen.md +33 -0
  310. package/doc/zh-CN/implemented/collections.md +26 -0
  311. package/doc/zh-CN/implemented/driver.md +19 -0
  312. package/doc/zh-CN/implemented/extensions.md +19 -0
  313. package/doc/zh-CN/implemented/fetch.md +12 -0
  314. package/doc/zh-CN/implemented/lexer.md +23 -0
  315. package/doc/zh-CN/implemented/modules.md +28 -0
  316. package/doc/zh-CN/implemented/node/assert.md +17 -0
  317. package/doc/zh-CN/implemented/node/buffer.md +25 -0
  318. package/doc/zh-CN/implemented/node/child-process.md +27 -0
  319. package/doc/zh-CN/implemented/node/crypto.md +9 -0
  320. package/doc/zh-CN/implemented/node/dgram.md +15 -0
  321. package/doc/zh-CN/implemented/node/events.md +36 -0
  322. package/doc/zh-CN/implemented/node/fs-promises.md +27 -0
  323. package/doc/zh-CN/implemented/node/fs.md +105 -0
  324. package/doc/zh-CN/implemented/node/http.md +17 -0
  325. package/doc/zh-CN/implemented/node/net.md +17 -0
  326. package/doc/zh-CN/implemented/node/os.md +21 -0
  327. package/doc/zh-CN/implemented/node/path.md +26 -0
  328. package/doc/zh-CN/implemented/node/process.md +23 -0
  329. package/doc/zh-CN/implemented/node/querystring.md +20 -0
  330. package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
  331. package/doc/zh-CN/implemented/node/stream.md +15 -0
  332. package/doc/zh-CN/implemented/node/test.md +10 -0
  333. package/doc/zh-CN/implemented/node/url.md +8 -0
  334. package/doc/zh-CN/implemented/node/util.md +25 -0
  335. package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
  336. package/doc/zh-CN/implemented/node/zlib.md +8 -0
  337. package/doc/zh-CN/implemented/node.md +45 -0
  338. package/doc/zh-CN/implemented/operators.md +38 -0
  339. package/doc/zh-CN/implemented/parser.md +58 -0
  340. package/doc/zh-CN/implemented/pipeline.md +25 -0
  341. package/doc/zh-CN/implemented/runtime-core.md +31 -0
  342. package/doc/zh-CN/implemented/stdlib.md +76 -0
  343. package/doc/zh-CN/implemented/strings.md +27 -0
  344. package/doc/zh-CN/implemented/tests.md +10 -0
  345. package/doc/zh-CN/implemented/typed-arrays.md +26 -0
  346. package/doc/zh-CN/implemented/value-model.md +18 -0
  347. package/doc/zh-CN/implemented.md +50 -347
  348. package/doc/zh-CN/node-implemented.md +4 -531
  349. package/doc/zh-CN/node-unimplemented.md +4 -139
  350. package/doc/zh-CN/plan-require-node-modules.md +4 -4
  351. package/doc/zh-CN/requirements.md +20 -6
  352. package/doc/zh-CN/unimplemented/classes.md +22 -0
  353. package/doc/zh-CN/unimplemented/deviations.md +24 -0
  354. package/doc/zh-CN/unimplemented/expressions.md +24 -0
  355. package/doc/zh-CN/unimplemented/functions.md +21 -0
  356. package/doc/zh-CN/unimplemented/modules.md +19 -0
  357. package/doc/zh-CN/unimplemented/node/async.md +17 -0
  358. package/doc/zh-CN/unimplemented/node/bun.md +8 -0
  359. package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
  360. package/doc/zh-CN/unimplemented/node/fs.md +24 -0
  361. package/doc/zh-CN/unimplemented/node/globals.md +14 -0
  362. package/doc/zh-CN/unimplemented/node/modules.md +15 -0
  363. package/doc/zh-CN/unimplemented/node.md +18 -0
  364. package/doc/zh-CN/unimplemented/statements.md +15 -0
  365. package/doc/zh-CN/unimplemented/stdlib.md +54 -0
  366. package/doc/zh-CN/unimplemented/toolchain.md +14 -0
  367. package/doc/zh-CN/unimplemented/types.md +11 -0
  368. package/doc/zh-CN/unimplemented.md +14 -236
  369. package/llms.txt +32 -4
  370. package/package.json +1 -1
  371. package/runtime/ext_gui/renderer_shaders.h +2 -2
  372. package/runtime/ext_gui/stb_image.h +1 -17
  373. package/runtime/ext_node/child_process/child_process.c +173 -73
  374. package/runtime/rt.h +47 -0
  375. package/runtime/rt_internal.h +205 -10
  376. package/runtime/xt_alloc.c +49 -7
  377. package/runtime/xt_array_buffer.c +284 -0
  378. package/runtime/xt_async.c +222 -0
  379. package/runtime/xt_bigint/helpers.inc +3 -3
  380. package/runtime/xt_builtins.c +59 -51
  381. package/runtime/xt_constructors.c +399 -0
  382. package/runtime/xt_containers/access.inc +195 -14
  383. package/runtime/xt_containers/arrays.inc +26 -2
  384. package/runtime/xt_containers/objects.inc +226 -5
  385. package/runtime/xt_containers/shapes.inc +71 -0
  386. package/runtime/xt_containers.c +1 -0
  387. package/runtime/xt_coroutine.c +229 -0
  388. package/runtime/xt_generator.c +325 -167
  389. package/runtime/xt_io/inspect.inc +147 -2
  390. package/runtime/xt_loop.c +35 -4
  391. package/runtime/xt_performance.c +37 -0
  392. package/runtime/xt_promise.c +125 -18
  393. package/runtime/xt_stdlib/arrays.inc +1 -1
  394. package/runtime/xt_stdlib/dispatch.inc +64 -13
  395. package/runtime/xt_stdlib/strings.inc +74 -17
  396. package/runtime/xt_stdlib2/array-statics.inc +28 -3
  397. package/runtime/xt_stdlib2/arrays.inc +5 -3
  398. package/runtime/xt_stdlib2/container.inc +5 -0
  399. package/runtime/xt_stdlib2/date.inc +111 -3
  400. package/runtime/xt_stdlib2/error.inc +35 -0
  401. package/runtime/xt_stdlib2/json.inc +353 -33
  402. package/runtime/xt_stdlib2/number-string-statics.inc +24 -15
  403. package/runtime/xt_stdlib2/objects.inc +123 -1
  404. package/runtime/xt_stdlib2/regexp-match.inc +2 -2
  405. package/runtime/xt_stdlib2/set.inc +7 -1
  406. package/runtime/xt_stdlib2/strings.inc +70 -40
  407. package/runtime/xt_structured_clone.c +159 -0
  408. package/runtime/xt_symbol.c +2 -2
  409. package/runtime/xt_text_codec.c +69 -0
  410. package/runtime/xt_typed_array/construction.inc +78 -7
  411. package/runtime/xt_typed_array/elements.inc +159 -0
  412. package/runtime/xt_typed_array/methods.inc +21 -5
  413. package/runtime/xt_typed_array.c +11 -10
  414. package/runtime/xt_url.c +375 -0
  415. package/runtime/xt_values/arithmetic.inc +2 -2
  416. package/runtime/xt_values/constructors.inc +8 -0
  417. package/runtime/xt_values/conversions.inc +1 -1
  418. package/runtime/xt_values/strings.inc +19 -3
  419. package/runtime/xt_values/utf16.inc +340 -0
  420. package/runtime/xt_values.c +1 -0
  421. package/runtime/xt_weak.c +281 -0
  422. package/scripts/build-gui.ts +133 -60
  423. package/scripts/check-version.ts +3 -3
  424. package/src/binder/declarations.ts +14 -3
  425. package/src/cli/hints.ts +8 -1
  426. package/src/cli/main.ts +119 -18
  427. package/src/cli/watch.ts +101 -0
  428. package/src/codegen/generator/calls/access.ts +17 -4
  429. package/src/codegen/generator/calls/closures.ts +12 -1
  430. package/src/codegen/generator/calls/invocation.ts +4 -3
  431. package/src/codegen/generator/context.ts +23 -3
  432. package/src/codegen/generator/expressions/operators.ts +27 -13
  433. package/src/codegen/generator/expressions/primary.ts +10 -1
  434. package/src/codegen/generator/module.ts +10 -19
  435. package/src/codegen/generator/numeric.ts +85 -11
  436. package/src/codegen/generator/state.ts +27 -0
  437. package/src/codegen/generator/statements/control-flow.ts +2 -6
  438. package/src/codegen/generator/statements/loops.ts +50 -16
  439. package/src/codegen/generator/tables.ts +110 -3
  440. package/src/diagnostics/diagnostic.ts +23 -3
  441. package/src/driver/app-artifacts.ts +77 -0
  442. package/src/driver/build-key.ts +55 -0
  443. package/src/driver/bundler/graph.ts +63 -13
  444. package/src/driver/bundler/merge.ts +4 -1
  445. package/src/driver/compiler.ts +93 -324
  446. package/src/driver/config.ts +11 -0
  447. package/src/driver/frontend.ts +120 -0
  448. package/src/driver/index.ts +0 -1
  449. package/src/driver/options.ts +70 -0
  450. package/src/driver/runtime-objects.ts +133 -0
  451. package/src/driver/toolchain-provider.ts +4 -0
  452. package/src/driver/toolchain.ts +154 -10
  453. package/src/driver/version.ts +12 -0
  454. package/src/driver/win-icon.ts +36 -36
  455. package/src/parser/declarations/classes.ts +4 -0
  456. package/src/parser/declarations/functions.ts +12 -1
  457. package/src/parser/modules.ts +8 -4
  458. package/src/parser/parser.ts +28 -0
@@ -0,0 +1,375 @@
1
+ /*
2
+ * xbintsc runtime — URLSearchParams.
3
+ *
4
+ * The query string is stored as an array of [key, value] pairs under an
5
+ * internal `__entries` property. Methods are closures on the instance, so the
6
+ * same object model as the rest of the runtime applies. Values are stored
7
+ * decoded and encoded with application/x-www-form-urlencoded rules when
8
+ * serialized (`+` for spaces, percent escapes for everything else).
9
+ */
10
+
11
+ #include "rt_internal.h"
12
+
13
+ #include <ctype.h>
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+
17
+ static int xt_url_unreserved(unsigned char c) {
18
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ||
19
+ c == '*' || c == '-' || c == '.' || c == '_';
20
+ }
21
+
22
+ static xt_value xt_url_encode(xt_value value) {
23
+ xt_value text = xt_to_string(value);
24
+ xt_string *string = xt_as_string(text);
25
+ const char *bytes = xt_string_bytes(string);
26
+ size_t capacity = string->length * 3 + 1;
27
+ char *out = (char *)malloc(capacity);
28
+ if (!out) abort();
29
+ size_t written = 0;
30
+ for (uint32_t i = 0; i < string->length; i++) {
31
+ unsigned char c = (unsigned char)bytes[i];
32
+ if (c == ' ') {
33
+ out[written++] = '+';
34
+ } else if (xt_url_unreserved(c)) {
35
+ out[written++] = (char)c;
36
+ } else {
37
+ static const char hex[] = "0123456789ABCDEF";
38
+ out[written++] = '%';
39
+ out[written++] = hex[c >> 4];
40
+ out[written++] = hex[c & 0x0f];
41
+ }
42
+ }
43
+ xt_value result = xt_string_new(out, written);
44
+ free(out);
45
+ return result;
46
+ }
47
+
48
+ static int xt_url_hex(char c) {
49
+ if (c >= '0' && c <= '9') return c - '0';
50
+ if (c >= 'a' && c <= 'f') return c - 'a' + 10;
51
+ if (c >= 'A' && c <= 'F') return c - 'A' + 10;
52
+ return -1;
53
+ }
54
+
55
+ static xt_value xt_url_decode(const char *data, size_t length) {
56
+ char *out = (char *)malloc(length == 0 ? 1 : length);
57
+ if (!out) abort();
58
+ size_t written = 0;
59
+ for (size_t i = 0; i < length; i++) {
60
+ char c = data[i];
61
+ if (c == '+') {
62
+ out[written++] = ' ';
63
+ } else if (c == '%' && i + 2 < length) {
64
+ int high = xt_url_hex(data[i + 1]);
65
+ int low = xt_url_hex(data[i + 2]);
66
+ if (high >= 0 && low >= 0) {
67
+ out[written++] = (char)((high << 4) | low);
68
+ i += 2;
69
+ } else {
70
+ out[written++] = c;
71
+ }
72
+ } else {
73
+ out[written++] = c;
74
+ }
75
+ }
76
+ xt_value result = xt_string_new(out, written);
77
+ free(out);
78
+ return result;
79
+ }
80
+
81
+ static xt_value xt_url_entries(xt_value params) {
82
+ xt_value entries = xt_get(params, xt_string_from_cstr("__entries"));
83
+ if (!XT_IS_ARRAY(entries)) {
84
+ entries = xt_array_new(0, NULL);
85
+ xt_object_set(params, xt_string_from_cstr("__entries"), entries);
86
+ }
87
+ return entries;
88
+ }
89
+
90
+ static void xt_url_set_size(xt_value params) {
91
+ xt_array *entries = xt_as_array(xt_url_entries(params));
92
+ xt_object_set(params, xt_string_from_cstr("size"), xt_number((double)entries->length));
93
+ }
94
+
95
+ static void xt_url_append_pair(xt_value entries, xt_value key, xt_value value) {
96
+ xt_value pair = xt_array_new(0, NULL);
97
+ xt_array_push(pair, key);
98
+ xt_array_push(pair, value);
99
+ xt_array_push(entries, pair);
100
+ }
101
+
102
+ static xt_value xt_url_string_at(xt_value text, size_t start, size_t length) {
103
+ xt_string *string = xt_as_string(text);
104
+ const char *bytes = xt_string_bytes(string);
105
+ return xt_string_new(bytes + start, length);
106
+ }
107
+
108
+ /* Split a query string on `&`, then each item on the first `=`; decode both
109
+ * halves and append them. A leading `?` is ignored. */
110
+ static void xt_url_parse_into(xt_value params, xt_value input) {
111
+ xt_value text = xt_to_string(input);
112
+ xt_string *string = xt_as_string(text);
113
+ const char *bytes = xt_string_bytes(string);
114
+ size_t length = string->length;
115
+ size_t start = (length > 0 && bytes[0] == '?') ? 1 : 0;
116
+ xt_value entries = xt_url_entries(params);
117
+ while (start <= length) {
118
+ size_t end = start;
119
+ while (end < length && bytes[end] != '&') end++;
120
+ if (end > start) {
121
+ size_t equals = start;
122
+ while (equals < end && bytes[equals] != '=') equals++;
123
+ xt_value key = xt_url_decode(bytes + start, equals - start);
124
+ xt_value value = equals < end ? xt_url_decode(bytes + equals + 1, end - equals - 1)
125
+ : xt_string_from_cstr("");
126
+ xt_url_append_pair(entries, key, value);
127
+ }
128
+ if (end >= length) break;
129
+ start = end + 1;
130
+ }
131
+ xt_url_set_size(params);
132
+ }
133
+
134
+ static void xt_url_ctor_from_value(xt_value params, xt_value source) {
135
+ if (source == XT_UNDEFINED) return;
136
+ if (XT_IS_STRING(source)) {
137
+ xt_url_parse_into(params, source);
138
+ return;
139
+ }
140
+ if (XT_IS_ARRAY(source)) {
141
+ xt_value entries = xt_url_entries(params);
142
+ xt_array *pairs = xt_as_array(source);
143
+ for (uint32_t i = 0; i < pairs->length; i++) {
144
+ xt_array *pair = xt_as_array(pairs->items[i]);
145
+ if (pair && pair->length >= 1) {
146
+ xt_value value = pair->length >= 2 ? pair->items[1] : xt_string_from_cstr("");
147
+ xt_url_append_pair(entries, xt_to_string(pair->items[0]), xt_to_string(value));
148
+ }
149
+ }
150
+ xt_url_set_size(params);
151
+ return;
152
+ }
153
+ if (XT_IS_OBJECT(source)) {
154
+ xt_value existing = xt_get(source, xt_string_from_cstr("__entries"));
155
+ if (XT_IS_ARRAY(existing)) {
156
+ xt_value entries = xt_url_entries(params);
157
+ xt_array *pairs = xt_as_array(existing);
158
+ for (uint32_t i = 0; i < pairs->length; i++) {
159
+ xt_array *pair = xt_as_array(pairs->items[i]);
160
+ if (pair && pair->length >= 2) xt_url_append_pair(entries, pair->items[0], pair->items[1]);
161
+ }
162
+ xt_url_set_size(params);
163
+ return;
164
+ }
165
+ xt_value keys = xt_object_keys(source);
166
+ xt_array *list = xt_as_array(keys);
167
+ if (!list) return;
168
+ xt_value entries = xt_url_entries(params);
169
+ for (uint32_t i = 0; i < list->length; i++) {
170
+ xt_value key = list->items[i];
171
+ xt_url_append_pair(entries, xt_to_string(key), xt_to_string(xt_object_get(source, key)));
172
+ }
173
+ xt_url_set_size(params);
174
+ }
175
+ }
176
+
177
+ /* -- methods -------------------------------------------------------------- */
178
+
179
+ static xt_value xt_url_method_append(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
180
+ (void)env;
181
+ xt_value entries = xt_url_entries(thisValue);
182
+ xt_url_append_pair(entries, xt_to_string(xt_arg_at(argc, argv, 0)),
183
+ xt_to_string(xt_arg_at(argc, argv, 1)));
184
+ xt_url_set_size(thisValue);
185
+ return XT_UNDEFINED;
186
+ }
187
+
188
+ static int xt_url_key_equals(xt_value pair, xt_value key) {
189
+ xt_array *items = xt_as_array(pair);
190
+ return items && items->length >= 2 && xt_value_equals(items->items[0], key);
191
+ }
192
+
193
+ static xt_value xt_url_method_get(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
194
+ (void)env;
195
+ xt_value key = xt_to_string(xt_arg_at(argc, argv, 0));
196
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
197
+ for (uint32_t i = 0; i < entries->length; i++) {
198
+ if (xt_url_key_equals(entries->items[i], key)) return ((xt_array *)XT_GET_PTR(entries->items[i]))->items[1];
199
+ }
200
+ return XT_NULL;
201
+ }
202
+
203
+ static xt_value xt_url_method_get_all(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
204
+ (void)env;
205
+ xt_value key = xt_to_string(xt_arg_at(argc, argv, 0));
206
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
207
+ xt_value result = xt_array_new(0, NULL);
208
+ for (uint32_t i = 0; i < entries->length; i++) {
209
+ if (xt_url_key_equals(entries->items[i], key)) {
210
+ xt_array_push(result, ((xt_array *)XT_GET_PTR(entries->items[i]))->items[1]);
211
+ }
212
+ }
213
+ return result;
214
+ }
215
+
216
+ static xt_value xt_url_method_has(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
217
+ (void)env;
218
+ xt_value key = xt_to_string(xt_arg_at(argc, argv, 0));
219
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
220
+ for (uint32_t i = 0; i < entries->length; i++) {
221
+ if (xt_url_key_equals(entries->items[i], key)) return XT_TRUE;
222
+ }
223
+ return XT_FALSE;
224
+ }
225
+
226
+ static xt_value xt_url_method_delete(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
227
+ (void)env;
228
+ xt_value key = xt_to_string(xt_arg_at(argc, argv, 0));
229
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
230
+ uint32_t write = 0;
231
+ for (uint32_t read = 0; read < entries->length; read++) {
232
+ if (!xt_url_key_equals(entries->items[read], key)) entries->items[write++] = entries->items[read];
233
+ }
234
+ entries->length = write;
235
+ xt_url_set_size(thisValue);
236
+ return XT_UNDEFINED;
237
+ }
238
+
239
+ static xt_value xt_url_method_set(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
240
+ (void)env;
241
+ xt_value key = xt_to_string(xt_arg_at(argc, argv, 0));
242
+ xt_value value = xt_to_string(xt_arg_at(argc, argv, 1));
243
+ xt_value entriesValue = xt_url_entries(thisValue);
244
+ xt_array *entries = xt_as_array(entriesValue);
245
+ uint32_t write = 0;
246
+ int replaced = 0;
247
+ for (uint32_t read = 0; read < entries->length; read++) {
248
+ if (xt_url_key_equals(entries->items[read], key)) {
249
+ if (!replaced) {
250
+ ((xt_array *)XT_GET_PTR(entries->items[read]))->items[1] = value;
251
+ entries->items[write++] = entries->items[read];
252
+ replaced = 1;
253
+ }
254
+ continue;
255
+ }
256
+ entries->items[write++] = entries->items[read];
257
+ }
258
+ entries->length = write;
259
+ if (!replaced) xt_url_append_pair(entriesValue, key, value);
260
+ xt_url_set_size(thisValue);
261
+ return XT_UNDEFINED;
262
+ }
263
+
264
+ static xt_value xt_url_method_sort(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
265
+ (void)env;
266
+ (void)argc;
267
+ (void)argv;
268
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
269
+ for (uint32_t i = 1; i < entries->length; i++) {
270
+ xt_value current = entries->items[i];
271
+ xt_array *currentPair = xt_as_array(current);
272
+ uint32_t j = i;
273
+ while (j > 0) {
274
+ xt_array *previousPair = xt_as_array(entries->items[j - 1]);
275
+ if (strcmp(xt_string_bytes(xt_as_string(previousPair->items[0])),
276
+ xt_string_bytes(xt_as_string(currentPair->items[0]))) <= 0)
277
+ break;
278
+ entries->items[j] = entries->items[j - 1];
279
+ j--;
280
+ }
281
+ entries->items[j] = current;
282
+ }
283
+ return XT_UNDEFINED;
284
+ }
285
+
286
+ static xt_value xt_url_method_to_string(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
287
+ (void)env;
288
+ (void)argc;
289
+ (void)argv;
290
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
291
+ xt_value out = xt_string_from_cstr("");
292
+ for (uint32_t i = 0; i < entries->length; i++) {
293
+ xt_array *pair = xt_as_array(entries->items[i]);
294
+ if (!pair || pair->length < 2) continue;
295
+ if (i > 0) out = xt_add(out, xt_string_from_cstr("&"));
296
+ out = xt_add(out, xt_url_encode(pair->items[0]));
297
+ out = xt_add(out, xt_string_from_cstr("="));
298
+ out = xt_add(out, xt_url_encode(pair->items[1]));
299
+ }
300
+ return out;
301
+ }
302
+
303
+ static xt_value xt_url_method_for_each(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
304
+ (void)env;
305
+ xt_value callback = xt_arg_at(argc, argv, 0);
306
+ if (!XT_IS_FUNCTION(callback)) return XT_UNDEFINED;
307
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
308
+ for (uint32_t i = 0; i < entries->length; i++) {
309
+ xt_array *pair = xt_as_array(entries->items[i]);
310
+ if (!pair || pair->length < 2) continue;
311
+ xt_value args[3] = {pair->items[1], pair->items[0], thisValue};
312
+ xt_closure_call(callback, 3, args);
313
+ }
314
+ return XT_UNDEFINED;
315
+ }
316
+
317
+ static xt_value xt_url_method_keys(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
318
+ (void)env;
319
+ (void)argc;
320
+ (void)argv;
321
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
322
+ xt_value result = xt_array_new(0, NULL);
323
+ for (uint32_t i = 0; i < entries->length; i++) {
324
+ xt_array *pair = xt_as_array(entries->items[i]);
325
+ if (pair && pair->length >= 1) xt_array_push(result, pair->items[0]);
326
+ }
327
+ return result;
328
+ }
329
+
330
+ static xt_value xt_url_method_values(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
331
+ (void)env;
332
+ (void)argc;
333
+ (void)argv;
334
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
335
+ xt_value result = xt_array_new(0, NULL);
336
+ for (uint32_t i = 0; i < entries->length; i++) {
337
+ xt_array *pair = xt_as_array(entries->items[i]);
338
+ if (pair && pair->length >= 2) xt_array_push(result, pair->items[1]);
339
+ }
340
+ return result;
341
+ }
342
+
343
+ static xt_value xt_url_method_entries(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
344
+ (void)env;
345
+ (void)argc;
346
+ (void)argv;
347
+ xt_value result = xt_array_new(0, NULL);
348
+ xt_array *entries = xt_as_array(xt_url_entries(thisValue));
349
+ for (uint32_t i = 0; i < entries->length; i++) xt_array_push(result, entries->items[i]);
350
+ return result;
351
+ }
352
+
353
+ static void xt_url_install(xt_value params, const char *name, void *fn) {
354
+ xt_object_set(params, xt_string_from_cstr(name), xt_closure_new(fn, 0, NULL));
355
+ }
356
+
357
+ xt_value xt_url_search_params_ctor(int32_t argc, xt_value *argv) {
358
+ xt_value params = xt_object_new();
359
+ xt_object_set(params, xt_string_from_cstr("__entries"), xt_array_new(0, NULL));
360
+ xt_object_set(params, xt_string_from_cstr("size"), xt_number(0));
361
+ xt_url_install(params, "append", (void *)xt_url_method_append);
362
+ xt_url_install(params, "delete", (void *)xt_url_method_delete);
363
+ xt_url_install(params, "get", (void *)xt_url_method_get);
364
+ xt_url_install(params, "getAll", (void *)xt_url_method_get_all);
365
+ xt_url_install(params, "has", (void *)xt_url_method_has);
366
+ xt_url_install(params, "set", (void *)xt_url_method_set);
367
+ xt_url_install(params, "sort", (void *)xt_url_method_sort);
368
+ xt_url_install(params, "toString", (void *)xt_url_method_to_string);
369
+ xt_url_install(params, "forEach", (void *)xt_url_method_for_each);
370
+ xt_url_install(params, "keys", (void *)xt_url_method_keys);
371
+ xt_url_install(params, "values", (void *)xt_url_method_values);
372
+ xt_url_install(params, "entries", (void *)xt_url_method_entries);
373
+ xt_url_ctor_from_value(params, xt_arg_at(argc, argv, 0));
374
+ return params;
375
+ }
@@ -3,7 +3,7 @@
3
3
  /* ------------------------------------------------------------------------- */
4
4
 
5
5
  static void xt_throw_mixed_bigint(void) {
6
- xt_throw(xt_string_from_cstr("TypeError: Cannot mix BigInt and other types, use explicit conversions"));
6
+ xt_throw(xt_error_from_message("TypeError: Cannot mix BigInt and other types, use explicit conversions"));
7
7
  }
8
8
 
9
9
  /* ToPrimitive for the operators: arrays/objects/functions stringify (their
@@ -143,7 +143,7 @@ xt_value xt_shr(xt_value a, xt_value b) {
143
143
 
144
144
  xt_value xt_ushr(xt_value a, xt_value b) {
145
145
  if (XT_IS_BIGINT(a) || XT_IS_BIGINT(b)) {
146
- xt_throw(xt_string_from_cstr("TypeError: BigInts have no unsigned right shift, use >> instead"));
146
+ xt_throw(xt_error_from_message("TypeError: BigInts have no unsigned right shift, use >> instead"));
147
147
  return XT_UNDEFINED;
148
148
  }
149
149
  return xt_number((double)(uint32_t)((uint32_t)xt_to_int32(a) >> (xt_to_int32(b) & 31)));
@@ -10,6 +10,8 @@ xt_value xt_number(double d) { return xt_from_double(d); }
10
10
  xt_string *xt_string_alloc(size_t length) {
11
11
  xt_string *s = (xt_string *)xt_alloc(sizeof(xt_string), XT_OBJECT_KIND_STRING);
12
12
  s->length = (uint32_t)length;
13
+ s->utf16_length = 0;
14
+ s->code_point_count = 0;
13
15
  /* Keep the terminator in the allocation: many consumers hand `flat` to libc. */
14
16
  s->capacity = (uint32_t)length + 1;
15
17
  s->flat = (char *)malloc(s->capacity);
@@ -26,6 +28,7 @@ xt_string *xt_string_alloc(size_t length) {
26
28
  xt_value xt_string_new(const char *data, size_t len) {
27
29
  xt_string *s = xt_string_alloc(len);
28
30
  if (len > 0) memcpy(s->flat, data, len);
31
+ xt_string_finish(s);
29
32
  return XT_FROM_PTR(XT_TAG_STRING, s);
30
33
  }
31
34
 
@@ -44,3 +47,8 @@ int32_t xt_string_length_value(xt_value value) {
44
47
  xt_string *s = xt_as_string(value);
45
48
  return s ? (int32_t)s->length : -1;
46
49
  }
50
+
51
+ int32_t xt_string_utf16_length_value(xt_value value) {
52
+ xt_string *s = xt_as_string(value);
53
+ return s ? (int32_t)xt_string_utf16_length(s) : -1;
54
+ }
@@ -94,7 +94,7 @@ xt_value xt_to_string(xt_value v) {
94
94
  }
95
95
  if (XT_IS_FUNCTION(v)) return xt_string_from_cstr("function () { [native code] }");
96
96
  if (xt_is_symbol(v)) {
97
- xt_throw(xt_string_from_cstr("TypeError: Cannot convert a Symbol value to a string"));
97
+ xt_throw(xt_error_from_message("TypeError: Cannot convert a Symbol value to a string"));
98
98
  }
99
99
  if (XT_IS_OBJECT(v) &&
100
100
  ((xt_object *)XT_GET_PTR(v))->header.kind == XT_OBJECT_KIND_ERROR) {
@@ -62,9 +62,13 @@ const char *xt_string_bytes(xt_string *s) {
62
62
 
63
63
  out[offset] = '\0';
64
64
  s->flat = out;
65
+ s->length = (uint32_t)offset;
65
66
  s->capacity = (uint32_t)(total + 1);
66
67
  s->left = NULL;
67
68
  s->right = NULL;
69
+ /* A concat boundary can split a surrogate pair; flattening is where the two
70
+ * halves meet, so normalise and record the UTF-16/code-point view now. */
71
+ xt_string_finish(s);
68
72
  return s->flat;
69
73
  }
70
74
 
@@ -74,12 +78,22 @@ static xt_value xt_string_concat(xt_string *a, xt_string *b) {
74
78
  size_t total = (size_t)a->length + (size_t)b->length;
75
79
  if (total <= XT_STRING_CONS_THRESHOLD) {
76
80
  xt_string *out = xt_string_alloc(total);
77
- memcpy(out->flat, xt_string_bytes(a), a->length);
78
- memcpy(out->flat + a->length, xt_string_bytes(b), b->length);
81
+ const char *aBytes = xt_string_bytes(a);
82
+ uint32_t aLength = a->length;
83
+ const char *bBytes = xt_string_bytes(b);
84
+ uint32_t bLength = b->length;
85
+ memcpy(out->flat, aBytes, aLength);
86
+ memcpy(out->flat + aLength, bBytes, bLength);
87
+ xt_string_finish(out);
79
88
  return XT_FROM_PTR(XT_TAG_STRING, out);
80
89
  }
81
90
  xt_string *out = (xt_string *)xt_alloc(sizeof(xt_string), XT_OBJECT_KIND_STRING);
82
91
  out->length = (uint32_t)total;
92
+ /* UTF-16 length is additive even when the boundary joins a surrogate pair;
93
+ * the code-point count is not, so leave it to be recomputed after
94
+ * flattening. */
95
+ out->utf16_length = xt_string_utf16_length(a) + xt_string_utf16_length(b);
96
+ out->code_point_count = 0;
83
97
  out->capacity = 0;
84
98
  out->flat = NULL;
85
99
  out->left = a;
@@ -91,6 +105,8 @@ int xt_string_equals(xt_string *a, xt_string *b) {
91
105
  /* Interned literals (property names above all) are shared, so identity is the
92
106
  * common case and skips the length, flattening and byte comparison entirely. */
93
107
  if (a == b) return 1;
108
+ const char *aBytes = xt_string_bytes(a);
109
+ const char *bBytes = xt_string_bytes(b);
94
110
  if (a->length != b->length) return 0;
95
- return memcmp(xt_string_bytes(a), xt_string_bytes(b), a->length) == 0;
111
+ return memcmp(aBytes, bBytes, a->length) == 0;
96
112
  }