xbintsc 0.3.3 → 0.3.5

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 (215) hide show
  1. package/dist/src/ast/expressions.d.ts +8 -0
  2. package/dist/src/binder/binder.js +1 -0
  3. package/dist/src/binder/binder.js.map +1 -1
  4. package/dist/src/binder/references.d.ts +1 -1
  5. package/dist/src/binder/references.js +34 -5
  6. package/dist/src/binder/references.js.map +1 -1
  7. package/dist/src/binder/types.d.ts +4 -0
  8. package/dist/src/binder/types.js.map +1 -1
  9. package/dist/src/cli/main.js.map +1 -1
  10. package/dist/src/codegen/generator/calls/access.d.ts +9 -1
  11. package/dist/src/codegen/generator/calls/access.js +146 -13
  12. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  13. package/dist/src/codegen/generator/calls/closures.d.ts +1 -0
  14. package/dist/src/codegen/generator/calls/closures.js +25 -0
  15. package/dist/src/codegen/generator/calls/closures.js.map +1 -1
  16. package/dist/src/codegen/generator/calls/invocation.js +12 -1
  17. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  18. package/dist/src/codegen/generator/calls/literals.js +12 -4
  19. package/dist/src/codegen/generator/calls/literals.js.map +1 -1
  20. package/dist/src/codegen/generator/calls/super.js +4 -7
  21. package/dist/src/codegen/generator/calls/super.js.map +1 -1
  22. package/dist/src/codegen/generator/context.d.ts +21 -2
  23. package/dist/src/codegen/generator/context.js +42 -5
  24. package/dist/src/codegen/generator/context.js.map +1 -1
  25. package/dist/src/codegen/generator/expressions/assignment.js +1 -3
  26. package/dist/src/codegen/generator/expressions/assignment.js.map +1 -1
  27. package/dist/src/codegen/generator/expressions/primary.d.ts +3 -1
  28. package/dist/src/codegen/generator/expressions/primary.js +99 -1
  29. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  30. package/dist/src/codegen/generator/generator.js.map +1 -1
  31. package/dist/src/codegen/generator/module.js +25 -15
  32. package/dist/src/codegen/generator/module.js.map +1 -1
  33. package/dist/src/codegen/generator/state.d.ts +15 -0
  34. package/dist/src/codegen/generator/state.js +28 -1
  35. package/dist/src/codegen/generator/state.js.map +1 -1
  36. package/dist/src/codegen/generator/statements/control-flow.d.ts +3 -1
  37. package/dist/src/codegen/generator/statements/control-flow.js +85 -0
  38. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
  39. package/dist/src/codegen/generator/statements/dispatch.js +15 -6
  40. package/dist/src/codegen/generator/statements/dispatch.js.map +1 -1
  41. package/dist/src/codegen/generator/statements/loops.d.ts +3 -0
  42. package/dist/src/codegen/generator/statements/loops.js +25 -11
  43. package/dist/src/codegen/generator/statements/loops.js.map +1 -1
  44. package/dist/src/codegen/generator/tables.d.ts +7 -0
  45. package/dist/src/codegen/generator/tables.js +41 -1
  46. package/dist/src/codegen/generator/tables.js.map +1 -1
  47. package/dist/src/driver/compiler.d.ts +1 -1
  48. package/dist/src/driver/compiler.js +33 -1
  49. package/dist/src/driver/compiler.js.map +1 -1
  50. package/dist/src/driver/modules.d.ts +4 -3
  51. package/dist/src/driver/modules.js +61 -4
  52. package/dist/src/driver/modules.js.map +1 -1
  53. package/dist/src/driver/toolchain.js +1 -1
  54. package/dist/src/driver/toolchain.js.map +1 -1
  55. package/dist/src/lexer/scanner.js.map +1 -1
  56. package/dist/src/parser/declarations/classes.js +4 -0
  57. package/dist/src/parser/declarations/classes.js.map +1 -1
  58. package/dist/src/parser/declarations/type-members.js.map +1 -1
  59. package/dist/src/parser/expressions.d.ts +2 -1
  60. package/dist/src/parser/expressions.js +10 -1
  61. package/dist/src/parser/expressions.js.map +1 -1
  62. package/dist/src/parser/helpers.js +2 -2
  63. package/dist/src/parser/helpers.js.map +1 -1
  64. package/dist/src/parser/literals.js +79 -6
  65. package/dist/src/parser/literals.js.map +1 -1
  66. package/dist/src/parser/modules.js.map +1 -1
  67. package/dist/src/parser/parser.js +0 -1
  68. package/dist/src/parser/parser.js.map +1 -1
  69. package/dist/src/parser/statements.d.ts +1 -0
  70. package/dist/src/parser/statements.js +13 -1
  71. package/dist/src/parser/statements.js.map +1 -1
  72. package/dist/src/parser/types.js +2 -2
  73. package/dist/src/parser/types.js.map +1 -1
  74. package/dist/tests/ast/factory.test.d.ts +1 -0
  75. package/dist/tests/ast/factory.test.js +35 -0
  76. package/dist/tests/ast/factory.test.js.map +1 -0
  77. package/dist/tests/ast/visitor.test.d.ts +1 -0
  78. package/dist/tests/ast/visitor.test.js +53 -0
  79. package/dist/tests/ast/visitor.test.js.map +1 -0
  80. package/dist/tests/cli/main.test.js +109 -9
  81. package/dist/tests/cli/main.test.js.map +1 -1
  82. package/dist/tests/codegen/closures.test.d.ts +1 -0
  83. package/dist/tests/codegen/closures.test.js +32 -0
  84. package/dist/tests/codegen/closures.test.js.map +1 -0
  85. package/dist/tests/codegen/expressions.test.d.ts +1 -0
  86. package/dist/tests/codegen/expressions.test.js +149 -0
  87. package/dist/tests/codegen/expressions.test.js.map +1 -0
  88. package/dist/tests/codegen/llvm.test.js +14 -0
  89. package/dist/tests/codegen/llvm.test.js.map +1 -1
  90. package/dist/tests/codegen/values.test.d.ts +1 -0
  91. package/dist/tests/codegen/values.test.js +48 -0
  92. package/dist/tests/codegen/values.test.js.map +1 -0
  93. package/dist/tests/diagnostics/diagnostic.test.d.ts +1 -0
  94. package/dist/tests/diagnostics/diagnostic.test.js +117 -0
  95. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -0
  96. package/dist/tests/diagnostics/source.test.d.ts +1 -0
  97. package/dist/tests/diagnostics/source.test.js +58 -0
  98. package/dist/tests/diagnostics/source.test.js.map +1 -0
  99. package/dist/tests/driver/modules.test.d.ts +1 -0
  100. package/dist/tests/driver/modules.test.js +140 -0
  101. package/dist/tests/driver/modules.test.js.map +1 -0
  102. package/dist/tests/driver/paths.test.js +17 -1
  103. package/dist/tests/driver/paths.test.js.map +1 -1
  104. package/dist/tests/driver/runtime-lib.test.d.ts +1 -0
  105. package/dist/tests/driver/runtime-lib.test.js +19 -0
  106. package/dist/tests/driver/runtime-lib.test.js.map +1 -0
  107. package/dist/tests/driver/toolchain-provider.test.js +91 -0
  108. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  109. package/dist/tests/driver/toolchain.test.js +11 -1
  110. package/dist/tests/driver/toolchain.test.js.map +1 -1
  111. package/dist/tests/e2e/compile-node.test.js +14 -1
  112. package/dist/tests/e2e/compile-node.test.js.map +1 -1
  113. package/dist/tests/e2e/compile.test.js +465 -2
  114. package/dist/tests/e2e/compile.test.js.map +1 -1
  115. package/dist/tests/e2e/differential.test.d.ts +7 -0
  116. package/dist/tests/e2e/differential.test.js +581 -0
  117. package/dist/tests/e2e/differential.test.js.map +1 -0
  118. package/dist/tests/e2e/harness.d.ts +21 -0
  119. package/dist/tests/e2e/harness.js +26 -0
  120. package/dist/tests/e2e/harness.js.map +1 -1
  121. package/dist/tests/extensions/node.test.d.ts +1 -0
  122. package/dist/tests/extensions/node.test.js +32 -0
  123. package/dist/tests/extensions/node.test.js.map +1 -0
  124. package/dist/tests/lexer/identifiers.test.d.ts +1 -0
  125. package/dist/tests/lexer/identifiers.test.js +13 -0
  126. package/dist/tests/lexer/identifiers.test.js.map +1 -0
  127. package/dist/tests/lexer/numbers.test.d.ts +1 -0
  128. package/dist/tests/lexer/numbers.test.js +23 -0
  129. package/dist/tests/lexer/numbers.test.js.map +1 -0
  130. package/dist/tests/lexer/strings.test.d.ts +1 -0
  131. package/dist/tests/lexer/strings.test.js +72 -0
  132. package/dist/tests/lexer/strings.test.js.map +1 -0
  133. package/dist/tests/parser/declarations.test.d.ts +1 -0
  134. package/dist/tests/parser/declarations.test.js +70 -0
  135. package/dist/tests/parser/declarations.test.js.map +1 -0
  136. package/dist/tests/parser/expressions.test.d.ts +1 -0
  137. package/dist/tests/parser/expressions.test.js +47 -0
  138. package/dist/tests/parser/expressions.test.js.map +1 -0
  139. package/dist/tests/parser/helpers.test.d.ts +1 -0
  140. package/dist/tests/parser/helpers.test.js +58 -0
  141. package/dist/tests/parser/helpers.test.js.map +1 -0
  142. package/dist/tests/parser/literals.test.d.ts +1 -0
  143. package/dist/tests/parser/literals.test.js +70 -0
  144. package/dist/tests/parser/literals.test.js.map +1 -0
  145. package/dist/tests/parser/module-syntax.test.d.ts +1 -0
  146. package/dist/tests/parser/module-syntax.test.js +91 -0
  147. package/dist/tests/parser/module-syntax.test.js.map +1 -0
  148. package/dist/tests/parser/statements.test.d.ts +1 -0
  149. package/dist/tests/parser/statements.test.js +85 -0
  150. package/dist/tests/parser/statements.test.js.map +1 -0
  151. package/dist/tests/parser/type-members.test.d.ts +1 -0
  152. package/dist/tests/parser/type-members.test.js +86 -0
  153. package/dist/tests/parser/type-members.test.js.map +1 -0
  154. package/dist/tests/parser/types.test.d.ts +1 -0
  155. package/dist/tests/parser/types.test.js +143 -0
  156. package/dist/tests/parser/types.test.js.map +1 -0
  157. package/package.json +6 -1
  158. package/runtime/ext_node/fs/fs_ops.c +36 -1
  159. package/runtime/rt.h +17 -0
  160. package/runtime/rt_internal.h +88 -2
  161. package/runtime/xt_builtins.c +174 -6
  162. package/runtime/xt_containers.c +234 -42
  163. package/runtime/xt_generator.c +304 -0
  164. package/runtime/xt_io.c +170 -30
  165. package/runtime/xt_promise.c +6 -1
  166. package/runtime/xt_regex.h +105 -35
  167. package/runtime/xt_stdlib/dispatch.inc +255 -4
  168. package/runtime/xt_stdlib/strings.inc +17 -13
  169. package/runtime/xt_stdlib2/arrays.inc +126 -19
  170. package/runtime/xt_stdlib2/date.inc +9 -2
  171. package/runtime/xt_stdlib2/error.inc +162 -12
  172. package/runtime/xt_stdlib2/helpers.inc +4 -0
  173. package/runtime/xt_stdlib2/json.inc +19 -6
  174. package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
  175. package/runtime/xt_stdlib2/numbers.inc +4 -5
  176. package/runtime/xt_stdlib2/objects.inc +29 -0
  177. package/runtime/xt_stdlib2/regexp-match.inc +293 -51
  178. package/runtime/xt_stdlib2/set.inc +58 -2
  179. package/runtime/xt_stdlib2/strings.inc +38 -0
  180. package/runtime/xt_symbol.c +149 -0
  181. package/runtime/xt_values.c +221 -15
  182. package/scripts/build-runtime.ts +1 -1
  183. package/src/ast/expressions.ts +8 -0
  184. package/src/binder/binder.ts +1 -1
  185. package/src/binder/references.ts +47 -4
  186. package/src/binder/types.ts +4 -0
  187. package/src/cli/main.ts +1 -2
  188. package/src/codegen/generator/calls/access.ts +158 -13
  189. package/src/codegen/generator/calls/closures.ts +24 -0
  190. package/src/codegen/generator/calls/invocation.ts +11 -1
  191. package/src/codegen/generator/calls/literals.ts +10 -4
  192. package/src/codegen/generator/calls/super.ts +6 -9
  193. package/src/codegen/generator/context.ts +44 -7
  194. package/src/codegen/generator/expressions/assignment.ts +1 -3
  195. package/src/codegen/generator/expressions/primary.ts +108 -2
  196. package/src/codegen/generator/generator.ts +0 -1
  197. package/src/codegen/generator/module.ts +24 -18
  198. package/src/codegen/generator/state.ts +44 -1
  199. package/src/codegen/generator/statements/control-flow.ts +86 -0
  200. package/src/codegen/generator/statements/dispatch.ts +18 -6
  201. package/src/codegen/generator/statements/loops.ts +29 -11
  202. package/src/codegen/generator/tables.ts +44 -1
  203. package/src/driver/compiler.ts +32 -2
  204. package/src/driver/modules.ts +64 -4
  205. package/src/driver/toolchain.ts +1 -1
  206. package/src/lexer/scanner.ts +0 -1
  207. package/src/parser/declarations/classes.ts +4 -0
  208. package/src/parser/declarations/type-members.ts +0 -2
  209. package/src/parser/expressions.ts +13 -1
  210. package/src/parser/helpers.ts +2 -2
  211. package/src/parser/literals.ts +82 -7
  212. package/src/parser/modules.ts +0 -1
  213. package/src/parser/parser.ts +0 -1
  214. package/src/parser/statements.ts +14 -0
  215. package/src/parser/types.ts +2 -2
