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
@@ -81,7 +81,25 @@ describeE2E("end-to-end compilation", (harness) => {
81
81
  const user = { name: "ada", tags: ["math", "code"], age: 36 };
82
82
  console.log(user);
83
83
  `;
84
- expect(runProgram(source)).toBe("{ name: ada, tags: [ math, code ], age: 36 }");
84
+ expect(runProgram(source)).toBe("{ name: 'ada', tags: [ 'math', 'code' ], age: 36 }");
85
+ });
86
+ it("orders object keys like JavaScript", () => {
87
+ const source = `
88
+ console.log(JSON.stringify({ b: 1, a: 2, 10: 3, 2: 4 }));
89
+ const o: any = {};
90
+ o.z = 1; o[5] = 2; o.a = 3; o[1] = 4; o["01"] = 5; o[100] = 6;
91
+ console.log(Object.keys(o).join(" "));
92
+ let seen = "";
93
+ for (const k in o) seen += k + ",";
94
+ console.log(seen);
95
+ console.log(JSON.stringify(Object.fromEntries([["b", 1], ["2", 2], ["a", 3]])));
96
+ `;
97
+ expect(runProgram(source)).toBe([
98
+ '{"2":4,"10":3,"b":1,"a":2}',
99
+ "1 5 100 z a 01",
100
+ "1,5,100,z,a,01,",
101
+ '{"2":2,"b":1,"a":3}',
102
+ ].join("\n"));
85
103
  });
86
104
  it("supports switch statements with fall-through", () => {
87
105
  const source = `
@@ -201,16 +219,250 @@ describeE2E("end-to-end compilation", (harness) => {
201
219
  `;
202
220
  expect(runProgram(source)).toBe("10 -1 try;catch:boom;finally");
203
221
  });
222
+ it("runs finally blocks on early return, break and continue", () => {
223
+ const source = `
224
+ const events: string[] = [];
225
+ function f(n: number): string {
226
+ try {
227
+ events.push("try" + n);
228
+ if (n === 1) return "ret1";
229
+ if (n === 2) throw "boom" + n;
230
+ } catch (e) {
231
+ events.push("catch" + e);
232
+ if (n === 3) return "ret3";
233
+ } finally {
234
+ events.push("finally" + n);
235
+ }
236
+ return "done" + n;
237
+ }
238
+ console.log(f(0), f(1), f(2), f(3));
239
+ console.log(events.join("|"));
240
+ const loop: string[] = [];
241
+ for (let i = 0; i < 5; i++) {
242
+ try {
243
+ if (i === 2) break;
244
+ if (i === 4) continue;
245
+ loop.push("i" + i);
246
+ } finally {
247
+ loop.push("F" + i);
248
+ }
249
+ }
250
+ console.log(loop.join("|"));
251
+ function nested(): string {
252
+ try {
253
+ try {
254
+ return "inner";
255
+ } finally {
256
+ events.push("innerFinally");
257
+ }
258
+ } finally {
259
+ events.push("outerFinally");
260
+ }
261
+ }
262
+ console.log(nested(), events[events.length - 2], events[events.length - 1]);
263
+ `;
264
+ expect(runProgram(source)).toBe([
265
+ "done0 ret1 done2 done3",
266
+ "try0|finally0|try1|finally1|try2|catchboom2|finally2|try3|finally3",
267
+ "i0|F0|i1|F1|F2",
268
+ "inner innerFinally outerFinally",
269
+ ].join("\n"));
270
+ });
271
+ it("implements abstract equality with ToPrimitive", () => {
272
+ const source = `
273
+ console.log(([] as any) == 0, ([] as any) == "", ([1] as any) == 1, ([1, 2] as any) == "1,2");
274
+ console.log(({} as any) == "[object Object]");
275
+ console.log(([1] as any) == [1], ([] as any) == false, ([] as any) == null);
276
+ console.log(0 == "0", 0 == false, "" == false, null == undefined, null == 0, undefined == 0);
277
+ console.log(NaN == NaN, (1 as any) == "1");
278
+ `;
279
+ expect(runProgram(source)).toBe([
280
+ "true true true true",
281
+ "true",
282
+ "false true false",
283
+ "true true true true false false",
284
+ "false true",
285
+ ].join("\n"));
286
+ });
287
+ it("supports labeled break and continue across nested loops", () => {
288
+ const source = `
289
+ const out: string[] = [];
290
+ outer: for (let i = 0; i < 3; i++) {
291
+ inner: for (let j = 0; j < 3; j++) {
292
+ if (j === 1) continue outer;
293
+ if (i === 2) break outer;
294
+ out.push(i + "," + j);
295
+ }
296
+ }
297
+ block: {
298
+ out.push("before");
299
+ if (out.length > 0) break block;
300
+ out.push("unreachable");
301
+ }
302
+ out.push("after");
303
+ function f(): number {
304
+ let total = 0;
305
+ loop: for (let i = 0; i < 5; i++) {
306
+ try {
307
+ if (i === 2) continue loop;
308
+ if (i === 4) break loop;
309
+ total += i;
310
+ } finally {
311
+ total += 100;
312
+ }
313
+ }
314
+ return total;
315
+ }
316
+ console.log(out.join("|"), f());
317
+ `;
318
+ expect(runProgram(source)).toBe("0,0|1,0|before|after 504");
319
+ });
320
+ it("supports #private fields, methods and static members", () => {
321
+ const source = `
322
+ class Counter {
323
+ #count = 0;
324
+ static #instances = 0;
325
+ constructor() { Counter.#bumpStatic(); }
326
+ #bump(by: number): void { this.#count += by; }
327
+ static #bumpStatic(): void { Counter.#instances++; }
328
+ inc(by: number): number { this.#bump(by); return this.#count; }
329
+ get count(): number { return this.#count; }
330
+ set count(v: number) { this.#count = v; }
331
+ static instances(): number { return Counter.#instances; }
332
+ }
333
+ class Sub extends Counter {
334
+ #label = "sub";
335
+ constructor() { super(); this.inc(5); }
336
+ describe(): string { return this.#label + ":" + this.count; }
337
+ }
338
+ const a = new Counter();
339
+ const b = new Counter();
340
+ a.inc(3);
341
+ a.count = 10;
342
+ console.log(a.count, b.count, Counter.instances());
343
+ console.log(new Sub().describe());
344
+ `;
345
+ expect(runProgram(source)).toBe("10 0 2\nsub:5");
346
+ });
347
+ it("encodes and decodes URIs like the specification", () => {
348
+ const source = `
349
+ console.log(encodeURI("a/b?c=d&e#f"), encodeURIComponent("a/b?c=d&e#f"));
350
+ console.log(encodeURI("café"), encodeURIComponent("😀 中文"));
351
+ console.log(decodeURI("%2f%2F"), decodeURIComponent("a%23b"));
352
+ console.log(decodeURIComponent("%C3%A9"), decodeURIComponent("%F0%9F%98%80"));
353
+ console.log(typeof encodeURIComponent, typeof decodeURI);
354
+ try { decodeURIComponent("%E0%80%80"); } catch (e) { console.log(String(e)); }
355
+ `;
356
+ expect(runProgram(source)).toBe([
357
+ "a/b?c=d&e#f a%2Fb%3Fc%3Dd%26e%23f",
358
+ "caf%C3%A9 %F0%9F%98%80%20%E4%B8%AD%E6%96%87",
359
+ "%2f%2F a#b",
360
+ "é 😀",
361
+ "function function",
362
+ "URIError: URI malformed",
363
+ ].join("\n"));
364
+ });
365
+ it("exposes RegExp capture groups in exec, match, replace and split", () => {
366
+ const source = `
367
+ const m = "12-34".match(/(\\d+)-(\\d+)/)!;
368
+ console.log(JSON.stringify([m[0], m[1], m[2], m.index]), Array.isArray(m), m.length);
369
+ console.log(JSON.stringify("a1b2c3".split(/(\\d)/)));
370
+ console.log(JSON.stringify("a1b2c3".split(/\\d/)));
371
+ console.log("2020-01-02".replace(/(\\d+)-(\\d+)-(\\d+)/, "$3/$2/$1"));
372
+ console.log("a1b2".replace(/(\\d)/g, "[$1]"));
373
+ console.log("a1b2".replace(/\\d/g, (x: string) => "<" + x + ">"));
374
+ console.log("a.b.c".search(/\\./));
375
+ console.log(JSON.stringify("abc".split(/(?:)/)));
376
+ `;
377
+ expect(runProgram(source)).toBe([
378
+ '["12-34","12","34",0] true 3',
379
+ '["a","1","b","2","c","3",""]',
380
+ '["a","b","c",""]',
381
+ "02/01/2020",
382
+ "a[1]b[2]",
383
+ "a<1>b<2>",
384
+ "1",
385
+ '["a","b","c"]',
386
+ ].join("\n"));
387
+ });
388
+ it("supports the immutable array methods and Object statics", () => {
389
+ const source = `
390
+ const a = [3, 1, 2];
391
+ console.log(JSON.stringify(a.toSorted((x, y) => x - y)), JSON.stringify(a));
392
+ console.log(JSON.stringify(a.toReversed()), JSON.stringify(a));
393
+ console.log(JSON.stringify(a.toSpliced(1, 1, 9, 9)), JSON.stringify(a));
394
+ console.log(JSON.stringify(a.with(1, 9)), JSON.stringify(a.with(-1, 9)));
395
+ console.log(JSON.stringify(Object.getOwnPropertyNames({ b: 1, a: 2 })));
396
+ console.log(JSON.stringify(Object.getOwnPropertyNames([1, 2])));
397
+ console.log(JSON.stringify(Object.groupBy([1, 2, 3, 4], (n: number) => (n % 2 === 0 ? "even" : "odd"))));
398
+ `;
399
+ expect(runProgram(source)).toBe([
400
+ "[1,2,3] [3,1,2]",
401
+ "[2,1,3] [3,1,2]",
402
+ "[3,9,9,2] [3,1,2]",
403
+ "[3,9,2] [3,1,9]",
404
+ '["b","a"]',
405
+ '["0","1","length"]',
406
+ '{"odd":[1,3],"even":[2,4]}',
407
+ ].join("\n"));
408
+ });
204
409
  it("supports optional chaining", () => {
205
410
  const source = `
206
411
  const obj = { a: { b: 5 }, m: (x: number) => x + 1 };
207
- const empty = null;
412
+ const empty: any = null;
208
413
  console.log(obj?.a?.b, empty?.a?.b, obj?.m?.(10), empty?.m?.(10));
209
414
  const arr = [1, 2, 3];
210
415
  console.log(arr?.length, arr?.map((x) => x * 2).join(","), empty?.length);
211
416
  `;
212
417
  expect(runProgram(source)).toBe("5 undefined 11 undefined\n3 2,4,6 undefined");
213
418
  });
419
+ it("short-circuits a whole optional chain but throws past the guard", () => {
420
+ const source = `
421
+ const empty: any = null;
422
+ const nested: any = { a: { b: null } };
423
+ // A \`?.\` short-circuits every later member, so nothing past it is evaluated.
424
+ console.log("A", empty?.a.b.c);
425
+ console.log("B", (nested?.a)?.b);
426
+ console.log("C", nested.a?.b?.c);
427
+ // Once the chain has started, a non-optional member on null throws.
428
+ try {
429
+ console.log(nested?.b.c);
430
+ console.log("D-ok");
431
+ } catch (e) {
432
+ console.log("D-threw");
433
+ }
434
+ try {
435
+ console.log(nested.a?.b.c);
436
+ console.log("E-ok");
437
+ } catch (e) {
438
+ console.log("E-threw");
439
+ }
440
+ `;
441
+ expect(runProgram(source)).toBe("A undefined\nB null\nC undefined\nD-threw\nE-threw");
442
+ });
443
+ it("defaults Array.sort to string order and reveals circular references", () => {
444
+ const source = `
445
+ console.log([10, 1, 2, 20].sort().join(","));
446
+ console.log(["banana", "apple", "cherry"].sort().join(","));
447
+ console.log(JSON.stringify([3, undefined, 1, 2, undefined].sort()));
448
+ console.log([5, 3, 8, 1].sort((a, b) => a - b).join(","));
449
+ const o: any = { name: "x" };
450
+ o.self = o;
451
+ o.child = { parent: o };
452
+ console.log(o);
453
+ const arr: any = [1, 2];
454
+ arr.push(arr);
455
+ console.log(arr);
456
+ `;
457
+ expect(runProgram(source)).toBe([
458
+ "1,10,2,20",
459
+ "apple,banana,cherry",
460
+ "[1,2,3,null,null]",
461
+ "1,3,5,8",
462
+ "{ name: 'x', self: [Circular *1], child: { parent: [Circular *1] } }",
463
+ "[ 1, 2, [Circular *1] ]",
464
+ ].join("\n"));
465
+ });
214
466
  it("supports classes with new, this, statics, inheritance and instanceof", () => {
215
467
  const source = `
216
468
  class Animal {
@@ -402,5 +654,216 @@ describeE2E("end-to-end compilation", (harness) => {
402
654
  `;
403
655
  expect(runProgram(source)).toBe("a b\n1 2\n7\nHello, Ada Hi, Bob\n30 3");
404
656
  });
657
+ it("supports Function.prototype.call, apply and bind", () => {
658
+ const source = `
659
+ function add(a: number, b: number): number { return a + b; }
660
+ console.log(add.call(null, 1, 2), add.apply(null, [5, 6]));
661
+
662
+ const obj = {
663
+ base: 10,
664
+ sum(a: number, b: number): number { return this.base + a + b; },
665
+ };
666
+ console.log(obj.sum.call(obj, 1, 2), obj.sum.apply(obj, [3, 4]));
667
+
668
+ const bound = obj.sum.bind(obj, 1);
669
+ console.log(bound(2));
670
+ const bound2 = add.bind(null, 10);
671
+ console.log(bound2(5));
672
+
673
+ class Greeter {
674
+ prefix = "hi";
675
+ greet(name: string): string { return this.prefix + " " + name; }
676
+ }
677
+ const g = new Greeter();
678
+ console.log(g.greet.call(g, "ada"), g.greet.bind(g)("cy"));
679
+ `;
680
+ expect(runProgram(source)).toBe("3 11\n13 17\n13\n15\nhi ada hi cy");
681
+ });
682
+ it("supports object-literal getters and setters", () => {
683
+ const source = `
684
+ const obj = {
685
+ _x: 0,
686
+ get x(): number { return this._x; },
687
+ set x(v: number) { this._x = v * 2; },
688
+ get double(): number { return this._x * 2; },
689
+ method(a: number, b: number) { return a + b; },
690
+ };
691
+ obj.x = 5;
692
+ console.log(obj.x, obj.double);
693
+ console.log(obj.method(2, 3));
694
+ console.log(Object.keys(obj).join(","));
695
+
696
+ const base = 7;
697
+ const o2 = { base, get next() { return base + 1; } };
698
+ console.log(o2.base, o2.next);
699
+
700
+ const o3 = { get ["dyn" + "amic"]() { return 42; } };
701
+ console.log(o3.dynamic);
702
+ `;
703
+ expect(runProgram(source)).toBe("10 20\n5\n_x,x,double,method\n7 8\n42");
704
+ });
705
+ it("supports first-class built-in method values", () => {
706
+ const source = `
707
+ const arr = [1, 2, 3];
708
+ console.log(typeof arr.map, arr.map.name, arr.map.length);
709
+ console.log(arr.map?.((x: number) => x * 2).join(","));
710
+
711
+ const text = "abc";
712
+ console.log(typeof text.slice, text.slice(1), text.split?.("").join("-"));
713
+
714
+ const obj = { base: 10, add(n: number) { return this.base + n; } };
715
+ console.log(obj.add?.(5));
716
+
717
+ const detached = arr.map;
718
+ try {
719
+ (detached as any)((x: number) => x);
720
+ console.log("no throw");
721
+ } catch (e) {
722
+ console.log("threw");
723
+ }
724
+ `;
725
+ expect(runProgram(source)).toBe("function map 1\n2,4,6\nfunction bc a-b-c\n15\nthrew");
726
+ });
727
+ it("supports the Error family as first-class constructors", () => {
728
+ const source = `
729
+ console.log(typeof Error, typeof TypeError, typeof AggregateError);
730
+ console.log(new Error("a") instanceof Error);
731
+ console.log(new TypeError("b") instanceof TypeError);
732
+ console.log(new TypeError("b") instanceof Error);
733
+ console.log(new RangeError("c") instanceof TypeError);
734
+ const e = new Error("boom");
735
+ console.log(String(e), e.toString(), e.name, e.message);
736
+
737
+ class MyErr extends Error {
738
+ constructor(m: string) { super(m); this.name = "MyErr"; }
739
+ }
740
+ const m = new MyErr("m");
741
+ console.log(m.name, m.message, m instanceof MyErr, m instanceof Error);
742
+
743
+ class CustomRange extends RangeError {}
744
+ const r = new CustomRange("too big");
745
+ console.log(r.name, r.message, r instanceof RangeError, r instanceof Error);
746
+
747
+ const agg = new AggregateError([1, 2], "all failed");
748
+ console.log(agg.name, agg.message, JSON.stringify(agg.errors), agg instanceof Error);
749
+
750
+ Promise.any([Promise.reject("x"), Promise.reject("y")]).catch((reason) => {
751
+ const err = reason as { name: string; errors: unknown[] };
752
+ console.log(err.name, JSON.stringify(err.errors));
753
+ });
754
+ `;
755
+ expect(runProgram(source)).toBe("function function function\ntrue\ntrue\ntrue\nfalse\n" +
756
+ "Error: boom Error: boom Error boom\n" +
757
+ "MyErr m true true\nRangeError too big true true\n" +
758
+ "AggregateError all failed [1,2] true\nAggregateError [\"x\",\"y\"]");
759
+ });
760
+ it("supports generator functions", () => {
761
+ const source = `
762
+ function* nums() { yield 1; yield 2; yield 3; }
763
+ const g = nums();
764
+ console.log(typeof nums, g.next().value, g.next().value, g.next().value);
765
+ console.log(JSON.stringify(g.next()));
766
+
767
+ function* counter(start: number) {
768
+ let x = start;
769
+ while (true) {
770
+ const step = yield x;
771
+ x = step === undefined ? x + 1 : step;
772
+ }
773
+ }
774
+ const c = counter(10);
775
+ console.log(c.next().value, c.next().value, c.next(100).value, c.next().value);
776
+
777
+ class Box {
778
+ private n = 0;
779
+ *gen(): Generator<number> { yield this.n++; yield this.n++; }
780
+ }
781
+ const box = new Box();
782
+ console.log([...box.gen()].join(","), [...box.gen()].join(","));
783
+
784
+ function* inner() { yield 1; yield 2; }
785
+ function* outer() { yield* inner(); yield 9; }
786
+ console.log([...outer()].join("-"), [...outer()].join("-"));
787
+
788
+ function* echo() { const a = yield "first"; const b = yield a; return b; }
789
+ const e = echo();
790
+ console.log(e.next().value, e.next("A").value, JSON.stringify(e.next("B")));
791
+
792
+ function* guarded() {
793
+ try { yield "x"; } catch (err) { yield "caught:" + (err as Error).message; }
794
+ yield "end";
795
+ }
796
+ const t = guarded();
797
+ console.log(t.next().value, t.throw(new Error("E")).value, t.next().value);
798
+
799
+ function* once() { yield 1; }
800
+ const o = once();
801
+ o.next();
802
+ console.log(JSON.stringify(o.next()), typeof o);
803
+
804
+ function* naturals() { let i = 0; while (true) yield i++; }
805
+ const seen: number[] = [];
806
+ for (const v of naturals()) { if (v >= 3) break; seen.push(v); }
807
+ console.log(seen.join(","));
808
+ `;
809
+ expect(runProgram(source)).toBe("function 1 2 3\n{\"done\":true}\n10 11 100 101\n0,1 2,3\n" +
810
+ "1-2-9 1-2-9\nfirst A {\"value\":\"B\",\"done\":true}\n" +
811
+ "x caught:E end\n{\"done\":true} object\n0,1,2");
812
+ });
813
+ it("supports symbols and the well-known symbol protocol", () => {
814
+ const source = `
815
+ const a = Symbol("desc");
816
+ const b = Symbol("desc");
817
+ console.log(typeof Symbol, typeof a, a === a, a === b);
818
+ console.log(a.toString(), String(a), a.description, String(Symbol()));
819
+ console.log(String(Symbol.iterator), typeof Symbol.iterator);
820
+
821
+ const holder: Record<string, unknown> = {};
822
+ (holder as any)[a] = 1;
823
+ (holder as any)[b] = 2;
824
+ holder.x = 3;
825
+ console.log(Object.keys(holder).join(","));
826
+ console.log(Object.getOwnPropertySymbols(holder).length);
827
+ console.log((holder as any)[a], (holder as any)[b], (holder as any)[Symbol("desc")]);
828
+ console.log(JSON.stringify(holder), JSON.stringify(a), JSON.stringify([a, 1]));
829
+ console.log(holder);
830
+
831
+ const reg = Symbol.for("shared");
832
+ console.log(reg === Symbol.for("shared"), Symbol.keyFor(reg), Symbol.keyFor(a));
833
+
834
+ class Range {
835
+ start: number;
836
+ end: number;
837
+ constructor(start: number, end: number) {
838
+ this.start = start;
839
+ this.end = end;
840
+ }
841
+ [Symbol.iterator]() {
842
+ let i = this.start;
843
+ const end = this.end;
844
+ return {
845
+ next() {
846
+ return i < end ? { value: i++, done: false } : { value: undefined, done: true };
847
+ },
848
+ };
849
+ }
850
+ }
851
+ console.log([...new Range(1, 4)].join(","));
852
+ const walked: number[] = [];
853
+ for (const x of new Range(10, 13)) walked.push(x);
854
+ console.log(walked.join(","));
855
+
856
+ function* delegates() { yield* new Range(5, 7); }
857
+ console.log([...delegates()].join(","));
858
+ `;
859
+ expect(runProgram(source)).toBe("function symbol true false\n" +
860
+ "Symbol(desc) Symbol(desc) desc Symbol()\n" +
861
+ "Symbol(Symbol.iterator) symbol\n" +
862
+ "x\n2\n1 2 undefined\n" +
863
+ '{"x":3} undefined [null,1]\n' +
864
+ "{ x: 3, Symbol(desc): 1, Symbol(desc): 2 }\n" +
865
+ "true shared undefined\n" +
866
+ "1,2,3\n10,11,12\n5,6");
867
+ });
405
868
  });
406
869
  //# sourceMappingURL=compile.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Differential tests: compile a program with xbintsc, run it, and compare the
3
+ * output byte-for-byte with the same program executed by Node. Every program
4
+ * prints canonical `JSON.stringify` lines so console formatting never masks a
5
+ * real semantic difference.
6
+ */
7
+ export {};