xbintsc 0.1.3 → 0.1.8

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 (142) hide show
  1. package/README.md +14 -13
  2. package/dist/src/ast/common.d.ts +33 -0
  3. package/dist/src/ast/common.js +7 -0
  4. package/dist/src/ast/common.js.map +1 -0
  5. package/dist/src/ast/declarations.d.ts +110 -0
  6. package/dist/src/ast/declarations.js +5 -0
  7. package/dist/src/ast/declarations.js.map +1 -0
  8. package/dist/src/ast/expressions.d.ts +219 -0
  9. package/dist/src/ast/expressions.js +6 -0
  10. package/dist/src/ast/expressions.js.map +1 -0
  11. package/dist/src/ast/kinds.d.ts +160 -0
  12. package/dist/src/ast/kinds.js +171 -0
  13. package/dist/src/ast/kinds.js.map +1 -0
  14. package/dist/src/ast/modules.d.ts +61 -0
  15. package/dist/src/ast/modules.js +5 -0
  16. package/dist/src/ast/modules.js.map +1 -0
  17. package/dist/src/ast/nodes.d.ts +11 -839
  18. package/dist/src/ast/nodes.js +11 -237
  19. package/dist/src/ast/nodes.js.map +1 -1
  20. package/dist/src/ast/operators.d.ts +71 -0
  21. package/dist/src/ast/operators.js +77 -0
  22. package/dist/src/ast/operators.js.map +1 -0
  23. package/dist/src/ast/statements.d.ts +120 -0
  24. package/dist/src/ast/statements.js +5 -0
  25. package/dist/src/ast/statements.js.map +1 -0
  26. package/dist/src/ast/types.d.ts +123 -0
  27. package/dist/src/ast/types.js +6 -0
  28. package/dist/src/ast/types.js.map +1 -0
  29. package/dist/src/codegen/generator/calls.d.ts +22 -0
  30. package/dist/src/codegen/generator/calls.js +301 -0
  31. package/dist/src/codegen/generator/calls.js.map +1 -0
  32. package/dist/src/codegen/generator/context.d.ts +45 -0
  33. package/dist/src/codegen/generator/context.js +128 -0
  34. package/dist/src/codegen/generator/context.js.map +1 -0
  35. package/dist/src/codegen/generator/expressions.d.ts +22 -0
  36. package/dist/src/codegen/generator/expressions.js +383 -0
  37. package/dist/src/codegen/generator/expressions.js.map +1 -0
  38. package/dist/src/codegen/generator/generator.d.ts +22 -0
  39. package/dist/src/codegen/generator/generator.js +21 -0
  40. package/dist/src/codegen/generator/generator.js.map +1 -0
  41. package/dist/src/codegen/generator/module.d.ts +15 -0
  42. package/dist/src/codegen/generator/module.js +114 -0
  43. package/dist/src/codegen/generator/module.js.map +1 -0
  44. package/dist/src/codegen/generator/state.d.ts +40 -0
  45. package/dist/src/codegen/generator/state.js +84 -0
  46. package/dist/src/codegen/generator/state.js.map +1 -0
  47. package/dist/src/codegen/generator/statements.d.ts +22 -0
  48. package/dist/src/codegen/generator/statements.js +425 -0
  49. package/dist/src/codegen/generator/statements.js.map +1 -0
  50. package/dist/src/codegen/generator/tables.d.ts +19 -0
  51. package/dist/src/codegen/generator/tables.js +153 -0
  52. package/dist/src/codegen/generator/tables.js.map +1 -0
  53. package/dist/src/codegen/llvm.d.ts +4 -13
  54. package/dist/src/codegen/llvm.js +4 -1159
  55. package/dist/src/codegen/llvm.js.map +1 -1
  56. package/dist/src/driver/compiler.js +13 -4
  57. package/dist/src/driver/compiler.js.map +1 -1
  58. package/dist/src/lexer/char.d.ts +78 -0
  59. package/dist/src/lexer/char.js +106 -0
  60. package/dist/src/lexer/char.js.map +1 -0
  61. package/dist/src/lexer/scanner.js +1 -98
  62. package/dist/src/lexer/scanner.js.map +1 -1
  63. package/dist/src/parser/context.d.ts +58 -0
  64. package/dist/src/parser/context.js +174 -0
  65. package/dist/src/parser/context.js.map +1 -0
  66. package/dist/src/parser/declarations.d.ts +26 -0
  67. package/dist/src/parser/declarations.js +461 -0
  68. package/dist/src/parser/declarations.js.map +1 -0
  69. package/dist/src/parser/expressions.d.ts +27 -0
  70. package/dist/src/parser/expressions.js +437 -0
  71. package/dist/src/parser/expressions.js.map +1 -0
  72. package/dist/src/parser/helpers.d.ts +7 -0
  73. package/dist/src/parser/helpers.js +36 -0
  74. package/dist/src/parser/helpers.js.map +1 -0
  75. package/dist/src/parser/literals.d.ts +16 -0
  76. package/dist/src/parser/literals.js +193 -0
  77. package/dist/src/parser/literals.js.map +1 -0
  78. package/dist/src/parser/modules.d.ts +12 -0
  79. package/dist/src/parser/modules.js +175 -0
  80. package/dist/src/parser/modules.js.map +1 -0
  81. package/dist/src/parser/operators.d.ts +12 -0
  82. package/dist/src/parser/operators.js +172 -0
  83. package/dist/src/parser/operators.js.map +1 -0
  84. package/dist/src/parser/parser.d.ts +17 -122
  85. package/dist/src/parser/parser.js +18 -2307
  86. package/dist/src/parser/parser.js.map +1 -1
  87. package/dist/src/parser/speculation.d.ts +6 -0
  88. package/dist/src/parser/speculation.js +10 -0
  89. package/dist/src/parser/speculation.js.map +1 -0
  90. package/dist/src/parser/statements.d.ts +28 -0
  91. package/dist/src/parser/statements.js +402 -0
  92. package/dist/src/parser/statements.js.map +1 -0
  93. package/dist/src/parser/types.d.ts +21 -0
  94. package/dist/src/parser/types.js +338 -0
  95. package/dist/src/parser/types.js.map +1 -0
  96. package/dist/tests/e2e/compile.test.js +122 -2
  97. package/dist/tests/e2e/compile.test.js.map +1 -1
  98. package/dist/tests/parser/parser.test.js +9 -1
  99. package/dist/tests/parser/parser.test.js.map +1 -1
  100. package/package.json +1 -1
  101. package/runtime/rt.h +32 -0
  102. package/runtime/rt_internal.h +106 -0
  103. package/runtime/xt_alloc.c +38 -0
  104. package/runtime/xt_builtins.c +192 -0
  105. package/runtime/xt_containers.c +225 -0
  106. package/runtime/xt_io.c +133 -0
  107. package/runtime/xt_stdlib.c +502 -0
  108. package/runtime/xt_values.c +291 -0
  109. package/scripts/build-runtime.mjs +8 -1
  110. package/src/ast/common.ts +210 -0
  111. package/src/ast/declarations.ts +130 -0
  112. package/src/ast/expressions.ts +275 -0
  113. package/src/ast/kinds.ts +176 -0
  114. package/src/ast/modules.ts +73 -0
  115. package/src/ast/nodes.ts +11 -1101
  116. package/src/ast/operators.ts +76 -0
  117. package/src/ast/statements.ts +148 -0
  118. package/src/ast/types.ts +173 -0
  119. package/src/codegen/generator/calls.ts +355 -0
  120. package/src/codegen/generator/context.ts +156 -0
  121. package/src/codegen/generator/expressions.ts +431 -0
  122. package/src/codegen/generator/generator.ts +35 -0
  123. package/src/codegen/generator/module.ts +139 -0
  124. package/src/codegen/generator/state.ts +126 -0
  125. package/src/codegen/generator/statements.ts +474 -0
  126. package/src/codegen/generator/tables.ts +171 -0
  127. package/src/codegen/llvm.ts +4 -1305
  128. package/src/driver/compiler.ts +17 -5
  129. package/src/lexer/char.ts +116 -0
  130. package/src/lexer/scanner.ts +9 -109
  131. package/src/parser/context.ts +196 -0
  132. package/src/parser/declarations.ts +502 -0
  133. package/src/parser/expressions.ts +465 -0
  134. package/src/parser/helpers.ts +42 -0
  135. package/src/parser/literals.ts +207 -0
  136. package/src/parser/modules.ts +194 -0
  137. package/src/parser/operators.ts +181 -0
  138. package/src/parser/parser.ts +35 -2369
  139. package/src/parser/speculation.ts +9 -0
  140. package/src/parser/statements.ts +457 -0
  141. package/src/parser/types.ts +365 -0
  142. package/runtime/xt_runtime.c +0 -682
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/codegen/generator/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Expression lowering: operators, assignments, conditionals, templates and
3
+ * identifier resolution.
4
+ */
5
+ import { type BinaryExpression, type ConditionalExpression, type Expression, type Identifier, type PostfixUnaryExpression, type PrefixUnaryExpression, type TemplateLiteral } from "../../ast/nodes.js";
6
+ import { type SymbolInfo } from "../../binder/binder.js";
7
+ import type { Generator } from "./generator.js";
8
+ export interface ExpressionMethods {
9
+ emitExpression(this: Generator, node: Expression): string;
10
+ emitIdentifier(this: Generator, identifier: Identifier): string;
11
+ emitFunctionValue(this: Generator, symbol: SymbolInfo): string;
12
+ emitTemplate(this: Generator, node: TemplateLiteral): string;
13
+ emitBinaryOrAssignment(this: Generator, node: BinaryExpression): string;
14
+ emitShortCircuit(this: Generator, node: BinaryExpression, kind: "and" | "or" | "nullish"): string;
15
+ emitConditional(this: Generator, node: ConditionalExpression): string;
16
+ emitPrefix(this: Generator, node: PrefixUnaryExpression): string;
17
+ emitPostfix(this: Generator, node: PostfixUnaryExpression): string;
18
+ emitAssignment(this: Generator, node: BinaryExpression): string;
19
+ emitLogicalAssignment(this: Generator, node: BinaryExpression): string;
20
+ emitAssignmentTarget(this: Generator, target: Expression, value: string): void;
21
+ }
22
+ export declare const expressionMethods: ExpressionMethods;
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Expression lowering: operators, assignments, conditionals, templates and
3
+ * identifier resolution.
4
+ */
5
+ import { SyntaxKind, } from "../../ast/nodes.js";
6
+ import { AssignmentOperator, BinaryOperator, PrefixUnaryOperator, PostfixUnaryOperator, } from "../../ast/nodes.js";
7
+ import { SymbolKind } from "../../binder/binder.js";
8
+ import { DiagnosticCode } from "../../diagnostics/diagnostic.js";
9
+ import { i64, numberLiteral, XT_FALSE, XT_NULL, XT_TRUE, XT_UNDEFINED } from "../values.js";
10
+ import { BINARY_RUNTIME, compoundToBinary, isAssignmentOperator } from "./tables.js";
11
+ export const expressionMethods = {
12
+ emitExpression(node) {
13
+ switch (node.kind) {
14
+ case SyntaxKind.Identifier:
15
+ return this.emitIdentifier(node);
16
+ case SyntaxKind.NumericLiteral: {
17
+ const value = node.value;
18
+ return numberLiteral(value);
19
+ }
20
+ case SyntaxKind.BigIntLiteral:
21
+ return numberLiteral(Number(node.value));
22
+ case SyntaxKind.StringLiteral:
23
+ return this.stringValue(node.value);
24
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
25
+ return this.stringValue(node.value);
26
+ case SyntaxKind.TemplateLiteral:
27
+ return this.emitTemplate(node);
28
+ case SyntaxKind.TrueKeyword:
29
+ return i64(XT_TRUE);
30
+ case SyntaxKind.FalseKeyword:
31
+ return i64(XT_FALSE);
32
+ case SyntaxKind.NullKeyword:
33
+ return i64(XT_NULL);
34
+ case SyntaxKind.UndefinedKeyword:
35
+ return i64(XT_UNDEFINED);
36
+ case SyntaxKind.ParenthesizedExpression:
37
+ return this.emitExpression(node.expression);
38
+ case SyntaxKind.AsExpression:
39
+ case SyntaxKind.SatisfiesExpression:
40
+ case SyntaxKind.NonNullExpression:
41
+ return this.emitExpression(node.expression);
42
+ case SyntaxKind.DeleteExpression:
43
+ return this.emitDelete(node);
44
+ case SyntaxKind.BinaryExpression:
45
+ return this.emitBinaryOrAssignment(node);
46
+ case SyntaxKind.PrefixUnaryExpression:
47
+ return this.emitPrefix(node);
48
+ case SyntaxKind.PostfixUnaryExpression:
49
+ return this.emitPostfix(node);
50
+ case SyntaxKind.ConditionalExpression:
51
+ return this.emitConditional(node);
52
+ case SyntaxKind.CallExpression:
53
+ return this.emitCall(node);
54
+ case SyntaxKind.PropertyAccessExpression:
55
+ return this.emitPropertyAccess(node);
56
+ case SyntaxKind.ElementAccessExpression:
57
+ return this.emitElementAccess(node);
58
+ case SyntaxKind.ArrayLiteralExpression:
59
+ return this.emitArrayLiteral(node);
60
+ case SyntaxKind.ObjectLiteralExpression:
61
+ return this.emitObjectLiteral(node);
62
+ case SyntaxKind.ArrowFunction:
63
+ case SyntaxKind.FunctionExpression:
64
+ return this.emitClosure(node);
65
+ default:
66
+ this.unsupported(node, "expression");
67
+ return i64(XT_UNDEFINED);
68
+ }
69
+ },
70
+ emitIdentifier(identifier) {
71
+ const symbol = this.binding.symbolOfIdentifier.get(identifier);
72
+ if (symbol) {
73
+ if (symbol.kind === SymbolKind.Function && !this.current.slots.has(symbol.id)) {
74
+ return this.emitFunctionValue(symbol);
75
+ }
76
+ return this.readSlot(symbol);
77
+ }
78
+ switch (identifier.text) {
79
+ case "undefined":
80
+ return i64(XT_UNDEFINED);
81
+ case "NaN":
82
+ return numberLiteral(NaN);
83
+ case "Infinity":
84
+ return numberLiteral(Infinity);
85
+ case "console":
86
+ return i64(XT_UNDEFINED);
87
+ case "arguments": {
88
+ const argc = this.reg();
89
+ this.emit(` ${argc} = load i32, i32* %saved.argc`);
90
+ const argv = this.reg();
91
+ this.emit(` ${argv} = load i64*, i64** %saved.argv`);
92
+ const rest = this.reg();
93
+ this.emit(` ${rest} = call i64 @xt_rest_args(i32 ${argc}, i64* ${argv}, i32 0)`);
94
+ return rest;
95
+ }
96
+ default:
97
+ this.diagnostics.error(DiagnosticCode.CannotFindName, `Cannot find name '${identifier.text}'`, identifier, this.sourceFile.fileName);
98
+ return i64(XT_UNDEFINED);
99
+ }
100
+ },
101
+ emitFunctionValue(symbol) {
102
+ const declaration = symbol.declarations[0];
103
+ const fn = declaration ? this.binding.functionOfNode.get(declaration) : undefined;
104
+ if (!fn)
105
+ return i64(XT_UNDEFINED);
106
+ const cast = this.reg();
107
+ this.emit(` ${cast} = bitcast i64 (i64, i32, i64*)* @${this.functionName(fn)} to i8*`);
108
+ const closure = this.reg();
109
+ this.emit(` ${closure} = call i64 @xt_closure_new(i8* ${cast}, i32 0, i64* null)`);
110
+ return closure;
111
+ },
112
+ emitTemplate(node) {
113
+ let accumulator = this.stringValue(node.head);
114
+ for (const span of node.spans) {
115
+ const expression = this.emitExpression(span.expression);
116
+ const text = this.reg();
117
+ this.emit(` ${text} = call i64 @xt_to_string(i64 ${expression})`);
118
+ const joined = this.reg();
119
+ this.emit(` ${joined} = call i64 @xt_add(i64 ${accumulator}, i64 ${text})`);
120
+ accumulator = joined;
121
+ if (span.literal.length > 0) {
122
+ const literal = this.stringValue(span.literal);
123
+ const withLiteral = this.reg();
124
+ this.emit(` ${withLiteral} = call i64 @xt_add(i64 ${accumulator}, i64 ${literal})`);
125
+ accumulator = withLiteral;
126
+ }
127
+ }
128
+ return accumulator;
129
+ },
130
+ emitBinaryOrAssignment(node) {
131
+ const operator = node.operator;
132
+ if (isAssignmentOperator(operator)) {
133
+ return this.emitAssignment(node);
134
+ }
135
+ switch (operator) {
136
+ case BinaryOperator.AmpersandAmpersand:
137
+ return this.emitShortCircuit(node, "and");
138
+ case BinaryOperator.BarBar:
139
+ return this.emitShortCircuit(node, "or");
140
+ case BinaryOperator.QuestionQuestion:
141
+ return this.emitShortCircuit(node, "nullish");
142
+ case BinaryOperator.Comma: {
143
+ this.emitExpression(node.left);
144
+ return this.emitExpression(node.right);
145
+ }
146
+ default:
147
+ break;
148
+ }
149
+ const left = this.emitExpression(node.left);
150
+ const right = this.emitExpression(node.right);
151
+ const runtime = BINARY_RUNTIME[operator];
152
+ if (!runtime) {
153
+ this.unsupported(node, `operator '${operator}'`);
154
+ return i64(XT_UNDEFINED);
155
+ }
156
+ const result = this.reg();
157
+ this.emit(` ${result} = call i64 @${runtime}(i64 ${left}, i64 ${right})`);
158
+ return result;
159
+ },
160
+ emitShortCircuit(node, kind) {
161
+ const result = this.alloca();
162
+ const left = this.emitExpression(node.left);
163
+ this.emit(` store i64 ${left}, i64* ${result}`);
164
+ const rightLabel = this.label("sc.right");
165
+ const endLabel = this.label("sc.end");
166
+ let condition;
167
+ if (kind === "and") {
168
+ const truthy = this.reg();
169
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${left})`);
170
+ condition = this.reg();
171
+ this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
172
+ }
173
+ else if (kind === "or") {
174
+ const truthy = this.reg();
175
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${left})`);
176
+ const isTruthy = this.reg();
177
+ this.emit(` ${isTruthy} = icmp ne i32 ${truthy}, 0`);
178
+ condition = this.reg();
179
+ this.emit(` ${condition} = xor i1 ${isTruthy}, true`);
180
+ }
181
+ else {
182
+ const nullish = this.reg();
183
+ this.emit(` ${nullish} = call i64 @xt_is_nullish(i64 ${left})`);
184
+ const truthy = this.reg();
185
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${nullish})`);
186
+ condition = this.reg();
187
+ this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
188
+ }
189
+ this.terminate(`br i1 ${condition}, label %${rightLabel}, label %${endLabel}`);
190
+ this.startBlock(rightLabel);
191
+ const right = this.emitExpression(node.right);
192
+ this.emit(` store i64 ${right}, i64* ${result}`);
193
+ this.terminate(`br label %${endLabel}`);
194
+ this.startBlock(endLabel);
195
+ const value = this.reg();
196
+ this.emit(` ${value} = load i64, i64* ${result}`);
197
+ return value;
198
+ },
199
+ emitConditional(node) {
200
+ const result = this.alloca();
201
+ const condition = this.emitExpression(node.condition);
202
+ const truthy = this.reg();
203
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${condition})`);
204
+ const nonzero = this.reg();
205
+ this.emit(` ${nonzero} = icmp ne i32 ${truthy}, 0`);
206
+ const trueLabel = this.label("cond.true");
207
+ const falseLabel = this.label("cond.false");
208
+ const endLabel = this.label("cond.end");
209
+ this.terminate(`br i1 ${nonzero}, label %${trueLabel}, label %${falseLabel}`);
210
+ this.startBlock(trueLabel);
211
+ const whenTrue = this.emitExpression(node.whenTrue);
212
+ this.emit(` store i64 ${whenTrue}, i64* ${result}`);
213
+ this.terminate(`br label %${endLabel}`);
214
+ this.startBlock(falseLabel);
215
+ const whenFalse = this.emitExpression(node.whenFalse);
216
+ this.emit(` store i64 ${whenFalse}, i64* ${result}`);
217
+ this.terminate(`br label %${endLabel}`);
218
+ this.startBlock(endLabel);
219
+ const value = this.reg();
220
+ this.emit(` ${value} = load i64, i64* ${result}`);
221
+ return value;
222
+ },
223
+ emitPrefix(node) {
224
+ switch (node.operator) {
225
+ case PrefixUnaryOperator.Minus: {
226
+ const operand = this.emitExpression(node.operand);
227
+ const result = this.reg();
228
+ this.emit(` ${result} = call i64 @xt_neg(i64 ${operand})`);
229
+ return result;
230
+ }
231
+ case PrefixUnaryOperator.Plus: {
232
+ const operand = this.emitExpression(node.operand);
233
+ const result = this.reg();
234
+ this.emit(` ${result} = call i64 @xt_pos(i64 ${operand})`);
235
+ return result;
236
+ }
237
+ case PrefixUnaryOperator.Exclamation: {
238
+ const operand = this.emitExpression(node.operand);
239
+ const result = this.reg();
240
+ this.emit(` ${result} = call i64 @xt_not(i64 ${operand})`);
241
+ return result;
242
+ }
243
+ case PrefixUnaryOperator.Tilde: {
244
+ const operand = this.emitExpression(node.operand);
245
+ const result = this.reg();
246
+ this.emit(` ${result} = call i64 @xt_bit_not(i64 ${operand})`);
247
+ return result;
248
+ }
249
+ case PrefixUnaryOperator.TypeOf: {
250
+ const operand = this.emitExpression(node.operand);
251
+ const result = this.reg();
252
+ this.emit(` ${result} = call i64 @xt_typeof(i64 ${operand})`);
253
+ return result;
254
+ }
255
+ case PrefixUnaryOperator.Void:
256
+ if (node.operand)
257
+ this.emitExpression(node.operand);
258
+ return i64(XT_UNDEFINED);
259
+ case PrefixUnaryOperator.PlusPlus:
260
+ case PrefixUnaryOperator.MinusMinus: {
261
+ const one = numberLiteral(1);
262
+ const current = this.emitExpression(node.operand);
263
+ const fn = node.operator === PrefixUnaryOperator.PlusPlus ? "xt_add" : "xt_sub";
264
+ const next = this.reg();
265
+ this.emit(` ${next} = call i64 @${fn}(i64 ${current}, i64 ${one})`);
266
+ this.emitAssignmentTarget(node.operand, next);
267
+ return next;
268
+ }
269
+ default:
270
+ this.unsupported(node, `unary operator '${node.operator}'`);
271
+ return i64(XT_UNDEFINED);
272
+ }
273
+ },
274
+ emitPostfix(node) {
275
+ const one = numberLiteral(1);
276
+ const current = this.emitExpression(node.operand);
277
+ const fn = node.operator === PostfixUnaryOperator.PlusPlus ? "xt_add" : "xt_sub";
278
+ const next = this.reg();
279
+ this.emit(` ${next} = call i64 @${fn}(i64 ${current}, i64 ${one})`);
280
+ this.emitAssignmentTarget(node.operand, next);
281
+ return current;
282
+ },
283
+ emitAssignment(node) {
284
+ const operator = node.operator;
285
+ const target = node.left;
286
+ let value;
287
+ if (operator === AssignmentOperator.Assign) {
288
+ value = this.emitExpression(node.right);
289
+ }
290
+ else if (operator === AssignmentOperator.AmpersandAmpersandAssign ||
291
+ operator === AssignmentOperator.BarBarAssign ||
292
+ operator === AssignmentOperator.QuestionQuestionAssign) {
293
+ value = this.emitLogicalAssignment(node);
294
+ }
295
+ else {
296
+ const current = this.emitExpression(target);
297
+ const right = this.emitExpression(node.right);
298
+ const binaryOperator = compoundToBinary(operator);
299
+ const runtime = BINARY_RUNTIME[binaryOperator];
300
+ if (!runtime) {
301
+ this.unsupported(node, `assignment operator '${operator}'`);
302
+ return i64(XT_UNDEFINED);
303
+ }
304
+ const result = this.reg();
305
+ this.emit(` ${result} = call i64 @${runtime}(i64 ${current}, i64 ${right})`);
306
+ value = result;
307
+ }
308
+ this.emitAssignmentTarget(target, value);
309
+ return value;
310
+ },
311
+ emitLogicalAssignment(node) {
312
+ const operator = node.operator;
313
+ const target = node.left;
314
+ const current = this.emitExpression(target);
315
+ const result = this.alloca();
316
+ this.emit(` store i64 ${current}, i64* ${result}`);
317
+ const rightLabel = this.label("assign.right");
318
+ const endLabel = this.label("assign.end");
319
+ let condition;
320
+ if (operator === AssignmentOperator.AmpersandAmpersandAssign) {
321
+ const truthy = this.reg();
322
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${current})`);
323
+ condition = this.reg();
324
+ this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
325
+ }
326
+ else if (operator === AssignmentOperator.BarBarAssign) {
327
+ const truthy = this.reg();
328
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${current})`);
329
+ const isTruthy = this.reg();
330
+ this.emit(` ${isTruthy} = icmp ne i32 ${truthy}, 0`);
331
+ condition = this.reg();
332
+ this.emit(` ${condition} = xor i1 ${isTruthy}, true`);
333
+ }
334
+ else {
335
+ const nullish = this.reg();
336
+ this.emit(` ${nullish} = call i64 @xt_is_nullish(i64 ${current})`);
337
+ const truthy = this.reg();
338
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${nullish})`);
339
+ condition = this.reg();
340
+ this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
341
+ }
342
+ this.terminate(`br i1 ${condition}, label %${rightLabel}, label %${endLabel}`);
343
+ this.startBlock(rightLabel);
344
+ const right = this.emitExpression(node.right);
345
+ this.emit(` store i64 ${right}, i64* ${result}`);
346
+ this.terminate(`br label %${endLabel}`);
347
+ this.startBlock(endLabel);
348
+ const value = this.reg();
349
+ this.emit(` ${value} = load i64, i64* ${result}`);
350
+ this.emitAssignmentTarget(target, value);
351
+ return value;
352
+ },
353
+ emitAssignmentTarget(target, value) {
354
+ switch (target.kind) {
355
+ case SyntaxKind.Identifier: {
356
+ const symbol = this.binding.symbolOfIdentifier.get(target);
357
+ if (symbol)
358
+ this.writeSlot(symbol, value);
359
+ return;
360
+ }
361
+ case SyntaxKind.PropertyAccessExpression: {
362
+ const access = target;
363
+ const object = this.emitExpression(access.expression);
364
+ const key = this.stringValue(access.name.text);
365
+ this.emit(` call i64 @xt_set(i64 ${object}, i64 ${key}, i64 ${value})`);
366
+ return;
367
+ }
368
+ case SyntaxKind.ElementAccessExpression: {
369
+ const access = target;
370
+ const object = this.emitExpression(access.expression);
371
+ const key = this.emitExpression(access.argumentExpression);
372
+ this.emit(` call i64 @xt_set(i64 ${object}, i64 ${key}, i64 ${value})`);
373
+ return;
374
+ }
375
+ case SyntaxKind.ParenthesizedExpression:
376
+ this.emitAssignmentTarget(target.expression, value);
377
+ return;
378
+ default:
379
+ this.unsupported(target, "assignment target");
380
+ }
381
+ },
382
+ };
383
+ //# sourceMappingURL=expressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../../src/codegen/generator/expressions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Assembles the LLVM IR generator from its method groups.
3
+ *
4
+ * The implementation is split across `context` (shared state and primitives)
5
+ * and several method-group modules. Each group contributes an interface plus a
6
+ * plain object of methods; they are merged onto the prototype here so the
7
+ * groups can freely call one another through `this`.
8
+ */
9
+ import type { SourceFileNode } from "../../ast/nodes.js";
10
+ import type { DiagnosticBag } from "../../diagnostics/diagnostic.js";
11
+ import { GeneratorContext } from "./context.js";
12
+ import { type ModuleMethods } from "./module.js";
13
+ import { type StatementMethods } from "./statements.js";
14
+ import { type ExpressionMethods } from "./expressions.js";
15
+ import { type CallMethods } from "./calls.js";
16
+ import type { CodegenOptions, CodegenResult } from "./state.js";
17
+ export declare class Generator extends GeneratorContext {
18
+ }
19
+ export interface Generator extends ModuleMethods, StatementMethods, ExpressionMethods, CallMethods {
20
+ }
21
+ export type { CodegenOptions, CodegenResult } from "./state.js";
22
+ export declare function generate(sourceFile: SourceFileNode, diagnostics: DiagnosticBag, options?: CodegenOptions): CodegenResult;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Assembles the LLVM IR generator from its method groups.
3
+ *
4
+ * The implementation is split across `context` (shared state and primitives)
5
+ * and several method-group modules. Each group contributes an interface plus a
6
+ * plain object of methods; they are merged onto the prototype here so the
7
+ * groups can freely call one another through `this`.
8
+ */
9
+ import { GeneratorContext } from "./context.js";
10
+ import { moduleMethods } from "./module.js";
11
+ import { statementMethods } from "./statements.js";
12
+ import { expressionMethods } from "./expressions.js";
13
+ import { callMethods } from "./calls.js";
14
+ export class Generator extends GeneratorContext {
15
+ }
16
+ Object.assign(Generator.prototype, moduleMethods, statementMethods, expressionMethods, callMethods);
17
+ export function generate(sourceFile, diagnostics, options = {}) {
18
+ const generator = new Generator(sourceFile, diagnostics, options);
19
+ return { ir: generator.run(), binding: generator.binding };
20
+ }
21
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/codegen/generator/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAyB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAA0B,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAG3D,MAAM,OAAO,SAAU,SAAQ,gBAAgB;CAAG;AAKlD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;AAIpG,MAAM,UAAU,QAAQ,CACtB,UAA0B,EAC1B,WAA0B,EAC1B,UAA0B,EAAE;IAE5B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAClE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Module-level generation: emitting functions, the entry point and the overall
3
+ * IR text, plus default-parameter initialization.
4
+ */
5
+ import { type Expression } from "../../ast/nodes.js";
6
+ import type { FunctionInfo, SymbolInfo } from "../../binder/binder.js";
7
+ import type { Generator } from "./generator.js";
8
+ export interface ModuleMethods {
9
+ run(this: Generator): string;
10
+ emitFunction(this: Generator, fn: FunctionInfo): void;
11
+ emitMain(this: Generator): void;
12
+ functionName(this: Generator, fn: FunctionInfo): string;
13
+ emitDefaultParameter(this: Generator, symbol: SymbolInfo, value: string, initializer: Expression): void;
14
+ }
15
+ export declare const moduleMethods: ModuleMethods;
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Module-level generation: emitting functions, the entry point and the overall
3
+ * IR text, plus default-parameter initialization.
4
+ */
5
+ import { SyntaxKind, } from "../../ast/nodes.js";
6
+ import { i64, XT_UNDEFINED } from "../values.js";
7
+ import { RUNTIME_DECLARATIONS } from "./state.js";
8
+ export const moduleMethods = {
9
+ run() {
10
+ for (const fn of this.binding.functions)
11
+ this.emitFunction(fn);
12
+ this.emitMain();
13
+ const header = ["; ModuleID = 'xbintsc'", "source_filename = \"" + this.sourceFile.fileName + "\"", ""];
14
+ return [...header, ...RUNTIME_DECLARATIONS, ...this.extraDeclarations, "", ...this.globals, "", ...this.functions, ""].join("\n");
15
+ },
16
+ // -- module level --------------------------------------------------------
17
+ emitFunction(fn) {
18
+ const name = this.functionName(fn);
19
+ const state = {
20
+ fn,
21
+ buffer: [],
22
+ allocas: [],
23
+ slots: new Map(),
24
+ reg: 0,
25
+ label: 0,
26
+ terminated: false,
27
+ loops: [],
28
+ tryFrames: [],
29
+ escapePointers: [],
30
+ usesTry: false,
31
+ };
32
+ this.current = state;
33
+ const header = `define i64 @${name}(i64 %env, i32 %argc, i64* %argv) {`;
34
+ this.emit(`%saved.env = alloca i64`);
35
+ this.emit(`store i64 %env, i64* %saved.env`);
36
+ this.emit(`%saved.argc = alloca i32`);
37
+ this.emit(`store i32 %argc, i32* %saved.argc`);
38
+ this.emit(`%saved.argv = alloca i64*`);
39
+ this.emit(`store i64* %argv, i64** %saved.argv`);
40
+ // Parameters.
41
+ const parameterNodes = fn.node.parameters ?? [];
42
+ for (let index = 0; index < fn.params.length; index++) {
43
+ const symbol = fn.params[index];
44
+ const parameter = parameterNodes[index];
45
+ if (parameter?.dotDotDotToken) {
46
+ const rest = this.reg();
47
+ this.emit(` ${rest} = call i64 @xt_rest_args(i32 %argc, i64* %argv, i32 ${index})`);
48
+ this.declareSlot(symbol, rest);
49
+ continue;
50
+ }
51
+ const value = this.reg();
52
+ this.emit(` ${value} = call i64 @xt_arg(i32 %argc, i64* %argv, i32 ${index})`);
53
+ this.declareSlot(symbol, value);
54
+ if (parameter?.initializer)
55
+ this.emitDefaultParameter(symbol, value, parameter.initializer);
56
+ }
57
+ // Captures threaded through the environment.
58
+ for (const symbol of fn.captures) {
59
+ const index = fn.captureIndex.get(symbol.id);
60
+ const value = this.reg();
61
+ this.emit(` ${value} = call i64 @xt_closure_env(i64 %env, i32 ${index})`);
62
+ this.defineCaptureSlot(symbol, value);
63
+ }
64
+ // Body.
65
+ if (fn.node.kind === SyntaxKind.SourceFile) {
66
+ this.emitStatements(this.sourceFile.statements);
67
+ }
68
+ else if (fn.node.kind === SyntaxKind.ArrowFunction && fn.node.body.kind !== SyntaxKind.Block) {
69
+ const value = this.emitExpression(fn.node.body);
70
+ this.terminate(`ret i64 ${value}`);
71
+ }
72
+ else {
73
+ const body = fn.node.body;
74
+ this.emitStatements(body.statements);
75
+ }
76
+ if (!this.current.terminated)
77
+ this.terminate(`ret i64 ${i64(XT_UNDEFINED)}`);
78
+ const escapes = state.usesTry
79
+ ? state.escapePointers.map((ptr) => ` call void asm sideeffect "", "r"(i64* ${ptr})`)
80
+ : [];
81
+ const lines = [...state.allocas.map((a) => ` ${a}`), ...escapes, ...state.buffer];
82
+ this.functions.push([header, ...lines, "}", ""].join("\n"));
83
+ },
84
+ emitMain() {
85
+ const moduleName = this.functionName(this.binding.moduleFunction);
86
+ this.functions.push([
87
+ "define i32 @main(i32 %argc, i8** %argv) {",
88
+ ` %result = call i64 @${moduleName}(i64 ${i64(XT_UNDEFINED)}, i32 0, i64* null)`,
89
+ " ret i32 0",
90
+ "}",
91
+ "",
92
+ ].join("\n"));
93
+ },
94
+ functionName(fn) {
95
+ return fn.isModule ? "xt_module" : `xt_fn_${fn.id}`;
96
+ },
97
+ emitDefaultParameter(symbol, value, initializer) {
98
+ const isUndefined = this.reg();
99
+ this.emit(` ${isUndefined} = call i64 @xt_seq(i64 ${value}, i64 ${i64(XT_UNDEFINED)})`);
100
+ const truthy = this.reg();
101
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${isUndefined})`);
102
+ const condition = this.reg();
103
+ this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
104
+ const applyLabel = this.label("param.default");
105
+ const endLabel = this.label("param.end");
106
+ this.terminate(`br i1 ${condition}, label %${applyLabel}, label %${endLabel}`);
107
+ this.startBlock(applyLabel);
108
+ const fallback = this.emitExpression(initializer);
109
+ this.writeSlot(symbol, fallback);
110
+ this.terminate(`br label %${endLabel}`);
111
+ this.startBlock(endLabel);
112
+ },
113
+ };
114
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../src/codegen/generator/module.ts"],"names":[],"mappings":"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"}