@scriptc/compiler 0.3.1 → 0.3.2
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 +342 -16
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/literals.d.ts +7 -0
- package/dist/backend/literals.js +32 -0
- package/dist/backend/literals.js.map +1 -1
- package/dist/backend/literals.test.js +17 -1
- package/dist/backend/literals.test.js.map +1 -1
- package/dist/backend/llvm/alloc.d.ts +15 -4
- package/dist/backend/llvm/alloc.js +39 -15
- package/dist/backend/llvm/alloc.js.map +1 -1
- package/dist/backend/llvm/alloc.test.js +15 -1
- package/dist/backend/llvm/alloc.test.js.map +1 -1
- package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
- package/dist/backend/llvm/appended-array-literals.js +109 -0
- package/dist/backend/llvm/appended-array-literals.js.map +1 -0
- package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
- package/dist/backend/llvm/appended-array-literals.test.js +90 -0
- package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
- package/dist/backend/llvm/call-lifetimes.js +51 -3
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/classes.js +10 -2
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/classes.test.js +2 -2
- package/dist/backend/llvm/dense-array-access.js +17 -12
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.test.js +15 -2
- package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +2 -0
- package/dist/backend/llvm/dyn.js +11 -2
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +43 -2
- package/dist/backend/llvm/emitter.js +306 -32
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +122 -6
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
- package/dist/backend/llvm/expr-callbacks.js +81 -1
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +12 -1
- package/dist/backend/llvm/expr-calls.js +126 -54
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +7 -0
- package/dist/backend/llvm/expr-containers.js +38 -7
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +2 -0
- package/dist/backend/llvm/expr-control.d.ts +8 -0
- package/dist/backend/llvm/expr-control.js +103 -69
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +2 -2
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +7 -0
- package/dist/backend/llvm/expr-primitives.js +30 -26
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +11 -1
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
- package/dist/backend/llvm/expr-stream-bridges.js +77 -8
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js +49 -1
- package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
- package/dist/backend/llvm/int32-abi.d.ts +18 -2
- package/dist/backend/llvm/int32-abi.js +23 -2
- package/dist/backend/llvm/int32-abi.js.map +1 -1
- package/dist/backend/llvm/int32-abi.test.js +75 -1
- package/dist/backend/llvm/int32-abi.test.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +7 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +58 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +76 -9
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +5 -3
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.d.ts +24 -2
- package/dist/backend/llvm/local-union-storage.js +127 -12
- package/dist/backend/llvm/local-union-storage.js.map +1 -1
- package/dist/backend/llvm/local-union-storage.test.js +106 -1
- package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
- package/dist/backend/llvm/record-results.d.ts +26 -0
- package/dist/backend/llvm/record-results.js +252 -0
- package/dist/backend/llvm/record-results.js.map +1 -0
- package/dist/backend/llvm/reference-effects.js +2 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -1
- package/dist/backend/llvm/reference-writes.js +15 -9
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +67 -0
- package/dist/backend/llvm/regions.js +309 -0
- package/dist/backend/llvm/regions.js.map +1 -0
- package/dist/backend/llvm/regions.test.d.ts +1 -0
- package/dist/backend/llvm/regions.test.js +173 -0
- package/dist/backend/llvm/regions.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +34 -7
- package/dist/backend/llvm/shapes.js +31 -16
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +7 -6
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/split-loops.js +1 -1
- package/dist/backend/llvm/split-loops.js.map +1 -1
- package/dist/backend/llvm/stack-objects.d.ts +29 -0
- package/dist/backend/llvm/stack-objects.js +130 -0
- package/dist/backend/llvm/stack-objects.js.map +1 -0
- package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
- package/dist/backend/llvm/stack-objects.test.js +252 -0
- package/dist/backend/llvm/stack-objects.test.js.map +1 -0
- package/dist/backend/llvm/string-reads.d.ts +4 -1
- package/dist/backend/llvm/string-reads.js +89 -9
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/switch-dispatch.js +5 -4
- package/dist/backend/llvm/switch-dispatch.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +2 -0
- package/dist/backend/llvm/walkers.js +4 -2
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +1 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -0
- package/dist/backend/native/executable.js +16 -1
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/library.js +1 -1
- package/dist/backend/native/library.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +2 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +1 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-core.d.ts +1 -0
- package/dist/backend/runtime-pack-core.js +1 -0
- package/dist/backend/runtime-pack-core.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.test.js +1 -1
- package/dist/backend/target-diagnostics.js +14 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/target-diagnostics.test.js +13 -0
- package/dist/backend/target-diagnostics.test.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +12 -0
- package/dist/frontend/experimental-import.js +63 -0
- package/dist/frontend/experimental-import.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
- package/dist/frontend/lowering/builtin-calls.js +36 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/console.d.ts +16 -6
- package/dist/frontend/lowering/builtins/console.js +33 -9
- package/dist/frontend/lowering/builtins/console.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +20 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/json.d.ts +2 -2
- package/dist/frontend/lowering/builtins/json.js +13 -4
- package/dist/frontend/lowering/builtins/json.js.map +1 -1
- package/dist/frontend/lowering/builtins/module-calls.js +16 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
- package/dist/frontend/lowering/builtins/numbers.js +17 -0
- package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
- package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
- package/dist/frontend/lowering/builtins/operating-system.js +361 -1
- package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +15 -3
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/promises.js +109 -2
- package/dist/frontend/lowering/builtins/promises.js.map +1 -1
- package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
- package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
- package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
- package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
- package/dist/frontend/lowering/checked-promise-all.js +52 -6
- package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -3
- package/dist/frontend/lowering/class-dynamic-dispatch.js +54 -31
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/containers/array-callbacks.js +34 -4
- package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
- package/dist/frontend/lowering/containers/array-construction.js +8 -4
- package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js +1 -1
- package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +91 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
- package/dist/frontend/lowering/cycle-initialization.js +166 -12
- package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
- package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
- package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
- package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +5 -56
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
- package/dist/frontend/lowering/generator-delegation.js +231 -10
- package/dist/frontend/lowering/generator-delegation.js.map +1 -1
- package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
- package/dist/frontend/lowering/lifetime-regions.js +216 -0
- package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
- package/dist/frontend/lowering/lower-array-sort.d.ts +28 -2
- package/dist/frontend/lowering/lower-array-sort.js +100 -3
- package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
- package/dist/frontend/lowering/lower-array-sort.test.js +99 -2
- package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +72 -102
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +4 -3
- package/dist/frontend/lowering/lower-classes.js +116 -2
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-console.d.ts +13 -0
- package/dist/frontend/lowering/lower-console.js +460 -4
- package/dist/frontend/lowering/lower-console.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
- package/dist/frontend/lowering/lower-event-emitter.js +124 -38
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +137 -22
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-generators.d.ts +15 -7
- package/dist/frontend/lowering/lower-generators.js +183 -99
- package/dist/frontend/lowering/lower-generators.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
- package/dist/frontend/lowering/lower-inspect.js +119 -18
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +20 -14
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
- package/dist/frontend/lowering/lower-stdlib.js +35 -1
- package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +66 -11
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +22 -1
- package/dist/frontend/lowering/lowerer.js +116 -8
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
- package/dist/frontend/lowering/regex-span-reads.js +164 -0
- package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
- package/dist/frontend/lowering/surfaces.js +112 -10
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
- package/dist/frontend/lowering/var-hoisting.js +261 -0
- package/dist/frontend/lowering/var-hoisting.js.map +1 -0
- package/dist/frontend/pipeline.js +5 -3
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.d.ts +3 -2
- package/dist/frontend/program.js +23 -5
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.js +13 -0
- package/dist/frontend/program.test.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +13 -1
- package/dist/frontend/type-mapper.js +146 -13
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/builtin-effects.js +29 -2
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +145 -15
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/function-references.test.js +1 -0
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/int32-slots.js +1 -0
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/intrinsic-signatures.js +2 -0
- package/dist/ir/intrinsic-signatures.js.map +1 -1
- package/dist/ir/ir.d.ts +65 -20
- package/dist/ir/ir.js +5 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/runtime-features.d.ts +1 -0
- package/dist/ir/runtime-features.js +35 -1
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/scalar-records.js +1 -2
- package/dist/ir/scalar-records.js.map +1 -1
- package/dist/ir/validate.js +150 -25
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +65 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +159 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type IrFunction } from "../../ir/ir.js";
|
|
2
|
+
import type { Lowerer } from "./lowerer.js";
|
|
3
|
+
/** Captures that need no string. An execGroups or matchGroups result
|
|
4
|
+
* (execResultCaptureMask's const binding) whose capture k is read only by
|
|
5
|
+
* strict comparisons with a string literal, Number() and parseInt() lets
|
|
6
|
+
* the runtime keep capture k as a span of the subject: those reads become
|
|
7
|
+
* regex.groupEquals/groupNumber/groupParseInt and the match becomes
|
|
8
|
+
* execSpans (or matchGroups) with the lazy mask. The pass reads the
|
|
9
|
+
* lowered IR, so it sees every read: any other read of capture k keeps k a
|
|
10
|
+
* string, and any use of the binding it cannot attribute to a capture
|
|
11
|
+
* leaves the whole result unchanged. */
|
|
12
|
+
export declare function foldRegexSpanReads(lowerer: Lowerer, fn: IrFunction): void;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { numLit } from "../../ir/build.js";
|
|
2
|
+
import { BOOL, F64, STRING, typeKey, } from "../../ir/ir.js";
|
|
3
|
+
import { everyExprChild, everyStmtChild, transformStmtList } from "../../ir/traverse.js";
|
|
4
|
+
/** Captures that need no string. An execGroups or matchGroups result
|
|
5
|
+
* (execResultCaptureMask's const binding) whose capture k is read only by
|
|
6
|
+
* strict comparisons with a string literal, Number() and parseInt() lets
|
|
7
|
+
* the runtime keep capture k as a span of the subject: those reads become
|
|
8
|
+
* regex.groupEquals/groupNumber/groupParseInt and the match becomes
|
|
9
|
+
* execSpans (or matchGroups) with the lazy mask. The pass reads the
|
|
10
|
+
* lowered IR, so it sees every read: any other read of capture k keeps k a
|
|
11
|
+
* string, and any use of the binding it cannot attribute to a capture
|
|
12
|
+
* leaves the whole result unchanged. */
|
|
13
|
+
export function foldRegexSpanReads(lowerer, fn) {
|
|
14
|
+
const candidates = new Map();
|
|
15
|
+
const assigned = new Set();
|
|
16
|
+
const findStmt = (stmt) => {
|
|
17
|
+
// A non-literal receiver is saved first: the call is a sequence result.
|
|
18
|
+
const init = stmt.kind !== "varDecl" ? null : stmt.init?.kind === "seqExpr" ? stmt.init.result : stmt.init;
|
|
19
|
+
if (stmt.kind === "varDecl" &&
|
|
20
|
+
init?.kind === "regexIntrinsic" &&
|
|
21
|
+
(init.method === "execGroups" || init.method === "matchGroups")) {
|
|
22
|
+
candidates.set(stmt.localId, {
|
|
23
|
+
match: init,
|
|
24
|
+
folds: new Map(),
|
|
25
|
+
strings: new Set(),
|
|
26
|
+
rejected: candidates.has(stmt.localId),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (stmt.kind === "assign")
|
|
30
|
+
assigned.add(stmt.localId);
|
|
31
|
+
return everyStmtChild(stmt, findExpr, findStmt);
|
|
32
|
+
};
|
|
33
|
+
const findExpr = (expr) => everyExprChild(expr, findExpr, findStmt);
|
|
34
|
+
fn.body.every(findStmt);
|
|
35
|
+
if (candidates.size === 0)
|
|
36
|
+
return;
|
|
37
|
+
for (const id of assigned)
|
|
38
|
+
candidates.delete(id);
|
|
39
|
+
const stringIndexHelper = lowerer.arrHofHelpers.get(`idxOr:${typeKey(STRING)}`);
|
|
40
|
+
/** `m[k]` as lowered: the optional element read of the narrowed result
|
|
41
|
+
* (or, for `m[k]!`, the dense read). */
|
|
42
|
+
const captureRead = (expr) => {
|
|
43
|
+
let result;
|
|
44
|
+
let index;
|
|
45
|
+
if (expr.kind === "call" && expr.callee === stringIndexHelper && expr.args.length === 2)
|
|
46
|
+
[result, index] = expr.args;
|
|
47
|
+
else if (expr.kind === "arrayGet")
|
|
48
|
+
({ arr: result, index } = expr);
|
|
49
|
+
else
|
|
50
|
+
return null;
|
|
51
|
+
if (result?.kind !== "unionNarrow" ||
|
|
52
|
+
result.value.kind !== "varRef" ||
|
|
53
|
+
index?.kind !== "numLit" ||
|
|
54
|
+
!Number.isInteger(index.value) ||
|
|
55
|
+
index.value < 0 ||
|
|
56
|
+
index.value >= 53)
|
|
57
|
+
return null;
|
|
58
|
+
return { local: result.value.localId, use: { index: index.value, result } };
|
|
59
|
+
};
|
|
60
|
+
/** The capture read a foldable consumer takes, and its other operands. */
|
|
61
|
+
const foldable = (expr) => {
|
|
62
|
+
if (expr.kind === "unionEq" && !expr.sameValue) {
|
|
63
|
+
if (isLiteral(expr.right))
|
|
64
|
+
return { read: expr.left, rest: [] };
|
|
65
|
+
if (isLiteral(expr.left))
|
|
66
|
+
return { read: expr.right, rest: [] };
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (expr.kind === "libCall" &&
|
|
70
|
+
expr.fn === "dyn.numberConstructor" &&
|
|
71
|
+
expr.args[0]?.kind === "dynFrom")
|
|
72
|
+
return { read: expr.args[0].value, rest: [] };
|
|
73
|
+
if (expr.kind === "call" &&
|
|
74
|
+
expr.args.length === 2 &&
|
|
75
|
+
expr.args[0].type.kind === "union" &&
|
|
76
|
+
expr.callee === lowerer.valueHelpers.get(`parseInt.optional:${expr.args[0].type.unionId}`))
|
|
77
|
+
return { read: expr.args[0], rest: [expr.args[1]] };
|
|
78
|
+
return null;
|
|
79
|
+
};
|
|
80
|
+
const visitExpr = (expr, parent) => {
|
|
81
|
+
const fold = foldable(expr);
|
|
82
|
+
const folded = fold && fold.read.kind === "call" ? captureRead(fold.read) : null;
|
|
83
|
+
const candidate = folded && candidates.get(folded.local);
|
|
84
|
+
if (fold && folded && candidate) {
|
|
85
|
+
candidate.folds.set(expr, folded.use);
|
|
86
|
+
for (const operand of fold.rest)
|
|
87
|
+
visitExpr(operand, expr);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
const read = captureRead(expr);
|
|
91
|
+
const reader = read && candidates.get(read.local);
|
|
92
|
+
if (read && reader) {
|
|
93
|
+
reader.strings.add(read.use.index);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
if (expr.kind === "varRef") {
|
|
97
|
+
const use = candidates.get(expr.localId);
|
|
98
|
+
// Null tests are the only other use the binding may have.
|
|
99
|
+
if (use && parent?.kind !== "unionIsTag")
|
|
100
|
+
use.rejected = true;
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return everyExprChild(expr, (child) => visitExpr(child, expr), (stmt) => visitStmt(stmt));
|
|
104
|
+
};
|
|
105
|
+
const visitStmt = (stmt) => everyStmtChild(stmt, (child) => visitExpr(child, null), visitStmt);
|
|
106
|
+
fn.body.every(visitStmt);
|
|
107
|
+
const rewrites = new Map();
|
|
108
|
+
for (const candidate of candidates.values()) {
|
|
109
|
+
if (candidate.rejected)
|
|
110
|
+
continue;
|
|
111
|
+
let lazy = 0;
|
|
112
|
+
const lazyIndices = new Set();
|
|
113
|
+
for (const use of candidate.folds.values()) {
|
|
114
|
+
if (!candidate.strings.has(use.index) && !lazyIndices.has(use.index)) {
|
|
115
|
+
lazyIndices.add(use.index);
|
|
116
|
+
lazy += 2 ** use.index;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (lazy === 0)
|
|
120
|
+
continue;
|
|
121
|
+
for (const [consumer, use] of candidate.folds) {
|
|
122
|
+
if (lazyIndices.has(use.index))
|
|
123
|
+
rewrites.set(consumer, spanRead(consumer, use));
|
|
124
|
+
}
|
|
125
|
+
const { match } = candidate;
|
|
126
|
+
const mask = match.args[1];
|
|
127
|
+
rewrites.set(match, {
|
|
128
|
+
...match,
|
|
129
|
+
method: match.method === "matchGroups" ? "matchGroups" : "execSpans",
|
|
130
|
+
args: [match.args[0], mask, numLit(lazy, match.loc)],
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (rewrites.size === 0)
|
|
134
|
+
return;
|
|
135
|
+
fn.body = transformStmtList(fn.body, {
|
|
136
|
+
stmt: (stmt) => stmt,
|
|
137
|
+
expr: (expr) => rewrites.get(expr) ?? expr,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function isLiteral(expr) {
|
|
141
|
+
return expr.kind === "unionWrap" && expr.value.kind === "strLit";
|
|
142
|
+
}
|
|
143
|
+
/** The span form of a foldable consumer of `use`. */
|
|
144
|
+
function spanRead(consumer, use) {
|
|
145
|
+
const loc = consumer.loc;
|
|
146
|
+
const capture = [use.result, numLit(use.index, loc)];
|
|
147
|
+
if (consumer.kind === "unionEq") {
|
|
148
|
+
const literal = isLiteral(consumer.right) ? consumer.right : consumer.left;
|
|
149
|
+
const value = literal.value;
|
|
150
|
+
const test = {
|
|
151
|
+
kind: "libCall",
|
|
152
|
+
fn: "regex.groupEquals",
|
|
153
|
+
args: [...capture, value],
|
|
154
|
+
type: BOOL,
|
|
155
|
+
loc,
|
|
156
|
+
};
|
|
157
|
+
return consumer.negated ? { kind: "unary", op: "!", operand: test, type: BOOL, loc } : test;
|
|
158
|
+
}
|
|
159
|
+
if (consumer.kind === "libCall")
|
|
160
|
+
return { kind: "libCall", fn: "regex.groupNumber", args: capture, type: F64, loc };
|
|
161
|
+
const radix = consumer.args[1];
|
|
162
|
+
return { kind: "libCall", fn: "regex.groupParseInt", args: [...capture, radix], type: F64, loc };
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=regex-span-reads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-span-reads.js","sourceRoot":"","sources":["../../../src/frontend/lowering/regex-span-reads.ts"],"names":[],"mappings":"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"}
|
|
@@ -492,7 +492,7 @@ export const STR_METHODS = {
|
|
|
492
492
|
// regexIntrinsic). The optional limit is completed to 2^32-1 by the
|
|
493
493
|
// lowering so the IR/runtime always see the spec's effective value.
|
|
494
494
|
// Empty separator splits per UTF-16 code unit —
|
|
495
|
-
// astral halves become
|
|
495
|
+
// astral halves become lone surrogates.
|
|
496
496
|
split: { method: "split", result: arrayOf(STRING), minArgs: 0, maxArgs: 2 },
|
|
497
497
|
// Padding completes omitted lengths and fill strings in its lowering.
|
|
498
498
|
padStart: { method: "padStart", result: STRING, minArgs: 0, maxArgs: 2 },
|
|
@@ -501,10 +501,8 @@ export const STR_METHODS = {
|
|
|
501
501
|
toLowerCase: { method: "toLowerCase", result: STRING, minArgs: 0, maxArgs: 0 },
|
|
502
502
|
toUpperCase: { method: "toUpperCase", result: STRING, minArgs: 0, maxArgs: 0 },
|
|
503
503
|
normalize: { method: "normalize", result: STRING, minArgs: 0, maxArgs: 1 },
|
|
504
|
-
// The ES2024 well-formedness pair
|
|
505
|
-
//
|
|
506
|
-
// well-formed input; where Node would answer false the program already
|
|
507
|
-
// diverged at the string's creation, SEMANTICS.md 2).
|
|
504
|
+
// The ES2024 well-formedness pair: whether the string holds a lone
|
|
505
|
+
// surrogate, and the copy with each one replaced by U+FFFD.
|
|
508
506
|
isWellFormed: { method: "isWellFormed", result: BOOL, minArgs: 0, maxArgs: 0 },
|
|
509
507
|
toWellFormed: { method: "toWellFormed", result: STRING, minArgs: 0, maxArgs: 0 },
|
|
510
508
|
};
|
|
@@ -789,6 +787,17 @@ const PATH_MODULE_FNS = {
|
|
|
789
787
|
result: STRING,
|
|
790
788
|
valueParams: [{ mode: "required", type: STRING }],
|
|
791
789
|
},
|
|
790
|
+
matchesGlob: {
|
|
791
|
+
fn: "path.matchesGlob",
|
|
792
|
+
params: [STRING, STRING],
|
|
793
|
+
result: BOOL,
|
|
794
|
+
valueParams: exactValueParams(STRING, STRING),
|
|
795
|
+
},
|
|
796
|
+
// Special-cased (lowerPathParseCall / lowerPathFormatCall): the
|
|
797
|
+
// ParsedPath record and the pathObject argument follow the call site's
|
|
798
|
+
// mapped shapes.
|
|
799
|
+
parse: { fn: "path.parse", params: [STRING], result: VOID },
|
|
800
|
+
format: { fn: "path.format", params: [], result: STRING },
|
|
792
801
|
};
|
|
793
802
|
/** The win32 twins (scr_path.c's Node-v24 path.win32 port, byte-for-byte):
|
|
794
803
|
* "path/win32" everywhere, and the bare-module table when the build
|
|
@@ -857,6 +866,17 @@ const PATH_WIN32_MODULE_FNS = {
|
|
|
857
866
|
result: STRING,
|
|
858
867
|
valueParams: [{ mode: "required", type: STRING }],
|
|
859
868
|
},
|
|
869
|
+
matchesGlob: {
|
|
870
|
+
fn: "path.win32MatchesGlob",
|
|
871
|
+
params: [STRING, STRING],
|
|
872
|
+
result: BOOL,
|
|
873
|
+
valueParams: exactValueParams(STRING, STRING),
|
|
874
|
+
},
|
|
875
|
+
// Special-cased (lowerPathParseCall / lowerPathFormatCall): the
|
|
876
|
+
// ParsedPath record and the pathObject argument follow the call site's
|
|
877
|
+
// mapped shapes.
|
|
878
|
+
parse: { fn: "path.win32Parse", params: [STRING], result: VOID },
|
|
879
|
+
format: { fn: "path.win32Format", params: [], result: STRING },
|
|
860
880
|
};
|
|
861
881
|
export const BUILTIN_MODULE_FNS = {
|
|
862
882
|
fs: {
|
|
@@ -1136,6 +1156,28 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
1136
1156
|
result: F64,
|
|
1137
1157
|
valueParams: [],
|
|
1138
1158
|
},
|
|
1159
|
+
// os.arch() IS process.arch, like platform().
|
|
1160
|
+
arch: { fn: "process.arch", params: [], result: STRING, valueParams: [] },
|
|
1161
|
+
hostname: { fn: "os.hostname", params: [], result: STRING, valueParams: [] },
|
|
1162
|
+
// uv_os_uname's machine and version fields, read once at module load
|
|
1163
|
+
// in Node (they never change while a process runs).
|
|
1164
|
+
machine: { fn: "os.machine", params: [], result: STRING, valueParams: [] },
|
|
1165
|
+
version: { fn: "os.version", params: [], result: STRING, valueParams: [] },
|
|
1166
|
+
endianness: { fn: "os.endianness", params: [], result: STRING, valueParams: [] },
|
|
1167
|
+
freemem: { fn: "os.freemem", params: [], result: F64, valueParams: [] },
|
|
1168
|
+
uptime: { fn: "os.uptime", params: [], result: F64, valueParams: [] },
|
|
1169
|
+
loadavg: { fn: "os.loadavg", params: [], result: arrayOf(F64), valueParams: [] },
|
|
1170
|
+
// An omitted (or undefined) pid is 0, the current process
|
|
1171
|
+
// (lowerOsGetPriorityCall completes it).
|
|
1172
|
+
getPriority: {
|
|
1173
|
+
fn: "os.getPriority",
|
|
1174
|
+
params: [F64],
|
|
1175
|
+
result: F64,
|
|
1176
|
+
valueParams: [{ mode: "optional", type: F64, defaultValue: 0 }],
|
|
1177
|
+
},
|
|
1178
|
+
// Special-cased (lowerOsCpusCall): the call site's CpuInfo[] assembles
|
|
1179
|
+
// from one uv_cpu_info snapshot.
|
|
1180
|
+
cpus: { fn: "os.cpusTake", params: [], result: VOID },
|
|
1139
1181
|
// Entirely special-cased (lowerOsNetworkInterfacesCall): the result is
|
|
1140
1182
|
// the call site's mapped Dict<NetworkInterfaceInfo[]> shape, verified
|
|
1141
1183
|
// structurally there — this entry only routes the dispatch.
|
|
@@ -1305,6 +1347,53 @@ export const BUILTIN_MODULE_FNS = {
|
|
|
1305
1347
|
result: STRING,
|
|
1306
1348
|
valueParams: exactValueParams(DYN),
|
|
1307
1349
|
},
|
|
1350
|
+
// The function helpers take checked-dynamic arguments and answer native
|
|
1351
|
+
// dyn functions, which a static function slot checks when it receives
|
|
1352
|
+
// one (lowerUtilCallableCall in the util spoke).
|
|
1353
|
+
inherits: {
|
|
1354
|
+
fn: "util.inherits",
|
|
1355
|
+
params: [DYN, DYN],
|
|
1356
|
+
result: VOID,
|
|
1357
|
+
valueParams: [
|
|
1358
|
+
{ mode: "required", type: DYN },
|
|
1359
|
+
{ mode: "required", type: DYN },
|
|
1360
|
+
],
|
|
1361
|
+
},
|
|
1362
|
+
deprecate: {
|
|
1363
|
+
fn: "util.deprecate",
|
|
1364
|
+
params: [DYN, DYN, DYN, DYN],
|
|
1365
|
+
result: DYN,
|
|
1366
|
+
valueParams: [
|
|
1367
|
+
{ mode: "required", type: DYN },
|
|
1368
|
+
{ mode: "required", type: DYN },
|
|
1369
|
+
{ mode: "optional", type: DYN, defaultValue: undefined },
|
|
1370
|
+
{ mode: "optional", type: DYN, defaultValue: undefined },
|
|
1371
|
+
],
|
|
1372
|
+
},
|
|
1373
|
+
callbackify: {
|
|
1374
|
+
fn: "util.callbackify",
|
|
1375
|
+
params: [DYN],
|
|
1376
|
+
result: DYN,
|
|
1377
|
+
valueParams: [{ mode: "required", type: DYN }],
|
|
1378
|
+
},
|
|
1379
|
+
debuglog: {
|
|
1380
|
+
fn: "util.debuglog",
|
|
1381
|
+
params: [DYN, DYN],
|
|
1382
|
+
result: DYN,
|
|
1383
|
+
valueParams: [
|
|
1384
|
+
{ mode: "required", type: DYN },
|
|
1385
|
+
{ mode: "optional", type: DYN, defaultValue: undefined },
|
|
1386
|
+
],
|
|
1387
|
+
},
|
|
1388
|
+
debug: {
|
|
1389
|
+
fn: "util.debuglog",
|
|
1390
|
+
params: [DYN, DYN],
|
|
1391
|
+
result: DYN,
|
|
1392
|
+
valueParams: [
|
|
1393
|
+
{ mode: "required", type: DYN },
|
|
1394
|
+
{ mode: "optional", type: DYN, defaultValue: undefined },
|
|
1395
|
+
],
|
|
1396
|
+
},
|
|
1308
1397
|
},
|
|
1309
1398
|
// The util/types spoke supplies the probe name to the shared brand check.
|
|
1310
1399
|
"util/types": {
|
|
@@ -1475,7 +1564,7 @@ export const BUILTIN_MODULE_CONSTS = {
|
|
|
1475
1564
|
path: { sep: "/", delimiter: ":" },
|
|
1476
1565
|
"path/posix": { sep: "/", delimiter: ":" },
|
|
1477
1566
|
"path/win32": { sep: "\\", delimiter: ";" },
|
|
1478
|
-
os: { EOL: "\n" },
|
|
1567
|
+
os: { EOL: "\n", devNull: "/dev/null" },
|
|
1479
1568
|
worker_threads: { isMainThread: true, threadId: 0 },
|
|
1480
1569
|
cluster: { isPrimary: true, isMaster: true, isWorker: false },
|
|
1481
1570
|
};
|
|
@@ -1550,6 +1639,8 @@ export const BUILTIN_MODULE_FN_ALIASES = {
|
|
|
1550
1639
|
os: {
|
|
1551
1640
|
// lowerOsUserInfoCall assembles the record from scalar libCalls.
|
|
1552
1641
|
userInfo: ["os.userHomedir", "os.userShell"],
|
|
1642
|
+
// lowerOsCpusCall reads the cpusTake snapshot through its accessors.
|
|
1643
|
+
cpus: ["os.cpusModel", "os.cpusField"],
|
|
1553
1644
|
},
|
|
1554
1645
|
};
|
|
1555
1646
|
export const AMBIENT_SURFACE_FNS = [
|
|
@@ -1944,13 +2035,22 @@ export const AMBIENT_SURFACE_FNS = [
|
|
|
1944
2035
|
fns: ["tlsca.set"],
|
|
1945
2036
|
note: "replaces the default set and the client trust anchors for the rest of the process",
|
|
1946
2037
|
},
|
|
2038
|
+
// os.constants is a VALUE read (lowerNamespaceBuiltinProperty and the
|
|
2039
|
+
// named-import path): the platform's null-prototype constants object.
|
|
2040
|
+
{
|
|
2041
|
+
id: "node-builtin.os.constants",
|
|
2042
|
+
kind: "node-builtin",
|
|
2043
|
+
name: "os.constants",
|
|
2044
|
+
fns: ["os.constants"],
|
|
2045
|
+
note: "the platform's dlopen, errno, signals and priority groups; members a platform lacks read as undefined",
|
|
2046
|
+
},
|
|
1947
2047
|
];
|
|
1948
2048
|
/** The win32-target overrides of the bare modules' constants: path's
|
|
1949
2049
|
* constants ARE the path/win32 namespace's, and os.EOL is CRLF (Node's
|
|
1950
2050
|
* `isWindows ? '\r\n' : '\n'`). */
|
|
1951
2051
|
const WIN32_TARGET_CONSTS = {
|
|
1952
2052
|
path: BUILTIN_MODULE_CONSTS["path/win32"],
|
|
1953
|
-
os: { EOL: "\r\n" },
|
|
2053
|
+
os: { EOL: "\r\n", devNull: "\\\\.\\nul" },
|
|
1954
2054
|
};
|
|
1955
2055
|
/** BUILTIN_MODULE_FNS with the platform-conditional modules bound per
|
|
1956
2056
|
* TARGET: a win32 triple compiles Node-on-Windows semantics — `path` is
|
|
@@ -2346,9 +2446,11 @@ export function stdlibMemberFence(lowerer, access) {
|
|
|
2346
2446
|
}
|
|
2347
2447
|
else if (container === "console") {
|
|
2348
2448
|
hint =
|
|
2349
|
-
"console.log/info/debug (stdout)
|
|
2350
|
-
"
|
|
2351
|
-
"
|
|
2449
|
+
"console.log/info/debug (stdout), console.error/warn (stderr), assert, count, " +
|
|
2450
|
+
"countReset, dir, dirxml, group, groupCollapsed, groupEnd, table, time, timeEnd, " +
|
|
2451
|
+
"timeLog, clear, profile, profileEnd, and timeStamp are the supported console surface " +
|
|
2452
|
+
"(arguments render with Node's console semantics: strings verbatim, everything else " +
|
|
2453
|
+
"through the static util.inspect)";
|
|
2352
2454
|
}
|
|
2353
2455
|
else if (container === "TextEncoder") {
|
|
2354
2456
|
hint =
|