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,40 @@
1
+ /**
2
+ * Shared state types and the runtime declaration list for the LLVM generator.
3
+ */
4
+ import type { FunctionInfo } from "../../binder/binder.js";
5
+ import type { BindResult } from "../../binder/binder.js";
6
+ import type { BuiltinFunction } from "../../extensions/registry.js";
7
+ export interface Slot {
8
+ /** Register holding the `i64*` to the storage. */
9
+ readonly ptr: string;
10
+ readonly boxed: boolean;
11
+ }
12
+ export interface LoopLabels {
13
+ readonly breakLabel: string;
14
+ readonly continueLabel: string;
15
+ /** Number of enclosing `try` frames when the loop was entered. */
16
+ readonly tryDepth?: number;
17
+ }
18
+ export interface FunctionState {
19
+ readonly fn: FunctionInfo;
20
+ readonly buffer: string[];
21
+ readonly allocas: string[];
22
+ readonly slots: Map<number, Slot>;
23
+ reg: number;
24
+ label: number;
25
+ terminated: boolean;
26
+ readonly loops: LoopLabels[];
27
+ readonly tryFrames: string[];
28
+ readonly escapePointers: string[];
29
+ /** Set when the function contains a `try`, forcing locals to live in memory. */
30
+ usesTry: boolean;
31
+ }
32
+ export interface CodegenResult {
33
+ readonly ir: string;
34
+ readonly binding: BindResult;
35
+ }
36
+ export interface CodegenOptions {
37
+ /** Global names supplied by registered extensions. */
38
+ readonly builtins?: Readonly<Record<string, BuiltinFunction>>;
39
+ }
40
+ export declare const RUNTIME_DECLARATIONS: readonly string[];
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Shared state types and the runtime declaration list for the LLVM generator.
3
+ */
4
+ export const RUNTIME_DECLARATIONS = [
5
+ "declare i64 @xt_undefined()",
6
+ "declare i64 @xt_null()",
7
+ "declare i64 @xt_bool(i32)",
8
+ "declare i64 @xt_number(double)",
9
+ "declare i64 @xt_string_new(i8*, i64)",
10
+ "declare i64 @xt_string_from_cstr(i8*)",
11
+ "declare i64 @xt_arg(i32, i64*, i32)",
12
+ "declare i64 @xt_closure_new(i8*, i32, i64*)",
13
+ "declare i64 @xt_closure_call(i64, i32, i64*)",
14
+ "declare i64 @xt_closure_env(i64, i32)",
15
+ "declare i32 @xt_truthy(i64)",
16
+ "declare double @xt_to_number(i64)",
17
+ "declare i64 @xt_to_string(i64)",
18
+ "declare i64 @xt_typeof(i64)",
19
+ "declare i64 @xt_add(i64, i64)",
20
+ "declare i64 @xt_sub(i64, i64)",
21
+ "declare i64 @xt_mul(i64, i64)",
22
+ "declare i64 @xt_div(i64, i64)",
23
+ "declare i64 @xt_mod(i64, i64)",
24
+ "declare i64 @xt_pow(i64, i64)",
25
+ "declare i64 @xt_neg(i64)",
26
+ "declare i64 @xt_pos(i64)",
27
+ "declare i64 @xt_bit_and(i64, i64)",
28
+ "declare i64 @xt_bit_or(i64, i64)",
29
+ "declare i64 @xt_bit_xor(i64, i64)",
30
+ "declare i64 @xt_bit_not(i64)",
31
+ "declare i64 @xt_shl(i64, i64)",
32
+ "declare i64 @xt_shr(i64, i64)",
33
+ "declare i64 @xt_ushr(i64, i64)",
34
+ "declare i64 @xt_lt(i64, i64)",
35
+ "declare i64 @xt_le(i64, i64)",
36
+ "declare i64 @xt_gt(i64, i64)",
37
+ "declare i64 @xt_ge(i64, i64)",
38
+ "declare i64 @xt_eq(i64, i64)",
39
+ "declare i64 @xt_ne(i64, i64)",
40
+ "declare i64 @xt_seq(i64, i64)",
41
+ "declare i64 @xt_sne(i64, i64)",
42
+ "declare i64 @xt_not(i64)",
43
+ "declare i64 @xt_object_new()",
44
+ "declare i64 @xt_object_get_cstr(i64, i8*)",
45
+ "declare i64 @xt_object_set(i64, i64, i64)",
46
+ "declare i64 @xt_object_has(i64, i64)",
47
+ "declare i64 @xt_object_keys(i64)",
48
+ "declare i64 @xt_object_values(i64)",
49
+ "declare i64 @xt_object_entries(i64)",
50
+ "declare i64 @xt_object_assign(i32, i64*)",
51
+ "declare i64 @xt_object_spread(i64, i64)",
52
+ "declare i64 @xt_call_method(i64, i64, i32, i64*)",
53
+ "declare i64 @xt_math_call(i64, i32, i64*)",
54
+ "declare i64 @xt_parse_int(i32, i64*)",
55
+ "declare i64 @xt_parse_float(i32, i64*)",
56
+ "declare i64 @xt_is_nan(i32, i64*)",
57
+ "declare i64 @xt_is_finite(i32, i64*)",
58
+ "declare i64 @xt_number_ctor(i32, i64*)",
59
+ "declare i64 @xt_string_ctor(i32, i64*)",
60
+ "declare i64 @xt_boolean_ctor(i32, i64*)",
61
+ "declare i64 @xt_in(i64, i64)",
62
+ "declare i64 @xt_delete(i64, i64)",
63
+ "declare i64 @xt_rest_args(i32, i64*, i32)",
64
+ "declare i64 @xt_array_new(i32, i64*)",
65
+ "declare i64 @xt_array_push(i64, i64)",
66
+ "declare i64 @xt_array_length(i64)",
67
+ "declare i64 @xt_array_spread(i64, i64)",
68
+ "declare i64 @xt_get(i64, i64)",
69
+ "declare i64 @xt_set(i64, i64, i64)",
70
+ "declare i64 @xt_box_new(i64)",
71
+ "declare i64 @xt_box_get(i64)",
72
+ "declare i64 @xt_box_set(i64, i64)",
73
+ "declare i64 @xt_is_nullish(i64)",
74
+ "declare void @xt_throw(i64)",
75
+ "declare i32 @_setjmp(i8*) returns_twice",
76
+ "declare i8* @xt_try_enter()",
77
+ "declare i64 @xt_try_exception(i8*)",
78
+ "declare void @xt_try_leave(i8*)",
79
+ "declare void @xt_console_log(i32, i64*)",
80
+ "declare void @xt_console_info(i32, i64*)",
81
+ "declare void @xt_console_warn(i32, i64*)",
82
+ "declare void @xt_console_error(i32, i64*)",
83
+ ];
84
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/codegen/generator/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4CH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,6BAA6B;IAC7B,wBAAwB;IACxB,2BAA2B;IAC3B,gCAAgC;IAChC,sCAAsC;IACtC,uCAAuC;IACvC,qCAAqC;IACrC,6CAA6C;IAC7C,8CAA8C;IAC9C,uCAAuC;IACvC,6BAA6B;IAC7B,mCAAmC;IACnC,gCAAgC;IAChC,6BAA6B;IAC7B,+BAA+B;IAC/B,+BAA+B;IAC/B,+BAA+B;IAC/B,+BAA+B;IAC/B,+BAA+B;IAC/B,+BAA+B;IAC/B,0BAA0B;IAC1B,0BAA0B;IAC1B,mCAAmC;IACnC,kCAAkC;IAClC,mCAAmC;IACnC,8BAA8B;IAC9B,+BAA+B;IAC/B,+BAA+B;IAC/B,gCAAgC;IAChC,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,8BAA8B;IAC9B,+BAA+B;IAC/B,+BAA+B;IAC/B,0BAA0B;IAC1B,8BAA8B;IAC9B,2CAA2C;IAC3C,2CAA2C;IAC3C,sCAAsC;IACtC,kCAAkC;IAClC,oCAAoC;IACpC,qCAAqC;IACrC,0CAA0C;IAC1C,yCAAyC;IACzC,kDAAkD;IAClD,2CAA2C;IAC3C,sCAAsC;IACtC,wCAAwC;IACxC,mCAAmC;IACnC,sCAAsC;IACtC,wCAAwC;IACxC,wCAAwC;IACxC,yCAAyC;IACzC,8BAA8B;IAC9B,kCAAkC;IAClC,2CAA2C;IAC3C,sCAAsC;IACtC,sCAAsC;IACtC,mCAAmC;IACnC,wCAAwC;IACxC,+BAA+B;IAC/B,oCAAoC;IACpC,8BAA8B;IAC9B,8BAA8B;IAC9B,mCAAmC;IACnC,iCAAiC;IACjC,6BAA6B;IAC7B,yCAAyC;IACzC,6BAA6B;IAC7B,oCAAoC;IACpC,iCAAiC;IACjC,yCAAyC;IACzC,0CAA0C;IAC1C,0CAA0C;IAC1C,2CAA2C;CAC5C,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Statement lowering: control flow, loops, switch and try/catch/finally.
3
+ */
4
+ import { type DoStatement, type Expression, type ForInStatement, type ForOfStatement, type ForStatement, type Identifier, type IfStatement, type ReturnStatement, type Statement, type SwitchStatement, type TryStatement, type VariableDeclarationList, type VariableStatement, type WhileStatement } from "../../ast/nodes.js";
5
+ import type { Generator } from "./generator.js";
6
+ export interface StatementMethods {
7
+ emitStatements(this: Generator, statements: readonly Statement[]): void;
8
+ emitStatement(this: Generator, statement: Statement): void;
9
+ emitVariableStatement(this: Generator, statement: VariableStatement): void;
10
+ emitIf(this: Generator, statement: IfStatement): void;
11
+ emitWhile(this: Generator, statement: WhileStatement): void;
12
+ emitDo(this: Generator, statement: DoStatement): void;
13
+ emitFor(this: Generator, statement: ForStatement): void;
14
+ emitForOf(this: Generator, statement: ForOfStatement | ForInStatement): void;
15
+ bindLoopVariable(this: Generator, initializer: VariableDeclarationList | Expression, value: string): void;
16
+ emitSwitch(this: Generator, statement: SwitchStatement): void;
17
+ emitTry(this: Generator, statement: TryStatement): void;
18
+ bindCatchVariable(this: Generator, variable: Identifier | undefined, value: string): void;
19
+ emitReturn(this: Generator, statement: ReturnStatement): void;
20
+ popTryFramesTo(this: Generator, depth: number): void;
21
+ }
22
+ export declare const statementMethods: StatementMethods;
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Statement lowering: control flow, loops, switch and try/catch/finally.
3
+ */
4
+ import { SyntaxKind, } from "../../ast/nodes.js";
5
+ import { i64, numberLiteral, XT_UNDEFINED } from "../values.js";
6
+ export const statementMethods = {
7
+ emitStatements(statements) {
8
+ for (const statement of statements) {
9
+ if (this.current.terminated)
10
+ break;
11
+ this.emitStatement(statement);
12
+ }
13
+ },
14
+ emitStatement(statement) {
15
+ switch (statement.kind) {
16
+ case SyntaxKind.ExpressionStatement:
17
+ this.emitExpression(statement.expression);
18
+ return;
19
+ case SyntaxKind.VariableStatement:
20
+ this.emitVariableStatement(statement);
21
+ return;
22
+ case SyntaxKind.Block:
23
+ this.emitStatements(statement.statements);
24
+ return;
25
+ case SyntaxKind.EmptyStatement:
26
+ case SyntaxKind.DebuggerStatement:
27
+ case SyntaxKind.FunctionDeclaration:
28
+ case SyntaxKind.InterfaceDeclaration:
29
+ case SyntaxKind.TypeAliasDeclaration:
30
+ return; // functions are emitted at module scope
31
+ case SyntaxKind.IfStatement:
32
+ this.emitIf(statement);
33
+ return;
34
+ case SyntaxKind.WhileStatement:
35
+ this.emitWhile(statement);
36
+ return;
37
+ case SyntaxKind.DoStatement:
38
+ this.emitDo(statement);
39
+ return;
40
+ case SyntaxKind.ForStatement:
41
+ this.emitFor(statement);
42
+ return;
43
+ case SyntaxKind.ForOfStatement:
44
+ case SyntaxKind.ForInStatement:
45
+ this.emitForOf(statement);
46
+ return;
47
+ case SyntaxKind.SwitchStatement:
48
+ this.emitSwitch(statement);
49
+ return;
50
+ case SyntaxKind.TryStatement:
51
+ this.emitTry(statement);
52
+ return;
53
+ case SyntaxKind.ReturnStatement:
54
+ this.emitReturn(statement);
55
+ return;
56
+ case SyntaxKind.BreakStatement: {
57
+ const loop = this.current.loops[this.current.loops.length - 1];
58
+ if (loop) {
59
+ this.popTryFramesTo(loop.tryDepth ?? 0);
60
+ this.terminate(`br label %${loop.breakLabel}`);
61
+ }
62
+ return;
63
+ }
64
+ case SyntaxKind.ContinueStatement: {
65
+ const loop = this.current.loops[this.current.loops.length - 1];
66
+ if (loop) {
67
+ this.popTryFramesTo(loop.tryDepth ?? 0);
68
+ this.terminate(`br label %${loop.continueLabel}`);
69
+ }
70
+ return;
71
+ }
72
+ case SyntaxKind.ThrowStatement: {
73
+ const value = this.emitExpression(statement.expression);
74
+ this.emit(` call void @xt_throw(i64 ${value})`);
75
+ this.terminate("unreachable");
76
+ return;
77
+ }
78
+ case SyntaxKind.ExportDeclaration: {
79
+ const declaration = statement.declaration;
80
+ if (declaration)
81
+ this.emitStatement(declaration);
82
+ return;
83
+ }
84
+ default:
85
+ this.unsupported(statement, "statement");
86
+ }
87
+ },
88
+ emitVariableStatement(statement) {
89
+ for (const declaration of statement.declarationList.declarations) {
90
+ const symbol = this.binding.symbolOfDeclaration.get(declaration);
91
+ if (!symbol)
92
+ continue;
93
+ if (this.current.slots.has(symbol.id))
94
+ continue; // hoisted `var`
95
+ const initial = declaration.initializer
96
+ ? this.emitExpression(declaration.initializer)
97
+ : i64(XT_UNDEFINED);
98
+ this.declareSlot(symbol, initial);
99
+ }
100
+ },
101
+ emitIf(statement) {
102
+ const thenLabel = this.label("if.then");
103
+ const elseLabel = statement.elseStatement ? this.label("if.else") : undefined;
104
+ const endLabel = this.label("if.end");
105
+ const condition = this.emitExpression(statement.condition);
106
+ const truthy = this.reg();
107
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${condition})`);
108
+ const nonzero = this.reg();
109
+ this.emit(` ${nonzero} = icmp ne i32 ${truthy}, 0`);
110
+ this.terminate(`br i1 ${nonzero}, label %${thenLabel}, label %${elseLabel ?? endLabel}`);
111
+ this.startBlock(thenLabel);
112
+ this.emitStatement(statement.thenStatement);
113
+ if (!this.current.terminated)
114
+ this.terminate(`br label %${endLabel}`);
115
+ if (elseLabel) {
116
+ this.startBlock(elseLabel);
117
+ this.emitStatement(statement.elseStatement);
118
+ if (!this.current.terminated)
119
+ this.terminate(`br label %${endLabel}`);
120
+ }
121
+ this.startBlock(endLabel);
122
+ },
123
+ emitWhile(statement) {
124
+ const condLabel = this.label("while.cond");
125
+ const bodyLabel = this.label("while.body");
126
+ const endLabel = this.label("while.end");
127
+ this.terminate(`br label %${condLabel}`);
128
+ this.startBlock(condLabel);
129
+ const condition = this.emitExpression(statement.condition);
130
+ const truthy = this.reg();
131
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${condition})`);
132
+ const nonzero = this.reg();
133
+ this.emit(` ${nonzero} = icmp ne i32 ${truthy}, 0`);
134
+ this.terminate(`br i1 ${nonzero}, label %${bodyLabel}, label %${endLabel}`);
135
+ this.startBlock(bodyLabel);
136
+ this.current.loops.push({ breakLabel: endLabel, continueLabel: condLabel, tryDepth: this.current.tryFrames.length });
137
+ this.emitStatement(statement.statement);
138
+ this.current.loops.pop();
139
+ if (!this.current.terminated)
140
+ this.terminate(`br label %${condLabel}`);
141
+ this.startBlock(endLabel);
142
+ },
143
+ emitDo(statement) {
144
+ const bodyLabel = this.label("do.body");
145
+ const condLabel = this.label("do.cond");
146
+ const endLabel = this.label("do.end");
147
+ this.terminate(`br label %${bodyLabel}`);
148
+ this.startBlock(bodyLabel);
149
+ this.current.loops.push({ breakLabel: endLabel, continueLabel: condLabel, tryDepth: this.current.tryFrames.length });
150
+ this.emitStatement(statement.statement);
151
+ this.current.loops.pop();
152
+ if (!this.current.terminated)
153
+ this.terminate(`br label %${condLabel}`);
154
+ this.startBlock(condLabel);
155
+ const condition = this.emitExpression(statement.condition);
156
+ const truthy = this.reg();
157
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${condition})`);
158
+ const nonzero = this.reg();
159
+ this.emit(` ${nonzero} = icmp ne i32 ${truthy}, 0`);
160
+ this.terminate(`br i1 ${nonzero}, label %${bodyLabel}, label %${endLabel}`);
161
+ this.startBlock(endLabel);
162
+ },
163
+ emitFor(statement) {
164
+ if (statement.initializer && statement.initializer.kind === SyntaxKind.VariableDeclarationList) {
165
+ this.emitVariableStatement({
166
+ kind: SyntaxKind.VariableStatement,
167
+ declarationList: statement.initializer,
168
+ modifiers: [],
169
+ start: statement.initializer.start,
170
+ end: statement.initializer.end,
171
+ });
172
+ }
173
+ else if (statement.initializer) {
174
+ this.emitExpression(statement.initializer);
175
+ }
176
+ const condLabel = this.label("for.cond");
177
+ const bodyLabel = this.label("for.body");
178
+ const updateLabel = this.label("for.update");
179
+ const endLabel = this.label("for.end");
180
+ this.terminate(`br label %${condLabel}`);
181
+ this.startBlock(condLabel);
182
+ if (statement.condition) {
183
+ const condition = this.emitExpression(statement.condition);
184
+ const truthy = this.reg();
185
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${condition})`);
186
+ const nonzero = this.reg();
187
+ this.emit(` ${nonzero} = icmp ne i32 ${truthy}, 0`);
188
+ this.terminate(`br i1 ${nonzero}, label %${bodyLabel}, label %${endLabel}`);
189
+ }
190
+ else {
191
+ this.terminate(`br label %${bodyLabel}`);
192
+ }
193
+ this.startBlock(bodyLabel);
194
+ this.current.loops.push({ breakLabel: endLabel, continueLabel: updateLabel, tryDepth: this.current.tryFrames.length });
195
+ this.emitStatement(statement.statement);
196
+ this.current.loops.pop();
197
+ if (!this.current.terminated)
198
+ this.terminate(`br label %${updateLabel}`);
199
+ this.startBlock(updateLabel);
200
+ if (statement.incrementor)
201
+ this.emitExpression(statement.incrementor);
202
+ this.terminate(`br label %${condLabel}`);
203
+ this.startBlock(endLabel);
204
+ },
205
+ /** `for (const x of xs)` / `for (const k in obj)` over arrays, strings and objects. */
206
+ emitForOf(statement) {
207
+ const source = this.emitExpression(statement.expression);
208
+ const isForIn = statement.kind === SyntaxKind.ForInStatement;
209
+ // `for...in` iterates the enumerable keys (indices become strings);
210
+ // `for...of` iterates the values at each index.
211
+ const iterable = isForIn ? this.runtimeCall("xt_object_keys", [source]) : source;
212
+ const indexPtr = this.alloca();
213
+ this.emit(` store i64 ${numberLiteral(0)}, i64* ${indexPtr}`);
214
+ const lengthValue = this.reg();
215
+ this.emit(` ${lengthValue} = call i64 @xt_array_length(i64 ${iterable})`);
216
+ const condLabel = this.label("forof.cond");
217
+ const bodyLabel = this.label("forof.body");
218
+ const updateLabel = this.label("forof.update");
219
+ const endLabel = this.label("forof.end");
220
+ this.terminate(`br label %${condLabel}`);
221
+ this.startBlock(condLabel);
222
+ const index = this.reg();
223
+ this.emit(` ${index} = load i64, i64* ${indexPtr}`);
224
+ const inRange = this.reg();
225
+ this.emit(` ${inRange} = call i64 @xt_lt(i64 ${index}, i64 ${lengthValue})`);
226
+ const truthy = this.reg();
227
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${inRange})`);
228
+ const nonzero = this.reg();
229
+ this.emit(` ${nonzero} = icmp ne i32 ${truthy}, 0`);
230
+ this.terminate(`br i1 ${nonzero}, label %${bodyLabel}, label %${endLabel}`);
231
+ this.startBlock(bodyLabel);
232
+ const element = this.reg();
233
+ this.emit(` ${element} = call i64 @xt_get(i64 ${iterable}, i64 ${index})`);
234
+ this.bindLoopVariable(statement.initializer, element);
235
+ this.current.loops.push({ breakLabel: endLabel, continueLabel: updateLabel, tryDepth: this.current.tryFrames.length });
236
+ this.emitStatement(statement.statement);
237
+ this.current.loops.pop();
238
+ if (!this.current.terminated)
239
+ this.terminate(`br label %${updateLabel}`);
240
+ this.startBlock(updateLabel);
241
+ const next = this.reg();
242
+ this.emit(` ${next} = call i64 @xt_add(i64 ${index}, i64 ${numberLiteral(1)})`);
243
+ this.emit(` store i64 ${next}, i64* ${indexPtr}`);
244
+ this.terminate(`br label %${condLabel}`);
245
+ this.startBlock(endLabel);
246
+ },
247
+ bindLoopVariable(initializer, value) {
248
+ if (initializer.kind === SyntaxKind.VariableDeclarationList) {
249
+ const declaration = initializer.declarations[0];
250
+ if (!declaration)
251
+ return;
252
+ const symbol = this.binding.symbolOfDeclaration.get(declaration);
253
+ if (symbol) {
254
+ if (this.current.slots.has(symbol.id))
255
+ this.writeSlot(symbol, value);
256
+ else
257
+ this.declareSlot(symbol, value);
258
+ }
259
+ return;
260
+ }
261
+ this.emitAssignmentTarget(initializer, value);
262
+ },
263
+ /**
264
+ * JavaScript `switch`: test each `case` with strict equality, then run the
265
+ * matched clause and fall through into the following clauses until `break`.
266
+ */
267
+ emitSwitch(statement) {
268
+ const discriminant = this.emitExpression(statement.expression);
269
+ const endLabel = this.label("switch.end");
270
+ const clauses = statement.clauses;
271
+ const labels = clauses.map(() => this.label("switch.case"));
272
+ const testLabels = clauses.map((clause) => clause.kind === SyntaxKind.CaseClause ? this.label("switch.test") : undefined);
273
+ const defaultIndex = clauses.findIndex((clause) => clause.kind === SyntaxKind.DefaultClause);
274
+ const defaultLabel = defaultIndex >= 0 ? labels[defaultIndex] : endLabel;
275
+ const caseIndexes = clauses
276
+ .map((clause, index) => ({ clause, index }))
277
+ .filter((entry) => entry.clause.kind === SyntaxKind.CaseClause);
278
+ this.terminate(`br label %${caseIndexes.length > 0 ? testLabels[caseIndexes[0].index] : defaultLabel}`);
279
+ for (let test = 0; test < caseIndexes.length; test++) {
280
+ const entry = caseIndexes[test];
281
+ this.startBlock(testLabels[entry.index]);
282
+ const caseValue = this.emitExpression(entry.clause.expression);
283
+ const equals = this.reg();
284
+ this.emit(` ${equals} = call i64 @xt_seq(i64 ${discriminant}, i64 ${caseValue})`);
285
+ const truthy = this.reg();
286
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${equals})`);
287
+ const condition = this.reg();
288
+ this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
289
+ const next = test + 1 < caseIndexes.length ? testLabels[caseIndexes[test + 1].index] : defaultLabel;
290
+ this.terminate(`br i1 ${condition}, label %${labels[entry.index]}, label %${next}`);
291
+ }
292
+ for (let index = 0; index < clauses.length; index++) {
293
+ this.startBlock(labels[index]);
294
+ const enclosing = this.current.loops[this.current.loops.length - 1];
295
+ this.current.loops.push({ breakLabel: endLabel, continueLabel: enclosing?.continueLabel ?? endLabel, tryDepth: this.current.tryFrames.length });
296
+ for (const child of clauses[index].statements) {
297
+ if (this.current.terminated)
298
+ break;
299
+ this.emitStatement(child);
300
+ }
301
+ this.current.loops.pop();
302
+ if (!this.current.terminated) {
303
+ const next = index + 1 < clauses.length ? labels[index + 1] : endLabel;
304
+ this.terminate(`br label %${next}`);
305
+ }
306
+ }
307
+ this.startBlock(endLabel);
308
+ },
309
+ /**
310
+ * `try`/`catch`/`finally` via a runtime setjmp frame. The runtime keeps a
311
+ * stack of frames; `xt_throw` longjmps into the innermost one. A `return`
312
+ * that exits the protected region skips `finally` (a known limitation).
313
+ */
314
+ emitTry(statement) {
315
+ this.current.usesTry = true;
316
+ const frameSlot = this.alloca();
317
+ const exceptionSlot = this.alloca();
318
+ const flagSlot = this.alloca();
319
+ const tryLabel = this.label("try.body");
320
+ const catchLabel = this.label("try.catch");
321
+ const exceptionLabel = this.label("try.exception");
322
+ const rethrowLabel = this.label("try.rethrow");
323
+ const finallyLabel = statement.finallyBlock ? this.label("try.finally") : undefined;
324
+ const endLabel = this.label("try.end");
325
+ const hasCatch = !!statement.catchClause;
326
+ const frame = this.reg();
327
+ this.emit(` ${frame} = call i8* @xt_try_enter()`);
328
+ this.emit(` store i8* ${frame}, i8** ${frameSlot}`);
329
+ this.emit(` store i64 0, i64* ${flagSlot}`);
330
+ const jump = this.reg();
331
+ this.emit(` ${jump} = call i32 @_setjmp(i8* ${frame})`);
332
+ const isThrow = this.reg();
333
+ this.emit(` ${isThrow} = icmp ne i32 ${jump}, 0`);
334
+ const exceptionTarget = hasCatch ? catchLabel : exceptionLabel;
335
+ this.terminate(`br i1 ${isThrow}, label %${exceptionTarget}, label %${tryLabel}`);
336
+ // Normal completion of the try block.
337
+ this.startBlock(tryLabel);
338
+ this.current.tryFrames.push(frameSlot);
339
+ this.emitStatements(statement.tryBlock.statements);
340
+ this.current.tryFrames.pop();
341
+ if (!this.current.terminated) {
342
+ const currentFrame = this.reg();
343
+ this.emit(` ${currentFrame} = load i8*, i8** ${frameSlot}`);
344
+ this.emit(` call void @xt_try_leave(i8* ${currentFrame})`);
345
+ this.terminate(`br label %${finallyLabel ?? endLabel}`);
346
+ }
347
+ if (hasCatch) {
348
+ this.startBlock(catchLabel);
349
+ const currentFrame = this.reg();
350
+ this.emit(` ${currentFrame} = load i8*, i8** ${frameSlot}`);
351
+ const exception = this.reg();
352
+ this.emit(` ${exception} = call i64 @xt_try_exception(i8* ${currentFrame})`);
353
+ this.emit(` call void @xt_try_leave(i8* ${currentFrame})`);
354
+ this.bindCatchVariable(statement.catchClause.variable, exception);
355
+ this.emitStatements(statement.catchClause.block.statements);
356
+ if (!this.current.terminated)
357
+ this.terminate(`br label %${finallyLabel ?? endLabel}`);
358
+ }
359
+ else {
360
+ // Without a catch clause the exception is remembered, then rethrown
361
+ // after `finally` runs.
362
+ this.startBlock(exceptionLabel);
363
+ const currentFrame = this.reg();
364
+ this.emit(` ${currentFrame} = load i8*, i8** ${frameSlot}`);
365
+ const exception = this.reg();
366
+ this.emit(` ${exception} = call i64 @xt_try_exception(i8* ${currentFrame})`);
367
+ this.emit(` call void @xt_try_leave(i8* ${currentFrame})`);
368
+ this.emit(` store i64 ${exception}, i64* ${exceptionSlot}`);
369
+ this.emit(` store i64 1, i64* ${flagSlot}`);
370
+ this.terminate(`br label %${finallyLabel ?? rethrowLabel}`);
371
+ }
372
+ if (finallyLabel) {
373
+ this.startBlock(finallyLabel);
374
+ this.emitStatements(statement.finallyBlock.statements);
375
+ if (!this.current.terminated) {
376
+ if (hasCatch) {
377
+ this.terminate(`br label %${endLabel}`);
378
+ }
379
+ else {
380
+ const flag = this.reg();
381
+ this.emit(` ${flag} = load i64, i64* ${flagSlot}`);
382
+ const truthy = this.reg();
383
+ this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${flag})`);
384
+ const shouldRethrow = this.reg();
385
+ this.emit(` ${shouldRethrow} = icmp ne i32 ${truthy}, 0`);
386
+ this.terminate(`br i1 ${shouldRethrow}, label %${rethrowLabel}, label %${endLabel}`);
387
+ }
388
+ }
389
+ }
390
+ if (!hasCatch) {
391
+ this.startBlock(rethrowLabel);
392
+ const exception = this.reg();
393
+ this.emit(` ${exception} = load i64, i64* ${exceptionSlot}`);
394
+ this.emit(` call void @xt_throw(i64 ${exception})`);
395
+ this.terminate("unreachable");
396
+ }
397
+ this.startBlock(endLabel);
398
+ },
399
+ bindCatchVariable(variable, value) {
400
+ if (!variable)
401
+ return;
402
+ const symbol = this.binding.symbolOfDeclaration.get(variable);
403
+ if (!symbol)
404
+ return;
405
+ if (this.current.slots.has(symbol.id))
406
+ this.writeSlot(symbol, value);
407
+ else
408
+ this.declareSlot(symbol, value);
409
+ },
410
+ emitReturn(statement) {
411
+ const value = statement.expression ? this.emitExpression(statement.expression) : i64(XT_UNDEFINED);
412
+ this.popTryFramesTo(0);
413
+ this.terminate(`ret i64 ${value}`);
414
+ },
415
+ /** Emit `xt_try_leave` for every active frame above `depth` (innermost first). */
416
+ popTryFramesTo(depth) {
417
+ for (let index = this.current.tryFrames.length - 1; index >= depth; index--) {
418
+ const slot = this.current.tryFrames[index];
419
+ const frame = this.reg();
420
+ this.emit(` ${frame} = load i8*, i8** ${slot}`);
421
+ this.emit(` call void @xt_try_leave(i8* ${frame})`);
422
+ }
423
+ },
424
+ };
425
+ //# sourceMappingURL=statements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statements.js","sourceRoot":"","sources":["../../../../src/codegen/generator/statements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Static tables and small pure helpers used by the LLVM generator.
3
+ */
4
+ import { AssignmentOperator, BinaryOperator, type Node } from "../../ast/nodes.js";
5
+ export declare const BINARY_RUNTIME: Record<string, string | undefined>;
6
+ export declare const CONSOLE_METHODS: Record<string, string>;
7
+ export declare const MATH_FUNCTIONS: Set<string>;
8
+ export declare const MATH_CONSTANTS: Record<string, number>;
9
+ export declare const GLOBAL_FUNCTIONS: Record<string, string>;
10
+ export declare const BUILTIN_METHODS: Set<string>;
11
+ export declare const ASSIGNMENT_OPERATORS: Set<string>;
12
+ export declare function isAssignmentOperator(operator: string): boolean;
13
+ export declare function compoundToBinary(operator: AssignmentOperator): BinaryOperator;
14
+ export declare function propertyNameText(name: Node): string;
15
+ /** Human readable syntax kind for diagnostics (const enums have no reverse map). */
16
+ export declare function kindName(kind: number): string;
17
+ export declare const KIND_NAMES: Map<number, string>;
18
+ export declare function utf8Bytes(text: string): number[];
19
+ export declare function escapeBytes(bytes: readonly number[]): string;