jseption 0.0.5 → 0.0.7

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 (90) hide show
  1. package/README.md +30 -6
  2. package/dist/atoms.d.ts +1 -0
  3. package/dist/atoms.js +2 -1
  4. package/dist/atoms.js.map +1 -1
  5. package/dist/builtins/base64.d.ts +14 -0
  6. package/dist/builtins/base64.js +219 -0
  7. package/dist/builtins/base64.js.map +1 -0
  8. package/dist/builtins/bigint.js +3 -3
  9. package/dist/builtins/bigint.js.map +1 -1
  10. package/dist/builtins/date.d.ts +1 -0
  11. package/dist/builtins/date.js +26 -12
  12. package/dist/builtins/date.js.map +1 -1
  13. package/dist/builtins/error.js +9 -0
  14. package/dist/builtins/error.js.map +1 -1
  15. package/dist/builtins/float16.d.ts +3 -0
  16. package/dist/builtins/float16.js +69 -0
  17. package/dist/builtins/float16.js.map +1 -0
  18. package/dist/builtins/function.js +2 -2
  19. package/dist/builtins/index.js +9 -6
  20. package/dist/builtins/index.js.map +1 -1
  21. package/dist/builtins/iterator.d.ts +2 -0
  22. package/dist/builtins/iterator.js +624 -0
  23. package/dist/builtins/iterator.js.map +1 -0
  24. package/dist/builtins/json.d.ts +13 -1
  25. package/dist/builtins/json.js +283 -211
  26. package/dist/builtins/json.js.map +1 -1
  27. package/dist/builtins/mapset.js +365 -6
  28. package/dist/builtins/mapset.js.map +1 -1
  29. package/dist/builtins/math.js +203 -3
  30. package/dist/builtins/math.js.map +1 -1
  31. package/dist/builtins/native.js +6 -6
  32. package/dist/builtins/object.js +9 -2
  33. package/dist/builtins/object.js.map +1 -1
  34. package/dist/builtins/promise.js +31 -11
  35. package/dist/builtins/promise.js.map +1 -1
  36. package/dist/builtins/proxy.js +2 -2
  37. package/dist/builtins/reflect.js +6 -2
  38. package/dist/builtins/reflect.js.map +1 -1
  39. package/dist/builtins/regexp.js +74 -3
  40. package/dist/builtins/regexp.js.map +1 -1
  41. package/dist/builtins/string.js +1 -1
  42. package/dist/builtins/symbol.js +1 -1
  43. package/dist/builtins/symbol.js.map +1 -1
  44. package/dist/builtins/typedarray.d.ts +4 -1
  45. package/dist/builtins/typedarray.js +325 -37
  46. package/dist/builtins/typedarray.js.map +1 -1
  47. package/dist/builtins/weakref.js +7 -7
  48. package/dist/embed.d.ts +5 -0
  49. package/dist/embed.js +36 -11
  50. package/dist/embed.js.map +1 -1
  51. package/dist/interpreter.js +15 -14
  52. package/dist/interpreter.js.map +1 -1
  53. package/dist/jit.d.ts +1 -0
  54. package/dist/jit.js +51 -13
  55. package/dist/jit.js.map +1 -1
  56. package/dist/jit_hook.d.ts +1 -0
  57. package/dist/jit_hook.js.map +1 -1
  58. package/dist/jit_runtime.d.ts +1 -1
  59. package/dist/jit_runtime.js +6 -6
  60. package/dist/jit_runtime.js.map +1 -1
  61. package/dist/jit_stack.d.ts +1 -0
  62. package/dist/jit_stack.js +2 -1
  63. package/dist/jit_stack.js.map +1 -1
  64. package/dist/jseption.d.ts +2 -0
  65. package/dist/jseption.js +1 -0
  66. package/dist/jseption.js.map +1 -1
  67. package/dist/membrane.d.ts +6 -0
  68. package/dist/membrane.js +7 -3
  69. package/dist/membrane.js.map +1 -1
  70. package/dist/module.js +5 -3
  71. package/dist/module.js.map +1 -1
  72. package/dist/parser.js +26 -9
  73. package/dist/parser.js.map +1 -1
  74. package/dist/print.d.ts +12 -0
  75. package/dist/print.js +494 -0
  76. package/dist/print.js.map +1 -0
  77. package/dist/qjs.js +13 -10
  78. package/dist/qjs.js.map +1 -1
  79. package/dist/quickjs.d.ts +8 -0
  80. package/dist/quickjs.js +132 -53
  81. package/dist/quickjs.js.map +1 -1
  82. package/dist/std.d.ts +4 -2
  83. package/dist/std.js +42 -8
  84. package/dist/std.js.map +1 -1
  85. package/dist/values.d.ts +31 -27
  86. package/dist/values.js.map +1 -1
  87. package/dist/version.d.ts +1 -1
  88. package/dist/version.js +1 -1
  89. package/dist/version.js.map +1 -1
  90. package/package.json +1 -1