@@ -0,0 +1,85 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { describe, expect, it } from "vitest";
3
+ import { parse } from "../helpers.js";
4
+ import { SyntaxKind } from "../../src/ast/nodes.js";
5
+ function statements(source) {
6
+ const { file, diagnostics } = parse(source);
7
+ return { stmts: file.statements, diagnostics };
8
+ }
9
+ describe("statement parsing", () => {
10
+ it("parses empty and debugger statements", () => {
11
+ const { stmts, diagnostics } = statements(";\ndebugger;");
12
+ expect(diagnostics).toHaveLength(0);
13
+ expect(stmts[0].kind).toBe(SyntaxKind.EmptyStatement);
14
+ expect(stmts[1].kind).toBe(SyntaxKind.DebuggerStatement);
15
+ });
16
+ it("parses const enums", () => {
17
+ const { stmts, diagnostics } = statements("const enum E { A, B }");
18
+ expect(diagnostics).toHaveLength(0);
19
+ expect(stmts[0].kind).toBe(SyntaxKind.EnumDeclaration);
20
+ });
21
+ it("parses labeled statements", () => {
22
+ const { stmts, diagnostics } = statements("outer: for (;;) { break outer; }");
23
+ expect(diagnostics).toHaveLength(0);
24
+ expect(stmts[0].kind).toBe(SyntaxKind.LabeledStatement);
25
+ });
26
+ it("parses interface, type alias, enum and namespace declarations", () => {
27
+ const cases = [
28
+ "interface I { x: number; }",
29
+ "type T = number | string;",
30
+ "enum E { A, B }",
31
+ "namespace N { export const x = 1; }",
32
+ 'module "m" { export const y = 2; }',
33
+ ];
34
+ for (const source of cases) {
35
+ const { diagnostics } = statements(source);
36
+ expect(diagnostics, source).toHaveLength(0);
37
+ }
38
+ });
39
+ it("parses declare modifiers on every declaration kind", () => {
40
+ const cases = [
41
+ "declare const x: number;",
42
+ "declare let y: number;",
43
+ "declare const enum E { A }",
44
+ "declare function f(): void;",
45
+ "declare class C {}",
46
+ "declare interface I {}",
47
+ "declare type T = number;",
48
+ "declare enum E { A }",
49
+ "declare namespace N {}",
50
+ 'declare module "m" {}',
51
+ ];
52
+ for (const source of cases) {
53
+ const { diagnostics } = statements(source);
54
+ expect(diagnostics, source).toHaveLength(0);
55
+ }
56
+ });
57
+ it("parses export default function and class declarations", () => {
58
+ expect(statements("export default function f() {}").diagnostics).toHaveLength(0);
59
+ expect(statements("export default class C {}").diagnostics).toHaveLength(0);
60
+ });
61
+ });
62
+ describe("class member parsing", () => {
63
+ it("skips stray semicolons", () => {
64
+ const { stmts, diagnostics } = statements("class C { ; x = 1; }");
65
+ expect(diagnostics).toHaveLength(0);
66
+ expect(stmts[0].members).toHaveLength(1);
67
+ });
68
+ it("parses member modifiers", () => {
69
+ const source = "class C { public x = 1; private y = 2; protected z = 3; readonly w = 4; static s = 5; abstract m(): void; }";
70
+ const { diagnostics } = statements(source);
71
+ expect(diagnostics).toHaveLength(0);
72
+ });
73
+ it("parses optional and definite-assignment properties", () => {
74
+ const { stmts, diagnostics } = statements("class C { a?: number; b!: number; }");
75
+ expect(diagnostics).toHaveLength(0);
76
+ expect(stmts[0].members[0].questionToken).toBe(true);
77
+ expect(stmts[0].members[1].exclamationToken).toBe(true);
78
+ });
79
+ it("parses bodyless accessor, method and constructor signatures", () => {
80
+ const source = "class C { get x(): number; set x(v: number); constructor(); m(): void; }";
81
+ const { diagnostics } = statements(source);
82
+ expect(diagnostics).toHaveLength(0);
83
+ });
84
+ });
85
+ //# sourceMappingURL=statements.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statements.test.js","sourceRoot":"","sources":["../../../tests/parser/statements.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parse } from "../helpers.js";
3
+ import { SyntaxKind } from "../../src/ast/nodes.js";
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ function first(source) {
6
+ const { file, diagnostics } = parse(source);
7
+ expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
8
+ return file.statements[0];
9
+ }
10
+ function members(source) {
11
+ return first(source).members;
12
+ }
13
+ describe("parser type members", () => {
14
+ it("parses call signatures", () => {
15
+ const [member] = members("interface I { (x: number): string; }");
16
+ expect(member.kind).toBe(SyntaxKind.MethodSignature);
17
+ expect(member.name.text).toBe("__call");
18
+ expect(member.parameters).toHaveLength(1);
19
+ expect(member.returnType.kind).toBe(SyntaxKind.StringKeywordType);
20
+ });
21
+ it("parses generic call signatures with type parameters", () => {
22
+ const [member] = members("interface I { <T>(x: T): T; }");
23
+ expect(member.kind).toBe(SyntaxKind.MethodSignature);
24
+ expect(member.typeParameters).toHaveLength(1);
25
+ expect(member.returnType.kind).toBe(SyntaxKind.TypeReference);
26
+ });
27
+ it("parses index signatures", () => {
28
+ const [member] = members("interface I { [key: string]: number; }");
29
+ expect(member.kind).toBe(SyntaxKind.IndexSignature);
30
+ expect(member.parameters[0].name.text).toBe("key");
31
+ expect(member.parameters[0].type.kind).toBe(SyntaxKind.StringKeywordType);
32
+ expect(member.type.kind).toBe(SyntaxKind.NumberKeywordType);
33
+ });
34
+ it("falls back to a property signature for an invalid index signature", () => {
35
+ const [member] = members("interface I { [key]: number; }");
36
+ expect(member.kind).toBe(SyntaxKind.PropertySignature);
37
+ });
38
+ it("parses method signatures", () => {
39
+ const [member] = members("interface I { greet(name: string): void; }");
40
+ expect(member.kind).toBe(SyntaxKind.MethodSignature);
41
+ expect(member.name.text).toBe("greet");
42
+ expect(member.questionToken).toBe(false);
43
+ expect(member.returnType.kind).toBe(SyntaxKind.VoidKeywordType);
44
+ });
45
+ it("parses generic method signatures", () => {
46
+ const [member] = members("interface I { map<T>(fn: (x: T) => T): T; }");
47
+ expect(member.kind).toBe(SyntaxKind.MethodSignature);
48
+ expect(member.typeParameters).toHaveLength(1);
49
+ });
50
+ it("parses optional, readonly and untyped property signatures", () => {
51
+ const [readonly, plain, untyped] = members("interface I { readonly a?: number; b: string; c; }");
52
+ expect(readonly.kind).toBe(SyntaxKind.PropertySignature);
53
+ expect(readonly.readonlyToken).toBe(true);
54
+ expect(readonly.questionToken).toBe(true);
55
+ expect(readonly.type.kind).toBe(SyntaxKind.NumberKeywordType);
56
+ expect(plain.readonlyToken).toBe(false);
57
+ expect(plain.questionToken).toBe(false);
58
+ expect(untyped.kind).toBe(SyntaxKind.PropertySignature);
59
+ expect(untyped.type).toBeUndefined();
60
+ });
61
+ it("parses multiple members separated by commas", () => {
62
+ const parsed = members("interface I { a: number, b: string, }");
63
+ expect(parsed).toHaveLength(2);
64
+ });
65
+ it("parses module declarations with a block body", () => {
66
+ const declaration = first("module Foo { const x = 1; }");
67
+ expect(declaration.kind).toBe(SyntaxKind.ModuleDeclaration);
68
+ expect(declaration.name.kind).toBe(SyntaxKind.Identifier);
69
+ expect(declaration.name.text).toBe("Foo");
70
+ expect(declaration.body.kind).toBe(SyntaxKind.Block);
71
+ });
72
+ it("parses dotted namespace declarations without a body", () => {
73
+ const declaration = first("namespace A.B.C;");
74
+ expect(declaration.kind).toBe(SyntaxKind.ModuleDeclaration);
75
+ expect(declaration.name.text).toBe("A");
76
+ expect(declaration.body).toBeUndefined();
77
+ });
78
+ it("parses string-named ambient modules", () => {
79
+ const declaration = first('declare module "foo" { }');
80
+ expect(declaration.kind).toBe(SyntaxKind.ModuleDeclaration);
81
+ expect(declaration.name.kind).toBe(SyntaxKind.StringLiteral);
82
+ expect(declaration.name.value).toBe("foo");
83
+ expect(declaration.body.kind).toBe(SyntaxKind.Block);
84
+ });
85
+ });
86
+ //# sourceMappingURL=type-members.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-members.test.js","sourceRoot":"","sources":["../../../tests/parser/type-members.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,143 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parse } from "../helpers.js";
3
+ import { SyntaxKind } from "../../src/ast/nodes.js";
4
+ import { TypeOperator } from "../../src/ast/operators.js";
5
+ /* eslint-disable @typescript-eslint/no-explicit-any */
6
+ function aliasType(source) {
7
+ const { file, diagnostics } = parse(source);
8
+ expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
9
+ return file.statements[0].type;
10
+ }
11
+ describe("parser type syntax", () => {
12
+ it("parses intersection types", () => {
13
+ const type = aliasType("type T = A & B & C;");
14
+ expect(type.kind).toBe(SyntaxKind.IntersectionType);
15
+ expect(type.types).toHaveLength(3);
16
+ expect(type.types.map((t) => t.kind)).toEqual([
17
+ SyntaxKind.TypeReference,
18
+ SyntaxKind.TypeReference,
19
+ SyntaxKind.TypeReference,
20
+ ]);
21
+ });
22
+ it("tolerates leading union and intersection bars", () => {
23
+ const union = aliasType("type T = | A | B;");
24
+ expect(union.kind).toBe(SyntaxKind.UnionType);
25
+ expect(union.types).toHaveLength(2);
26
+ const intersection = aliasType("type T = & A & B;");
27
+ expect(intersection.kind).toBe(SyntaxKind.IntersectionType);
28
+ expect(intersection.types).toHaveLength(2);
29
+ });
30
+ it("parses keyof, unique and readonly type operators", () => {
31
+ const keyof = aliasType("type T = keyof Foo;");
32
+ expect(keyof.kind).toBe(SyntaxKind.TypeOperator);
33
+ expect(keyof.operator).toBe(TypeOperator.KeyOf);
34
+ const unique = aliasType("type T = unique symbol;");
35
+ expect(unique.kind).toBe(SyntaxKind.TypeOperator);
36
+ expect(unique.operator).toBe(TypeOperator.Unique);
37
+ const readonly = aliasType("type T = readonly number[];");
38
+ expect(readonly.kind).toBe(SyntaxKind.TypeOperator);
39
+ expect(readonly.operator).toBe(TypeOperator.Readonly);
40
+ });
41
+ it("parses infer types with and without a constraint", () => {
42
+ const plain = aliasType("type T = infer R;");
43
+ expect(plain.kind).toBe(SyntaxKind.InferType);
44
+ expect(plain.typeParameter.name.text).toBe("R");
45
+ expect(plain.typeParameter.constraint).toBeUndefined();
46
+ const constrained = aliasType("type T = infer R extends string;");
47
+ expect(constrained.kind).toBe(SyntaxKind.InferType);
48
+ expect(constrained.typeParameter.constraint.kind).toBe(SyntaxKind.StringKeywordType);
49
+ });
50
+ it("parses every keyword type", () => {
51
+ const cases = [
52
+ ["bigint", SyntaxKind.BigIntKeywordType],
53
+ ["boolean", SyntaxKind.BooleanKeywordType],
54
+ ["symbol", SyntaxKind.SymbolKeywordType],
55
+ ["undefined", SyntaxKind.UndefinedKeywordType],
56
+ ["null", SyntaxKind.NullKeywordType],
57
+ ["never", SyntaxKind.NeverKeywordType],
58
+ ["object", SyntaxKind.ObjectKeywordType],
59
+ ["this", SyntaxKind.ThisKeywordType],
60
+ ];
61
+ for (const [text, kind] of cases) {
62
+ expect(aliasType(`type T = ${text};`).kind).toBe(kind);
63
+ }
64
+ });
65
+ it("parses typeof queries with and without type arguments", () => {
66
+ const plain = aliasType("type T = typeof foo.bar;");
67
+ expect(plain.kind).toBe(SyntaxKind.TypeQuery);
68
+ expect(plain.exprName.kind).toBe(SyntaxKind.QualifiedName);
69
+ expect(plain.typeArguments).toEqual([]);
70
+ const generic = aliasType("type T = typeof foo<number>;");
71
+ expect(generic.kind).toBe(SyntaxKind.TypeQuery);
72
+ expect(generic.typeArguments).toHaveLength(1);
73
+ });
74
+ it("parses parenthesized and function types", () => {
75
+ expect(aliasType("type T = (number);").kind).toBe(SyntaxKind.ParenthesizedType);
76
+ expect(aliasType("type T = (x: number) => string;").kind).toBe(SyntaxKind.FunctionType);
77
+ expect(aliasType("type T = <U>(x: U) => U;").kind).toBe(SyntaxKind.FunctionType);
78
+ expect(aliasType("type T = new (x: number) => Foo;").kind).toBe(SyntaxKind.FunctionType);
79
+ });
80
+ it("parses literal types including booleans and negatives", () => {
81
+ const trueType = aliasType("type T = true;");
82
+ expect(trueType.kind).toBe(SyntaxKind.LiteralType);
83
+ expect(trueType.literal.kind).toBe(SyntaxKind.TrueKeyword);
84
+ const falseType = aliasType("type T = false;");
85
+ expect(falseType.literal.kind).toBe(SyntaxKind.FalseKeyword);
86
+ const negative = aliasType("type T = -1;");
87
+ expect(negative.kind).toBe(SyntaxKind.LiteralType);
88
+ expect(negative.literal.text).toBe("-1");
89
+ expect(negative.literal.value).toBe(-1);
90
+ expect(aliasType('type T = "x";').literal.value).toBe("x");
91
+ expect(aliasType("type T = 3;").literal.value).toBe(3);
92
+ });
93
+ it("parses import types, degrading them to a loose node", () => {
94
+ const type = aliasType('type T = import("./m").Foo;');
95
+ expect(type.kind).toBe(SyntaxKind.AnyKeywordType);
96
+ });
97
+ it("parses indexed access types", () => {
98
+ const type = aliasType('type T = Foo["bar"];');
99
+ expect(type.kind).toBe(SyntaxKind.IndexedAccessType);
100
+ expect(type.objectType.kind).toBe(SyntaxKind.TypeReference);
101
+ expect(type.indexType.kind).toBe(SyntaxKind.LiteralType);
102
+ });
103
+ it("parses tuple types with rest and optional members", () => {
104
+ const type = aliasType("type T = [number, string?, ...boolean[]];");
105
+ expect(type.kind).toBe(SyntaxKind.TupleType);
106
+ expect(type.elements.map((e) => e.kind)).toEqual([
107
+ SyntaxKind.NumberKeywordType,
108
+ SyntaxKind.OptionalType,
109
+ SyntaxKind.RestType,
110
+ ]);
111
+ });
112
+ it("parses mapped types with question modifiers", () => {
113
+ const optional = aliasType("type T = { [K in keyof U]?: U[K] };");
114
+ expect(optional.kind).toBe(SyntaxKind.MappedType);
115
+ expect(optional.questionToken).toBe(true);
116
+ const added = aliasType("type T = { [K in keyof U]+?: U[K] };");
117
+ expect(added.kind).toBe(SyntaxKind.MappedType);
118
+ expect(added.questionToken).toBe("+");
119
+ const removed = aliasType("type T = { [K in keyof U]-?: U[K] };");
120
+ expect(removed.kind).toBe(SyntaxKind.MappedType);
121
+ expect(removed.questionToken).toBe("-");
122
+ });
123
+ it("parses conditional types", () => {
124
+ const type = aliasType("type T = A extends B ? C : D;");
125
+ expect(type.kind).toBe(SyntaxKind.ConditionalType);
126
+ expect(type.checkType.kind).toBe(SyntaxKind.TypeReference);
127
+ expect(type.trueType.kind).toBe(SyntaxKind.TypeReference);
128
+ expect(type.falseType.kind).toBe(SyntaxKind.TypeReference);
129
+ });
130
+ it("parses generic type references and qualified names", () => {
131
+ const generic = aliasType("type T = Map<string, number>;");
132
+ expect(generic.kind).toBe(SyntaxKind.TypeReference);
133
+ expect(generic.typeArguments).toHaveLength(2);
134
+ const qualified = aliasType("type T = A.B.C;");
135
+ expect(qualified.kind).toBe(SyntaxKind.TypeReference);
136
+ expect(qualified.typeName.kind).toBe(SyntaxKind.QualifiedName);
137
+ });
138
+ it("reports invalid type syntax", () => {
139
+ const { diagnostics } = parse("type T = @;");
140
+ expect(diagnostics.some((d) => d.category === "error")).toBe(true);
141
+ });
142
+ });
143
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../tests/parser/types.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xbintsc",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "xbintsc - a TypeScript binary compiler (TypeScript -> LLVM IR -> native binary)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -38,15 +38,20 @@
38
38
  "runtime:clean": "node -e \"require('fs').rmSync('build/runtime-obj',{recursive:true,force:true});require('fs').rmSync('runtime/lib',{recursive:true,force:true})\"",
