@scriptc/compiler 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/backend/emission/emit-exprs.js +47 -1
  2. package/dist/backend/emission/emit-exprs.js.map +1 -1
  3. package/dist/backend/emission/emit-island.js +9 -1
  4. package/dist/backend/emission/emit-island.js.map +1 -1
  5. package/dist/backend/emission/emit-stmts.js +3 -1
  6. package/dist/backend/emission/emit-stmts.js.map +1 -1
  7. package/dist/backend/emission/emit-walkers.js +22 -8
  8. package/dist/backend/emission/emit-walkers.js.map +1 -1
  9. package/dist/backend/emission/emitter.js +5 -1
  10. package/dist/backend/emission/emitter.js.map +1 -1
  11. package/dist/backend/emission/may-throw.js +4 -3
  12. package/dist/backend/emission/may-throw.js.map +1 -1
  13. package/dist/backend/llvm/emitter.js +94 -7
  14. package/dist/backend/llvm/emitter.js.map +1 -1
  15. package/dist/diagnostics/diagnostic.d.ts +43 -1
  16. package/dist/diagnostics/diagnostic.js +103 -5
  17. package/dist/diagnostics/diagnostic.js.map +1 -1
  18. package/dist/frontend/lib-contract.d.ts +24 -6
  19. package/dist/frontend/lib-contract.js +125 -44
  20. package/dist/frontend/lib-contract.js.map +1 -1
  21. package/dist/frontend/lowering/lower-builtins.js +16 -1
  22. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  23. package/dist/frontend/lowering/lower-calls.d.ts +47 -7
  24. package/dist/frontend/lowering/lower-calls.js +560 -36
  25. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  26. package/dist/frontend/lowering/lower-classes.d.ts +14 -1
  27. package/dist/frontend/lowering/lower-classes.js +85 -15
  28. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  29. package/dist/frontend/lowering/lower-containers.js +43 -1
  30. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  31. package/dist/frontend/lowering/lower-emitter.js +1 -1
  32. package/dist/frontend/lowering/lower-emitter.js.map +1 -1
  33. package/dist/frontend/lowering/lower-exprs.d.ts +26 -3
  34. package/dist/frontend/lowering/lower-exprs.js +455 -40
  35. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  36. package/dist/frontend/lowering/lower-island.d.ts +7 -0
  37. package/dist/frontend/lowering/lower-island.js +71 -10
  38. package/dist/frontend/lowering/lower-island.js.map +1 -1
  39. package/dist/frontend/lowering/lower-mixins.d.ts +1 -1
  40. package/dist/frontend/lowering/lower-mixins.js +1 -1
  41. package/dist/frontend/lowering/lower-modules.js +95 -4
  42. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  43. package/dist/frontend/lowering/lower-stmts.js +421 -43
  44. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  45. package/dist/frontend/lowering/lowerer.d.ts +19 -3
  46. package/dist/frontend/lowering/lowerer.js +188 -11
  47. package/dist/frontend/lowering/lowerer.js.map +1 -1
  48. package/dist/frontend/types.d.ts +28 -1
  49. package/dist/frontend/types.js +300 -8
  50. package/dist/frontend/types.js.map +1 -1
  51. package/dist/index.d.ts +2 -1
  52. package/dist/index.js +37 -7
  53. package/dist/index.js.map +1 -1
  54. package/dist/ir/nodes.d.ts +28 -2
  55. package/dist/ir/nodes.js +35 -3
  56. package/dist/ir/nodes.js.map +1 -1
  57. package/dist/ir/validate.js +35 -6
  58. package/dist/ir/validate.js.map +1 -1
  59. package/dist/library/profile.d.ts +17 -3
  60. package/dist/library/profile.js +38 -9
  61. package/dist/library/profile.js.map +1 -1
  62. package/dist/library/sidecar.js +162 -43
  63. package/dist/library/sidecar.js.map +1 -1
  64. package/dist/library/trap-teaching.d.ts +11 -0
  65. package/dist/library/trap-teaching.js +49 -0
  66. package/dist/library/trap-teaching.js.map +1 -0
  67. package/package.json +2 -2
  68. package/surface-manifest.json +37 -2
