xbintsc 0.2.9 → 0.3.3
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 +17 -2
- package/README.zh-CN.md +16 -2
- package/bin/xbintsc.js +49 -10
- package/dist/src/ast/expressions.d.ts +2 -0
- package/dist/src/binder/binder.d.ts +24 -98
- package/dist/src/binder/binder.js +13 -559
- package/dist/src/binder/binder.js.map +1 -1
- package/dist/src/binder/declarations.d.ts +16 -0
- package/dist/src/binder/declarations.js +168 -0
- package/dist/src/binder/declarations.js.map +1 -0
- package/dist/src/binder/helpers.d.ts +11 -0
- package/dist/src/binder/helpers.js +46 -0
- package/dist/src/binder/helpers.js.map +1 -0
- package/dist/src/binder/references.d.ts +21 -0
- package/dist/src/binder/references.js +349 -0
- package/dist/src/binder/references.js.map +1 -0
- package/dist/src/binder/types.d.ts +114 -0
- package/dist/src/binder/types.js +27 -0
- package/dist/src/binder/types.js.map +1 -0
- package/dist/src/cli/main.d.ts +1 -0
- package/dist/src/cli/main.js +40 -0
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.d.ts +13 -0
- package/dist/src/codegen/generator/calls/access.js +115 -0
- package/dist/src/codegen/generator/calls/access.js.map +1 -0
- package/dist/src/codegen/generator/calls/closures.d.ts +11 -0
- package/dist/src/codegen/generator/calls/closures.js +50 -0
- package/dist/src/codegen/generator/calls/closures.js.map +1 -0
- package/dist/src/codegen/generator/calls/invocation.d.ts +18 -0
- package/dist/src/codegen/generator/calls/invocation.js +242 -0
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -0
- package/dist/src/codegen/generator/calls/literals.d.ts +10 -0
- package/dist/src/codegen/generator/calls/literals.js +69 -0
- package/dist/src/codegen/generator/calls/literals.js.map +1 -0
- package/dist/src/codegen/generator/calls/super.d.ts +10 -0
- package/dist/src/codegen/generator/calls/super.js +47 -0
- package/dist/src/codegen/generator/calls/super.js.map +1 -0
- package/dist/src/codegen/generator/calls.d.ts +15 -24
- package/dist/src/codegen/generator/calls.js +15 -482
- package/dist/src/codegen/generator/calls.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +1 -1
- package/dist/src/codegen/generator/context.js +2 -2
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/expressions/assignment.d.ts +13 -0
- package/dist/src/codegen/generator/expressions/assignment.js +203 -0
- package/dist/src/codegen/generator/expressions/assignment.js.map +1 -0
- package/dist/src/codegen/generator/expressions/operators.d.ts +14 -0
- package/dist/src/codegen/generator/expressions/operators.js +163 -0
- package/dist/src/codegen/generator/expressions/operators.js.map +1 -0
- package/dist/src/codegen/generator/expressions/primary.d.ts +17 -0
- package/dist/src/codegen/generator/expressions/primary.js +260 -0
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -0
- package/dist/src/codegen/generator/expressions.d.ts +11 -21
- package/dist/src/codegen/generator/expressions.js +11 -494
- package/dist/src/codegen/generator/expressions.js.map +1 -1
- package/dist/src/codegen/generator/module.js +16 -4
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/state.js +8 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.d.ts +14 -0
- package/dist/src/codegen/generator/statements/control-flow.js +199 -0
- package/dist/src/codegen/generator/statements/control-flow.js.map +1 -0
- package/dist/src/codegen/generator/statements/dispatch.d.ts +12 -0
- package/dist/src/codegen/generator/statements/dispatch.js +100 -0
- package/dist/src/codegen/generator/statements/dispatch.js.map +1 -0
- package/dist/src/codegen/generator/statements/loops.d.ts +13 -0
- package/dist/src/codegen/generator/statements/loops.js +152 -0
- package/dist/src/codegen/generator/statements/loops.js.map +1 -0
- package/dist/src/codegen/generator/statements/variables.d.ts +13 -0
- package/dist/src/codegen/generator/statements/variables.js +146 -0
- package/dist/src/codegen/generator/statements/variables.js.map +1 -0
- package/dist/src/codegen/generator/statements.d.ts +13 -21
- package/dist/src/codegen/generator/statements.js +13 -568
- package/dist/src/codegen/generator/statements.js.map +1 -1
- package/dist/src/codegen/generator/tables.js +7 -0
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/codegen/values.d.ts +17 -17
- package/dist/src/codegen/values.js +21 -57
- package/dist/src/codegen/values.js.map +1 -1
- package/dist/src/diagnostics/diagnostic.d.ts +1 -0
- package/dist/src/diagnostics/diagnostic.js +1 -0
- package/dist/src/diagnostics/diagnostic.js.map +1 -1
- package/dist/src/diagnostics/source.d.ts +1 -1
- package/dist/src/diagnostics/source.js +7 -12
- package/dist/src/diagnostics/source.js.map +1 -1
- package/dist/src/driver/compiler.d.ts +4 -0
- package/dist/src/driver/compiler.js +51 -16
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/index.d.ts +5 -2
- package/dist/src/driver/index.js +5 -2
- package/dist/src/driver/index.js.map +1 -1
- package/dist/src/driver/paths.d.ts +20 -0
- package/dist/src/driver/paths.js +49 -0
- package/dist/src/driver/paths.js.map +1 -1
- package/dist/src/driver/runtime-lib.d.ts +18 -0
- package/dist/src/driver/runtime-lib.js +31 -0
- package/dist/src/driver/runtime-lib.js.map +1 -0
- package/dist/src/driver/toolchain-download.d.ts +50 -0
- package/dist/src/driver/toolchain-download.js +76 -0
- package/dist/src/driver/toolchain-download.js.map +1 -0
- package/dist/src/driver/toolchain-provider.d.ts +33 -0
- package/dist/src/driver/toolchain-provider.js +71 -0
- package/dist/src/driver/toolchain-provider.js.map +1 -0
- package/dist/src/driver/toolchain.d.ts +9 -4
- package/dist/src/driver/toolchain.js +6 -10
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/extensions/node/child_process/index.d.ts +4 -2
- package/dist/src/extensions/node/child_process/index.js +4 -2
- package/dist/src/extensions/node/child_process/index.js.map +1 -1
- package/dist/src/extensions/node/events/index.d.ts +10 -0
- package/dist/src/extensions/node/events/index.js +22 -0
- package/dist/src/extensions/node/events/index.js.map +1 -0
- package/dist/src/extensions/node/index.js +6 -0
- package/dist/src/extensions/node/index.js.map +1 -1
- package/dist/src/extensions/node/querystring/index.d.ts +10 -0
- package/dist/src/extensions/node/querystring/index.js +25 -0
- package/dist/src/extensions/node/querystring/index.js.map +1 -0
- package/dist/src/extensions/node/util/index.d.ts +11 -0
- package/dist/src/extensions/node/util/index.js +41 -0
- package/dist/src/extensions/node/util/index.js.map +1 -0
- package/dist/src/extensions/registry.d.ts +6 -0
- package/dist/src/extensions/registry.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lexer/scanner/identifiers.d.ts +9 -0
- package/dist/src/lexer/scanner/identifiers.js +33 -0
- package/dist/src/lexer/scanner/identifiers.js.map +1 -0
- package/dist/src/lexer/scanner/numbers.d.ts +10 -0
- package/dist/src/lexer/scanner/numbers.js +89 -0
- package/dist/src/lexer/scanner/numbers.js.map +1 -0
- package/dist/src/lexer/scanner/punctuation.d.ts +9 -0
- package/dist/src/lexer/scanner/punctuation.js +151 -0
- package/dist/src/lexer/scanner/punctuation.js.map +1 -0
- package/dist/src/lexer/scanner/regex.d.ts +11 -0
- package/dist/src/lexer/scanner/regex.js +69 -0
- package/dist/src/lexer/scanner/regex.js.map +1 -0
- package/dist/src/lexer/scanner/strings.d.ts +13 -0
- package/dist/src/lexer/scanner/strings.js +118 -0
- package/dist/src/lexer/scanner/strings.js.map +1 -0
- package/dist/src/lexer/scanner.d.ts +20 -27
- package/dist/src/lexer/scanner.js +11 -415
- package/dist/src/lexer/scanner.js.map +1 -1
- package/dist/src/parser/declarations/classes.d.ts +14 -0
- package/dist/src/parser/declarations/classes.js +191 -0
- package/dist/src/parser/declarations/classes.js.map +1 -0
- package/dist/src/parser/declarations/functions.d.ts +17 -0
- package/dist/src/parser/declarations/functions.js +241 -0
- package/dist/src/parser/declarations/functions.js.map +1 -0
- package/dist/src/parser/declarations/type-members.d.ts +16 -0
- package/dist/src/parser/declarations/type-members.js +156 -0
- package/dist/src/parser/declarations/type-members.js.map +1 -0
- package/dist/src/parser/declarations.d.ts +13 -24
- package/dist/src/parser/declarations.js +13 -571
- package/dist/src/parser/declarations.js.map +1 -1
- package/dist/src/parser/helpers.js +13 -4
- package/dist/src/parser/helpers.js.map +1 -1
- package/dist/src/parser/literals.js +10 -1
- package/dist/src/parser/literals.js.map +1 -1
- package/dist/tests/codegen/llvm.test.js +24 -0
- package/dist/tests/codegen/llvm.test.js.map +1 -1
- package/dist/tests/driver/compiler.test.js +3 -0
- package/dist/tests/driver/compiler.test.js.map +1 -1
- package/dist/tests/driver/paths.test.d.ts +1 -0
- package/dist/tests/driver/paths.test.js +26 -0
- package/dist/tests/driver/paths.test.js.map +1 -0
- package/dist/tests/driver/toolchain-download.test.d.ts +1 -0
- package/dist/tests/driver/toolchain-download.test.js +38 -0
- package/dist/tests/driver/toolchain-download.test.js.map +1 -0
- package/dist/tests/driver/toolchain-provider.test.d.ts +1 -0
- package/dist/tests/driver/toolchain-provider.test.js +37 -0
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -0
- package/dist/tests/e2e/compile-node.test.d.ts +7 -0
- package/dist/tests/e2e/compile-node.test.js +123 -0
- package/dist/tests/e2e/compile-node.test.js.map +1 -0
- package/dist/tests/e2e/compile.test.d.ts +4 -1
- package/dist/tests/e2e/compile.test.js +78 -130
- package/dist/tests/e2e/compile.test.js.map +1 -1
- package/dist/tests/e2e/harness.d.ts +36 -0
- package/dist/tests/e2e/harness.js +64 -0
- package/dist/tests/e2e/harness.js.map +1 -0
- package/dist/tests/e2e/node-modules.test.js +60 -0
- package/dist/tests/e2e/node-modules.test.js.map +1 -1
- package/dist/tests/extensions/registry.test.js +4 -0
- package/dist/tests/extensions/registry.test.js.map +1 -1
- package/package.json +5 -3
- package/runtime/ext_node/buffer/buffer.c +12 -552
- package/runtime/ext_node/buffer/parts/byte-access.inc +35 -0
- package/runtime/ext_node/buffer/parts/construction.inc +60 -0
- package/runtime/ext_node/buffer/parts/integer-io.inc +119 -0
- package/runtime/ext_node/buffer/parts/methods.inc +135 -0
- package/runtime/ext_node/buffer/parts/prototype.inc +54 -0
- package/runtime/ext_node/buffer/parts/search.inc +86 -0
- package/runtime/ext_node/buffer/parts/static-api.inc +58 -0
- package/runtime/ext_node/child_process/child_process.c +37 -3
- package/runtime/ext_node/events/events.c +285 -0
- package/runtime/ext_node/http/http.c +11 -736
- package/runtime/ext_node/http/parts/client.inc +290 -0
- package/runtime/ext_node/http/parts/helpers.inc +45 -0
- package/runtime/ext_node/http/parts/prototypes.inc +57 -0
- package/runtime/ext_node/http/parts/response.inc +149 -0
- package/runtime/ext_node/http/parts/server.inc +133 -0
- package/runtime/ext_node/http/parts/string-builder.inc +58 -0
- package/runtime/ext_node/net/net.c +12 -504
- package/runtime/ext_node/net/parts/construction.inc +22 -0
- package/runtime/ext_node/net/parts/platform.inc +60 -0
- package/runtime/ext_node/net/parts/prototypes.inc +35 -0
- package/runtime/ext_node/net/parts/read-loop.inc +58 -0
- package/runtime/ext_node/net/parts/server.inc +131 -0
- package/runtime/ext_node/net/parts/socket-methods.inc +100 -0
- package/runtime/ext_node/net/parts/static-api.inc +93 -0
- package/runtime/ext_node/querystring/querystring.c +251 -0
- package/runtime/ext_node/util/util.c +456 -0
- package/runtime/rt.h +8 -2
- package/runtime/rt_internal.h +34 -0
- package/runtime/xt_bigint/arithmetic.inc +135 -0
- package/runtime/xt_bigint/bits.inc +98 -0
- package/runtime/xt_bigint/bitwise.inc +103 -0
- package/runtime/xt_bigint/compare.inc +30 -0
- package/runtime/xt_bigint/conversions.inc +51 -0
- package/runtime/xt_bigint/division.inc +85 -0
- package/runtime/xt_bigint/format.inc +145 -0
- package/runtime/xt_bigint/helpers.inc +92 -0
- package/runtime/xt_bigint/magnitude.inc +88 -0
- package/runtime/xt_bigint/public.inc +59 -0
- package/runtime/xt_bigint/small-arithmetic.inc +58 -0
- package/runtime/xt_bigint.c +42 -0
- package/runtime/xt_builtins.c +1 -0
- package/runtime/xt_io.c +7 -0
- package/runtime/xt_stdlib/arrays.inc +161 -0
- package/runtime/xt_stdlib/dispatch.inc +116 -0
- package/runtime/xt_stdlib/helpers.inc +23 -0
- package/runtime/xt_stdlib/math.inc +72 -0
- package/runtime/xt_stdlib/strings.inc +178 -0
- package/runtime/xt_stdlib.c +10 -549
- package/runtime/xt_stdlib2/array-statics.inc +37 -0
- package/runtime/xt_stdlib2/arrays.inc +189 -0
- package/runtime/xt_stdlib2/container.inc +23 -0
- package/runtime/xt_stdlib2/date.inc +72 -0
- package/runtime/xt_stdlib2/error.inc +22 -0
- package/runtime/xt_stdlib2/helpers.inc +43 -0
- package/runtime/xt_stdlib2/json.inc +213 -0
- package/runtime/xt_stdlib2/map.inc +95 -0
- package/runtime/xt_stdlib2/number-string-statics.inc +73 -0
- package/runtime/xt_stdlib2/numbers.inc +38 -0
- package/runtime/xt_stdlib2/objects.inc +41 -0
- package/runtime/xt_stdlib2/regexp-match.inc +204 -0
- package/runtime/xt_stdlib2/regexp.inc +20 -0
- package/runtime/xt_stdlib2/set.inc +105 -0
- package/runtime/xt_stdlib2/strings.inc +94 -0
- package/runtime/xt_stdlib2.c +19 -1278
- package/runtime/xt_values.c +155 -12
- package/scripts/build-runtime.ts +109 -0
- package/scripts/fetch-toolchain.ts +101 -0
- package/scripts/package-release.ts +192 -0
- package/src/ast/expressions.ts +2 -0
- package/src/binder/binder.ts +40 -725
- package/src/binder/declarations.ts +203 -0
- package/src/binder/helpers.ts +47 -0
- package/src/binder/references.ts +410 -0
- package/src/binder/types.ts +134 -0
- package/src/cli/main.ts +43 -0
- package/src/codegen/generator/calls/access.ts +139 -0
- package/src/codegen/generator/calls/closures.ts +60 -0
- package/src/codegen/generator/calls/invocation.ts +282 -0
- package/src/codegen/generator/calls/literals.ts +77 -0
- package/src/codegen/generator/calls/super.ts +61 -0
- package/src/codegen/generator/calls.ts +30 -552
- package/src/codegen/generator/context.ts +2 -2
- package/src/codegen/generator/expressions/assignment.ts +226 -0
- package/src/codegen/generator/expressions/operators.ts +182 -0
- package/src/codegen/generator/expressions/primary.ts +304 -0
- package/src/codegen/generator/expressions.ts +22 -553
- package/src/codegen/generator/module.ts +14 -4
- package/src/codegen/generator/state.ts +8 -0
- package/src/codegen/generator/statements/control-flow.ts +225 -0
- package/src/codegen/generator/statements/dispatch.ts +122 -0
- package/src/codegen/generator/statements/loops.ts +173 -0
- package/src/codegen/generator/statements/variables.ts +152 -0
- package/src/codegen/generator/statements.ts +26 -612
- package/src/codegen/generator/tables.ts +7 -0
- package/src/codegen/values.ts +22 -57
- package/src/diagnostics/diagnostic.ts +1 -0
- package/src/diagnostics/source.ts +7 -12
- package/src/driver/compiler.ts +61 -18
- package/src/driver/index.ts +17 -2
- package/src/driver/paths.ts +54 -0
- package/src/driver/runtime-lib.ts +32 -0
- package/src/driver/toolchain-download.ts +108 -0
- package/src/driver/toolchain-provider.ts +91 -0
- package/src/driver/toolchain.ts +29 -11
- package/src/extensions/node/child_process/index.ts +4 -2
- package/src/extensions/node/events/index.ts +27 -0
- package/src/extensions/node/index.ts +6 -0
- package/src/extensions/node/querystring/index.ts +29 -0
- package/src/extensions/node/util/index.ts +48 -0
- package/src/extensions/registry.ts +6 -0
- package/src/index.ts +1 -0
- package/src/lexer/scanner/identifiers.ts +37 -0
- package/src/lexer/scanner/numbers.ts +84 -0
- package/src/lexer/scanner/punctuation.ts +132 -0
- package/src/lexer/scanner/regex.ts +79 -0
- package/src/lexer/scanner/strings.ts +128 -0
- package/src/lexer/scanner.ts +35 -401
- package/src/parser/declarations/classes.ts +215 -0
- package/src/parser/declarations/functions.ts +254 -0
- package/src/parser/declarations/type-members.ts +181 -0
- package/src/parser/declarations.ts +32 -609
- package/src/parser/helpers.ts +13 -6
- package/src/parser/literals.ts +10 -1
- package/scripts/build-runtime.mjs +0 -55
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binder data model: the plain-data symbols, scopes and per-function records
|
|
3
|
+
* that the binder produces and the checker/codegen consume.
|
|
4
|
+
*/
|
|
5
|
+
import type { ArrowFunction, Expression, FunctionDeclaration, FunctionExpression, Identifier, Node, SourceFileNode } from "../ast/nodes.js";
|
|
6
|
+
export declare enum SymbolKind {
|
|
7
|
+
Var = "var",
|
|
8
|
+
Let = "let",
|
|
9
|
+
Const = "const",
|
|
10
|
+
Function = "function",
|
|
11
|
+
Parameter = "parameter",
|
|
12
|
+
Class = "class",
|
|
13
|
+
Interface = "interface",
|
|
14
|
+
TypeAlias = "type",
|
|
15
|
+
Enum = "enum",
|
|
16
|
+
Import = "import",
|
|
17
|
+
Namespace = "namespace"
|
|
18
|
+
}
|
|
19
|
+
export interface SymbolInfo {
|
|
20
|
+
readonly id: number;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly kind: SymbolKind;
|
|
23
|
+
/** False for `const` bindings and imports. */
|
|
24
|
+
readonly mutable: boolean;
|
|
25
|
+
/** The function this symbol belongs to. */
|
|
26
|
+
readonly fn: FunctionInfo;
|
|
27
|
+
readonly declarations: Node[];
|
|
28
|
+
readonly references: Identifier[];
|
|
29
|
+
/** Set when referenced from a nested function. */
|
|
30
|
+
captured: boolean;
|
|
31
|
+
/** Assigned after construction once we know it is captured. */
|
|
32
|
+
boxed: boolean;
|
|
33
|
+
}
|
|
34
|
+
export type FunctionNode = SourceFileNode | FunctionDeclaration | FunctionExpression | ArrowFunction;
|
|
35
|
+
export interface FunctionInfo {
|
|
36
|
+
readonly id: number;
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly node: FunctionNode;
|
|
39
|
+
readonly parent?: FunctionInfo;
|
|
40
|
+
readonly scope: Scope;
|
|
41
|
+
readonly params: SymbolInfo[];
|
|
42
|
+
/** Every binding declared directly in this function (params + locals). */
|
|
43
|
+
readonly locals: SymbolInfo[];
|
|
44
|
+
/** Outer bindings referenced by this function or any descendant. */
|
|
45
|
+
readonly captures: SymbolInfo[];
|
|
46
|
+
readonly captureIndex: Map<number, number>;
|
|
47
|
+
readonly isModule: boolean;
|
|
48
|
+
readonly isArrow: boolean;
|
|
49
|
+
/** True when the function was declared `async`. */
|
|
50
|
+
readonly isAsync: boolean;
|
|
51
|
+
/** True when this function's body mentions `this` directly. */
|
|
52
|
+
usesThis: boolean;
|
|
53
|
+
/** True when an arrow function must receive `this` from its enclosing scope. */
|
|
54
|
+
capturesThis: boolean;
|
|
55
|
+
/** Set for class methods/constructors; carries the owning class. */
|
|
56
|
+
classInfo?: ClassInfo;
|
|
57
|
+
/** True for `static` class members. */
|
|
58
|
+
isStatic?: boolean;
|
|
59
|
+
/** True for an explicit `constructor`. */
|
|
60
|
+
isConstructor?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface ClassInfo {
|
|
63
|
+
readonly id: number;
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly node: Node;
|
|
66
|
+
readonly scope: Scope;
|
|
67
|
+
readonly parent?: ClassInfo;
|
|
68
|
+
readonly parentExpression?: Expression;
|
|
69
|
+
/** `this`-bearing fields declared on the class. */
|
|
70
|
+
readonly fields: ClassFieldInfo[];
|
|
71
|
+
readonly methods: FunctionInfo[];
|
|
72
|
+
readonly statics: FunctionInfo[];
|
|
73
|
+
ctor?: FunctionInfo;
|
|
74
|
+
}
|
|
75
|
+
export interface ClassFieldInfo {
|
|
76
|
+
readonly name: string;
|
|
77
|
+
readonly initializer: Expression | undefined;
|
|
78
|
+
readonly fn: FunctionInfo;
|
|
79
|
+
readonly isStatic: boolean;
|
|
80
|
+
}
|
|
81
|
+
export declare enum ScopeKind {
|
|
82
|
+
Module = "module",
|
|
83
|
+
Function = "function",
|
|
84
|
+
Block = "block",
|
|
85
|
+
For = "for",
|
|
86
|
+
Catch = "catch"
|
|
87
|
+
}
|
|
88
|
+
export interface Scope {
|
|
89
|
+
readonly kind: ScopeKind;
|
|
90
|
+
readonly parent?: Scope;
|
|
91
|
+
readonly fn: FunctionInfo;
|
|
92
|
+
readonly symbols: Map<string, SymbolInfo>;
|
|
93
|
+
/** The syntax node that introduced the scope, when there is one. */
|
|
94
|
+
readonly node?: Node;
|
|
95
|
+
}
|
|
96
|
+
export interface BindResult {
|
|
97
|
+
readonly moduleFunction: FunctionInfo;
|
|
98
|
+
readonly functions: FunctionInfo[];
|
|
99
|
+
readonly classes: ClassInfo[];
|
|
100
|
+
/** Maps a class-like AST node to the ClassInfo the binder built. */
|
|
101
|
+
readonly classOfNode: Map<Node, ClassInfo>;
|
|
102
|
+
/** Maps a function-like AST node to the FunctionInfo the binder built for it. */
|
|
103
|
+
readonly functionOfNode: Map<Node, FunctionInfo>;
|
|
104
|
+
readonly symbolOfDeclaration: Map<Node, SymbolInfo>;
|
|
105
|
+
readonly symbolOfIdentifier: Map<Identifier, SymbolInfo>;
|
|
106
|
+
readonly scopes: Map<Node, Scope>;
|
|
107
|
+
/** Identifier references that could not be resolved in user code. */
|
|
108
|
+
readonly unresolved: Identifier[];
|
|
109
|
+
}
|
|
110
|
+
export interface MutableFunction extends FunctionInfo {
|
|
111
|
+
locals: SymbolInfo[];
|
|
112
|
+
captures: SymbolInfo[];
|
|
113
|
+
captureIndex: Map<number, number>;
|
|
114
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binder data model: the plain-data symbols, scopes and per-function records
|
|
3
|
+
* that the binder produces and the checker/codegen consume.
|
|
4
|
+
*/
|
|
5
|
+
export var SymbolKind;
|
|
6
|
+
(function (SymbolKind) {
|
|
7
|
+
SymbolKind["Var"] = "var";
|
|
8
|
+
SymbolKind["Let"] = "let";
|
|
9
|
+
SymbolKind["Const"] = "const";
|
|
10
|
+
SymbolKind["Function"] = "function";
|
|
11
|
+
SymbolKind["Parameter"] = "parameter";
|
|
12
|
+
SymbolKind["Class"] = "class";
|
|
13
|
+
SymbolKind["Interface"] = "interface";
|
|
14
|
+
SymbolKind["TypeAlias"] = "type";
|
|
15
|
+
SymbolKind["Enum"] = "enum";
|
|
16
|
+
SymbolKind["Import"] = "import";
|
|
17
|
+
SymbolKind["Namespace"] = "namespace";
|
|
18
|
+
})(SymbolKind || (SymbolKind = {}));
|
|
19
|
+
export var ScopeKind;
|
|
20
|
+
(function (ScopeKind) {
|
|
21
|
+
ScopeKind["Module"] = "module";
|
|
22
|
+
ScopeKind["Function"] = "function";
|
|
23
|
+
ScopeKind["Block"] = "block";
|
|
24
|
+
ScopeKind["For"] = "for";
|
|
25
|
+
ScopeKind["Catch"] = "catch";
|
|
26
|
+
})(ScopeKind || (ScopeKind = {}));
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/binder/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,CAAN,IAAY,UAYX;AAZD,WAAY,UAAU;IACpB,yBAAW,CAAA;IACX,yBAAW,CAAA;IACX,6BAAe,CAAA;IACf,mCAAqB,CAAA;IACrB,qCAAuB,CAAA;IACvB,6BAAe,CAAA;IACf,qCAAuB,CAAA;IACvB,gCAAkB,CAAA;IAClB,2BAAa,CAAA;IACb,+BAAiB,CAAA;IACjB,qCAAuB,CAAA;AACzB,CAAC,EAZW,UAAU,KAAV,UAAU,QAYrB;AAsED,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,8BAAiB,CAAA;IACjB,kCAAqB,CAAA;IACrB,4BAAe,CAAA;IACf,wBAAW,CAAA;IACX,4BAAe,CAAA;AACjB,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB"}
|
package/dist/src/cli/main.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* xbintsc build <file> [-o out] [--emit ir|obj|exe] [-O0..3] [--ext node]
|
|
8
8
|
* xbintsc run <file> [-- args...]
|
|
9
9
|
* xbintsc emit <file> # print LLVM IR to stdout
|
|
10
|
+
* xbintsc doctor # report the resolved toolchain
|
|
10
11
|
* xbintsc version
|
|
11
12
|
*/
|
|
12
13
|
export interface CliIo {
|
package/dist/src/cli/main.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* xbintsc build <file> [-o out] [--emit ir|obj|exe] [-O0..3] [--ext node]
|
|
8
8
|
* xbintsc run <file> [-- args...]
|
|
9
9
|
* xbintsc emit <file> # print LLVM IR to stdout
|
|
10
|
+
* xbintsc doctor # report the resolved toolchain
|
|
10
11
|
* xbintsc version
|
|
11
12
|
*/
|
|
12
13
|
import { spawnSync } from "node:child_process";
|
|
@@ -15,6 +16,10 @@ import { pathToFileURL } from "node:url";
|
|
|
15
16
|
import { formatDiagnostic } from "../diagnostics/diagnostic.js";
|
|
16
17
|
import { SourceFile } from "../diagnostics/source.js";
|
|
17
18
|
import { build, compileEntry, COMPILER_VERSION } from "../driver/compiler.js";
|
|
19
|
+
import { findRuntimeDir, platformSlug } from "../driver/paths.js";
|
|
20
|
+
import { runtimeLibDir } from "../driver/runtime-lib.js";
|
|
21
|
+
import { resolveToolchain } from "../driver/toolchain-provider.js";
|
|
22
|
+
import { realRunner } from "../driver/toolchain.js";
|
|
18
23
|
import { createDefaultRegistry } from "../extensions/registry.js";
|
|
19
24
|
import { nodeExtension } from "../extensions/node/index.js";
|
|
20
25
|
const defaultIo = {
|
|
@@ -109,6 +114,7 @@ Usage:
|
|
|
109
114
|
xbintsc build <file.ts> [options] Compile to a native binary
|
|
110
115
|
xbintsc run <file.ts> [-- args] Compile and execute
|
|
111
116
|
xbintsc emit <file.ts> Print LLVM IR
|
|
117
|
+
xbintsc doctor Report the resolved toolchain
|
|
112
118
|
xbintsc version Print the version
|
|
113
119
|
xbintsc help Show this message
|
|
114
120
|
|
|
@@ -121,6 +127,37 @@ Options:
|
|
|
121
127
|
--force Ignore the incremental cache
|
|
122
128
|
--verbose Print progress information
|
|
123
129
|
`;
|
|
130
|
+
function firstLine(text) {
|
|
131
|
+
const index = text.indexOf("\n");
|
|
132
|
+
return (index === -1 ? text : text.slice(0, index)).trim();
|
|
133
|
+
}
|
|
134
|
+
/** Report the resolved toolchain and runtime locations. */
|
|
135
|
+
function doctor(io) {
|
|
136
|
+
io.stdout(`xbintsc ${COMPILER_VERSION}\n`);
|
|
137
|
+
io.stdout(`platform : ${platformSlug()}\n`);
|
|
138
|
+
try {
|
|
139
|
+
const toolchain = resolveToolchain();
|
|
140
|
+
const version = realRunner.run(toolchain.clang, ["--version"], { env: toolchain.env }).stdout;
|
|
141
|
+
io.stdout(`toolchain : ${toolchain.clang} (${toolchain.source})\n`);
|
|
142
|
+
io.stdout(`compiler : ${firstLine(version) || "unknown"}\n`);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
io.stdout("toolchain : not found (install the Xcode Command Line Tools or set xbintsc_CLANG)\n");
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
io.stdout(`runtime : ${findRuntimeDir()}\n`);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
io.stdout("runtime : not found (cannot locate runtime/rt.h)\n");
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
io.stdout(`runtime lib: ${runtimeLibDir()}\n`);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
io.stdout("runtime lib: unavailable\n");
|
|
158
|
+
}
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
124
161
|
export function run(argv, io = defaultIo) {
|
|
125
162
|
const args = parseArgs(argv);
|
|
126
163
|
const command = args.command;
|
|
@@ -128,6 +165,9 @@ export function run(argv, io = defaultIo) {
|
|
|
128
165
|
io.stdout(HELP);
|
|
129
166
|
return 0;
|
|
130
167
|
}
|
|
168
|
+
if (command === "doctor") {
|
|
169
|
+
return doctor(io);
|
|
170
|
+
}
|
|
131
171
|
if (command === "version" || args.flags.has("version")) {
|
|
132
172
|
io.stdout(`xbintsc ${COMPILER_VERSION}\n`);
|
|
133
173
|
return 0;
|
package/dist/src/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Member access lowering: property/element reads, `delete` and optional
|
|
3
|
+
* chaining guards.
|
|
4
|
+
*/
|
|
5
|
+
import { type DeleteExpression, type ElementAccessExpression, type PropertyAccessExpression } from "../../../ast/nodes.js";
|
|
6
|
+
import type { Generator } from "../generator.js";
|
|
7
|
+
export interface AccessCallMethods {
|
|
8
|
+
emitDelete(this: Generator, node: DeleteExpression): string;
|
|
9
|
+
emitPropertyAccess(this: Generator, node: PropertyAccessExpression): string;
|
|
10
|
+
emitElementAccess(this: Generator, node: ElementAccessExpression): string;
|
|
11
|
+
emitOptional(this: Generator, objectValue: string, compute: () => string): string;
|
|
12
|
+
}
|
|
13
|
+
export declare const accessCallMethods: AccessCallMethods;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Member access lowering: property/element reads, `delete` and optional
|
|
3
|
+
* chaining guards.
|
|
4
|
+
*/
|
|
5
|
+
import { SyntaxKind, } from "../../../ast/nodes.js";
|
|
6
|
+
import { i64, numberLiteral, XT_TRUE, XT_UNDEFINED } from "../../values.js";
|
|
7
|
+
import { MATH_CONSTANTS, NAMESPACE_PROPERTIES } from "../tables.js";
|
|
8
|
+
export const accessCallMethods = {
|
|
9
|
+
emitDelete(node) {
|
|
10
|
+
const target = node.expression;
|
|
11
|
+
if (target.kind === SyntaxKind.PropertyAccessExpression) {
|
|
12
|
+
const access = target;
|
|
13
|
+
const object = this.emitExpression(access.expression);
|
|
14
|
+
const key = this.stringValue(access.name.text);
|
|
15
|
+
return this.runtimeCall("xt_delete", [object, key]);
|
|
16
|
+
}
|
|
17
|
+
if (target.kind === SyntaxKind.ElementAccessExpression) {
|
|
18
|
+
const access = target;
|
|
19
|
+
const object = this.emitExpression(access.expression);
|
|
20
|
+
const key = this.emitExpression(access.argumentExpression);
|
|
21
|
+
return this.runtimeCall("xt_delete", [object, key]);
|
|
22
|
+
}
|
|
23
|
+
return i64(XT_TRUE);
|
|
24
|
+
},
|
|
25
|
+
emitPropertyAccess(node) {
|
|
26
|
+
if (node.expression.kind === SyntaxKind.Identifier && node.expression.text === "super") {
|
|
27
|
+
const thisValue = this.emitThis();
|
|
28
|
+
const proto = this.reg();
|
|
29
|
+
this.emit(` ${proto} = call i64 @xt_object_get_prototype(i64 ${thisValue})`);
|
|
30
|
+
const parentProto = this.reg();
|
|
31
|
+
this.emit(` ${parentProto} = call i64 @xt_object_get_prototype(i64 ${proto})`);
|
|
32
|
+
const key = this.stringValue(node.name.text);
|
|
33
|
+
const value = this.reg();
|
|
34
|
+
this.emit(` ${value} = call i64 @xt_get(i64 ${parentProto}, i64 ${key})`);
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
if (node.name.text in MATH_CONSTANTS &&
|
|
38
|
+
node.expression.kind === SyntaxKind.Identifier &&
|
|
39
|
+
node.expression.text === "Math" &&
|
|
40
|
+
!this.binding.symbolOfIdentifier.get(node.expression)) {
|
|
41
|
+
return numberLiteral(MATH_CONSTANTS[node.name.text]);
|
|
42
|
+
}
|
|
43
|
+
if (node.expression.kind === SyntaxKind.Identifier &&
|
|
44
|
+
!this.binding.symbolOfIdentifier.get(node.expression)) {
|
|
45
|
+
const getter = NAMESPACE_PROPERTIES[node.expression.text];
|
|
46
|
+
if (getter) {
|
|
47
|
+
const key = this.stringValue(node.name.text);
|
|
48
|
+
const result = this.reg();
|
|
49
|
+
this.emit(` ${result} = call i64 @${getter}(i64 ${key})`);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (node.expression.kind === SyntaxKind.Identifier) {
|
|
54
|
+
const namespace = this.namespaceOfSymbol(this.binding.symbolOfIdentifier.get(node.expression));
|
|
55
|
+
if (namespace) {
|
|
56
|
+
const getter = NAMESPACE_PROPERTIES[namespace];
|
|
57
|
+
if (getter) {
|
|
58
|
+
const key = this.stringValue(node.name.text);
|
|
59
|
+
const result = this.reg();
|
|
60
|
+
this.emit(` ${result} = call i64 @${getter}(i64 ${key})`);
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const object = this.emitExpression(node.expression);
|
|
66
|
+
const access = () => {
|
|
67
|
+
if (node.name.text === "length") {
|
|
68
|
+
const result = this.reg();
|
|
69
|
+
this.emit(` ${result} = call i64 @xt_array_length(i64 ${object})`);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
const key = this.stringValue(node.name.text);
|
|
73
|
+
const result = this.reg();
|
|
74
|
+
this.emit(` ${result} = call i64 @xt_get(i64 ${object}, i64 ${key})`);
|
|
75
|
+
return result;
|
|
76
|
+
};
|
|
77
|
+
return node.optional ? this.emitOptional(object, access) : access();
|
|
78
|
+
},
|
|
79
|
+
emitElementAccess(node) {
|
|
80
|
+
const object = this.emitExpression(node.expression);
|
|
81
|
+
const access = () => {
|
|
82
|
+
const key = this.emitExpression(node.argumentExpression);
|
|
83
|
+
const result = this.reg();
|
|
84
|
+
this.emit(` ${result} = call i64 @xt_get(i64 ${object}, i64 ${key})`);
|
|
85
|
+
return result;
|
|
86
|
+
};
|
|
87
|
+
return node.optional ? this.emitOptional(object, access) : access();
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* Evaluate `object` once and, when it is neither `null` nor `undefined`, run
|
|
91
|
+
* `compute` to produce the value; otherwise short-circuit to `undefined`.
|
|
92
|
+
*/
|
|
93
|
+
emitOptional(objectValue, compute) {
|
|
94
|
+
const result = this.alloca();
|
|
95
|
+
this.emit(` store i64 ${i64(XT_UNDEFINED)}, i64* ${result}`);
|
|
96
|
+
const nullish = this.reg();
|
|
97
|
+
this.emit(` ${nullish} = call i64 @xt_is_nullish(i64 ${objectValue})`);
|
|
98
|
+
const truthy = this.reg();
|
|
99
|
+
this.emit(` ${truthy} = call i32 @xt_truthy(i64 ${nullish})`);
|
|
100
|
+
const condition = this.reg();
|
|
101
|
+
this.emit(` ${condition} = icmp ne i32 ${truthy}, 0`);
|
|
102
|
+
const someLabel = this.label("opt.some");
|
|
103
|
+
const endLabel = this.label("opt.end");
|
|
104
|
+
this.terminate(`br i1 ${condition}, label %${endLabel}, label %${someLabel}`);
|
|
105
|
+
this.startBlock(someLabel);
|
|
106
|
+
const value = compute();
|
|
107
|
+
this.emit(` store i64 ${value}, i64* ${result}`);
|
|
108
|
+
this.terminate(`br label %${endLabel}`);
|
|
109
|
+
this.startBlock(endLabel);
|
|
110
|
+
const merged = this.reg();
|
|
111
|
+
this.emit(` ${merged} = load i64, i64* ${result}`);
|
|
112
|
+
return merged;
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../../../../src/codegen/generator/calls/access.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closure lowering: arrow/function expressions and their captured environments.
|
|
3
|
+
*/
|
|
4
|
+
import type { ArrowFunction, FunctionExpression } from "../../../ast/nodes.js";
|
|
5
|
+
import type { FunctionInfo } from "../../../binder/binder.js";
|
|
6
|
+
import type { Generator } from "../generator.js";
|
|
7
|
+
export interface ClosureCallMethods {
|
|
8
|
+
emitClosure(this: Generator, node: ArrowFunction | FunctionExpression): string;
|
|
9
|
+
emitClosureValue(this: Generator, fn: FunctionInfo): string;
|
|
10
|
+
}
|
|
11
|
+
export declare const closureCallMethods: ClosureCallMethods;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closure lowering: arrow/function expressions and their captured environments.
|
|
3
|
+
*/
|
|
4
|
+
import { i64, XT_UNDEFINED } from "../../values.js";
|
|
5
|
+
export const closureCallMethods = {
|
|
6
|
+
emitClosure(node) {
|
|
7
|
+
const fn = this.binding.functionOfNode.get(node);
|
|
8
|
+
if (!fn) {
|
|
9
|
+
this.unsupported(node, "closure");
|
|
10
|
+
return i64(XT_UNDEFINED);
|
|
11
|
+
}
|
|
12
|
+
return this.emitClosureValue(fn);
|
|
13
|
+
},
|
|
14
|
+
emitClosureValue(fn) {
|
|
15
|
+
const count = fn.captures.length + (fn.capturesThis ? 1 : 0);
|
|
16
|
+
let envPtr = "null";
|
|
17
|
+
if (count > 0) {
|
|
18
|
+
envPtr = `%env${this.current.allocas.length}`;
|
|
19
|
+
this.current.allocas.push(`${envPtr} = alloca i64, i32 ${count}`);
|
|
20
|
+
for (let index = 0; index < fn.captures.length; index++) {
|
|
21
|
+
const symbol = fn.captures[index];
|
|
22
|
+
const slot = this.current.slots.get(symbol.id);
|
|
23
|
+
let raw = i64(XT_UNDEFINED);
|
|
24
|
+
if (slot) {
|
|
25
|
+
raw = this.reg();
|
|
26
|
+
this.emit(` ${raw} = load i64, i64* ${slot.ptr}`);
|
|
27
|
+
}
|
|
28
|
+
const target = this.reg();
|
|
29
|
+
this.emit(` ${target} = getelementptr i64, i64* ${envPtr}, i32 ${index}`);
|
|
30
|
+
this.emit(` store i64 ${raw}, i64* ${target}`);
|
|
31
|
+
}
|
|
32
|
+
if (fn.capturesThis) {
|
|
33
|
+
let thisValue = i64(XT_UNDEFINED);
|
|
34
|
+
if (this.current.thisPtr) {
|
|
35
|
+
thisValue = this.reg();
|
|
36
|
+
this.emit(` ${thisValue} = load i64, i64* ${this.current.thisPtr}`);
|
|
37
|
+
}
|
|
38
|
+
const target = this.reg();
|
|
39
|
+
this.emit(` ${target} = getelementptr i64, i64* ${envPtr}, i32 ${fn.captures.length}`);
|
|
40
|
+
this.emit(` store i64 ${thisValue}, i64* ${target}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const cast = this.reg();
|
|
44
|
+
this.emit(` ${cast} = bitcast i64 (i64, i64, i32, i64*)* @${this.functionName(fn)} to i8*`);
|
|
45
|
+
const closure = this.reg();
|
|
46
|
+
this.emit(` ${closure} = call i64 @xt_closure_new(i8* ${cast}, i32 ${count}, i64* ${envPtr})`);
|
|
47
|
+
return closure;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=closures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closures.js","sourceRoot":"","sources":["../../../../../src/codegen/generator/calls/closures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call invocation: direct calls, built-in/namespace dispatch, imported
|
|
3
|
+
* bindings, argument marshalling and generic runtime calls.
|
|
4
|
+
*/
|
|
5
|
+
import { type CallExpression, type Expression, type PropertyAccessExpression } from "../../../ast/nodes.js";
|
|
6
|
+
import type { ModuleExport } from "../../../extensions/registry.js";
|
|
7
|
+
import type { Generator } from "../generator.js";
|
|
8
|
+
export interface InvocationCallMethods {
|
|
9
|
+
emitCall(this: Generator, node: CallExpression): string;
|
|
10
|
+
tryEmitBuiltinCall(this: Generator, node: CallExpression, callee: PropertyAccessExpression): string | undefined;
|
|
11
|
+
emitModuleExport(this: Generator, node: CallExpression, exported: ModuleExport): string;
|
|
12
|
+
runtimeCall(this: Generator, name: string, args: readonly string[]): string;
|
|
13
|
+
emitArguments(this: Generator, args: readonly Expression[]): {
|
|
14
|
+
argc: string;
|
|
15
|
+
ptr: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare const invocationCallMethods: InvocationCallMethods;
|