package/dist/jit.d.ts CHANGED
@@ -42,6 +42,7 @@ export interface JitCompiled {
42
42
  export interface JitSource {
43
43
  source: string;
44
44
  name: string;
45
+ ctor_names?: Map<number, string>;
45
46
  osr?: {
46
47
  arg_cell: boolean[];
47
48
  var_cell: boolean[];
package/dist/jit.js CHANGED
@@ -1068,6 +1068,8 @@ class BlockEmitter {
1068
1068
  }
1069
1069
  this.emit(`$s${i} = ${p.code};`);
1070
1070
  this.slots[i] = P(temp_name(i), 1 /* PK.TEMP */, { fresh: p.fresh, mkeys: p.mkeys });
1071
+ if (p.name !== undefined)
1072
+ this.slots[i].name = p.name;
1071
1073
  this.see_temp(i);
1072
1074
  }
1073
1075
  /* materialize every pending expression that is not trivially duplicable, in order */
@@ -1211,17 +1213,26 @@ class BlockEmitter {
1211
1213
  /* before emitting a statement with side effects */
1212
1214
  before_stmt() { this.flush_exprs(); }
1213
1215
  /* --- variable access --- */
1216
+ /* the source name of the argument or variable at vardefs[i] ('' when unknown) */
1217
+ vardef_name(i) {
1218
+ const vd = this.fi.b.vardefs[i];
1219
+ return vd === undefined ? '' : this.fi.atom_name(vd.var_name);
1220
+ }
1214
1221
  arg_read(i) {
1215
1222
  const fi = this.fi;
1216
1223
  if (i >= fi.argName.length)
1217
1224
  return P('undefined', 0 /* PK.LIT */);
1218
- return fi.argCell[i] ? P(`${fi.argName[i]}.get()`, 3 /* PK.EXPR */) : P(fi.argName[i], 2 /* PK.LOCAL */, { local: fi.argName[i] });
1225
+ const p = fi.argCell[i] ? P(`${fi.argName[i]}.get()`, 3 /* PK.EXPR */) : P(fi.argName[i], 2 /* PK.LOCAL */, { local: fi.argName[i] });
1226
+ p.name = this.vardef_name(i);
1227
+ return p;
1219
1228
  }
1220
1229
  var_read(i) {
1221
1230
  const fi = this.fi;
1222
1231
  if (i >= fi.varName.length)
1223
1232
  bail(`bad local index ${i}`);
1224
- return fi.varCell[i] ? P(`${fi.varName[i]}.get()`, 3 /* PK.EXPR */) : P(fi.varName[i], 2 /* PK.LOCAL */, { local: fi.varName[i] });
1233
+ const p = fi.varCell[i] ? P(`${fi.varName[i]}.get()`, 3 /* PK.EXPR */) : P(fi.varName[i], 2 /* PK.LOCAL */, { local: fi.varName[i] });
1234
+ p.name = this.vardef_name(fi.b.arg_count + i);
1235
+ return p;
1225
1236
  }
1226
1237
  write_local(is_arg, i, value) {
1227
1238
  const fi = this.fi;
@@ -1582,7 +1593,16 @@ class BlockEmitter {
1582
1593
  /* `new C(args)`: new.target is the constructor itself */
1583
1594
  this.pop();
1584
1595
  this.pop();
1585
- e = `new ${fn.code}${this.M()}(${args.join(', ')})${this.M()}`;
1596
+ /* every native construct site is recorded: a failure there is named after the callee
1597
+ the site stored in $C.last_new once its arguments ran (after the last one, so a nested
1598
+ `new` in an argument cannot overwrite it) */
1599
+ this.fi.ctor_names.set(this.cur_pc, fn.name ?? '');
1600
+ if (args.length > 0)
1601
+ this.fi.uses_nw = true;
1602
+ const store = `$C.last_new = ${fn.code}`;
1603
+ const n = args.length;
1604
+ const argv = n === 0 ? [] : [...args.slice(0, n - 1), `($nw = ${args[n - 1]}, ${store}, $nw)`];
1605
+ e = n === 0 ? `(${store}, new ${fn.code}${this.M()}()${this.M()})` : `new ${fn.code}${this.M()}(${argv.join(', ')})${this.M()}`;
1586
1606
  }
1587
1607
  else {
1588
1608
  const t = this.dup_code(this.depth - 1);
@@ -1682,7 +1702,9 @@ class BlockEmitter {
1682
1702
  fi.uses_global = true;
1683
1703
  const slow = `$RT.get_global(${insn.a}, ${op === 57 /* OP.get_var */})`;
1684
1704
  const g = op === 57 /* OP.get_var */ ? `(($g = $G${acc}) !== undefined ? $g : ${slow})` : `$G${acc}`;
1685
- this.push(P(`(($g = $GV${acc}) !== undefined ? ($g === $U ? ${slow} : $g) : ${g})`, 3 /* PK.EXPR */));
1705
+ const pv = P(`(($g = $GV${acc}) !== undefined ? ($g === $U ? ${slow} : $g) : ${g})`, 3 /* PK.EXPR */);
1706
+ pv.name = fi.atom_name(insn.a);
1707
+ this.push(pv);
1686
1708
  return false;
1687
1709
  }
1688
1710
  case 58 /* OP.put_var */:
@@ -1813,9 +1835,14 @@ class BlockEmitter {
1813
1835
  case 223 /* OP.get_var_ref0 */:
1814
1836
  case 224 /* OP.get_var_ref1 */:
1815
1837
  case 225 /* OP.get_var_ref2 */:
1816
- case 226 /* OP.get_var_ref3 */:
1817
- this.push(P(`$vr[${insn.a}].get()`, 3 /* PK.EXPR */));
1838
+ case 226 /* OP.get_var_ref3 */: {
1839
+ const pv = P(`$vr[${insn.a}].get()`, 3 /* PK.EXPR */);
1840
+ const cv = fi.b.closure_var[insn.a];
1841
+ if (cv !== undefined)
1842
+ pv.name = fi.atom_name(cv.var_name);
1843
+ this.push(pv);
1818
1844
  return false;
1845
+ }
1819
1846
  case 96 /* OP.put_var_ref */:
1820
1847
  case 227 /* OP.put_var_ref0 */:
1821
1848
  case 228 /* OP.put_var_ref1 */:
@@ -1840,7 +1867,11 @@ class BlockEmitter {
1840
1867
  const d = this.depth;
1841
1868
  this.before_stmt();
1842
1869
  this.emit(`$s${d} = $vr[${insn.a}].get(); if ($s${d} === $U) $RT.throw_uninitialized($b, ${insn.a}, true);`);
1843
- this.push(P(`$s${d}`, 1 /* PK.TEMP */));
1870
+ const pv = P(`$s${d}`, 1 /* PK.TEMP */);
1871
+ const cv = fi.b.closure_var[insn.a];
1872
+ if (cv !== undefined)
1873
+ pv.name = fi.atom_name(cv.var_name);
1874
+ this.push(pv);
1844
1875
  return false;
1845
1876
  }
1846
1877
  case 104 /* OP.put_var_ref_check */: {
@@ -1863,7 +1894,9 @@ class BlockEmitter {
1863
1894
  const d = this.depth;
1864
1895
  this.before_stmt();
1865
1896
  this.emit(`$s${d} = ${this.local_value(false, insn.a)}; if ($s${d} === $U) $RT.throw_uninitialized($b, ${insn.a}, false);`);
1866
- this.push(P(`$s${d}`, 1 /* PK.TEMP */));
1897
+ const pv = P(`$s${d}`, 1 /* PK.TEMP */);
1898
+ pv.name = this.vardef_name(fi.b.arg_count + insn.a);
1899
+ this.push(pv);
1867
1900
  return false;
1868
1901
  }
1869
1902
  case 100 /* OP.put_loc_check */: {
@@ -2023,7 +2056,10 @@ class BlockEmitter {
2023
2056
  case 66 /* OP.get_field */: {
2024
2057
  const o = this.dup_code(this.depth - 1);
2025
2058
  this.pop();
2026
- this.push(P(this.get_field(o, insn.a), 3 /* PK.EXPR */));
2059
+ const pv = P(this.get_field(o, insn.a), 3 /* PK.EXPR */);
2060
+ if (!fi.atom_is_symbol(insn.a))
2061
+ pv.name = fi.atom_name(insn.a);
2062
+ this.push(pv);
2027
2063
  return false;
2028
2064
  }
2029
2065
  case 67 /* OP.get_field2 */: {
@@ -3029,7 +3065,7 @@ export function jit_generate_source(ctx, b, id = 0, opts = {}) {
3029
3065
  const fi = {
3030
3066
  ctx, b, A, strict, constructible, derived: b.is_derived_class_constructor, uses_direct: false, uses_global: false, uses_w: false,
3031
3067
  natural: (opts.conv ?? jit_config.conv) === 'natural', arg_off: (opts.conv ?? jit_config.conv) === 'natural' ? 0 : 2,
3032
- sloppy_sets: new Map(), sloppy_props: new Map(), uses_spe: false, uses_sdel: false,
3068
+ sloppy_sets: new Map(), sloppy_props: new Map(), uses_spe: false, uses_sdel: false, ctor_names: new Map(), uses_nw: false,
3033
3069
  argName: [], argCell: [], varName: [], varCell: [],
3034
3070
  atom_name: (atom) => JS_AtomGetStr(ctx, atom),
3035
3071
  atom_is_symbol: (atom) => ctx.rt.atoms.isSymbol(atom),
@@ -3110,6 +3146,8 @@ export function jit_generate_source(ctx, b, id = 0, opts = {}) {
3110
3146
  decls.push('$g');
3111
3147
  if (fi.uses_w)
3112
3148
  decls.push('$w');
3149
+ if (fi.uses_nw)
3150
+ decls.push('$nw');
3113
3151
  const params = ['$t', '$nt'];
3114
3152
  const fwparams = [];
3115
3153
  for (let i = 0; i < b.arg_count; i++) {
@@ -3222,7 +3260,7 @@ ${prologue}${body}};
3222
3260
  }
3223
3261
  /* the url names the function for host stack traces; its id leads to the position table */
3224
3262
  source += `\n//# sourceURL=jseption:${id}:${url_part(jit_file_name(ctx, b))}:${url_part(name || '<anonymous>')}`;
3225
- const res = { source, name };
3263
+ const res = { source, name, ctor_names: fi.ctor_names };
3226
3264
  if (osr !== undefined)
3227
3265
  res.osr = { arg_cell: fi.argCell.slice(), var_cell: fi.varCell.slice(), depth: cfg.byPc.get(osr).stateIn.length };
3228
3266
  return res;
@@ -3281,7 +3319,7 @@ function compile_variant(ctx, b, opts) {
3281
3319
  try {
3282
3320
  const id = jit_stack_alloc_id();
3283
3321
  const gen = jit_generate_source(ctx, b, id, opts);
3284
- const { source, name } = gen;
3322
+ const { source, name, ctor_names } = gen;
3285
3323
  if (jit_config.dump)
3286
3324
  console.log(`--- jit${opts.osr !== undefined ? ` (osr at ${opts.osr})` : opts.conv === 'forwarder' && jit_config.conv !== 'forwarder' ? ' (ctor)' : ''}: ${name || '<anonymous>'} ---\n${source}`);
3287
3325
  const RT = make_jit_runtime(ctx, (bb) => jit_closure_compile(ctx, bb));
@@ -3297,7 +3335,7 @@ function compile_variant(ctx, b, opts) {
3297
3335
  throw e;
3298
3336
  }
3299
3337
  const make = factory(...jit_runtime_factory_args(RT, b));
3300
- const stack = { b, name, file: jit_file_name(ctx, b), source, lines: null };
3338
+ const stack = { b, name, file: jit_file_name(ctx, b), source, lines: null, ctor_names: ctor_names ?? null };
3301
3339
  jit_stack_register(id, stack);
3302
3340
  const compiled = { make, source, name, stack, osr: gen.osr };
3303
3341
  jit_stats.compiled++;