xbintsc 0.2.9 → 0.3.1

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 (311) hide show
  1. package/README.md +17 -2
  2. package/README.zh-CN.md +16 -2
  3. package/bin/xbintsc.js +49 -10
  4. package/dist/src/ast/expressions.d.ts +2 -0
  5. package/dist/src/binder/binder.d.ts +24 -98
  6. package/dist/src/binder/binder.js +13 -559
  7. package/dist/src/binder/binder.js.map +1 -1
  8. package/dist/src/binder/declarations.d.ts +16 -0
  9. package/dist/src/binder/declarations.js +168 -0
  10. package/dist/src/binder/declarations.js.map +1 -0
  11. package/dist/src/binder/helpers.d.ts +11 -0
  12. package/dist/src/binder/helpers.js +46 -0
  13. package/dist/src/binder/helpers.js.map +1 -0
  14. package/dist/src/binder/references.d.ts +21 -0
  15. package/dist/src/binder/references.js +349 -0
  16. package/dist/src/binder/references.js.map +1 -0
  17. package/dist/src/binder/types.d.ts +114 -0
  18. package/dist/src/binder/types.js +27 -0
  19. package/dist/src/binder/types.js.map +1 -0
  20. package/dist/src/cli/main.d.ts +1 -0
  21. package/dist/src/cli/main.js +40 -0
  22. package/dist/src/cli/main.js.map +1 -1
  23. package/dist/src/codegen/generator/calls/access.d.ts +13 -0
  24. package/dist/src/codegen/generator/calls/access.js +115 -0
  25. package/dist/src/codegen/generator/calls/access.js.map +1 -0
  26. package/dist/src/codegen/generator/calls/closures.d.ts +11 -0
  27. package/dist/src/codegen/generator/calls/closures.js +50 -0
  28. package/dist/src/codegen/generator/calls/closures.js.map +1 -0
  29. package/dist/src/codegen/generator/calls/invocation.d.ts +18 -0
  30. package/dist/src/codegen/generator/calls/invocation.js +242 -0
  31. package/dist/src/codegen/generator/calls/invocation.js.map +1 -0
  32. package/dist/src/codegen/generator/calls/literals.d.ts +10 -0
  33. package/dist/src/codegen/generator/calls/literals.js +69 -0
  34. package/dist/src/codegen/generator/calls/literals.js.map +1 -0
  35. package/dist/src/codegen/generator/calls/super.d.ts +10 -0
  36. package/dist/src/codegen/generator/calls/super.js +47 -0
  37. package/dist/src/codegen/generator/calls/super.js.map +1 -0
  38. package/dist/src/codegen/generator/calls.d.ts +15 -24
  39. package/dist/src/codegen/generator/calls.js +15 -482
  40. package/dist/src/codegen/generator/calls.js.map +1 -1
  41. package/dist/src/codegen/generator/context.d.ts +1 -1
  42. package/dist/src/codegen/generator/context.js +2 -2
  43. package/dist/src/codegen/generator/context.js.map +1 -1
  44. package/dist/src/codegen/generator/expressions/assignment.d.ts +13 -0
  45. package/dist/src/codegen/generator/expressions/assignment.js +203 -0
  46. package/dist/src/codegen/generator/expressions/assignment.js.map +1 -0
  47. package/dist/src/codegen/generator/expressions/operators.d.ts +14 -0
  48. package/dist/src/codegen/generator/expressions/operators.js +163 -0
  49. package/dist/src/codegen/generator/expressions/operators.js.map +1 -0
  50. package/dist/src/codegen/generator/expressions/primary.d.ts +17 -0
  51. package/dist/src/codegen/generator/expressions/primary.js +260 -0
  52. package/dist/src/codegen/generator/expressions/primary.js.map +1 -0
  53. package/dist/src/codegen/generator/expressions.d.ts +11 -21
  54. package/dist/src/codegen/generator/expressions.js +11 -494
  55. package/dist/src/codegen/generator/expressions.js.map +1 -1
  56. package/dist/src/codegen/generator/module.js +16 -4
  57. package/dist/src/codegen/generator/module.js.map +1 -1
  58. package/dist/src/codegen/generator/state.js +8 -0
  59. package/dist/src/codegen/generator/state.js.map +1 -1
  60. package/dist/src/codegen/generator/statements/control-flow.d.ts +14 -0
  61. package/dist/src/codegen/generator/statements/control-flow.js +199 -0
  62. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -0
  63. package/dist/src/codegen/generator/statements/dispatch.d.ts +12 -0
  64. package/dist/src/codegen/generator/statements/dispatch.js +100 -0
  65. package/dist/src/codegen/generator/statements/dispatch.js.map +1 -0
  66. package/dist/src/codegen/generator/statements/loops.d.ts +13 -0
  67. package/dist/src/codegen/generator/statements/loops.js +152 -0
  68. package/dist/src/codegen/generator/statements/loops.js.map +1 -0
  69. package/dist/src/codegen/generator/statements/variables.d.ts +13 -0
  70. package/dist/src/codegen/generator/statements/variables.js +146 -0
  71. package/dist/src/codegen/generator/statements/variables.js.map +1 -0
  72. package/dist/src/codegen/generator/statements.d.ts +13 -21
  73. package/dist/src/codegen/generator/statements.js +13 -568
  74. package/dist/src/codegen/generator/statements.js.map +1 -1
  75. package/dist/src/codegen/generator/tables.js +7 -0
  76. package/dist/src/codegen/generator/tables.js.map +1 -1
  77. package/dist/src/codegen/values.d.ts +17 -17
  78. package/dist/src/codegen/values.js +21 -57
  79. package/dist/src/codegen/values.js.map +1 -1
  80. package/dist/src/diagnostics/diagnostic.d.ts +1 -0
  81. package/dist/src/diagnostics/diagnostic.js +1 -0
  82. package/dist/src/diagnostics/diagnostic.js.map +1 -1
  83. package/dist/src/diagnostics/source.d.ts +1 -1
  84. package/dist/src/diagnostics/source.js +7 -12
  85. package/dist/src/diagnostics/source.js.map +1 -1
  86. package/dist/src/driver/compiler.d.ts +4 -0
  87. package/dist/src/driver/compiler.js +51 -16
  88. package/dist/src/driver/compiler.js.map +1 -1
  89. package/dist/src/driver/index.d.ts +5 -2
  90. package/dist/src/driver/index.js +5 -2
  91. package/dist/src/driver/index.js.map +1 -1
  92. package/dist/src/driver/paths.d.ts +20 -0
  93. package/dist/src/driver/paths.js +49 -0
  94. package/dist/src/driver/paths.js.map +1 -1
  95. package/dist/src/driver/runtime-lib.d.ts +18 -0
  96. package/dist/src/driver/runtime-lib.js +31 -0
  97. package/dist/src/driver/runtime-lib.js.map +1 -0
  98. package/dist/src/driver/toolchain-download.d.ts +50 -0
  99. package/dist/src/driver/toolchain-download.js +76 -0
  100. package/dist/src/driver/toolchain-download.js.map +1 -0
  101. package/dist/src/driver/toolchain-provider.d.ts +33 -0
  102. package/dist/src/driver/toolchain-provider.js +71 -0
  103. package/dist/src/driver/toolchain-provider.js.map +1 -0
  104. package/dist/src/driver/toolchain.d.ts +9 -4
  105. package/dist/src/driver/toolchain.js +6 -10
  106. package/dist/src/driver/toolchain.js.map +1 -1
  107. package/dist/src/extensions/node/child_process/index.d.ts +4 -2
  108. package/dist/src/extensions/node/child_process/index.js +4 -2
  109. package/dist/src/extensions/node/child_process/index.js.map +1 -1
  110. package/dist/src/extensions/node/events/index.d.ts +10 -0
  111. package/dist/src/extensions/node/events/index.js +22 -0
  112. package/dist/src/extensions/node/events/index.js.map +1 -0
  113. package/dist/src/extensions/node/index.js +6 -0
  114. package/dist/src/extensions/node/index.js.map +1 -1
  115. package/dist/src/extensions/node/querystring/index.d.ts +10 -0
  116. package/dist/src/extensions/node/querystring/index.js +25 -0
  117. package/dist/src/extensions/node/querystring/index.js.map +1 -0
  118. package/dist/src/extensions/node/util/index.d.ts +11 -0
  119. package/dist/src/extensions/node/util/index.js +41 -0
  120. package/dist/src/extensions/node/util/index.js.map +1 -0
  121. package/dist/src/extensions/registry.d.ts +6 -0
  122. package/dist/src/extensions/registry.js.map +1 -1
  123. package/dist/src/index.d.ts +1 -1
  124. package/dist/src/index.js +1 -1
  125. package/dist/src/index.js.map +1 -1
  126. package/dist/src/lexer/scanner/identifiers.d.ts +9 -0
  127. package/dist/src/lexer/scanner/identifiers.js +33 -0
  128. package/dist/src/lexer/scanner/identifiers.js.map +1 -0
  129. package/dist/src/lexer/scanner/numbers.d.ts +10 -0
  130. package/dist/src/lexer/scanner/numbers.js +89 -0
  131. package/dist/src/lexer/scanner/numbers.js.map +1 -0
  132. package/dist/src/lexer/scanner/punctuation.d.ts +9 -0
  133. package/dist/src/lexer/scanner/punctuation.js +151 -0
  134. package/dist/src/lexer/scanner/punctuation.js.map +1 -0
  135. package/dist/src/lexer/scanner/regex.d.ts +11 -0
  136. package/dist/src/lexer/scanner/regex.js +69 -0
  137. package/dist/src/lexer/scanner/regex.js.map +1 -0
  138. package/dist/src/lexer/scanner/strings.d.ts +13 -0
  139. package/dist/src/lexer/scanner/strings.js +118 -0
  140. package/dist/src/lexer/scanner/strings.js.map +1 -0
  141. package/dist/src/lexer/scanner.d.ts +20 -27
  142. package/dist/src/lexer/scanner.js +11 -415
  143. package/dist/src/lexer/scanner.js.map +1 -1
  144. package/dist/src/parser/declarations/classes.d.ts +14 -0
  145. package/dist/src/parser/declarations/classes.js +191 -0
  146. package/dist/src/parser/declarations/classes.js.map +1 -0
  147. package/dist/src/parser/declarations/functions.d.ts +17 -0
  148. package/dist/src/parser/declarations/functions.js +241 -0
  149. package/dist/src/parser/declarations/functions.js.map +1 -0
  150. package/dist/src/parser/declarations/type-members.d.ts +16 -0
  151. package/dist/src/parser/declarations/type-members.js +156 -0
  152. package/dist/src/parser/declarations/type-members.js.map +1 -0
  153. package/dist/src/parser/declarations.d.ts +13 -24
  154. package/dist/src/parser/declarations.js +13 -571
  155. package/dist/src/parser/declarations.js.map +1 -1
  156. package/dist/src/parser/helpers.js +13 -4
  157. package/dist/src/parser/helpers.js.map +1 -1
  158. package/dist/src/parser/literals.js +10 -1
  159. package/dist/src/parser/literals.js.map +1 -1
  160. package/dist/tests/codegen/llvm.test.js +24 -0
  161. package/dist/tests/codegen/llvm.test.js.map +1 -1
  162. package/dist/tests/driver/compiler.test.js +3 -0
  163. package/dist/tests/driver/compiler.test.js.map +1 -1
  164. package/dist/tests/driver/paths.test.d.ts +1 -0
  165. package/dist/tests/driver/paths.test.js +26 -0
  166. package/dist/tests/driver/paths.test.js.map +1 -0
  167. package/dist/tests/driver/toolchain-download.test.d.ts +1 -0
  168. package/dist/tests/driver/toolchain-download.test.js +38 -0
  169. package/dist/tests/driver/toolchain-download.test.js.map +1 -0
  170. package/dist/tests/driver/toolchain-provider.test.d.ts +1 -0
  171. package/dist/tests/driver/toolchain-provider.test.js +37 -0
  172. package/dist/tests/driver/toolchain-provider.test.js.map +1 -0
  173. package/dist/tests/e2e/compile-node.test.d.ts +7 -0
  174. package/dist/tests/e2e/compile-node.test.js +123 -0
  175. package/dist/tests/e2e/compile-node.test.js.map +1 -0
  176. package/dist/tests/e2e/compile.test.d.ts +4 -1
  177. package/dist/tests/e2e/compile.test.js +78 -130
  178. package/dist/tests/e2e/compile.test.js.map +1 -1
  179. package/dist/tests/e2e/harness.d.ts +36 -0
  180. package/dist/tests/e2e/harness.js +64 -0
  181. package/dist/tests/e2e/harness.js.map +1 -0
  182. package/dist/tests/e2e/node-modules.test.js +60 -0
  183. package/dist/tests/e2e/node-modules.test.js.map +1 -1
  184. package/dist/tests/extensions/registry.test.js +4 -0
  185. package/dist/tests/extensions/registry.test.js.map +1 -1
  186. package/package.json +5 -3
  187. package/runtime/ext_node/buffer/buffer.c +12 -552
  188. package/runtime/ext_node/buffer/parts/byte-access.inc +35 -0
  189. package/runtime/ext_node/buffer/parts/construction.inc +60 -0
  190. package/runtime/ext_node/buffer/parts/integer-io.inc +119 -0
  191. package/runtime/ext_node/buffer/parts/methods.inc +135 -0
  192. package/runtime/ext_node/buffer/parts/prototype.inc +54 -0
  193. package/runtime/ext_node/buffer/parts/search.inc +86 -0
  194. package/runtime/ext_node/buffer/parts/static-api.inc +58 -0
  195. package/runtime/ext_node/child_process/child_process.c +37 -3
  196. package/runtime/ext_node/events/events.c +285 -0
  197. package/runtime/ext_node/http/http.c +11 -736
  198. package/runtime/ext_node/http/parts/client.inc +290 -0
  199. package/runtime/ext_node/http/parts/helpers.inc +45 -0
  200. package/runtime/ext_node/http/parts/prototypes.inc +57 -0
  201. package/runtime/ext_node/http/parts/response.inc +149 -0
  202. package/runtime/ext_node/http/parts/server.inc +133 -0
  203. package/runtime/ext_node/http/parts/string-builder.inc +58 -0
  204. package/runtime/ext_node/net/net.c +12 -504
  205. package/runtime/ext_node/net/parts/construction.inc +22 -0
  206. package/runtime/ext_node/net/parts/platform.inc +60 -0
  207. package/runtime/ext_node/net/parts/prototypes.inc +35 -0
  208. package/runtime/ext_node/net/parts/read-loop.inc +58 -0
  209. package/runtime/ext_node/net/parts/server.inc +131 -0
  210. package/runtime/ext_node/net/parts/socket-methods.inc +100 -0
  211. package/runtime/ext_node/net/parts/static-api.inc +93 -0
  212. package/runtime/ext_node/querystring/querystring.c +251 -0
  213. package/runtime/ext_node/util/util.c +456 -0
  214. package/runtime/rt.h +8 -2
  215. package/runtime/rt_internal.h +34 -0
  216. package/runtime/xt_bigint/arithmetic.inc +135 -0
  217. package/runtime/xt_bigint/bits.inc +98 -0
  218. package/runtime/xt_bigint/bitwise.inc +103 -0
  219. package/runtime/xt_bigint/compare.inc +30 -0
  220. package/runtime/xt_bigint/conversions.inc +51 -0
  221. package/runtime/xt_bigint/division.inc +85 -0
  222. package/runtime/xt_bigint/format.inc +145 -0
  223. package/runtime/xt_bigint/helpers.inc +92 -0
  224. package/runtime/xt_bigint/magnitude.inc +88 -0
  225. package/runtime/xt_bigint/public.inc +59 -0
  226. package/runtime/xt_bigint/small-arithmetic.inc +58 -0
  227. package/runtime/xt_bigint.c +42 -0
  228. package/runtime/xt_builtins.c +1 -0
  229. package/runtime/xt_io.c +7 -0
  230. package/runtime/xt_stdlib/arrays.inc +161 -0
  231. package/runtime/xt_stdlib/dispatch.inc +116 -0
  232. package/runtime/xt_stdlib/helpers.inc +23 -0
  233. package/runtime/xt_stdlib/math.inc +72 -0
  234. package/runtime/xt_stdlib/strings.inc +178 -0
  235. package/runtime/xt_stdlib.c +10 -549
  236. package/runtime/xt_stdlib2/array-statics.inc +37 -0
  237. package/runtime/xt_stdlib2/arrays.inc +189 -0
  238. package/runtime/xt_stdlib2/container.inc +23 -0
  239. package/runtime/xt_stdlib2/date.inc +72 -0
  240. package/runtime/xt_stdlib2/error.inc +22 -0
  241. package/runtime/xt_stdlib2/helpers.inc +43 -0
  242. package/runtime/xt_stdlib2/json.inc +213 -0
  243. package/runtime/xt_stdlib2/map.inc +95 -0
  244. package/runtime/xt_stdlib2/number-string-statics.inc +73 -0
  245. package/runtime/xt_stdlib2/numbers.inc +38 -0
  246. package/runtime/xt_stdlib2/objects.inc +41 -0
  247. package/runtime/xt_stdlib2/regexp-match.inc +204 -0
  248. package/runtime/xt_stdlib2/regexp.inc +20 -0
  249. package/runtime/xt_stdlib2/set.inc +105 -0
  250. package/runtime/xt_stdlib2/strings.inc +94 -0
  251. package/runtime/xt_stdlib2.c +19 -1278
  252. package/runtime/xt_values.c +155 -12
  253. package/scripts/build-runtime.ts +109 -0
  254. package/scripts/fetch-toolchain.ts +101 -0
  255. package/scripts/package-release.ts +192 -0
  256. package/src/ast/expressions.ts +2 -0
  257. package/src/binder/binder.ts +40 -725
  258. package/src/binder/declarations.ts +203 -0
  259. package/src/binder/helpers.ts +47 -0
  260. package/src/binder/references.ts +410 -0
  261. package/src/binder/types.ts +134 -0
  262. package/src/cli/main.ts +43 -0
  263. package/src/codegen/generator/calls/access.ts +139 -0
  264. package/src/codegen/generator/calls/closures.ts +60 -0
  265. package/src/codegen/generator/calls/invocation.ts +282 -0
  266. package/src/codegen/generator/calls/literals.ts +77 -0
  267. package/src/codegen/generator/calls/super.ts +61 -0
  268. package/src/codegen/generator/calls.ts +30 -552
  269. package/src/codegen/generator/context.ts +2 -2
  270. package/src/codegen/generator/expressions/assignment.ts +226 -0
  271. package/src/codegen/generator/expressions/operators.ts +182 -0
  272. package/src/codegen/generator/expressions/primary.ts +304 -0
  273. package/src/codegen/generator/expressions.ts +22 -553
  274. package/src/codegen/generator/module.ts +14 -4
  275. package/src/codegen/generator/state.ts +8 -0
  276. package/src/codegen/generator/statements/control-flow.ts +225 -0
  277. package/src/codegen/generator/statements/dispatch.ts +122 -0
  278. package/src/codegen/generator/statements/loops.ts +173 -0
  279. package/src/codegen/generator/statements/variables.ts +152 -0
  280. package/src/codegen/generator/statements.ts +26 -612
  281. package/src/codegen/generator/tables.ts +7 -0
  282. package/src/codegen/values.ts +22 -57
  283. package/src/diagnostics/diagnostic.ts +1 -0
  284. package/src/diagnostics/source.ts +7 -12
  285. package/src/driver/compiler.ts +61 -18
  286. package/src/driver/index.ts +17 -2
  287. package/src/driver/paths.ts +54 -0
  288. package/src/driver/runtime-lib.ts +32 -0
  289. package/src/driver/toolchain-download.ts +108 -0
  290. package/src/driver/toolchain-provider.ts +91 -0
  291. package/src/driver/toolchain.ts +29 -11
  292. package/src/extensions/node/child_process/index.ts +4 -2
  293. package/src/extensions/node/events/index.ts +27 -0
  294. package/src/extensions/node/index.ts +6 -0
  295. package/src/extensions/node/querystring/index.ts +29 -0
  296. package/src/extensions/node/util/index.ts +48 -0
  297. package/src/extensions/registry.ts +6 -0
  298. package/src/index.ts +1 -0
  299. package/src/lexer/scanner/identifiers.ts +37 -0
  300. package/src/lexer/scanner/numbers.ts +84 -0
  301. package/src/lexer/scanner/punctuation.ts +132 -0
  302. package/src/lexer/scanner/regex.ts +79 -0
  303. package/src/lexer/scanner/strings.ts +128 -0
  304. package/src/lexer/scanner.ts +35 -401
  305. package/src/parser/declarations/classes.ts +215 -0
  306. package/src/parser/declarations/functions.ts +254 -0
  307. package/src/parser/declarations/type-members.ts +181 -0
  308. package/src/parser/declarations.ts +32 -609
  309. package/src/parser/helpers.ts +13 -6
  310. package/src/parser/literals.ts +10 -1
  311. package/scripts/build-runtime.mjs +0 -55
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Primary expression lowering: the dispatcher, identifier/function values,
3
+ * `this`, `new`, `await` and template literals.
4
+ */
5
+
6
+ import {
7
+ SyntaxKind,
8
+ type ArrowFunction,
9
+ type AwaitExpression,
10
+ type BinaryExpression,
11
+ type CallExpression,
12
+ type ClassExpression,
13
+ type ConditionalExpression,
14
+ type DeleteExpression,
15
+ type ElementAccessExpression,
16
+ type Expression,
17
+ type FunctionExpression,
18
+ type Identifier,
19
+ type NewExpression,
20
+ type ObjectLiteralExpression,
21
+ type PostfixUnaryExpression,
22
+ type PrefixUnaryExpression,
23
+ type PropertyAccessExpression,
24
+ type TemplateLiteral,
25
+ type ArrayLiteralExpression,
26
+ } from "../../../ast/nodes.js";
27
+ import { SymbolKind, type SymbolInfo } from "../../../binder/binder.js";
28
+ import { DiagnosticCode } from "../../../diagnostics/diagnostic.js";
29
+ import { i64, numberLiteral, XT_FALSE, XT_NULL, XT_TRUE, XT_UNDEFINED } from "../../values.js";
30
+ import { BUILTIN_FUNCTION_VALUES, CTOR_FUNCTIONS } from "../tables.js";
31
+ import type { Generator } from "../generator.js";
32
+
33
+ export interface PrimaryExpressionMethods {
34
+ emitExpression(this: Generator, node: Expression): string;
35
+ emitIdentifier(this: Generator, identifier: Identifier): string;
36
+ emitFunctionValue(this: Generator, symbol: SymbolInfo): string;
37
+ emitTemplate(this: Generator, node: TemplateLiteral): string;
38
+ emitThis(this: Generator): string;
39
+ emitNew(this: Generator, node: NewExpression): string;
40
+ emitAwait(this: Generator, node: AwaitExpression): string;
41
+ }
42
+
43
+ export const primaryExpressionMethods: PrimaryExpressionMethods = {
44
+ emitExpression(node: Expression): string {
45
+ switch (node.kind) {
46
+ case SyntaxKind.Identifier:
47
+ return this.emitIdentifier(node as Identifier);
48
+ case SyntaxKind.NumericLiteral: {
49
+ const value = (node as { value: number }).value;
50
+ return numberLiteral(value);
51
+ }
52
+ case SyntaxKind.BigIntLiteral: {
53
+ const entry = this.internString((node as { text: string }).text);
54
+ const result = this.reg();
55
+ this.emit(` ${result} = call i64 @xt_bigint_from_string(i8* ${entry.label}, i64 ${entry.length})`);
56
+ return result;
57
+ }
58
+ case SyntaxKind.StringLiteral:
59
+ return this.stringValue((node as { value: string }).value);
60
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
61
+ return this.stringValue((node as { value: string }).value);
62
+ case SyntaxKind.RegularExpressionLiteral: {
63
+ const regex = node as { pattern: string; flags: string };
64
+ const pattern = this.stringValue(regex.pattern);
65
+ const flags = this.stringValue(regex.flags);
66
+ const ptr = `%regex${this.current.allocas.length}`;
67
+ this.current.allocas.push(`${ptr} = alloca i64, i32 2`);
68
+ const slot0 = this.reg();
69
+ this.emit(` ${slot0} = getelementptr i64, i64* ${ptr}, i32 0`);
70
+ this.emit(` store i64 ${pattern}, i64* ${slot0}`);
71
+ const slot1 = this.reg();
72
+ this.emit(` ${slot1} = getelementptr i64, i64* ${ptr}, i32 1`);
73
+ this.emit(` store i64 ${flags}, i64* ${slot1}`);
74
+ const result = this.reg();
75
+ this.emit(` ${result} = call i64 @xt_regexp_ctor(i32 2, i64* ${ptr})`);
76
+ return result;
77
+ }
78
+ case SyntaxKind.TemplateLiteral:
79
+ return this.emitTemplate(node as TemplateLiteral);
80
+ case SyntaxKind.TrueKeyword:
81
+ return i64(XT_TRUE);
82
+ case SyntaxKind.FalseKeyword:
83
+ return i64(XT_FALSE);
84
+ case SyntaxKind.NullKeyword:
85
+ return i64(XT_NULL);
86
+ case SyntaxKind.UndefinedKeyword:
87
+ return i64(XT_UNDEFINED);
88
+ case SyntaxKind.ParenthesizedExpression:
89
+ return this.emitExpression((node as { expression: Expression }).expression);
90
+ case SyntaxKind.AsExpression:
91
+ case SyntaxKind.SatisfiesExpression:
92
+ case SyntaxKind.NonNullExpression:
93
+ return this.emitExpression((node as { expression: Expression }).expression);
94
+ case SyntaxKind.DeleteExpression:
95
+ return this.emitDelete(node as DeleteExpression);
96
+ case SyntaxKind.TypeOfExpression: {
97
+ const operand = this.emitExpression((node as { expression: Expression }).expression);
98
+ const result = this.reg();
99
+ this.emit(` ${result} = call i64 @xt_typeof(i64 ${operand})`);
100
+ return result;
101
+ }
102
+ case SyntaxKind.VoidExpression:
103
+ this.emitExpression((node as { expression: Expression }).expression);
104
+ return i64(XT_UNDEFINED);
105
+ case SyntaxKind.ThisKeyword:
106
+ return this.emitThis();
107
+ case SyntaxKind.NewExpression:
108
+ return this.emitNew(node as NewExpression);
109
+ case SyntaxKind.AwaitExpression:
110
+ return this.emitAwait(node as AwaitExpression);
111
+ case SyntaxKind.ClassExpression: {
112
+ const info = this.binding.classOfNode.get(node);
113
+ if (!info) {
114
+ this.unsupported(node, "class expression");
115
+ return i64(XT_UNDEFINED);
116
+ }
117
+ this.emitClassSetup(info);
118
+ return this.emitClassReference(info);
119
+ }
120
+ case SyntaxKind.BinaryExpression:
121
+ return this.emitBinaryOrAssignment(node as BinaryExpression);
122
+ case SyntaxKind.PrefixUnaryExpression:
123
+ return this.emitPrefix(node as PrefixUnaryExpression);
124
+ case SyntaxKind.PostfixUnaryExpression:
125
+ return this.emitPostfix(node as PostfixUnaryExpression);
126
+ case SyntaxKind.ConditionalExpression:
127
+ return this.emitConditional(node as ConditionalExpression);
128
+ case SyntaxKind.CallExpression:
129
+ return this.emitCall(node as CallExpression);
130
+ case SyntaxKind.PropertyAccessExpression:
131
+ return this.emitPropertyAccess(node as PropertyAccessExpression);
132
+ case SyntaxKind.ElementAccessExpression:
133
+ return this.emitElementAccess(node as ElementAccessExpression);
134
+ case SyntaxKind.ArrayLiteralExpression:
135
+ return this.emitArrayLiteral(node as ArrayLiteralExpression);
136
+ case SyntaxKind.ObjectLiteralExpression:
137
+ return this.emitObjectLiteral(node as ObjectLiteralExpression);
138
+ case SyntaxKind.ArrowFunction:
139
+ case SyntaxKind.FunctionExpression:
140
+ return this.emitClosure(node as ArrowFunction | FunctionExpression);
141
+ default:
142
+ this.unsupported(node, "expression");
143
+ return i64(XT_UNDEFINED);
144
+ }
145
+ },
146
+
147
+ emitIdentifier(identifier: Identifier): string {
148
+ const symbol = this.binding.symbolOfIdentifier.get(identifier);
149
+ if (symbol) {
150
+ if (symbol.kind === SymbolKind.Class) {
151
+ const declaration = symbol.declarations[0];
152
+ const info = declaration ? this.binding.classOfNode.get(declaration) : undefined;
153
+ if (info) return this.emitClassReference(info);
154
+ }
155
+ if (symbol.kind === SymbolKind.Function && !this.current.slots.has(symbol.id)) {
156
+ return this.emitFunctionValue(symbol);
157
+ }
158
+ if (symbol.kind === SymbolKind.Import) {
159
+ // Imported runtime bindings have no first-class value: they are meant
160
+ // to be called (`readFileSync(...)`) or used as a namespace
161
+ // (`path.join(...)`), both handled before identifier lowering.
162
+ this.diagnostics.error(
163
+ DiagnosticCode.CodegenError,
164
+ `Imported binding '${identifier.text}' cannot be used as a value`,
165
+ identifier,
166
+ this.sourceFile.fileName,
167
+ );
168
+ return i64(XT_UNDEFINED);
169
+ }
170
+ return this.readSlot(symbol);
171
+ }
172
+ switch (identifier.text) {
173
+ case "undefined":
174
+ return i64(XT_UNDEFINED);
175
+ case "NaN":
176
+ return numberLiteral(NaN);
177
+ case "Infinity":
178
+ return numberLiteral(Infinity);
179
+ case "console":
180
+ return i64(XT_UNDEFINED);
181
+ case "arguments": {
182
+ const argc = this.reg();
183
+ this.emit(` ${argc} = load i32, i32* %saved.argc`);
184
+ const argv = this.reg();
185
+ this.emit(` ${argv} = load i64*, i64** %saved.argv`);
186
+ const rest = this.reg();
187
+ this.emit(` ${rest} = call i64 @xt_rest_args(i32 ${argc}, i64* ${argv}, i32 0)`);
188
+ return rest;
189
+ }
190
+ default: {
191
+ const builtinValue = BUILTIN_FUNCTION_VALUES[identifier.text];
192
+ if (builtinValue) {
193
+ // A global like `Boolean` used as a value (`arr.filter(Boolean)`):
194
+ // wrap its runtime trampoline in a closure object.
195
+ const cast = this.reg();
196
+ this.emit(` ${cast} = bitcast i64 (i64, i64, i32, i64*)* @${builtinValue} to i8*`);
197
+ const closure = this.reg();
198
+ this.emit(` ${closure} = call i64 @xt_closure_new(i8* ${cast}, i32 0, i64* null)`);
199
+ return closure;
200
+ }
201
+ this.diagnostics.error(
202
+ DiagnosticCode.CannotFindName,
203
+ `Cannot find name '${identifier.text}'`,
204
+ identifier,
205
+ this.sourceFile.fileName,
206
+ );
207
+ return i64(XT_UNDEFINED);
208
+ }
209
+ }
210
+ },
211
+
212
+ emitFunctionValue(symbol: SymbolInfo): string {
213
+ const declaration = symbol.declarations[0];
214
+ const fn = declaration ? this.binding.functionOfNode.get(declaration) : undefined;
215
+ if (!fn) return i64(XT_UNDEFINED);
216
+ const cast = this.reg();
217
+ this.emit(` ${cast} = bitcast i64 (i64, i64, i32, i64*)* @${this.functionName(fn)} to i8*`);
218
+ const closure = this.reg();
219
+ this.emit(` ${closure} = call i64 @xt_closure_new(i8* ${cast}, i32 0, i64* null)`);
220
+ return closure;
221
+ },
222
+
223
+ emitThis(): string {
224
+ if (!this.current.thisPtr) return i64(XT_UNDEFINED);
225
+ const value = this.reg();
226
+ this.emit(` ${value} = load i64, i64* ${this.current.thisPtr}`);
227
+ return value;
228
+ },
229
+
230
+ emitAwait(node: AwaitExpression): string {
231
+ const value = this.emitExpression(node.expression);
232
+ const result = this.reg();
233
+ this.emit(` ${result} = call i64 @xt_await(i64 ${value})`);
234
+ return result;
235
+ },
236
+
237
+ emitNew(node: NewExpression): string {
238
+ const callee = node.expression;
239
+ if (callee.kind === SyntaxKind.Identifier) {
240
+ const identifier = callee as Identifier;
241
+ const symbol = this.binding.symbolOfIdentifier.get(identifier);
242
+ if (symbol && symbol.kind === SymbolKind.Class) {
243
+ const declaration = symbol.declarations[0];
244
+ const info = declaration ? this.binding.classOfNode.get(declaration) : undefined;
245
+ if (info) {
246
+ const ctor = this.emitClassReference(info);
247
+ const args = this.emitArguments(node.arguments);
248
+ const result = this.reg();
249
+ this.emit(` ${result} = call i64 @xt_new(i64 ${ctor}, i32 ${args.argc}, i64* ${args.ptr})`);
250
+ return result;
251
+ }
252
+ }
253
+ if (!symbol) {
254
+ const ctor = CTOR_FUNCTIONS[identifier.text];
255
+ if (ctor) {
256
+ const args = this.emitArguments(node.arguments);
257
+ const result = this.reg();
258
+ this.emit(` ${result} = call i64 @${ctor}(i32 ${args.argc}, i64* ${args.ptr})`);
259
+ return result;
260
+ }
261
+ if (identifier.text === "Object") {
262
+ if (node.arguments.length > 0) return this.emitExpression(node.arguments[0]!);
263
+ return this.runtimeCall("xt_object_new", []);
264
+ }
265
+ }
266
+ // An imported constructor (`import { EventEmitter } from "events"`) keeps
267
+ // its import symbol, so resolve it through the module export table.
268
+ if (symbol && symbol.kind === SymbolKind.Import) {
269
+ const exported = this.importExports.get(symbol.id);
270
+ if (exported?.symbol && exported.isConstructor) {
271
+ this.extraDeclarations.add(`declare i64 @${exported.symbol}(i32, i64*)`);
272
+ const args = this.emitArguments(node.arguments);
273
+ const result = this.reg();
274
+ this.emit(` ${result} = call i64 @${exported.symbol}(i32 ${args.argc}, i64* ${args.ptr})`);
275
+ return result;
276
+ }
277
+ }
278
+ }
279
+ const ctorValue = this.emitExpression(callee);
280
+ const args = this.emitArguments(node.arguments);
281
+ const result = this.reg();
282
+ this.emit(` ${result} = call i64 @xt_new(i64 ${ctorValue}, i32 ${args.argc}, i64* ${args.ptr})`);
283
+ return result;
284
+ },
285
+
286
+ emitTemplate(node: TemplateLiteral): string {
287
+ let accumulator = this.stringValue(node.head);
288
+ for (const span of node.spans) {
289
+ const expression = this.emitExpression(span.expression);
290
+ const text = this.reg();
291
+ this.emit(` ${text} = call i64 @xt_to_string(i64 ${expression})`);
292
+ const joined = this.reg();
293
+ this.emit(` ${joined} = call i64 @xt_add(i64 ${accumulator}, i64 ${text})`);
294
+ accumulator = joined;
295
+ if (span.literal.length > 0) {
296
+ const literal = this.stringValue(span.literal);
297
+ const withLiteral = this.reg();
298
+ this.emit(` ${withLiteral} = call i64 @xt_add(i64 ${accumulator}, i64 ${literal})`);
299
+ accumulator = withLiteral;
300
+ }
301
+ }
302
+ return accumulator;
303
+ },
304
+ };