@@ -468,6 +468,27 @@ export function emitExpr(E, e) {
468
468
  // result IS the left box. Narrowed shape: the single non-unit arm's
469
469
  // payload is extracted unionNarrow-style (+1 for ref kinds, the
470
470
  // checker proved the tag) and the left box is released.
471
+ if (e.left.type.kind === "jsval") {
472
+ // `a ?? b` on an island value: the engine's nullish test; the
473
+ // right runs lazily in its branch (already jsval-typed).
474
+ const l = E.emitExpr(e.left);
475
+ E.moveTemp(l);
476
+ const name = `sc_t${E.tempCounter++}`;
477
+ E.line(`${cDecl(e.type, name)};`);
478
+ E.line(`if (scr_jsval_is_nullish(${l.name})) {`);
479
+ E.indent++;
480
+ E.releaseValue(l.name, e.left.type);
481
+ E.emitBranchInto(name, e.right);
482
+ E.indent--;
483
+ E.line(`} else {`);
484
+ E.indent++;
485
+ E.line(`${name} = ${l.name};`);
486
+ E.indent--;
487
+ E.line(`}`);
488
+ if (isRefCounted(e.type))
489
+ E.currentFrame().push({ name, type: e.type });
490
+ return { name, type: e.type };
491
+ }
471
492
  if (e.left.type.kind !== "union")
472
493
  throw new Error("emitter bug: nullish left is not a union");
473
494
  const def = E.unionsById.get(e.left.type.unionId);
@@ -4605,6 +4626,14 @@ export function emitExpr(E, e) {
4605
4626
  return finish(`scr_domex_clone(${arg(0)}, ${arg(1)})`);
4606
4627
  case "dyn.objKeys":
4607
4628
  return finish(`scr_dyn_obj_keys(${arg(0)})`);
4629
+ case "dyn.assign":
4630
+ // Object.assign over DOM values: own members copy, the target
4631
+ // returns (+1); non-object receivers throw like Node.
4632
+ return finish(`scr_dyn_assign(${arg(0)}, ${arg(1)})`);
4633
+ case "dyn.hasOwn":
4634
+ // Object.hasOwn over a DOM receiver (throws on nullish, like
4635
+ // Node's ToObject).
4636
+ return finish(`scr_dyn_has_own(${arg(0)}, ${arg(1)})`);
4608
4637
  case "dyn.objValues":
4609
4638
  return finish(`scr_dyn_obj_values(${arg(0)})`);
4610
4639
  case "dyn.objEntries":
@@ -5813,7 +5842,11 @@ export function emitExpr(E, e) {
5813
5842
  const adapter = canMarshalFuncIntoIsland(fn)
5814
5843
  ? E.islandAdapter(fn.params.length, fn.ret.kind)
5815
5844
  : E.islandTypedAdapter(fn);
5816
- return E.newTemp(e.type, `scr_jsval_from_closure(${v.name}, ${fn.params.length}, ${adapter})`);
5845
+ // ISLAND-REST closures encode a NEGATIVE arity: the wrapper
5846
+ // pads the leading declared params and hands the trailing
5847
+ // slot the ENGINE array of the surplus arguments.
5848
+ const arity = fn.rest === true && fn.restAbi === "jsval" ? -fn.params.length : fn.params.length;
5849
+ return E.newTemp(e.type, `scr_jsval_from_closure(${v.name}, ${arity}, ${adapter})`);
5817
5850
  }
5818
5851
  default: {
5819
5852
  const helper = E.jsonWriteHelper(e.value.type);
@@ -5911,6 +5944,19 @@ export function emitExpr(E, e) {
5911
5944
  const pack = argPack(args.map((x) => x.name));
5912
5945
  return E.newTemp(e.type, `scr_jsval_obj_lit(${args.length / 2}, ${pack})`);
5913
5946
  }
5947
+ case "tplStrings": {
5948
+ const pack = argPack(args.map((x) => x.name));
5949
+ return E.newTemp(e.type, `scr_jsval_tpl_strings(${args.length / 2}, ${pack})`);
5950
+ }
5951
+ case "objSpread":
5952
+ // Spread completion: engine CopyDataProperties (getters can
5953
+ // throw — fallible); answers the target (+1).
5954
+ return finishFallible(`scr_jsval_obj_spread(${a(0)}, ${a(1)})`);
5955
+ case "defineGetter":
5956
+ // Getter completion for an island literal: defines key (a(1))
5957
+ // on obj (a(0)) as an engine getter invoking a(2); answers the
5958
+ // object (+1) for chaining.
5959
+ return E.newTemp(e.type, `scr_jsval_define_getter(${a(0)}, ${a(1)}, ${a(2)})`);
5914
5960
  case "arrLit": {
5915
5961
  const pack = argPack(args.map((x) => x.name));
5916
5962
  return E.newTemp(e.type, `scr_jsval_arr_lit(${args.length}, ${pack})`);