@scriptc/compiler 0.1.3 → 0.1.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 (147) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +200 -51
  2. package/dist/backend/c/async.d.ts +25 -0
  3. package/dist/backend/c/async.js +167 -0
  4. package/dist/backend/c/async.js.map +1 -1
  5. package/dist/backend/c/c-emitter.d.ts +10 -0
  6. package/dist/backend/c/c-emitter.js +14 -2
  7. package/dist/backend/c/c-emitter.js.map +1 -1
  8. package/dist/backend/c/exprs.js +293 -51
  9. package/dist/backend/c/exprs.js.map +1 -1
  10. package/dist/backend/c/types.js +2 -0
  11. package/dist/backend/c/types.js.map +1 -1
  12. package/dist/backend/link-plan.d.ts +2 -1
  13. package/dist/backend/link-plan.js +2 -1
  14. package/dist/backend/link-plan.js.map +1 -1
  15. package/dist/backend/llvm/emitter.js +20 -6
  16. package/dist/backend/llvm/emitter.js.map +1 -1
  17. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  18. package/dist/backend/llvm/expr-bytes.js +8 -8
  19. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  20. package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
  21. package/dist/backend/llvm/expr-callbacks.js +125 -0
  22. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  23. package/dist/backend/llvm/expr-context.d.ts +14 -2
  24. package/dist/backend/llvm/expr-dispatch.js +1 -0
  25. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  26. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  27. package/dist/backend/llvm/expr-primitives.js +30 -9
  28. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  29. package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
  30. package/dist/backend/llvm/expr-primitives.test.js +38 -0
  31. package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
  32. package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
  33. package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
  34. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  35. package/dist/backend/llvm/lib-filesystem.js +68 -10
  36. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  37. package/dist/backend/llvm/lib-network.js +18 -2
  38. package/dist/backend/llvm/lib-network.js.map +1 -1
  39. package/dist/backend/llvm/lib-process.js +156 -6
  40. package/dist/backend/llvm/lib-process.js.map +1 -1
  41. package/dist/backend/llvm/lib-shared.js +36 -0
  42. package/dist/backend/llvm/lib-shared.js.map +1 -1
  43. package/dist/backend/llvm/lib-stream.js +23 -0
  44. package/dist/backend/llvm/lib-stream.js.map +1 -1
  45. package/dist/backend/native-toolchain.d.ts +3 -0
  46. package/dist/backend/native-toolchain.js +3 -1
  47. package/dist/backend/native-toolchain.js.map +1 -1
  48. package/dist/backend/runtime-pack.test.js +28 -10
  49. package/dist/backend/runtime-pack.test.js.map +1 -1
  50. package/dist/backend/targets.d.ts +4 -0
  51. package/dist/backend/targets.js +13 -0
  52. package/dist/backend/targets.js.map +1 -1
  53. package/dist/backend/targets.test.js +8 -1
  54. package/dist/backend/targets.test.js.map +1 -1
  55. package/dist/coverage/surface-manifest.js +8 -0
  56. package/dist/coverage/surface-manifest.js.map +1 -1
  57. package/dist/diagnostics/diagnostic.js +1 -1
  58. package/dist/diagnostics/diagnostic.js.map +1 -1
  59. package/dist/executable/executable-cache.d.ts +2 -0
  60. package/dist/executable/executable-cache.js +3 -0
  61. package/dist/executable/executable-cache.js.map +1 -1
  62. package/dist/frontend/fork-target.d.ts +17 -0
  63. package/dist/frontend/fork-target.js +256 -0
  64. package/dist/frontend/fork-target.js.map +1 -0
  65. package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
  66. package/dist/frontend/lowering/abstract-equality.js +250 -0
  67. package/dist/frontend/lowering/abstract-equality.js.map +1 -0
  68. package/dist/frontend/lowering/lower-assert.js +71 -2
  69. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  70. package/dist/frontend/lowering/lower-builtins.d.ts +50 -23
  71. package/dist/frontend/lowering/lower-builtins.js +939 -106
  72. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  73. package/dist/frontend/lowering/lower-calls.d.ts +29 -21
  74. package/dist/frontend/lowering/lower-calls.js +573 -121
  75. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  76. package/dist/frontend/lowering/lower-classes.js +39 -8
  77. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  78. package/dist/frontend/lowering/lower-containers.js +150 -0
  79. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  80. package/dist/frontend/lowering/lower-event-emitter.js +212 -21
  81. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  82. package/dist/frontend/lowering/lower-exprs.js +135 -83
  83. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  84. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  85. package/dist/frontend/lowering/lower-inspect.js +1 -1
  86. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  87. package/dist/frontend/lowering/lower-island.d.ts +6 -3
  88. package/dist/frontend/lowering/lower-island.js +165 -6
  89. package/dist/frontend/lowering/lower-island.js.map +1 -1
  90. package/dist/frontend/lowering/lower-modules.d.ts +6 -0
  91. package/dist/frontend/lowering/lower-modules.js +184 -38
  92. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  93. package/dist/frontend/lowering/lower-namespaces.js +7 -0
  94. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  95. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  96. package/dist/frontend/lowering/lower-server.js +130 -27
  97. package/dist/frontend/lowering/lower-server.js.map +1 -1
  98. package/dist/frontend/lowering/lower-stmts.js +118 -15
  99. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  100. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  101. package/dist/frontend/lowering/lower-stream.js +7 -0
  102. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  103. package/dist/frontend/lowering/lowerer.d.ts +86 -9
  104. package/dist/frontend/lowering/lowerer.js +412 -72
  105. package/dist/frontend/lowering/lowerer.js.map +1 -1
  106. package/dist/frontend/lowering/surfaces.d.ts +26 -0
  107. package/dist/frontend/lowering/surfaces.js +140 -77
  108. package/dist/frontend/lowering/surfaces.js.map +1 -1
  109. package/dist/frontend/npm-static-declarations.d.ts +4 -0
  110. package/dist/frontend/npm-static-declarations.js +56 -0
  111. package/dist/frontend/npm-static-declarations.js.map +1 -1
  112. package/dist/frontend/npm-static-declarations.test.js +23 -2
  113. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  114. package/dist/frontend/npm-static.js +6 -5
  115. package/dist/frontend/npm-static.js.map +1 -1
  116. package/dist/frontend/npm.d.ts +15 -3
  117. package/dist/frontend/npm.js +80 -8
  118. package/dist/frontend/npm.js.map +1 -1
  119. package/dist/frontend/npm.test.js +76 -9
  120. package/dist/frontend/npm.test.js.map +1 -1
  121. package/dist/frontend/program.js +92 -10
  122. package/dist/frontend/program.js.map +1 -1
  123. package/dist/frontend/resolve.d.ts +6 -0
  124. package/dist/frontend/resolve.js +7 -4
  125. package/dist/frontend/resolve.js.map +1 -1
  126. package/dist/frontend/type-mapper.d.ts +5 -0
  127. package/dist/frontend/type-mapper.js +64 -24
  128. package/dist/frontend/type-mapper.js.map +1 -1
  129. package/dist/index.d.ts +5 -0
  130. package/dist/index.js +24 -3
  131. package/dist/index.js.map +1 -1
  132. package/dist/ir/ir.d.ts +93 -47
  133. package/dist/ir/ir.js +63 -4
  134. package/dist/ir/ir.js.map +1 -1
  135. package/dist/ir/ir.test.js +14 -1
  136. package/dist/ir/ir.test.js.map +1 -1
  137. package/dist/ir/serialize.d.ts +1 -1
  138. package/dist/ir/serialize.js +1 -1
  139. package/dist/ir/serialize.js.map +1 -1
  140. package/dist/ir/validate.js +165 -13
  141. package/dist/ir/validate.js.map +1 -1
  142. package/dist/library/int-infer.test.js +4 -4
  143. package/dist/library/int-infer.test.js.map +1 -1
  144. package/dist/library/library-cache.test.js +5 -5
  145. package/dist/library/library-cache.test.js.map +1 -1
  146. package/package.json +17 -17
  147. package/surface-manifest.json +132 -38
