@scriptc/compiler 0.2.3 → 0.2.4

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 (135) hide show
  1. package/dist/backend/llvm/borrowed-inputs.d.ts +15 -0
  2. package/dist/backend/llvm/borrowed-inputs.js +28 -0
  3. package/dist/backend/llvm/borrowed-inputs.js.map +1 -0
  4. package/dist/backend/llvm/byte-numbers.d.ts +10 -0
  5. package/dist/backend/llvm/byte-numbers.js +235 -0
  6. package/dist/backend/llvm/byte-numbers.js.map +1 -0
  7. package/dist/backend/llvm/bytes-bounds.d.ts +9 -0
  8. package/dist/backend/llvm/bytes-bounds.js +189 -0
  9. package/dist/backend/llvm/bytes-bounds.js.map +1 -0
  10. package/dist/backend/llvm/call-lifetimes.d.ts +7 -0
  11. package/dist/backend/llvm/call-lifetimes.js +27 -7
  12. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  13. package/dist/backend/llvm/call-lifetimes.test.js +54 -0
  14. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  15. package/dist/backend/llvm/checked-value-lifetimes.d.ts +9 -0
  16. package/dist/backend/llvm/checked-value-lifetimes.js +35 -0
  17. package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -0
  18. package/dist/backend/llvm/counted-loops.d.ts +6 -0
  19. package/dist/backend/llvm/counted-loops.js +28 -0
  20. package/dist/backend/llvm/counted-loops.js.map +1 -0
  21. package/dist/backend/llvm/emitter.d.ts +25 -9
  22. package/dist/backend/llvm/emitter.js +131 -31
  23. package/dist/backend/llvm/emitter.js.map +1 -1
  24. package/dist/backend/llvm/emitter.test.js +4 -4
  25. package/dist/backend/llvm/emitter.test.js.map +1 -1
  26. package/dist/backend/llvm/expr-async.js +3 -2
  27. package/dist/backend/llvm/expr-async.js.map +1 -1
  28. package/dist/backend/llvm/expr-bytes.d.ts +4 -4
  29. package/dist/backend/llvm/expr-bytes.js +68 -35
  30. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  31. package/dist/backend/llvm/expr-calls.js +21 -13
  32. package/dist/backend/llvm/expr-calls.js.map +1 -1
  33. package/dist/backend/llvm/expr-containers.d.ts +2 -1
  34. package/dist/backend/llvm/expr-containers.js +68 -46
  35. package/dist/backend/llvm/expr-containers.js.map +1 -1
  36. package/dist/backend/llvm/expr-context.d.ts +11 -0
  37. package/dist/backend/llvm/expr-control.js +26 -5
  38. package/dist/backend/llvm/expr-control.js.map +1 -1
  39. package/dist/backend/llvm/expr-dynamic.js +32 -30
  40. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  41. package/dist/backend/llvm/expr-primitives.js +55 -22
  42. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  43. package/dist/backend/llvm/expr-records.js +8 -2
  44. package/dist/backend/llvm/expr-records.js.map +1 -1
  45. package/dist/backend/llvm/integer-values.d.ts +10 -0
  46. package/dist/backend/llvm/integer-values.js +41 -0
  47. package/dist/backend/llvm/integer-values.js.map +1 -0
  48. package/dist/backend/llvm/integer-views.d.ts +7 -0
  49. package/dist/backend/llvm/integer-views.js +67 -0
  50. package/dist/backend/llvm/integer-views.js.map +1 -0
  51. package/dist/backend/llvm/integer-views.test.d.ts +1 -0
  52. package/dist/backend/llvm/integer-views.test.js +34 -0
  53. package/dist/backend/llvm/integer-views.test.js.map +1 -0
  54. package/dist/backend/llvm/lib-dispatch.js +3 -1
  55. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  56. package/dist/backend/llvm/lib-filesystem.js +5 -5
  57. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  58. package/dist/backend/llvm/local-array-reads.d.ts +2 -4
  59. package/dist/backend/llvm/local-array-reads.js +4 -91
  60. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  61. package/dist/backend/llvm/local-array-reads.test.js +11 -11
  62. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  63. package/dist/backend/llvm/map-read-lifetimes.js +2 -2
  64. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  65. package/dist/backend/llvm/map-read-lifetimes.test.js +5 -1
  66. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  67. package/dist/backend/llvm/reference-effects.d.ts +22 -0
  68. package/dist/backend/llvm/reference-effects.js +148 -0
  69. package/dist/backend/llvm/reference-effects.js.map +1 -0
  70. package/dist/backend/llvm/reference-effects.test.d.ts +1 -0
  71. package/dist/backend/llvm/reference-effects.test.js +74 -0
  72. package/dist/backend/llvm/reference-effects.test.js.map +1 -0
  73. package/dist/backend/llvm/shapes.d.ts +7 -4
  74. package/dist/backend/llvm/shapes.js +23 -6
  75. package/dist/backend/llvm/shapes.js.map +1 -1
  76. package/dist/backend/llvm/stack-unions.test.js +23 -2
  77. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  78. package/dist/backend/llvm/string-construction.d.ts +10 -0
  79. package/dist/backend/llvm/string-construction.js +38 -0
  80. package/dist/backend/llvm/string-construction.js.map +1 -0
  81. package/dist/backend/llvm/string-construction.test.d.ts +1 -0
  82. package/dist/backend/llvm/string-construction.test.js +65 -0
  83. package/dist/backend/llvm/string-construction.test.js.map +1 -0
  84. package/dist/backend/llvm/string-lifetimes.d.ts +2 -2
  85. package/dist/backend/llvm/string-lifetimes.js +5 -3
  86. package/dist/backend/llvm/string-lifetimes.js.map +1 -1
  87. package/dist/backend/llvm/string-lifetimes.test.js +19 -10
  88. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  89. package/dist/frontend/lowering/collection-ingestion.js +9 -0
  90. package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
  91. package/dist/frontend/lowering/containers/string-and-regexp.js +6 -0
  92. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  93. package/dist/frontend/lowering/lower-builtins.js +2 -0
  94. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  95. package/dist/frontend/lowering/lower-classes.js +3 -3
  96. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  97. package/dist/frontend/lowering/lower-containers.js +12 -34
  98. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  99. package/dist/frontend/lowering/lower-exprs.js +12 -2
  100. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  101. package/dist/frontend/lowering/lowerer.js +10 -3
  102. package/dist/frontend/lowering/lowerer.js.map +1 -1
  103. package/dist/frontend/type-mapper.js +2 -2
  104. package/dist/frontend/type-mapper.js.map +1 -1
  105. package/dist/ir/analysis.js +3 -1
  106. package/dist/ir/analysis.js.map +1 -1
  107. package/dist/ir/byte-numbers.d.ts +20 -0
  108. package/dist/ir/byte-numbers.js +65 -0
  109. package/dist/ir/byte-numbers.js.map +1 -0
  110. package/dist/ir/byte-numbers.test.d.ts +1 -0
  111. package/dist/ir/byte-numbers.test.js +42 -0
  112. package/dist/ir/byte-numbers.test.js.map +1 -0
  113. package/dist/ir/integer-loops.d.ts +19 -0
  114. package/dist/ir/integer-loops.js +107 -1
  115. package/dist/ir/integer-loops.js.map +1 -1
  116. package/dist/ir/integer-loops.test.js +51 -1
  117. package/dist/ir/integer-loops.test.js.map +1 -1
  118. package/dist/ir/integer-ranges.d.ts +8 -6
  119. package/dist/ir/integer-ranges.js +343 -89
  120. package/dist/ir/integer-ranges.js.map +1 -1
  121. package/dist/ir/integer-ranges.test.js +54 -3
  122. package/dist/ir/integer-ranges.test.js.map +1 -1
  123. package/dist/ir/ir.d.ts +8 -5
  124. package/dist/ir/ir.js +16 -5
  125. package/dist/ir/ir.js.map +1 -1
  126. package/dist/ir/validate.js +47 -29
  127. package/dist/ir/validate.js.map +1 -1
  128. package/dist/ir/validate.test.js +20 -0
  129. package/dist/ir/validate.test.js.map +1 -1
  130. package/dist/native/toolchain.js +6 -3
  131. package/dist/native/toolchain.js.map +1 -1
  132. package/dist/native/toolchain.test.js +43 -5
  133. package/dist/native/toolchain.test.js.map +1 -1
  134. package/package.json +20 -20
  135. package/surface-manifest.json +1 -1