39
39
  "xbintsc": "tsx src/cli/main.ts",
40
40
  "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "lint": "eslint .",
41
42
  "test": "vitest run",
42
43
  "test:watch": "vitest",
43
44
  "test:e2e": "vitest run tests/e2e",
44
45
  "coverage": "vitest run --coverage"
45
46
  },
46
47
  "devDependencies": {
48
+ "@eslint/js": "^9.39.5",
47
49
  "@types/node": "^22.20.4",
50
+ "@vitest/coverage-v8": "^2.1.9",
51
+ "eslint": "^9.39.5",
48
52
  "tsx": "^4.19.2",
49
53
  "typescript": "^5.7.2",
54
+ "typescript-eslint": "^8.70.1",
50
55
  "vitest": "^2.1.8"
51
56
  },
52
57
  "engines": {
@@ -131,11 +131,46 @@ xt_value xt_node_exists(int32_t argc, xt_value *argv) {
131
131
  /* readdirSync */
132
132
  /* ------------------------------------------------------------------------- */
133
133
 
134
+ /* Defined alongside `statSync` further down; the `Dirent` objects built for
135
+ `readdirSync(path, { withFileTypes: true })` reuse the same closures. */
136
+ static void xt_fs_define_stat_method(xt_value object, const char *name, unsigned int mode);
137
+
138
+ /* Build the Node `Dirent`-shaped object (`name` plus stat predicates) for a
139
+ single directory entry. Types come from `lstat`, matching Node's `d_type`
140
+ based `Dirent` (a symlink reports `isSymbolicLink()` true). */
141
+ static xt_value xt_node_dirent_result(const char *dir, const char *name) {
142
+ size_t size = strlen(dir) + strlen(name) + 2;
143
+ char *full = (char *)malloc(size);
144
+ unsigned int mode = 0;
145
+ if (full) {
146
+ snprintf(full, size, "%s/%s", dir, name);
147
+ xt_fs_stat_t info;
148
+ if (xt_fs_lstat_fn(full, &info) == 0) mode = (unsigned int)info.st_mode;
149
+ free(full);
150
+ }
151
+
152
+ xt_value object = xt_object_new();
153
+ xt_object_set(object, xt_string_from_cstr("name"), xt_string_from_cstr(name));
154
+ xt_fs_define_stat_method(object, "isFile", mode);
155
+ xt_fs_define_stat_method(object, "isDirectory", mode);
156
+ xt_fs_define_stat_method(object, "isSymbolicLink", mode);
157
+ xt_fs_define_stat_method(object, "isFIFO", mode);
158
+ xt_fs_define_stat_method(object, "isSocket", mode);
159
+ xt_fs_define_stat_method(object, "isBlockDevice", mode);
160
+ xt_fs_define_stat_method(object, "isCharacterDevice", mode);
161
+ return object;
162
+ }
163
+
134
164
  xt_value xt_node_read_dir(int32_t argc, xt_value *argv) {
135
165
  if (argc < 1) return xt_undefined();
136
166
  const char *path = xt_string_data(xt_to_string(argv[0]));
137
167
  if (!path) return xt_undefined();
138
168
 
169
+ /* `readdirSync(path, { withFileTypes: true })` yields `Dirent` objects;
170
+ without the option the result is a plain array of entry names. */
171
+ int withFileTypes =
172
+ argc > 1 && XT_IS_OBJECT(argv[1]) && xt_truthy(xt_object_get_cstr(argv[1], "withFileTypes"));
173
+
139
174
  xt_fs_dir dir;
140
175
  if (!xt_fs_dir_open(&dir, path)) {
141
176
  xt_fs_error("open directory", path);
@@ -159,7 +194,7 @@ xt_value xt_node_read_dir(int32_t argc, xt_value *argv) {
159
194
  if (!grown) break;
160
195
  items = grown;
161
196
  }
162
- items[count++] = xt_string_from_cstr(name);
197
+ items[count++] = withFileTypes ? xt_node_dirent_result(path, name) : xt_string_from_cstr(name);
163
198
  }
164
199
  xt_fs_dir_close(&dir);
165
200
 
package/runtime/rt.h CHANGED
@@ -107,6 +107,7 @@ xt_value xt_closure_call(xt_value fn, int32_t argc, xt_value *argv);
107
107
  xt_value xt_call_with_this(xt_value fn, xt_value thisValue, int32_t argc, xt_value *argv);
108
108
  xt_value xt_closure_env(xt_value fn, int32_t index);
109
109
  int32_t xt_closure_arity(xt_value fn);
110
+ xt_value xt_function_set_metadata(xt_value fn, xt_value name, int32_t arity);
110
111
  xt_value xt_this(void);
111
112
  xt_value xt_new(xt_value ctor, int32_t argc, xt_value *argv);
112
113
  xt_value xt_instance_of(xt_value value, xt_value ctor);
@@ -169,6 +170,14 @@ xt_value xt_object_entries(xt_value obj);
169
170
  xt_value xt_object_assign(int32_t argc, xt_value *argv);
170
171
  xt_value xt_object_spread(xt_value target, xt_value source);
171
172
 
173
+ /* -- symbols -------------------------------------------------------------- */
174
+ /** Implements `Symbol(description)`. */
175
+ xt_value xt_symbol(int32_t argc, xt_value *argv);
176
+ /** Implements `Symbol.<name>(...)` statics (`for`, `keyFor`). */
177
+ xt_value xt_symbol_static(xt_value name, int32_t argc, xt_value *argv);
178
+ /** Reads a well-known symbol (`Symbol.iterator`, ...). */
179
+ xt_value xt_symbol_get(xt_value name);
180
+
172
181
  /* -- standard library dispatch -------------------------------------------- */
173
182
  /** Call `target[name](...)`, falling back to built-in Array/String methods. */
174
183
  xt_value xt_call_method(xt_value target, xt_value name, int32_t argc, xt_value *argv);
@@ -229,6 +238,10 @@ xt_value xt_parse_int(int32_t argc, xt_value *argv);
229
238
  xt_value xt_parse_float(int32_t argc, xt_value *argv);
230
239
  xt_value xt_is_nan(int32_t argc, xt_value *argv);
231
240
  xt_value xt_is_finite(int32_t argc, xt_value *argv);
241
+ xt_value xt_encode_uri_component(int32_t argc, xt_value *argv);
242
+ xt_value xt_encode_uri(int32_t argc, xt_value *argv);
243
+ xt_value xt_decode_uri_component(int32_t argc, xt_value *argv);
244
+ xt_value xt_decode_uri(int32_t argc, xt_value *argv);
232
245
  xt_value xt_number_ctor(int32_t argc, xt_value *argv);
233
246
  xt_value xt_string_ctor(int32_t argc, xt_value *argv);
234
247
  xt_value xt_boolean_ctor(int32_t argc, xt_value *argv);
@@ -263,6 +276,10 @@ xt_value xt_iter_value(xt_value value, xt_value index);
263
276
  /* -- generic member access ------------------------------------------------ */
264
277
  xt_value xt_get(xt_value target, xt_value key);
265
278
  xt_value xt_set(xt_value target, xt_value key, xt_value value);
279
+ /* Materialise a first-class runtime method value (`arr.map`) as an unbound
280
+ * closure that expects the receiver through `this`. Returns `XT_UNDEFINED` when
281
+ * `name` is not a method of `target`, so it can be used as a property fallback. */
282
+ xt_value xt_method_value(xt_value target, xt_value name);
266
283
 
267
284
  /* -- boxes (used for captured variables) ---------------------------------- */
268
285
  xt_value xt_box_new(xt_value value);
@@ -32,6 +32,7 @@
32
32
 
33
33
  #include "rt.h"
34
34
 
35
+ #include <setjmp.h>
35
36
  #include <stddef.h>
36
37
  #include <stdint.h>
37
38
 
@@ -47,6 +48,9 @@
47
48
  #define XT_OBJECT_KIND_REGEXP 9
48
49
  #define XT_OBJECT_KIND_SYMBOL 10
49
50
  #define XT_OBJECT_KIND_BIGINT 11
51
+ #define XT_OBJECT_KIND_ERROR 12
52
+ #define XT_OBJECT_KIND_GENERATOR 13
53
+ #define XT_OBJECT_KIND_ITERATOR 14
50
54
 
51
55
  /* Common header for every heap object. */
52
56
  typedef struct xt_header {
@@ -74,7 +78,8 @@ typedef struct {
74
78
  } xt_bigint;
75
79
 
76
80
  typedef struct {
77
- xt_string *key;
81
+ /* String or Symbol value (see `xt_to_property_key`). */
82
+ xt_value key;
78
83
  xt_value value;
79
84
  /* Accessor properties (`get x()` / `set x(v)`) store the functions here;
80
85
  * when set, `value` is ignored and property access invokes the getter. */
@@ -98,6 +103,9 @@ typedef struct {
98
103
  uint32_t length;
99
104
  uint32_t capacity;
100
105
  xt_value *items;
106
+ /* Named (non-index) properties such as `raw` on template strings or
107
+ * `index`/`input` on RegExp match results, stored in an `xt_object`. */
108
+ xt_value extra;
101
109
  } xt_array;
102
110
 
103
111
  typedef struct {
@@ -109,6 +117,9 @@ typedef struct {
109
117
  xt_string *name;
110
118
  xt_object *properties;
111
119
  xt_value prototype;
120
+ /* Set on generator function objects: calling the closure does not run the
121
+ * body, it creates a suspended generator (see xt_generator.c). */
122
+ uint8_t is_generator;
112
123
  } xt_function;
113
124
 
114
125
  /* Allocation (xt_alloc.c). */
@@ -121,6 +132,12 @@ int32_t xt_string_length(xt_string *s);
121
132
  int xt_string_equals(xt_string *a, xt_string *b);
122
133
  int32_t xt_to_int32(xt_value v);
123
134
 
135
+ /* ECMAScript number formatting (xt_values.c). */
136
+ void xt_number_to_js_string(double d, char *buffer, size_t size);
137
+ void xt_number_to_exponential(double d, int precision, char *buffer, size_t size);
138
+ void xt_number_to_precision(double d, int precision, char *buffer, size_t size);
139
+ void xt_number_to_fixed(double d, int precision, char *buffer, size_t size);
140
+
124
141
  /* BigInt runtime (xt_bigint.c). */
125
142
  int xt_is_bigint(xt_value value);
126
143
  double xt_bigint_to_double_value(xt_value value);
@@ -150,7 +167,19 @@ void xt_array_reserve(xt_array *array, uint32_t needed);
150
167
 
151
168
  /* Object helpers used by the standard library. */
152
169
  xt_object *xt_as_object(xt_value value);
153
- xt_property *xt_object_find_property(xt_object *obj, xt_string *key);
170
+ xt_property *xt_object_find_property(xt_object *obj, xt_value key);
171
+
172
+ /* Property keys are either strings or symbols. */
173
+ xt_value xt_to_property_key(xt_value key);
174
+ int xt_property_key_equals(xt_value a, xt_value b);
175
+
176
+ /* Symbols (xt_symbol.c). */
177
+ int xt_is_symbol(xt_value value);
178
+ xt_value xt_symbol_new(xt_value description);
179
+ xt_value xt_symbol_description(xt_value value);
180
+ xt_value xt_symbol_to_string(xt_value value);
181
+ xt_value xt_symbol_well_known(const char *name);
182
+ xt_value xt_object_own_property_symbols(xt_value value);
154
183
 
155
184
  /* Map / Set / Promise / Date / RegExp live in xt_stdlib.c and xt_promise.c. */
156
185
  int xt_is_promise(xt_value value);
@@ -160,13 +189,66 @@ int xt_is_date(xt_value value);
160
189
  int xt_is_regexp(xt_value value);
161
190
  int xt_regexp_find(xt_value regexp, xt_value input, int32_t start, int32_t *matchStart, int32_t *matchEnd);
162
191
  xt_value xt_regexp_exec(xt_value regexp, xt_value input);
192
+ xt_value xt_regexp_match(xt_value input, xt_value regexp);
163
193
  xt_value xt_regexp_replace(xt_value value, xt_value regexp, xt_value replacement);
194
+ xt_value xt_regexp_split(xt_value value, xt_value regexp, xt_value limit);
164
195
  xt_value xt_regexp_get_property(xt_value regexp, xt_value key);
165
196
  int32_t xt_map_size(xt_value value);
166
197
  int32_t xt_set_size(xt_value value);
167
198
  /* `for...of` iteration: dispatch over arrays, strings, Maps and Sets. */
168
199
  xt_value xt_iter_length(xt_value value);
169
200
  xt_value xt_iter_value(xt_value value, xt_value index);
201
+ /* Per-step iteration check. Generators pull the next value here; the index is
202
+ * ignored because the value is cached until `xt_iter_value` reads it. */
203
+ xt_value xt_iter_has(xt_value value, xt_value index);
204
+ /* Resolve the iteration protocol once: returns `value` for the built-in index
205
+ * protocols, or a wrapper around `value[Symbol.iterator]()` otherwise. */
206
+ xt_value xt_iter_open(xt_value value);
207
+
208
+ /* Stackful generators (xt_generator.c). */
209
+ int xt_is_generator(xt_value value);
210
+ xt_value xt_generator_new(xt_value function, xt_value thisValue, int32_t argc, xt_value *argv);
211
+ xt_value xt_generator_next(xt_value generator, xt_value sent);
212
+ xt_value xt_generator_return(xt_value generator, xt_value value);
213
+ xt_value xt_generator_throw(xt_value generator, xt_value error);
214
+ xt_value xt_yield(xt_value value);
215
+ xt_value xt_yield_star(xt_value delegate);
216
+ int xt_generator_has_next(xt_value generator);
217
+ xt_value xt_generator_iter_value(xt_value generator);
218
+
219
+ /* Exception-frame plumbing shared with the generator runtime. The struct is
220
+ * public so a coroutine can `_setjmp` its own boundary directly (a `setjmp`
221
+ * must run in the frame it returns to, never in a helper). */
222
+ typedef struct xt_try_frame {
223
+ jmp_buf buf;
224
+ struct xt_try_frame *prev;
225
+ xt_value exception;
226
+ } xt_try_frame;
227
+ /* Call `_setjmp` the way the active `<setjmp.h>` declares it. The two Windows
228
+ * C runtimes differ:
229
+ *
230
+ * - MSVC/UCRT declares `_setjmp(jmp_buf)` with one visible argument and lets
231
+ * clang treat it as a built-in that injects the caller's frame address
232
+ * (`@llvm.frameaddress(0)`) as a hidden second argument. Writing the frame
233
+ * by hand is a compile error ("too many arguments to function call").
234
+ * - MinGW-w64 (the vendored llvm-mingw toolchain) declares
235
+ * `_setjmp(jmp_buf, void *frame)` itself, so the frame must be passed
236
+ * explicitly -- exactly what its own `setjmp` macro does.
237
+ *
238
+ * The generated IR always emits the two-argument form, because it is already
239
+ * IR and clang will not rewrite it. `_setjmp` (rather than the `setjmp` macro)
240
+ * is used so it pairs with the plain `longjmp` in `xt_throw`. */
241
+ #if defined(_WIN32) && !defined(__MINGW32__)
242
+ #define xt_try_setjmp(framePtr) _setjmp(((xt_try_frame *)(framePtr))->buf)
243
+ #elif defined(_WIN32) && defined(__aarch64__)
244
+ #define xt_try_setjmp(framePtr) _setjmpex(((xt_try_frame *)(framePtr))->buf, __builtin_sponentry())
245
+ #elif defined(_WIN32)
246
+ #define xt_try_setjmp(framePtr) _setjmp(((xt_try_frame *)(framePtr))->buf, __builtin_frame_address(0))
247
+ #else
248
+ #define xt_try_setjmp(framePtr) _setjmp(((xt_try_frame *)(framePtr))->buf)
249
+ #endif
250
+ void *xt_try_mark(void);
251
+ void xt_try_restore(void *mark);
170
252
 
171
253
  /* -- collection / date / regexp representations --------------------------- */
172
254
  typedef struct {
@@ -201,6 +283,10 @@ xt_value xt_ext_array_method(xt_value target, const char *method, int32_t argc,
201
283
  xt_value xt_ext_string_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
202
284
  xt_value xt_ext_number_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
203
285
  xt_value xt_ext_object_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
286
+
287
+ /* Error family helpers (xt_stdlib2.c). */
288
+ xt_value xt_error_to_string(xt_value error);
289
+ xt_value xt_aggregate_error_ctor(int32_t argc, xt_value *argv);
204
290
  xt_value xt_ext_container_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
205
291
  xt_value xt_promise_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
206
292