@scriptc/compiler 0.0.31 → 0.0.33
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 +1 -1
- package/dist/backend/cc-cache.test.js +308 -1
- package/dist/backend/cc-cache.test.js.map +1 -1
- package/dist/backend/cc.d.ts +17 -5
- package/dist/backend/cc.js +745 -75
- package/dist/backend/cc.js.map +1 -1
- package/dist/backend/emission/emit-exprs.js +53 -2
- package/dist/backend/emission/emit-exprs.js.map +1 -1
- package/dist/backend/emission/emitter.d.ts +12 -5
- package/dist/backend/emission/emitter.js +160 -22
- package/dist/backend/emission/emitter.js.map +1 -1
- package/dist/backend/emission/may-throw.js +7 -4
- package/dist/backend/emission/may-throw.js.map +1 -1
- package/dist/backend/ffi-callbacks.d.ts +38 -1
- package/dist/backend/ffi-callbacks.js +76 -3
- package/dist/backend/ffi-callbacks.js.map +1 -1
- package/dist/backend/llvm/emitter.js +243 -12
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +2 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/ffi/profile.d.ts +17 -5
- package/dist/ffi/profile.js +169 -22
- package/dist/ffi/profile.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +1 -0
- package/dist/frontend/lowering/lower-calls.js +89 -23
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +65 -19
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +12 -0
- package/dist/frontend/lowering/lowerer.js +20 -1
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/ts7/checker.d.ts +2 -0
- package/dist/frontend/ts7/checker.js +20 -3
- package/dist/frontend/ts7/checker.js.map +1 -1
- package/dist/frontend/types.d.ts +8 -0
- package/dist/frontend/types.js +33 -5
- package/dist/frontend/types.js.map +1 -1
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/nodes.d.ts +22 -9
- package/dist/ir/nodes.js +7 -1
- package/dist/ir/nodes.js.map +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/validate.js +74 -1
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/int-infer.js +7 -1
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/int-infer.test.js +73 -4
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/profile.d.ts +3 -0
- package/dist/library/profile.js +9 -1
- package/dist/library/profile.js.map +1 -1
- package/package.json +2 -2
- package/surface-manifest.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isFfiCallbackParam, MAY_THROW_ARR_METHODS, MAY_THROW_BYTES_METHODS, MAY_THROW_LIB_FNS } from "../../ir/nodes.js";
|
|
2
|
+
import { hasRetainedFfiCallback } from "../ffi-callbacks.js";
|
|
2
3
|
/** Cheap may-throw analysis (cost discipline: functions that transitively
|
|
3
4
|
* CANNOT throw pay for no pending-exception checks). A function may throw
|
|
4
5
|
* iff it contains a `throw`, calls a may-throw function (direct `call` or
|
|
@@ -23,6 +24,7 @@ export function computeMayThrow(mod) {
|
|
|
23
24
|
const callbackFfiImports = new Set((mod.ffiImports ?? [])
|
|
24
25
|
.filter((entry) => entry.params.some(isFfiCallbackParam))
|
|
25
26
|
.map((entry) => entry.name));
|
|
27
|
+
const manifestHasRetainedCallback = hasRetainedFfiCallback(mod.ffiImports ?? []);
|
|
26
28
|
// Method name → every class's implementation of it (virtualCall callees).
|
|
27
29
|
const methodImpls = new Map();
|
|
28
30
|
for (const cls of mod.classes ?? []) {
|
|
@@ -164,10 +166,11 @@ export function computeMayThrow(mod) {
|
|
|
164
166
|
f.throws = true;
|
|
165
167
|
break;
|
|
166
168
|
case "ffiCall":
|
|
167
|
-
// A
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
if (callbackFfiImports.has(rec["import"])
|
|
169
|
+
// A native callback may run arbitrary scriptc code. With retained
|
|
170
|
+
// descriptors any manifest binding may pump a previously stored
|
|
171
|
+
// callback, so every FFI call is conservatively a checkpoint.
|
|
172
|
+
if (callbackFfiImports.has(rec["import"]) ||
|
|
173
|
+
manifestHasRetainedCallback)
|
|
171
174
|
f.throws = true;
|
|
172
175
|
break;
|
|
173
176
|
case "bytesNew": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"may-throw.js","sourceRoot":"","sources":["../../../src/backend/emission/may-throw.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"may-throw.js","sourceRoot":"","sources":["../../../src/backend/emission/may-throw.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,48 @@
|
|
|
1
1
|
import type { IrFfiCallbackParam, IrFfiImport } from "../ir/nodes.js";
|
|
2
2
|
export interface FfiCallbackAdapter {
|
|
3
3
|
symbol: string;
|
|
4
|
-
/** Raw callbacks
|
|
4
|
+
/** Raw call-scoped callbacks borrow this thread-local slot. */
|
|
5
5
|
tls: string | null;
|
|
6
|
+
/** Raw retained callbacks occupy this process-global replaceable slot. */
|
|
7
|
+
global: string | null;
|
|
8
|
+
/** Every retained descriptor owns one counted registration table. */
|
|
9
|
+
table: string | null;
|
|
6
10
|
callback: IrFfiCallbackParam["callback"];
|
|
7
11
|
}
|
|
8
12
|
/** Allocate internal callback symbols outside the manifest's external
|
|
9
13
|
* symbol set. C and LLVM share this table so a valid native symbol can
|
|
10
14
|
* never collide with a generated trampoline or raw-callback TLS slot. */
|
|
11
15
|
export declare function allocateFfiCallbackAdapters(imports: readonly IrFfiImport[]): Map<string, FfiCallbackAdapter>;
|
|
16
|
+
/** The adapter-map key is `<binding>:<callback-id>`; a release descriptor
|
|
17
|
+
* carries the same key as its target. Binding names may themselves contain
|
|
18
|
+
* `:`; callback ids may not — split on the LAST separator. The single
|
|
19
|
+
* parser for every consumer (both emitters, twice each). */
|
|
20
|
+
export declare function parseFfiCallbackKey(key: string): {
|
|
21
|
+
binding: string;
|
|
22
|
+
id: string;
|
|
23
|
+
};
|
|
24
|
+
/** Whether any manifest binding declares a retained callback — the
|
|
25
|
+
* throw-checkpoint policy predicate (with retained descriptors ANY binding
|
|
26
|
+
* may pump a stored callback). Computed once per module by may-throw and
|
|
27
|
+
* each emitter; keep every consumer on this helper so the policy cannot
|
|
28
|
+
* drift between analysis and emission. */
|
|
29
|
+
export declare function hasRetainedFfiCallback(imports: readonly IrFfiImport[]): boolean;
|
|
30
|
+
/** Foreign callbacks install and hold the process event loop even when the
|
|
31
|
+
* source itself has no timer, async function, or other loop-backed surface. */
|
|
32
|
+
export declare function hasForeignFfiCallback(imports: readonly IrFfiImport[]): boolean;
|
|
33
|
+
/** One retained lifecycle operation of an FFI call: the registration table,
|
|
34
|
+
* the raw singleton trampoline slot (null for context-bearing descriptors),
|
|
35
|
+
* and the backend's value for the closure argument. */
|
|
36
|
+
export interface FfiRetainedOp<V> {
|
|
37
|
+
table: string;
|
|
38
|
+
global: string | null;
|
|
39
|
+
callback: V;
|
|
40
|
+
foreign: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** Collect a call's retained registrations and releases in manifest order —
|
|
43
|
+
* the lifecycle-policy walk shared by the C and LLVM emitters, so ordering
|
|
44
|
+
* fixes apply to both backends at once. */
|
|
45
|
+
export declare function collectFfiRetainedOps<V>(entry: IrFfiImport, callbackArgs: ReadonlyMap<string, V>, adapterFor: (binding: string, id: string) => FfiCallbackAdapter): {
|
|
46
|
+
registrations: FfiRetainedOp<V>[];
|
|
47
|
+
releases: FfiRetainedOp<V>[];
|
|
48
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isFfiCallbackParam, isFfiContextParam } from "../ir/nodes.js";
|
|
1
|
+
import { isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam } from "../ir/nodes.js";
|
|
2
2
|
/** Allocate internal callback symbols outside the manifest's external
|
|
3
3
|
* symbol set. C and LLVM share this table so a valid native symbol can
|
|
4
4
|
* never collide with a generated trampoline or raw-callback TLS slot. */
|
|
@@ -13,21 +13,94 @@ export function allocateFfiCallbackAdapters(imports) {
|
|
|
13
13
|
const hasContext = param.callback.params.some(isFfiContextParam);
|
|
14
14
|
let symbol;
|
|
15
15
|
let tls;
|
|
16
|
+
let global;
|
|
17
|
+
let table;
|
|
16
18
|
do {
|
|
17
19
|
const index = suffix++;
|
|
18
20
|
symbol = `sc_ffi_cb_${index}`;
|
|
19
|
-
tls = hasContext
|
|
20
|
-
|
|
21
|
+
tls = !hasContext && param.callback.lifetime === "call"
|
|
22
|
+
? `sc_ffi_cb_ctx_${index}`
|
|
23
|
+
: null;
|
|
24
|
+
global = !hasContext && param.callback.lifetime === "retained"
|
|
25
|
+
? `sc_ffi_cb_retained_${index}`
|
|
26
|
+
: null;
|
|
27
|
+
table = param.callback.lifetime === "retained"
|
|
28
|
+
? `sc_ffi_cb_table_${index}`
|
|
29
|
+
: null;
|
|
30
|
+
} while (reserved.has(symbol) ||
|
|
31
|
+
(tls !== null && reserved.has(tls)) ||
|
|
32
|
+
(global !== null && reserved.has(global)) ||
|
|
33
|
+
(table !== null && reserved.has(table)));
|
|
21
34
|
reserved.add(symbol);
|
|
22
35
|
if (tls !== null)
|
|
23
36
|
reserved.add(tls);
|
|
37
|
+
if (global !== null)
|
|
38
|
+
reserved.add(global);
|
|
39
|
+
if (table !== null)
|
|
40
|
+
reserved.add(table);
|
|
24
41
|
adapters.set(`${entry.name}:${param.callback.id}`, {
|
|
25
42
|
symbol,
|
|
26
43
|
tls,
|
|
44
|
+
global,
|
|
45
|
+
table,
|
|
27
46
|
callback: param.callback,
|
|
28
47
|
});
|
|
29
48
|
}
|
|
30
49
|
}
|
|
31
50
|
return adapters;
|
|
32
51
|
}
|
|
52
|
+
/** The adapter-map key is `<binding>:<callback-id>`; a release descriptor
|
|
53
|
+
* carries the same key as its target. Binding names may themselves contain
|
|
54
|
+
* `:`; callback ids may not — split on the LAST separator. The single
|
|
55
|
+
* parser for every consumer (both emitters, twice each). */
|
|
56
|
+
export function parseFfiCallbackKey(key) {
|
|
57
|
+
const split = key.lastIndexOf(":");
|
|
58
|
+
return { binding: key.slice(0, split), id: key.slice(split + 1) };
|
|
59
|
+
}
|
|
60
|
+
/** Whether any manifest binding declares a retained callback — the
|
|
61
|
+
* throw-checkpoint policy predicate (with retained descriptors ANY binding
|
|
62
|
+
* may pump a stored callback). Computed once per module by may-throw and
|
|
63
|
+
* each emitter; keep every consumer on this helper so the policy cannot
|
|
64
|
+
* drift between analysis and emission. */
|
|
65
|
+
export function hasRetainedFfiCallback(imports) {
|
|
66
|
+
return imports.some((entry) => entry.params.some((param) => isFfiCallbackParam(param) && param.callback.lifetime === "retained"));
|
|
67
|
+
}
|
|
68
|
+
/** Foreign callbacks install and hold the process event loop even when the
|
|
69
|
+
* source itself has no timer, async function, or other loop-backed surface. */
|
|
70
|
+
export function hasForeignFfiCallback(imports) {
|
|
71
|
+
return imports.some((entry) => entry.params.some((param) => isFfiCallbackParam(param) && param.callback.invoke === "foreign"));
|
|
72
|
+
}
|
|
73
|
+
/** Collect a call's retained registrations and releases in manifest order —
|
|
74
|
+
* the lifecycle-policy walk shared by the C and LLVM emitters, so ordering
|
|
75
|
+
* fixes apply to both backends at once. */
|
|
76
|
+
export function collectFfiRetainedOps(entry, callbackArgs, adapterFor) {
|
|
77
|
+
const registrations = [];
|
|
78
|
+
const releases = [];
|
|
79
|
+
for (const param of entry.params) {
|
|
80
|
+
if (isFfiCallbackParam(param) && param.callback.lifetime === "retained") {
|
|
81
|
+
const adapter = adapterFor(entry.name, param.callback.id);
|
|
82
|
+
if (adapter.table === null)
|
|
83
|
+
throw new Error("emitter bug: retained callback has no table");
|
|
84
|
+
registrations.push({
|
|
85
|
+
table: adapter.table,
|
|
86
|
+
global: adapter.global,
|
|
87
|
+
callback: callbackArgs.get(param.callback.id),
|
|
88
|
+
foreign: param.callback.invoke === "foreign",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else if (isFfiReleaseParam(param)) {
|
|
92
|
+
const { binding, id } = parseFfiCallbackKey(param.callback.release);
|
|
93
|
+
const adapter = adapterFor(binding, id);
|
|
94
|
+
if (adapter.table === null)
|
|
95
|
+
throw new Error("emitter bug: retained release has no table");
|
|
96
|
+
releases.push({
|
|
97
|
+
table: adapter.table,
|
|
98
|
+
global: adapter.global,
|
|
99
|
+
callback: callbackArgs.get(param.callback.release),
|
|
100
|
+
foreign: adapter.callback.invoke === "foreign",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { registrations, releases };
|
|
105
|
+
}
|
|
33
106
|
//# sourceMappingURL=ffi-callbacks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffi-callbacks.js","sourceRoot":"","sources":["../../src/backend/ffi-callbacks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ffi-callbacks.js","sourceRoot":"","sources":["../../src/backend/ffi-callbacks.ts"],"names":[],"mappings":"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"}
|