@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.
- package/ambient/scriptc-node-fallback.d.ts +200 -51
- package/dist/backend/c/async.d.ts +25 -0
- package/dist/backend/c/async.js +167 -0
- package/dist/backend/c/async.js.map +1 -1
- package/dist/backend/c/c-emitter.d.ts +10 -0
- package/dist/backend/c/c-emitter.js +14 -2
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.js +293 -51
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/types.js +2 -0
- package/dist/backend/c/types.js.map +1 -1
- package/dist/backend/link-plan.d.ts +2 -1
- package/dist/backend/link-plan.js +2 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/emitter.js +20 -6
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +8 -8
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
- package/dist/backend/llvm/expr-callbacks.js +125 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -2
- package/dist/backend/llvm/expr-dispatch.js +1 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +30 -9
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
- package/dist/backend/llvm/expr-primitives.test.js +38 -0
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +68 -10
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +18 -2
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +156 -6
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +36 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +23 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +3 -0
- package/dist/backend/native-toolchain.js +3 -1
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +28 -10
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/targets.d.ts +4 -0
- package/dist/backend/targets.js +13 -0
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +8 -1
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/coverage/surface-manifest.js +8 -0
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -0
- package/dist/executable/executable-cache.js +3 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/frontend/fork-target.d.ts +17 -0
- package/dist/frontend/fork-target.js +256 -0
- package/dist/frontend/fork-target.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
- package/dist/frontend/lowering/abstract-equality.js +250 -0
- package/dist/frontend/lowering/abstract-equality.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +71 -2
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +50 -23
- package/dist/frontend/lowering/lower-builtins.js +939 -106
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +29 -21
- package/dist/frontend/lowering/lower-calls.js +573 -121
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +39 -8
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +150 -0
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +212 -21
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +135 -83
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
- package/dist/frontend/lowering/lower-inspect.js +1 -1
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +6 -3
- package/dist/frontend/lowering/lower-island.js +165 -6
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +6 -0
- package/dist/frontend/lowering/lower-modules.js +184 -38
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +7 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +1 -1
- package/dist/frontend/lowering/lower-server.js +130 -27
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +118 -15
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +3 -0
- package/dist/frontend/lowering/lower-stream.js +7 -0
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +86 -9
- package/dist/frontend/lowering/lowerer.js +412 -72
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +26 -0
- package/dist/frontend/lowering/surfaces.js +140 -77
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-declarations.d.ts +4 -0
- package/dist/frontend/npm-static-declarations.js +56 -0
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +23 -2
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static.js +6 -5
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +15 -3
- package/dist/frontend/npm.js +80 -8
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +76 -9
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/program.js +92 -10
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +6 -0
- package/dist/frontend/resolve.js +7 -4
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +5 -0
- package/dist/frontend/type-mapper.js +64 -24
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/ir/ir.d.ts +93 -47
- package/dist/ir/ir.js +63 -4
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +14 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.js +165 -13
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-cache.test.js.map +1 -1
- package/package.json +17 -17
- 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-
|