@@ -95,6 +95,11 @@ export function lowerArrayMethodCall(lowerer, call, access) {
95
95
  probedUntyped = true;
96
96
  }
97
97
  }
98
+ if (receiverIr?.kind === "union") {
99
+ const unionHof = lowerArrayUnionHofCall(lowerer, call, access, receiverIr);
100
+ if (unionHof)
101
+ return unionHof;
102
+ }
98
103
  if (receiverIr?.kind !== "array")
99
104
  return null;
100
105
  if (!probedUntyped && !lowerer.isStdlibMember(access))
@@ -828,6 +833,18 @@ function hofCallbackArg(lowerer, argNode, lead, arrT, bindUntyped = false) {
828
833
  }
829
834
  lowerer.implicitParamTypes = previousImplicit;
830
835
  }
836
+ // Array storage widens indexed reads with undefined so holes remain
837
+ // observable. The HOF helper guards every callback behind arrayHas,
838
+ // so an exact-ABI builtin closure may safely adapt from its declared
839
+ // parameter to that guarded union. Keep this exception scoped to the
840
+ // compiler-generated builtin values; ordinary callback-value policy is
841
+ // unchanged.
842
+ if (fnArg.type.kind === "func" && lowerer.isBuiltinCallableValue(fnArg)) {
843
+ const callbackType = funcOf(full.slice(0, fnArg.type.params.length), fnArg.type.ret);
844
+ if (!typeEquals(fnArg.type, callbackType)) {
845
+ fnArg = lowerer.coerceToExpected(fnArg, callbackType);
846
+ }
847
+ }
831
848
  if (fnArg.type.kind !== "func" ||
832
849
  fnArg.type.params.length > full.length ||
833
850
  !fnArg.type.params.every((p, i) => typeEquals(p, full[i]))) {
@@ -1043,6 +1060,139 @@ function arrayHofHelper(lowerer, method, elem, fnRet, arity, loc, outElem = fnRe
1043
1060
  lowerer.liftedFns.push(buildArrayHofFn(lowerer, name, method, elem, fnRet, arity, loc, outElem));
1044
1061
  return name;
1045
1062
  }
1063
+ /** The TS 5.2+ callable-union array rule: a `T[] | U[]` receiver exposes
1064
+ * common HOFs with a callback over `T | U`. The runtime value remains the
1065
+ * original concrete array arm — never a copied `(T | U)[]` — and an
1066
+ * arm-specific function adapter wraps the element and receiver arguments
1067
+ * into the union-wide callback ABI. That preserves sparse-array reads,
1068
+ * callback mutation, and the callback's third-argument identity. */
1069
+ function lowerArrayUnionHofCall(lowerer, call, access, receiverT) {
1070
+ const method = access.name.text;
1071
+ if (method !== "map" && method !== "forEach")
1072
+ return null;
1073
+ if (!lowerer.isStdlibMember(access))
1074
+ return null;
1075
+ const def = lowerer.unions.get(receiverT.unionId);
1076
+ if (!def || def.arms.length < 2 || !def.arms.every((arm) => arm.kind === "array"))
1077
+ return null;
1078
+ if (call.arguments.length !== 1 || !call.arguments[0])
1079
+ return null;
1080
+ const arrays = def.arms;
1081
+ const valueArms = [];
1082
+ const addValueArm = (type) => {
1083
+ if (type.kind === "dyn" || type.kind === "jsval" || type.kind === "caught" || type.kind === "void")
1084
+ return false;
1085
+ if (type.kind === "union") {
1086
+ const inner = lowerer.unions.get(type.unionId);
1087
+ if (!inner)
1088
+ return false;
1089
+ for (const arm of inner.arms) {
1090
+ if (!valueArms.some((candidate) => typeEquals(candidate, arm)))
1091
+ valueArms.push(arm);
1092
+ }
1093
+ return true;
1094
+ }
1095
+ if (!valueArms.some((candidate) => typeEquals(candidate, type)))
1096
+ valueArms.push(type);
1097
+ return true;
1098
+ };
1099
+ for (const array of arrays) {
1100
+ if (!addValueArm(array.elem))
1101
+ return null;
1102
+ }
1103
+ const valueT = valueArms.length === 1
1104
+ ? valueArms[0]
1105
+ : { kind: "union", unionId: lowerer.unions.intern(valueArms) };
1106
+ const argNode = call.arguments[0];
1107
+ const { fnArg, arity } = hofCallbackArg(lowerer, argNode, [valueT], receiverT);
1108
+ const fnRet = fnArg.type.ret;
1109
+ if (method === "map" && (fnRet.kind === "void" || fnRet.kind === "func")) {
1110
+ lowerer.badType(call, lowerer.typeOf(call));
1111
+ }
1112
+ if (method === "map")
1113
+ fenceProducedArrayElem(lowerer, call, "'.map()'", fnRet);
1114
+ const outElem = method === "map" ? callbackArrayElem(lowerer, call, fnRet) : VOID;
1115
+ const resultT = method === "map" ? arrayOf(outElem) : VOID;
1116
+ for (const array of arrays) {
1117
+ const armFnT = funcOf([arrayValueType(lowerer, array.elem), F64, array].slice(0, arity), fnRet);
1118
+ if (!lowerer.cleanFuncAdaptable(fnArg.type, armFnT))
1119
+ return null;
1120
+ }
1121
+ const helper = arrayUnionHofHelper(lowerer, method, receiverT, arrays, fnArg.type, arity, fnRet, outElem, locOf(call));
1122
+ return {
1123
+ kind: "call",
1124
+ callee: helper,
1125
+ args: [lowerer.coerceInto(access.expression, lowerer.lowerExpr(access.expression), receiverT), fnArg],
1126
+ type: resultT,
1127
+ loc: locOf(call),
1128
+ };
1129
+ }
1130
+ function arrayUnionHofHelper(lowerer, method, receiverT, arrays, callbackT, arity, fnRet, outElem, loc) {
1131
+ const resultT = method === "map" ? arrayOf(outElem) : VOID;
1132
+ const key = `union:${method}:${receiverT.unionId}:${typeKey(callbackT)}:${typeKey(resultT)}`;
1133
+ const existing = lowerer.arrHofHelpers.get(key);
1134
+ if (existing)
1135
+ return existing;
1136
+ const name = `%arr.union.${lowerer.arrHofHelpers.size}`;
1137
+ lowerer.arrHofHelpers.set(key, name);
1138
+ const receiver = varRef("a.0", receiverT, loc);
1139
+ const callback = varRef("f.0", callbackT, loc);
1140
+ const branch = (array) => {
1141
+ const tag = lowerer.armTag(receiverT.unionId, array);
1142
+ const concrete = {
1143
+ kind: "unionNarrow",
1144
+ unionId: receiverT.unionId,
1145
+ tag,
1146
+ value: receiver,
1147
+ type: array,
1148
+ loc,
1149
+ };
1150
+ const armFnT = funcOf([arrayValueType(lowerer, array.elem), F64, array].slice(0, arity), fnRet);
1151
+ const adapted = lowerer.coerceToExpected(callback, armFnT);
1152
+ if (!typeEquals(adapted.type, armFnT)) {
1153
+ throw new InternalCompilerError("lowerer bug: union-array callback stopped adapting");
1154
+ }
1155
+ const callee = arrayHofHelper(lowerer, method, array.elem, fnRet, arity, loc, outElem);
1156
+ const invoke = { kind: "call", callee, args: [concrete, adapted], type: resultT, loc };
1157
+ return resultT.kind === "void"
1158
+ ? [{ kind: "exprStmt", expr: invoke, loc }, { kind: "return", value: null, loc }]
1159
+ : [{ kind: "return", value: invoke, loc }];
1160
+ };
1161
+ let body = branch(arrays[arrays.length - 1]);
1162
+ for (let i = arrays.length - 2; i >= 0; i--) {
1163
+ const array = arrays[i];
1164
+ body = [{
1165
+ kind: "if",
1166
+ cond: {
1167
+ kind: "unionIsTag",
1168
+ unionId: receiverT.unionId,
1169
+ tag: lowerer.armTag(receiverT.unionId, array),
1170
+ negated: false,
1171
+ value: receiver,
1172
+ type: BOOL,
1173
+ loc,
1174
+ },
1175
+ then: branch(array),
1176
+ else_: body,
1177
+ loc,
1178
+ }];
1179
+ }
1180
+ lowerer.liftedFns.push({
1181
+ name,
1182
+ params: [
1183
+ { localId: "a.0", name: "a", type: receiverT },
1184
+ { localId: "f.0", name: "f", type: callbackT },
1185
+ ],
1186
+ returnType: resultT,
1187
+ locals: [
1188
+ { id: "a.0", name: "a", type: receiverT, mutable: false },
1189
+ { id: "f.0", name: "f", type: callbackT, mutable: false },
1190
+ ],
1191
+ body,
1192
+ loc,
1193
+ });
1194
+ return name;
1195
+ }
1046
1196
  /** READ-ONLY array methods on TUPLE receivers — `t.slice(...)` and
1047
1197
  * `t.map(f)`: a tuple is a fixed-shape record, but these methods never
1048
1198
  * write, so the positions snapshot into a fresh array (the for-of-over-