@@ -5,7 +5,7 @@ import { InternalCompilerError } from "../../errors.js";
5
5
  * methods with Node-exact forEach desugaring, iterator helpers, and indexed
6
6
  * record operations. */
7
7
  import * as ts from "../ts7/adapter.js";
8
- import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
8
+ import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, UNDEFINED_T, VOID, arrayOf, funcOf, isPrimitiveCollectionKey, isRefCounted, isSupportedArrayElem, isSupportedIndexValue, isUnitType, typeEquals } from "../../ir/ir.js";
9
9
  import { ARRAY_METHODS, COLLECTION_ITERATOR_METHODS, MAP_METHODS, SET_COMBINE_METHODS, SET_METHODS } from "./surfaces.js";
10
10
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
11
11
  import { forOfVarTarget, lowerDestructuringAssign } from "./lower-stmts.js";
@@ -3386,6 +3386,14 @@ export function lowerMapMethodCall(lowerer, call, access) {
3386
3386
  const v = receiverIr.value.kind === "dyn"
3387
3387
  ? lowerer.lowerCollectionKey(call.arguments[1], receiverIr.value)
3388
3388
  : lowerer.lowerExprExpecting(call.arguments[1], receiverIr.value);
3389
+ // A discarded set result needs no second receiver read or identity
3390
+ // owner. Keep the ordinary operand order: receiver, key, then value.
3391
+ let parent = call.parent;
3392
+ while (ts.isParenthesizedExpression(parent))
3393
+ parent = parent.parent;
3394
+ if (ts.isExpressionStatement(parent)) {
3395
+ return { kind: "mapIntrinsic", method: "set", receiver, args: [k, v], type: VOID, loc };
3396
+ }
3389
3397
  const slot = lowerer.declareHiddenLocal("%mapSetReceiver", receiver.type);
3390
3398
  const ref = varRef(slot.id, receiver.type, loc);
3391
3399
  return { kind: "seqExpr", stmts: [
@@ -5391,7 +5399,7 @@ export function lowerSetSeedNew(lowerer, node, setT) {
5391
5399
  }
5392
5400
  const seedType = lowerer.typeOf(node);
5393
5401
  const declared = lowerer.mapTypeOf(seedType);
5394
- const scalar = setT.elem.kind === "f64" || setT.elem.kind === "string";
5402
+ const scalar = isPrimitiveCollectionKey(setT.elem, setT.elem.kind === "union" ? lowerer.unions.get(setT.elem.unionId)?.arms : undefined);
5395
5403
  let source = !scalar && (declared?.kind === "array" || declared?.kind === "record")
5396
5404
  ? lowerer.lowerCollectionKey(node, declared)
5397
5405
  : lowerer.lowerExpr(node);
@@ -5448,7 +5456,7 @@ function setFromSeedValue(lowerer, source, setT, missing) {
5448
5456
  }
5449
5457
  let seed;
5450
5458
  if (source.type.kind === "set" && typeEquals(source.type, setT)) {
5451
- seed = { kind: "setIntrinsic", method: "toArray", receiver: source, args: [], type: arrayOf(setT.elem), loc };
5459
+ return { kind: "setIntrinsic", method: "clone", receiver: source, args: [], type: setT, loc };
5452
5460
  }
5453
5461
  else if (source.type.kind === "string" && setT.elem.kind === "string") {
5454
5462
  seed = strCharsCall(lowerer, source, loc);
@@ -5569,37 +5577,7 @@ export function mapFromSeedValue(lowerer, seed, mapT) {
5569
5577
  if (seed.type.kind === "map") {
5570
5578
  if (!typeEquals(seed.type, mapT))
5571
5579
  return null;
5572
- const key = `copy:${typeKey(mapT)}`;
5573
- let name = lowerer.mapHofHelpers.get(key);
5574
- if (!name) {
5575
- name = `%map.copy.${lowerer.mapHofHelpers.size}`;
5576
- lowerer.mapHofHelpers.set(key, name);
5577
- const source = varRef("source.0", mapT, loc);
5578
- const target = varRef("target.0", mapT, loc);
5579
- const index = varRef("i.0", F64, loc);
5580
- const read = (method, type) => ({
5581
- kind: "mapIntrinsic", method, receiver: source, args: method === "iterCount" ? [] : [index], type, loc,
5582
- });
5583
- lowerer.liftedFns.push({
5584
- name, params: [{ localId: "source.0", name: "source", type: mapT }], returnType: mapT,
5585
- locals: [
5586
- { id: "source.0", name: "source", type: mapT, mutable: false },
5587
- { id: "target.0", name: "target", type: mapT, mutable: false },
5588
- { id: "i.0", name: "i", type: F64, mutable: true },
5589
- ],
5590
- body: [
5591
- { kind: "varDecl", localId: "target.0", init: { kind: "mapNew", type: mapT, loc }, loc },
5592
- countedFor(loc, read("iterCount", F64), () => [{
5593
- kind: "if", cond: read("iterLive", BOOL), then: [{ kind: "exprStmt", expr: {
5594
- kind: "mapIntrinsic", method: "set", receiver: target,
5595
- args: [read("iterKey", mapT.key), read("iterValue", mapT.value)], type: VOID, loc,
5596
- }, loc }], else_: null, loc,
5597
- }]),
5598
- { kind: "return", value: target, loc },
5599
- ], loc,
5600
- });
5601
- }
5602
- return { kind: "call", callee: name, args: [seed], type: mapT, loc };
5580
+ return { kind: "mapIntrinsic", method: "clone", receiver: seed, args: [], type: mapT, loc };
5603
5581
  }
5604
5582
  if (seed.type.kind === "dyn" || seed.type.kind === "array" &&
5605
5583
  !(seed.type.elem.kind === "record" && lowerer.shapes.get(seed.type.elem.shapeId)?.tuple)) {