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.
- package/README.md +14 -13
- package/dist/src/ast/common.d.ts +33 -0
- package/dist/src/ast/common.js +7 -0
- package/dist/src/ast/common.js.map +1 -0
- package/dist/src/ast/declarations.d.ts +110 -0
- package/dist/src/ast/declarations.js +5 -0
- package/dist/src/ast/declarations.js.map +1 -0
- package/dist/src/ast/expressions.d.ts +219 -0
- package/dist/src/ast/expressions.js +6 -0
- package/dist/src/ast/expressions.js.map +1 -0
- package/dist/src/ast/kinds.d.ts +160 -0
- package/dist/src/ast/kinds.js +171 -0
- package/dist/src/ast/kinds.js.map +1 -0
- package/dist/src/ast/modules.d.ts +61 -0
- package/dist/src/ast/modules.js +5 -0
- package/dist/src/ast/modules.js.map +1 -0
- package/dist/src/ast/nodes.d.ts +11 -839
- package/dist/src/ast/nodes.js +11 -237
- package/dist/src/ast/nodes.js.map +1 -1
- package/dist/src/ast/operators.d.ts +71 -0
- package/dist/src/ast/operators.js +77 -0
- package/dist/src/ast/operators.js.map +1 -0
- package/dist/src/ast/statements.d.ts +120 -0
- package/dist/src/ast/statements.js +5 -0
- package/dist/src/ast/statements.js.map +1 -0
- package/dist/src/ast/types.d.ts +123 -0
- package/dist/src/ast/types.js +6 -0
- package/dist/src/ast/types.js.map +1 -0
- package/dist/src/codegen/generator/calls.d.ts +22 -0
- package/dist/src/codegen/generator/calls.js +301 -0
- package/dist/src/codegen/generator/calls.js.map +1 -0
- package/dist/src/codegen/generator/context.d.ts +45 -0
- package/dist/src/codegen/generator/context.js +128 -0
- package/dist/src/codegen/generator/context.js.map +1 -0
- package/dist/src/codegen/generator/expressions.d.ts +22 -0
- package/dist/src/codegen/generator/expressions.js +383 -0
- package/dist/src/codegen/generator/expressions.js.map +1 -0
- package/dist/src/codegen/generator/generator.d.ts +22 -0
- package/dist/src/codegen/generator/generator.js +21 -0
- package/dist/src/codegen/generator/generator.js.map +1 -0
- package/dist/src/codegen/generator/module.d.ts +15 -0
- package/dist/src/codegen/generator/module.js +114 -0
- package/dist/src/codegen/generator/module.js.map +1 -0
- package/dist/src/codegen/generator/state.d.ts +40 -0
- package/dist/src/codegen/generator/state.js +84 -0
- package/dist/src/codegen/generator/state.js.map +1 -0
- package/dist/src/codegen/generator/statements.d.ts +22 -0
- package/dist/src/codegen/generator/statements.js +425 -0
- package/dist/src/codegen/generator/statements.js.map +1 -0
- package/dist/src/codegen/generator/tables.d.ts +19 -0
- package/dist/src/codegen/generator/tables.js +153 -0
- package/dist/src/codegen/generator/tables.js.map +1 -0
- package/dist/src/codegen/llvm.d.ts +4 -13
- package/dist/src/codegen/llvm.js +4 -1159
- package/dist/src/codegen/llvm.js.map +1 -1
- package/dist/src/driver/compiler.js +13 -4
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/lexer/char.d.ts +78 -0
- package/dist/src/lexer/char.js +106 -0
- package/dist/src/lexer/char.js.map +1 -0
- package/dist/src/lexer/scanner.js +1 -98
- package/dist/src/lexer/scanner.js.map +1 -1
- package/dist/src/parser/context.d.ts +58 -0
- package/dist/src/parser/context.js +174 -0
- package/dist/src/parser/context.js.map +1 -0
- package/dist/src/parser/declarations.d.ts +26 -0
- package/dist/src/parser/declarations.js +461 -0
- package/dist/src/parser/declarations.js.map +1 -0
- package/dist/src/parser/expressions.d.ts +27 -0
- package/dist/src/parser/expressions.js +437 -0
- package/dist/src/parser/expressions.js.map +1 -0
- package/dist/src/parser/helpers.d.ts +7 -0
- package/dist/src/parser/helpers.js +36 -0
- package/dist/src/parser/helpers.js.map +1 -0
- package/dist/src/parser/literals.d.ts +16 -0
- package/dist/src/parser/literals.js +193 -0
- package/dist/src/parser/literals.js.map +1 -0
- package/dist/src/parser/modules.d.ts +12 -0
- package/dist/src/parser/modules.js +175 -0
- package/dist/src/parser/modules.js.map +1 -0
- package/dist/src/parser/operators.d.ts +12 -0
- package/dist/src/parser/operators.js +172 -0
- package/dist/src/parser/operators.js.map +1 -0
- package/dist/src/parser/parser.d.ts +17 -122
- package/dist/src/parser/parser.js +18 -2307
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/speculation.d.ts +6 -0
- package/dist/src/parser/speculation.js +10 -0
- package/dist/src/parser/speculation.js.map +1 -0
- package/dist/src/parser/statements.d.ts +28 -0
- package/dist/src/parser/statements.js +402 -0
- package/dist/src/parser/statements.js.map +1 -0
- package/dist/src/parser/types.d.ts +21 -0
- package/dist/src/parser/types.js +338 -0
- package/dist/src/parser/types.js.map +1 -0
- package/dist/tests/e2e/compile.test.js +122 -2
- package/dist/tests/e2e/compile.test.js.map +1 -1
- package/dist/tests/parser/parser.test.js +9 -1
- package/dist/tests/parser/parser.test.js.map +1 -1
- package/package.json +1 -1
- package/runtime/rt.h +32 -0
- package/runtime/rt_internal.h +106 -0
- package/runtime/xt_alloc.c +38 -0
- package/runtime/xt_builtins.c +192 -0
- package/runtime/xt_containers.c +225 -0
- package/runtime/xt_io.c +133 -0
- package/runtime/xt_stdlib.c +502 -0
- package/runtime/xt_values.c +291 -0
- package/scripts/build-runtime.mjs +8 -1
- package/src/ast/common.ts +210 -0
- package/src/ast/declarations.ts +130 -0
- package/src/ast/expressions.ts +275 -0
- package/src/ast/kinds.ts +176 -0
- package/src/ast/modules.ts +73 -0
- package/src/ast/nodes.ts +11 -1101
- package/src/ast/operators.ts +76 -0
- package/src/ast/statements.ts +148 -0
- package/src/ast/types.ts +173 -0
- package/src/codegen/generator/calls.ts +355 -0
- package/src/codegen/generator/context.ts +156 -0
- package/src/codegen/generator/expressions.ts +431 -0
- package/src/codegen/generator/generator.ts +35 -0
- package/src/codegen/generator/module.ts +139 -0
- package/src/codegen/generator/state.ts +126 -0
- package/src/codegen/generator/statements.ts +474 -0
- package/src/codegen/generator/tables.ts +171 -0
- package/src/codegen/llvm.ts +4 -1305
- package/src/driver/compiler.ts +17 -5
- package/src/lexer/char.ts +116 -0
- package/src/lexer/scanner.ts +9 -109
- package/src/parser/context.ts +196 -0
- package/src/parser/declarations.ts +502 -0
- package/src/parser/expressions.ts +465 -0
- package/src/parser/helpers.ts +42 -0
- package/src/parser/literals.ts +207 -0
- package/src/parser/modules.ts +194 -0
- package/src/parser/operators.ts +181 -0
- package/src/parser/parser.ts +35 -2369
- package/src/parser/speculation.ts +9 -0
- package/src/parser/statements.ts +457 -0
- package/src/parser/types.ts +365 -0
- package/runtime/xt_runtime.c +0 -682
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type nodes of the xbintsc AST. The parser records type syntax so diagnostics
|
|
3
|
+
* and tooling can see it, but the code generator erases types before lowering.
|
|
4
|
+
*/
|
|
5
|
+
import { SyntaxKind } from "./kinds.js";
|
|
6
|
+
import type { TypeOperator } from "./operators.js";
|
|
7
|
+
import type { Node, TypeNode } from "./common.js";
|
|
8
|
+
import type { BooleanLiteral, Identifier, NullLiteral, NumericLiteral, StringLiteral, ThisExpression, PropertyName } from "./expressions.js";
|
|
9
|
+
import type { Parameter, TypeParameterDeclaration } from "./declarations.js";
|
|
10
|
+
export interface TypeReference extends Node {
|
|
11
|
+
readonly kind: SyntaxKind.TypeReference;
|
|
12
|
+
readonly typeName: Identifier | QualifiedName;
|
|
13
|
+
readonly typeArguments: TypeNode[];
|
|
14
|
+
}
|
|
15
|
+
export interface QualifiedName extends Node {
|
|
16
|
+
readonly kind: SyntaxKind.QualifiedName;
|
|
17
|
+
readonly left: Identifier | QualifiedName;
|
|
18
|
+
readonly right: Identifier;
|
|
19
|
+
}
|
|
20
|
+
export interface TypePredicate extends Node {
|
|
21
|
+
readonly kind: SyntaxKind.TypePredicate;
|
|
22
|
+
readonly parameterName: Identifier | ThisExpression;
|
|
23
|
+
readonly type?: TypeNode;
|
|
24
|
+
}
|
|
25
|
+
export interface KeywordTypeNode extends Node {
|
|
26
|
+
readonly kind: SyntaxKind.AnyKeywordType | SyntaxKind.UnknownKeywordType | SyntaxKind.NumberKeywordType | SyntaxKind.BigIntKeywordType | SyntaxKind.StringKeywordType | SyntaxKind.BooleanKeywordType | SyntaxKind.SymbolKeywordType | SyntaxKind.VoidKeywordType | SyntaxKind.UndefinedKeywordType | SyntaxKind.NullKeywordType | SyntaxKind.NeverKeywordType | SyntaxKind.ObjectKeywordType | SyntaxKind.ThisKeywordType;
|
|
27
|
+
}
|
|
28
|
+
export interface LiteralTypeNode extends Node {
|
|
29
|
+
readonly kind: SyntaxKind.LiteralType;
|
|
30
|
+
readonly literal: StringLiteral | NumericLiteral | BooleanLiteral | NullLiteral;
|
|
31
|
+
}
|
|
32
|
+
export interface ArrayTypeNode extends Node {
|
|
33
|
+
readonly kind: SyntaxKind.ArrayType;
|
|
34
|
+
readonly elementType: TypeNode;
|
|
35
|
+
}
|
|
36
|
+
export interface TupleTypeNode extends Node {
|
|
37
|
+
readonly kind: SyntaxKind.TupleType;
|
|
38
|
+
readonly elements: TypeNode[];
|
|
39
|
+
}
|
|
40
|
+
export interface UnionTypeNode extends Node {
|
|
41
|
+
readonly kind: SyntaxKind.UnionType;
|
|
42
|
+
readonly types: TypeNode[];
|
|
43
|
+
}
|
|
44
|
+
export interface IntersectionTypeNode extends Node {
|
|
45
|
+
readonly kind: SyntaxKind.IntersectionType;
|
|
46
|
+
readonly types: TypeNode[];
|
|
47
|
+
}
|
|
48
|
+
export interface FunctionTypeNode extends Node {
|
|
49
|
+
readonly kind: SyntaxKind.FunctionType;
|
|
50
|
+
readonly typeParameters: TypeParameterDeclaration[];
|
|
51
|
+
readonly parameters: Parameter[];
|
|
52
|
+
readonly returnType: TypeNode;
|
|
53
|
+
}
|
|
54
|
+
export type TypeElement = PropertySignature | MethodSignature | IndexSignature;
|
|
55
|
+
export interface PropertySignature extends Node {
|
|
56
|
+
readonly kind: SyntaxKind.PropertySignature;
|
|
57
|
+
readonly name: PropertyName;
|
|
58
|
+
readonly questionToken: boolean;
|
|
59
|
+
readonly readonlyToken: boolean;
|
|
60
|
+
readonly type?: TypeNode;
|
|
61
|
+
}
|
|
62
|
+
export interface MethodSignature extends Node {
|
|
63
|
+
readonly kind: SyntaxKind.MethodSignature;
|
|
64
|
+
readonly name: PropertyName;
|
|
65
|
+
readonly questionToken: boolean;
|
|
66
|
+
readonly typeParameters: TypeParameterDeclaration[];
|
|
67
|
+
readonly parameters: Parameter[];
|
|
68
|
+
readonly returnType?: TypeNode;
|
|
69
|
+
}
|
|
70
|
+
export interface IndexSignature extends Node {
|
|
71
|
+
readonly kind: SyntaxKind.IndexSignature;
|
|
72
|
+
readonly parameters: Parameter[];
|
|
73
|
+
readonly type?: TypeNode;
|
|
74
|
+
}
|
|
75
|
+
export interface TypeLiteralNode extends Node {
|
|
76
|
+
readonly kind: SyntaxKind.TypeLiteral;
|
|
77
|
+
readonly members: TypeElement[];
|
|
78
|
+
}
|
|
79
|
+
export interface ParenthesizedTypeNode extends Node {
|
|
80
|
+
readonly kind: SyntaxKind.ParenthesizedType;
|
|
81
|
+
readonly type: TypeNode;
|
|
82
|
+
}
|
|
83
|
+
export interface TypeQueryNode extends Node {
|
|
84
|
+
readonly kind: SyntaxKind.TypeQuery;
|
|
85
|
+
readonly exprName: Identifier | QualifiedName;
|
|
86
|
+
readonly typeArguments: TypeNode[];
|
|
87
|
+
}
|
|
88
|
+
export interface IndexedAccessTypeNode extends Node {
|
|
89
|
+
readonly kind: SyntaxKind.IndexedAccessType;
|
|
90
|
+
readonly objectType: TypeNode;
|
|
91
|
+
readonly indexType: TypeNode;
|
|
92
|
+
}
|
|
93
|
+
export interface TypeOperatorNode extends Node {
|
|
94
|
+
readonly kind: SyntaxKind.TypeOperator;
|
|
95
|
+
readonly operator: TypeOperator;
|
|
96
|
+
readonly type: TypeNode;
|
|
97
|
+
}
|
|
98
|
+
export interface MappedTypeNode extends Node {
|
|
99
|
+
readonly kind: SyntaxKind.MappedType;
|
|
100
|
+
readonly readonlyToken: boolean | "+" | "-";
|
|
101
|
+
readonly typeParameter: TypeParameterDeclaration;
|
|
102
|
+
readonly questionToken: boolean | "+" | "-";
|
|
103
|
+
readonly type?: TypeNode;
|
|
104
|
+
}
|
|
105
|
+
export interface ConditionalTypeNode extends Node {
|
|
106
|
+
readonly kind: SyntaxKind.ConditionalType;
|
|
107
|
+
readonly checkType: TypeNode;
|
|
108
|
+
readonly extendsType: TypeNode;
|
|
109
|
+
readonly trueType: TypeNode;
|
|
110
|
+
readonly falseType: TypeNode;
|
|
111
|
+
}
|
|
112
|
+
export interface InferTypeNode extends Node {
|
|
113
|
+
readonly kind: SyntaxKind.InferType;
|
|
114
|
+
readonly typeParameter: TypeParameterDeclaration;
|
|
115
|
+
}
|
|
116
|
+
export interface OptionalTypeNode extends Node {
|
|
117
|
+
readonly kind: SyntaxKind.OptionalType;
|
|
118
|
+
readonly type: TypeNode;
|
|
119
|
+
}
|
|
120
|
+
export interface RestTypeNode extends Node {
|
|
121
|
+
readonly kind: SyntaxKind.RestType;
|
|
122
|
+
readonly type: TypeNode;
|
|
123
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ast/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calls, member access, optional chaining, object/array literals and closures.
|
|
3
|
+
*/
|
|
4
|
+
import { type ArrowFunction, type ArrayLiteralExpression, type CallExpression, type DeleteExpression, type ElementAccessExpression, type Expression, type FunctionExpression, type ObjectLiteralExpression, type PropertyAccessExpression } from "../../ast/nodes.js";
|
|
5
|
+
import type { Generator } from "./generator.js";
|
|
6
|
+
export interface CallMethods {
|
|
7
|
+
emitCall(this: Generator, node: CallExpression): string;
|
|
8
|
+
tryEmitBuiltinCall(this: Generator, node: CallExpression, callee: PropertyAccessExpression): string | undefined;
|
|
9
|
+
runtimeCall(this: Generator, name: string, args: readonly string[]): string;
|
|
10
|
+
emitArguments(this: Generator, args: readonly Expression[]): {
|
|
11
|
+
argc: number;
|
|
12
|
+
ptr: string;
|
|
13
|
+
};
|
|
14
|
+
emitDelete(this: Generator, node: DeleteExpression): string;
|
|
15
|
+
emitPropertyAccess(this: Generator, node: PropertyAccessExpression): string;
|
|
16
|
+
emitElementAccess(this: Generator, node: ElementAccessExpression): string;
|
|
17
|
+
emitOptional(this: Generator, objectValue: string, compute: () => string): string;
|
|
18
|
+
emitArrayLiteral(this: Generator, node: ArrayLiteralExpression): string;
|
|
19
|
+
emitObjectLiteral(this: Generator, node: ObjectLiteralExpression): string;
|
|
20
|
+
emitClosure(this: Generator, node: ArrowFunction | FunctionExpression): string;
|
|
21
|
+
}
|
|
22
|
+
export declare const callMethods: CallMethods;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calls, member access, optional chaining, object/array literals and closures.
|
|
3
|
+
*/
|
|
4
|
+
import { SyntaxKind, } from "../../ast/nodes.js";
|
|
5
|
+
import { SymbolKind } from "../../binder/binder.js";
|
|
6
|
+
import { i64, numberLiteral, XT_TRUE, XT_UNDEFINED } from "../values.js";
|
|
7
|
+
import { BUILTIN_METHODS, CONSOLE_METHODS, GLOBAL_FUNCTIONS, MATH_CONSTANTS, MATH_FUNCTIONS, propertyNameText, } from "./tables.js";
|
|
8
|
+
export const callMethods = {
|
|
9
|
+
emitCall(node) {
|
|
10
|
+
const callee = node.expression;
|
|
11
|
+
if (node.optional) {
|
|
12
|
+
const calleeValue = this.emitExpression(callee);
|
|
13
|
+
return this.emitOptional(calleeValue, () => {
|
|
14
|
+
const args = this.emitArguments(node.arguments);
|
|
15
|
+
const result = this.reg();
|
|
16
|
+
this.emit(` ${result} = call i64 @xt_closure_call(i64 ${calleeValue}, i32 ${args.argc}, i64* ${args.ptr})`);
|
|
17
|
+
return result;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if ((callee.kind === SyntaxKind.PropertyAccessExpression || callee.kind === SyntaxKind.ElementAccessExpression) &&
|
|
21
|
+
callee.optional) {
|
|
22
|
+
// `obj?.method(args)` / `obj?.[key](args)`: guard the receiver, then
|
|
23
|
+
// dispatch through the runtime, which understands object methods as well
|
|
24
|
+
// as the built-in array/string methods.
|
|
25
|
+
const access = callee;
|
|
26
|
+
const object = this.emitExpression(access.expression);
|
|
27
|
+
return this.emitOptional(object, () => {
|
|
28
|
+
const name = access.kind === SyntaxKind.PropertyAccessExpression
|
|
29
|
+
? this.stringValue(access.name.text)
|
|
30
|
+
: this.emitExpression(access.argumentExpression);
|
|
31
|
+
const args = this.emitArguments(node.arguments);
|
|
32
|
+
const result = this.reg();
|
|
33
|
+
this.emit(` ${result} = call i64 @xt_call_method(i64 ${object}, i64 ${name}, i32 ${args.argc}, i64* ${args.ptr})`);
|
|
34
|
+
return result;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (callee.kind === SyntaxKind.PropertyAccessExpression) {
|
|
38
|
+
const special = this.tryEmitBuiltinCall(node, callee);
|
|
39
|
+
if (special)
|
|
40
|
+
return special;
|
|
41
|
+
}
|
|
42
|
+
if (callee.kind === SyntaxKind.Identifier) {
|
|
43
|
+
const symbol = this.binding.symbolOfIdentifier.get(callee);
|
|
44
|
+
if (symbol && symbol.kind === SymbolKind.Function) {
|
|
45
|
+
const declaration = symbol.declarations[0];
|
|
46
|
+
const fn = declaration ? this.binding.functionOfNode.get(declaration) : undefined;
|
|
47
|
+
if (fn) {
|
|
48
|
+
const args = this.emitArguments(node.arguments);
|
|
49
|
+
const result = this.reg();
|
|
50
|
+
this.emit(` ${result} = call i64 @${this.functionName(fn)}(i64 ${i64(XT_UNDEFINED)}, i32 ${args.argc}, i64* ${args.ptr})`);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const globalFunction = !symbol ? GLOBAL_FUNCTIONS[callee.text] : undefined;
|
|
55
|
+
if (globalFunction) {
|
|
56
|
+
const args = this.emitArguments(node.arguments);
|
|
57
|
+
const result = this.reg();
|
|
58
|
+
this.emit(` ${result} = call i64 @${globalFunction}(i32 ${args.argc}, i64* ${args.ptr})`);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
const builtin = this.builtins[callee.text];
|
|
62
|
+
if (!symbol && builtin) {
|
|
63
|
+
this.extraDeclarations.add(builtin.returnVoid ? `declare void @${builtin.symbol}(i32, i64*)` : `declare i64 @${builtin.symbol}(i32, i64*)`);
|
|
64
|
+
const args = this.emitArguments(node.arguments);
|
|
65
|
+
if (builtin.returnVoid) {
|
|
66
|
+
this.emit(` call void @${builtin.symbol}(i32 ${args.argc}, i64* ${args.ptr})`);
|
|
67
|
+
return i64(XT_UNDEFINED);
|
|
68
|
+
}
|
|
69
|
+
const result = this.reg();
|
|
70
|
+
this.emit(` ${result} = call i64 @${builtin.symbol}(i32 ${args.argc}, i64* ${args.ptr})`);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const calleeValue = this.emitExpression(callee);
|
|
75
|
+
const args = this.emitArguments(node.arguments);
|
|
76
|
+
const result = this.reg();
|
|
77
|
+
this.emit(` ${result} = call i64 @xt_closure_call(i64 ${calleeValue}, i32 ${args.argc}, i64* ${args.ptr})`);
|
|
78
|
+
return result;
|
|
79
|
+
},
|
|
80
|
+
tryEmitBuiltinCall(node, callee) {
|
|
81
|
+
const target = callee.expression;
|
|
82
|
+
const method = callee.name.text;
|
|
83
|
+
const targetIdentifier = target.kind === SyntaxKind.Identifier ? target : undefined;
|
|
84
|
+
const targetSymbol = targetIdentifier ? this.binding.symbolOfIdentifier.get(targetIdentifier) : undefined;
|
|
85
|
+
if (targetIdentifier && targetIdentifier.text === "console" && !targetSymbol) {
|
|
86
|
+
const consoleFn = CONSOLE_METHODS[method];
|
|
87
|
+
if (consoleFn) {
|
|
88
|
+
const args = this.emitArguments(node.arguments);
|
|
89
|
+
this.emit(` call void @${consoleFn}(i32 ${args.argc}, i64* ${args.ptr})`);
|
|
90
|
+
return i64(XT_UNDEFINED);
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
if (targetIdentifier && targetIdentifier.text === "Math" && !targetSymbol) {
|
|
95
|
+
if (!MATH_FUNCTIONS.has(method))
|
|
96
|
+
return undefined;
|
|
97
|
+
const name = this.stringValue(method);
|
|
98
|
+
const args = this.emitArguments(node.arguments);
|
|
99
|
+
const result = this.reg();
|
|
100
|
+
this.emit(` ${result} = call i64 @xt_math_call(i64 ${name}, i32 ${args.argc}, i64* ${args.ptr})`);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
if (targetIdentifier && targetIdentifier.text === "Object" && !targetSymbol) {
|
|
104
|
+
if (method === "keys" || method === "values" || method === "entries") {
|
|
105
|
+
const argument = node.arguments.length > 0 ? this.emitExpression(node.arguments[0]) : i64(XT_UNDEFINED);
|
|
106
|
+
const fn = method === "keys" ? "xt_object_keys" : method === "values" ? "xt_object_values" : "xt_object_entries";
|
|
107
|
+
return this.runtimeCall(fn, [argument]);
|
|
108
|
+
}
|
|
109
|
+
if (method === "assign") {
|
|
110
|
+
const args = this.emitArguments(node.arguments);
|
|
111
|
+
const result = this.reg();
|
|
112
|
+
this.emit(` ${result} = call i64 @xt_object_assign(i32 ${args.argc}, i64* ${args.ptr})`);
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
if (BUILTIN_METHODS.has(method)) {
|
|
118
|
+
const object = this.emitExpression(target);
|
|
119
|
+
const name = this.stringValue(method);
|
|
120
|
+
const args = this.emitArguments(node.arguments);
|
|
121
|
+
const result = this.reg();
|
|
122
|
+
this.emit(` ${result} = call i64 @xt_call_method(i64 ${object}, i64 ${name}, i32 ${args.argc}, i64* ${args.ptr})`);
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
},
|
|
127
|
+
runtimeCall(name, args) {
|
|
128
|
+
const result = this.reg();
|
|
129
|
+
this.emit(` ${result} = call i64 @${name}(${args.map((a) => `i64 ${a}`).join(", ")})`);
|
|
130
|
+
return result;
|
|
131
|
+
},
|
|
132
|
+
emitArguments(args) {
|
|
133
|
+
if (args.length === 0)
|
|
134
|
+
return { argc: 0, ptr: "null" };
|
|
135
|
+
const ptr = `%args${this.current.allocas.length}`;
|
|
136
|
+
this.current.allocas.push(`${ptr} = alloca i64, i32 ${args.length}`);
|
|
137
|
+
for (let index = 0; index < args.length; index++) {
|
|
138
|
+
const value = this.emitExpression(args[index]);
|
|
139
|
+
const slot = this.reg();
|
|
140
|
+
this.emit(` ${slot} = getelementptr i64, i64* ${ptr}, i32 ${index}`);
|
|
141
|
+
this.emit(` store i64 ${value}, i64* ${slot}`);
|
|
142
|
+
}
|
|
143
|
+
return { argc: args.length, ptr };
|
|
144
|
+
},
|
|
145
|
+
emitDelete(node) {
|
|
146
|
+
const target = node.expression;
|
|
147
|
+
if (target.kind === SyntaxKind.PropertyAccessExpression) {
|
|
148
|
+
const access = target;
|
|
149
|
+
const object = this.emitExpression(access.expression);
|
|
150
|
+
const key = this.stringValue(access.name.text);
|
|
151
|
+
return this.runtimeCall("xt_delete", [object, key]);
|
|
152
|
+
}
|
|
153
|
+
if (target.kind === SyntaxKind.ElementAccessExpression) {
|
|
154
|
+
const access = target;
|
|
155
|
+
const object = this.emitExpression(access.expression);
|
|
156
|
+
const key = this.emitExpression(access.argumentExpression);
|
|
157
|
+
return this.runtimeCall("xt_delete", [object, key]);
|
|
158
|
+
}
|
|
159
|
+
return i64(XT_TRUE);
|
|
160
|
+
},
|
|
161
|
+
emitPropertyAccess(node) {
|
|
162
|
+
if (node.name.text in MATH_CONSTANTS &&
|
|
163
|
+
node.expression.kind === SyntaxKind.Identifier &&
|
|
164
|
+
node.expression.text === "Math" &&
|
|
165
|
+
!this.binding.symbolOfIdentifier.get(node.expression)) {
|
|
166
|
+
return numberLiteral(MATH_CONSTANTS[node.name.text]);
|
|
167
|
+
}
|
|
168
|
+
const object = this.emitExpression(node.expression);
|
|
169
|
+
const access = () => {
|
|
170
|
+
if (node.name.text === "length") {
|
|
171
|
+
const result = this.reg();
|
|
172
|
+
this.emit(` ${result} = call i64 @xt_array_length(i64 ${object})`);
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
const key = this.stringValue(node.name.text);
|
|
176
|
+
const result = this.reg();
|
|
177
|
+
this.emit(` ${result} = call i64 @xt_get(i64 ${object}, i64 ${key})`);
|
|
178
|
+
return result;
|
|
179
|
+
};
|
|
180
|
+
return node.optional ? this.emitOptional(object, access) : access();
|
|
181
|
+
},
|
|
182
|
+
emitElementAccess(node) {
|
|
183
|
+
const object = this.emitExpression(node.expression);
|
|
184
|
+
const access = () => {
|
|
185
|
+
const key = this.emitExpression(node.argumentExpression);
|
|
186
|
+
const result = this.reg();
|
|
187
|
+
this.emit(` ${result} = call i64 @xt_get(i64 ${object}, i64 ${key})`);
|
|
188
|
+
return result;
|
|
189
|
+
};
|
|
190
|
+
return node.optional ? this.emitOptional(object, access) : access();
|
|
191
|
+
},
|
|
192
|
+
/**
|
|
193
|
+
* Evaluate `object` once and, when it is neither `null` nor `undefined`, run
|
|
194
|
+
* `compute` to produce the value; otherwise short-circuit to `undefined`.
|
|
195
|
+
*/
|
|
196
|
+
emitOptional(objectValue, compute) {
|
|
197
|
+
const result = this.alloca();
|
|
198
|
+
this.emit(` store i64 ${i64(XT_UNDEFINED)}, i64* ${result}`);
|
|
199
|
+
const nullish = this.reg();
|
|
200
|
+
this.emit(` ${nullish} = call i64 @xt_is_nullish(i64 ${objectValue})`);
|
|
201
|
+
const truthy = this.reg();
|
|
202
|
+
this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${nullish})`);
|
|
203
|
+
const condition = this.reg();
|
|
204
|
+
this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
|
|
205
|
+
const someLabel = this.label("opt.some");
|
|
206
|
+
const endLabel = this.label("opt.end");
|
|
207
|
+
this.terminate(`br i1 ${condition}, label %${endLabel}, label %${someLabel}`);
|
|
208
|
+
this.startBlock(someLabel);
|
|
209
|
+
const value = compute();
|
|
210
|
+
this.emit(` store i64 ${value}, i64* ${result}`);
|
|
211
|
+
this.terminate(`br label %${endLabel}`);
|
|
212
|
+
this.startBlock(endLabel);
|
|
213
|
+
const merged = this.reg();
|
|
214
|
+
this.emit(` ${merged} = load i64, i64* ${result}`);
|
|
215
|
+
return merged;
|
|
216
|
+
},
|
|
217
|
+
emitArrayLiteral(node) {
|
|
218
|
+
const hasSpread = node.elements.some((element) => element.kind === SyntaxKind.SpreadElement);
|
|
219
|
+
if (!hasSpread) {
|
|
220
|
+
const args = this.emitArguments(node.elements);
|
|
221
|
+
const result = this.reg();
|
|
222
|
+
this.emit(` ${result} = call i64 @xt_array_new(i32 ${args.argc}, i64* ${args.ptr})`);
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
let array = this.runtimeCall("xt_array_new", [`0`, `null`]);
|
|
226
|
+
for (const element of node.elements) {
|
|
227
|
+
if (element.kind === SyntaxKind.SpreadElement) {
|
|
228
|
+
const spread = this.emitExpression(element.expression);
|
|
229
|
+
array = this.runtimeCall("xt_array_spread", [array, spread]);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
const value = this.emitExpression(element);
|
|
233
|
+
array = this.runtimeCall("xt_array_push", [array, value]);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return array;
|
|
237
|
+
},
|
|
238
|
+
emitObjectLiteral(node) {
|
|
239
|
+
const object = this.reg();
|
|
240
|
+
this.emit(` ${object} = call i64 @xt_object_new()`);
|
|
241
|
+
for (const property of node.properties) {
|
|
242
|
+
if (property.kind === SyntaxKind.PropertyAssignment) {
|
|
243
|
+
const name = propertyNameText(property.name);
|
|
244
|
+
const key = this.stringValue(name);
|
|
245
|
+
const value = this.emitExpression(property.initializer);
|
|
246
|
+
this.emit(` call i64 @xt_set(i64 ${object}, i64 ${key}, i64 ${value})`);
|
|
247
|
+
}
|
|
248
|
+
else if (property.kind === SyntaxKind.ShorthandPropertyAssignment) {
|
|
249
|
+
const identifier = property.name;
|
|
250
|
+
const key = this.stringValue(identifier.text);
|
|
251
|
+
const value = this.emitIdentifier(identifier);
|
|
252
|
+
this.emit(` call i64 @xt_set(i64 ${object}, i64 ${key}, i64 ${value})`);
|
|
253
|
+
}
|
|
254
|
+
else if (property.kind === SyntaxKind.SpreadElement) {
|
|
255
|
+
const spread = this.emitExpression(property.expression);
|
|
256
|
+
this.emit(` call i64 @xt_object_spread(i64 ${object}, i64 ${spread})`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
this.unsupported(property, "object spread");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return object;
|
|
263
|
+
},
|
|
264
|
+
emitClosure(node) {
|
|
265
|
+
const fn = this.binding.functionOfNode.get(node);
|
|
266
|
+
if (!fn) {
|
|
267
|
+
this.unsupported(node, "closure");
|
|
268
|
+
return i64(XT_UNDEFINED);
|
|
269
|
+
}
|
|
270
|
+
let envPtr = "null";
|
|
271
|
+
if (fn.captures.length > 0) {
|
|
272
|
+
envPtr = `%env${this.current.allocas.length}`;
|
|
273
|
+
this.current.allocas.push(`${envPtr} = alloca i64, i32 ${fn.captures.length}`);
|
|
274
|
+
for (let index = 0; index < fn.captures.length; index++) {
|
|
275
|
+
const symbol = fn.captures[index];
|
|
276
|
+
// The current function must be able to read the capture: either from
|
|
277
|
+
// its own slot (local) or from one of its own capture slots.
|
|
278
|
+
const slot = this.current.slots.get(symbol.id);
|
|
279
|
+
let raw;
|
|
280
|
+
if (slot) {
|
|
281
|
+
raw = this.reg();
|
|
282
|
+
this.emit(` ${raw} = load i64, i64* ${slot.ptr}`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
const outer = this.binding.functionOfNode.get(node);
|
|
286
|
+
void outer;
|
|
287
|
+
raw = i64(XT_UNDEFINED);
|
|
288
|
+
}
|
|
289
|
+
const target = this.reg();
|
|
290
|
+
this.emit(` ${target} = getelementptr i64, i64* ${envPtr}, i32 ${index}`);
|
|
291
|
+
this.emit(` store i64 ${raw}, i64* ${target}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const cast = this.reg();
|
|
295
|
+
this.emit(` ${cast} = bitcast i64 (i64, i32, i64*)* @${this.functionName(fn)} to i8*`);
|
|
296
|
+
const closure = this.reg();
|
|
297
|
+
this.emit(` ${closure} = call i64 @xt_closure_new(i8* ${cast}, i32 ${fn.captures.length}, i64* ${envPtr})`);
|
|
298
|
+
return closure;
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
//# sourceMappingURL=calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/codegen/generator/calls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared generator state plus the low-level emission primitives.
|
|
3
|
+
*
|
|
4
|
+
* The generator's method groups are installed onto {@link Generator} via
|
|
5
|
+
* `Object.assign`; this context holds the fields they all mutate and the
|
|
6
|
+
* helpers every group relies on.
|
|
7
|
+
*/
|
|
8
|
+
import { type BindResult, type SymbolInfo } from "../../binder/binder.js";
|
|
9
|
+
import type { DiagnosticBag } from "../../diagnostics/diagnostic.js";
|
|
10
|
+
import type { SourceFileNode, Node } from "../../ast/nodes.js";
|
|
11
|
+
import type { BuiltinFunction } from "../../extensions/registry.js";
|
|
12
|
+
import type { CodegenOptions, FunctionState } from "./state.js";
|
|
13
|
+
export declare class GeneratorContext {
|
|
14
|
+
readonly binding: BindResult;
|
|
15
|
+
readonly sourceFile: SourceFileNode;
|
|
16
|
+
readonly diagnostics: DiagnosticBag;
|
|
17
|
+
readonly builtins: Readonly<Record<string, BuiltinFunction>>;
|
|
18
|
+
readonly globals: string[];
|
|
19
|
+
readonly functions: string[];
|
|
20
|
+
readonly strings: Map<string, {
|
|
21
|
+
label: string;
|
|
22
|
+
length: number;
|
|
23
|
+
}>;
|
|
24
|
+
readonly extraDeclarations: Set<string>;
|
|
25
|
+
stringCounter: number;
|
|
26
|
+
current: FunctionState;
|
|
27
|
+
constructor(sourceFile: SourceFileNode, diagnostics: DiagnosticBag, options?: CodegenOptions);
|
|
28
|
+
emit(line: string): void;
|
|
29
|
+
terminate(line: string): void;
|
|
30
|
+
reg(): string;
|
|
31
|
+
label(prefix: string): string;
|
|
32
|
+
startBlock(label: string): void;
|
|
33
|
+
alloca(): string;
|
|
34
|
+
const(hex: bigint): string;
|
|
35
|
+
declareSlot(symbol: SymbolInfo, initial: string): void;
|
|
36
|
+
defineCaptureSlot(symbol: SymbolInfo, box: string): void;
|
|
37
|
+
readSlot(symbol: SymbolInfo): string;
|
|
38
|
+
writeSlot(symbol: SymbolInfo, value: string): void;
|
|
39
|
+
stringValue(text: string): string;
|
|
40
|
+
internString(text: string): {
|
|
41
|
+
label: string;
|
|
42
|
+
length: number;
|
|
43
|
+
};
|
|
44
|
+
unsupported(node: Node, what: string): void;
|
|
45
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared generator state plus the low-level emission primitives.
|
|
3
|
+
*
|
|
4
|
+
* The generator's method groups are installed onto {@link Generator} via
|
|
5
|
+
* `Object.assign`; this context holds the fields they all mutate and the
|
|
6
|
+
* helpers every group relies on.
|
|
7
|
+
*/
|
|
8
|
+
import { bind } from "../../binder/binder.js";
|
|
9
|
+
import { DiagnosticCode } from "../../diagnostics/diagnostic.js";
|
|
10
|
+
import { i64, XT_UNDEFINED } from "../values.js";
|
|
11
|
+
import { escapeBytes, kindName, utf8Bytes } from "./tables.js";
|
|
12
|
+
export class GeneratorContext {
|
|
13
|
+
binding;
|
|
14
|
+
sourceFile;
|
|
15
|
+
diagnostics;
|
|
16
|
+
builtins;
|
|
17
|
+
globals = [];
|
|
18
|
+
functions = [];
|
|
19
|
+
strings = new Map();
|
|
20
|
+
extraDeclarations = new Set();
|
|
21
|
+
stringCounter = 0;
|
|
22
|
+
current;
|
|
23
|
+
constructor(sourceFile, diagnostics, options = {}) {
|
|
24
|
+
this.sourceFile = sourceFile;
|
|
25
|
+
this.diagnostics = diagnostics;
|
|
26
|
+
this.binding = bind(sourceFile);
|
|
27
|
+
this.builtins = options.builtins ?? {};
|
|
28
|
+
}
|
|
29
|
+
// -- emission primitives -------------------------------------------------
|
|
30
|
+
emit(line) {
|
|
31
|
+
this.current.buffer.push(line);
|
|
32
|
+
}
|
|
33
|
+
terminate(line) {
|
|
34
|
+
this.current.buffer.push(` ${line}`);
|
|
35
|
+
this.current.terminated = true;
|
|
36
|
+
}
|
|
37
|
+
reg() {
|
|
38
|
+
return `%r${this.current.reg++}`;
|
|
39
|
+
}
|
|
40
|
+
label(prefix) {
|
|
41
|
+
return `${prefix}.${this.current.label++}`;
|
|
42
|
+
}
|
|
43
|
+
startBlock(label) {
|
|
44
|
+
this.current.buffer.push(`${label}:`);
|
|
45
|
+
this.current.terminated = false;
|
|
46
|
+
}
|
|
47
|
+
alloca() {
|
|
48
|
+
const ptr = `%slot${this.current.allocas.length}`;
|
|
49
|
+
this.current.allocas.push(`${ptr} = alloca i64`);
|
|
50
|
+
this.current.escapePointers.push(ptr);
|
|
51
|
+
return ptr;
|
|
52
|
+
}
|
|
53
|
+
const(hex) {
|
|
54
|
+
return i64(hex);
|
|
55
|
+
}
|
|
56
|
+
// -- variables -----------------------------------------------------------
|
|
57
|
+
declareSlot(symbol, initial) {
|
|
58
|
+
const ptr = this.alloca();
|
|
59
|
+
if (symbol.boxed) {
|
|
60
|
+
const box = this.reg();
|
|
61
|
+
this.emit(` ${box} = call i64 @xt_box_new(i64 ${initial})`);
|
|
62
|
+
this.emit(` store i64 ${box}, i64* ${ptr}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.emit(` store i64 ${initial}, i64* ${ptr}`);
|
|
66
|
+
}
|
|
67
|
+
this.current.slots.set(symbol.id, { ptr, boxed: symbol.boxed });
|
|
68
|
+
}
|
|
69
|
+
defineCaptureSlot(symbol, box) {
|
|
70
|
+
const ptr = this.alloca();
|
|
71
|
+
this.emit(` store i64 ${box}, i64* ${ptr}`);
|
|
72
|
+
// A captured symbol is always boxed; the environment holds the box.
|
|
73
|
+
this.current.slots.set(symbol.id, { ptr, boxed: true });
|
|
74
|
+
}
|
|
75
|
+
readSlot(symbol) {
|
|
76
|
+
const slot = this.current.slots.get(symbol.id);
|
|
77
|
+
if (!slot) {
|
|
78
|
+
// Referenced from an inner function without a capture slot: this should
|
|
79
|
+
// be impossible once the binder has run, but stay defensive.
|
|
80
|
+
this.diagnostics.error(DiagnosticCode.CodegenError, `Internal: no slot for '${symbol.name}' in ${this.current.fn.name}`);
|
|
81
|
+
return i64(XT_UNDEFINED);
|
|
82
|
+
}
|
|
83
|
+
const value = this.reg();
|
|
84
|
+
this.emit(` ${value} = load i64, i64* ${slot.ptr}`);
|
|
85
|
+
if (!slot.boxed)
|
|
86
|
+
return value;
|
|
87
|
+
const unboxed = this.reg();
|
|
88
|
+
this.emit(` ${unboxed} = call i64 @xt_box_get(i64 ${value})`);
|
|
89
|
+
return unboxed;
|
|
90
|
+
}
|
|
91
|
+
writeSlot(symbol, value) {
|
|
92
|
+
const slot = this.current.slots.get(symbol.id);
|
|
93
|
+
if (!slot) {
|
|
94
|
+
this.diagnostics.error(DiagnosticCode.CodegenError, `Internal: no slot for '${symbol.name}'`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!slot.boxed) {
|
|
98
|
+
this.emit(` store i64 ${value}, i64* ${slot.ptr}`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const box = this.reg();
|
|
102
|
+
this.emit(` ${box} = load i64, i64* ${slot.ptr}`);
|
|
103
|
+
this.emit(` call i64 @xt_box_set(i64 ${box}, i64 ${value})`);
|
|
104
|
+
}
|
|
105
|
+
// -- string pool ---------------------------------------------------------
|
|
106
|
+
stringValue(text) {
|
|
107
|
+
const entry = this.internString(text);
|
|
108
|
+
const result = this.reg();
|
|
109
|
+
this.emit(` ${result} = call i64 @xt_string_new(i8* ${entry.label}, i64 ${entry.length})`);
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
internString(text) {
|
|
113
|
+
const existing = this.strings.get(text);
|
|
114
|
+
if (existing)
|
|
115
|
+
return existing;
|
|
116
|
+
const label = `@.str.${this.stringCounter++}`;
|
|
117
|
+
const bytes = utf8Bytes(text);
|
|
118
|
+
const entry = { label, length: bytes.length };
|
|
119
|
+
this.strings.set(text, entry);
|
|
120
|
+
this.globals.push(`${label} = private unnamed_addr constant [${bytes.length + 1} x i8] c"${escapeBytes(bytes)}\\00"`);
|
|
121
|
+
return entry;
|
|
122
|
+
}
|
|
123
|
+
unsupported(node, what) {
|
|
124
|
+
const label = kindName(node.kind);
|
|
125
|
+
this.diagnostics.error(DiagnosticCode.UnsupportedFeature, `xbintsc does not yet support this ${what} (${label})`, node, this.sourceFile.fileName);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=context.js.map
|