@scriptc/compiler 0.1.2 → 0.1.3
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 +59 -14
- package/dist/backend/c/async.d.ts +5 -0
- package/dist/backend/c/async.js +57 -0
- package/dist/backend/c/async.js.map +1 -1
- package/dist/backend/c/c-emitter.d.ts +3 -0
- package/dist/backend/c/c-emitter.js +15 -8
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.d.ts +8 -1
- package/dist/backend/c/exprs.js +152 -9
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/shapes.js +15 -13
- package/dist/backend/c/shapes.js.map +1 -1
- package/dist/backend/c/types.d.ts +4 -0
- package/dist/backend/c/types.js +18 -1
- package/dist/backend/c/types.js.map +1 -1
- package/dist/backend/c/types.test.js +8 -1
- package/dist/backend/c/types.test.js.map +1 -1
- package/dist/backend/c/walkers.js +32 -11
- package/dist/backend/c/walkers.js.map +1 -1
- package/dist/backend/json-literal.d.ts +7 -0
- package/dist/backend/json-literal.js +17 -0
- package/dist/backend/json-literal.js.map +1 -0
- package/dist/backend/json-literal.test.d.ts +1 -0
- package/dist/backend/json-literal.test.js +17 -0
- package/dist/backend/json-literal.test.js.map +1 -0
- package/dist/backend/link-plan.d.ts +1 -1
- package/dist/backend/link-plan.js +5 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/classes.js +8 -7
- package/dist/backend/llvm/classes.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +4 -0
- package/dist/backend/llvm/common.js +6 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/common.test.d.ts +1 -0
- package/dist/backend/llvm/common.test.js +9 -0
- package/dist/backend/llvm/common.test.js.map +1 -0
- package/dist/backend/llvm/dyn.d.ts +4 -0
- package/dist/backend/llvm/dyn.js +24 -13
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.js +35 -7
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +4 -0
- package/dist/backend/llvm/expr-dynamic.js +9 -0
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +8 -0
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +3 -3
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +2 -1
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +53 -0
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +22 -0
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +50 -5
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +46 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/shapes.js +10 -8
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/walkers.js +7 -5
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/native-link-info.d.ts +2 -1
- package/dist/backend/native-link-info.js +4 -0
- package/dist/backend/native-link-info.js.map +1 -1
- package/dist/backend/native-link-info.test.js +24 -1
- package/dist/backend/native-link-info.test.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +8 -6
- package/dist/backend/native-toolchain.js +28 -13
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +36 -1
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +1 -0
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/targets.d.ts +5 -0
- package/dist/backend/targets.js +9 -0
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +6 -1
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/coverage/surface-manifest.js +1 -0
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +3 -3
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.d.ts +0 -4
- package/dist/frontend/lowering/containers/bytes.js +112 -28
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/lower-assert.js +16 -10
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +22 -21
- package/dist/frontend/lowering/lower-builtins.js +392 -67
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +8 -6
- package/dist/frontend/lowering/lower-calls.js +110 -12
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +12 -8
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +104 -5
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +7 -0
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +8 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.d.ts +5 -4
- package/dist/frontend/lowering/lower-stmts.js +23 -6
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +4 -4
- package/dist/frontend/lowering/lowerer.js +5 -5
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +5 -3
- package/dist/frontend/lowering/surfaces.js +33 -13
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-declarations.js +27 -14
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +10 -0
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/program.js +18 -2
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +22 -7
- package/dist/frontend/resolve.js +83 -22
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/resolve.test.js +21 -1
- package/dist/frontend/resolve.test.js.map +1 -1
- package/dist/frontend/type-mapper.js +52 -10
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +1 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/ir.d.ts +67 -24
- package/dist/ir/ir.js +81 -3
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/validate.js +77 -5
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/library-cache.d.ts +1 -0
- package/dist/library/library-cache.js +1 -0
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +18 -5
- package/dist/library/library-cache.test.js.map +1 -1
- package/package.json +17 -17
- package/surface-manifest.json +32 -17
|
@@ -394,12 +394,14 @@ export declare function lowerTaggedTemplate(lowerer: Lowerer, expr: ts.TaggedTem
|
|
|
394
394
|
* FLATTENED namespace block count — splitFiles hoisted them into the
|
|
395
395
|
* same collection lists top-level declarations ride. */
|
|
396
396
|
export declare function isTopLevelFnSymbol(lowerer: Lowerer, ident: ts.Identifier): boolean;
|
|
397
|
-
/** Nested `function name(...) {...}`:
|
|
398
|
-
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
*
|
|
402
|
-
*
|
|
397
|
+
/** Nested `function name(...) {...}`: declare the mutable function binding
|
|
398
|
+
* before lowering its body, then initialize it with the lifted closure.
|
|
399
|
+
* The early declaration is observable only when another nested closure
|
|
400
|
+
* captures the binding: its box must exist before either side of a mutual
|
|
401
|
+
* recursion cycle builds its closure. Forward source references use the
|
|
402
|
+
* same split declaration/assignment through predeclareForwardFnDecl.
|
|
403
|
+
* Self-references inside the body lower to `selfRef`, not a capture: a box
|
|
404
|
+
* holding its own closure would be an RC cycle. */
|
|
403
405
|
export declare function lowerNestedFunctionDecl(lowerer: Lowerer, stmt: ts.FunctionDeclaration): IrStmt;
|
|
404
406
|
/** Signature checks + param shapes + IR func type for any lambda-like
|
|
405
407
|
* node. The func type's params are the ABI types, so a lambda with
|
|
@@ -5,7 +5,7 @@ import { InternalCompilerError } from "../../errors.js";
|
|
|
5
5
|
* generic instantiation (bounded by MAX_GENERIC_INSTANCES). */
|
|
6
6
|
import * as ts from "../ts7/adapter.js";
|
|
7
7
|
import { lowerGenMethodCall } from "./lower-generators.js";
|
|
8
|
-
import { BOOL, CAUGHT, DYN, F64, JSVAL, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, canMarshalTypedFuncIntoIsland, ffiClassType, ffiSourceParamTypes, funcOf, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isUnitType, shapeHasAccessorSlots, typeEquals } from "../../ir/ir.js";
|
|
8
|
+
import { BIGINT_T, BOOL, CAUGHT, DYN, F64, JSVAL, STRING, SYMBOL_T, UNDEFINED_T, VOID, arrayOf, canBoxFuncIntoDyn, canConvertToDyn, canDynCheckTo, canMarshalTypedFuncIntoIsland, ffiClassType, ffiSourceParamTypes, funcOf, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isUnitType, shapeHasAccessorSlots, typeEquals } from "../../ir/ir.js";
|
|
9
9
|
import { isJsSourceFile, locOf } from "../program.js";
|
|
10
10
|
import { genResultRecord, isGenericCallableMemberType, typeKey } from "../type-mapper.js";
|
|
11
11
|
import { PoisonError, dynFallbackType, dynUndefinedExpr, importCallHandleType, jsFuncNameOf, newFnCtx, nodeThrowExpr } from "./lowerer.js";
|
|
@@ -16,7 +16,7 @@ import { mixinFnShapeOf } from "./lower-mixins.js";
|
|
|
16
16
|
import { dynStringReceiver, lowerArrayFromCall, lowerDynArrayFilterCall, lowerDynArrayFlatMapCall, lowerGroupByStaticCall, lowerIteratorHelperCall, lowerObjectAssignIndexShape, lowerObjectFromEntriesCall, lowerObjectIterOverIndexShape, lowerTupleReadMethodCall } from "./lower-containers.js";
|
|
17
17
|
import { bufEncoding } from "./containers/bytes.js";
|
|
18
18
|
import { lowerRegexMethodCall, lowerStringMethodCall } from "./containers/string-and-regexp.js";
|
|
19
|
-
import { lowerChildStreamMethodCall, lowerCreateRequireCall, lowerDirentMethodCall, lowerFileHandleMethodCall, lowerImportMetaResolveCall, lowerPerfHooksCall, lowerProcStreamMethodCall, lowerReflectApplyCall, lowerRequireResolveCall, lowerWatcherMethodCall } from "./lower-builtins.js";
|
|
19
|
+
import { lowerChildStreamMethodCall, lowerChildWriterMethodCall, lowerCreateRequireCall, lowerCryptoHashMethodCall, lowerDirentMethodCall, lowerFileHandleMethodCall, lowerImportMetaResolveCall, lowerPerfHooksCall, lowerProcStreamMethodCall, lowerReflectApplyCall, lowerRequireResolveCall, lowerWatcherMethodCall } from "./lower-builtins.js";
|
|
20
20
|
import { lowerAbsenceProbe, lowerPromiseAllTupleCall, lowerPromiseRejectCall, templateRawTextOf } from "./lower-exprs.js";
|
|
21
21
|
import { isSafeToDiscard } from "./expressions/evaluation-safety.js";
|
|
22
22
|
import { tryLowerExpression } from "./expressions/try-lower-expression.js";
|
|
@@ -3149,6 +3149,34 @@ export function lowerCall(lowerer, expr) {
|
|
|
3149
3149
|
// Provenance-checked like setTimeout; zero-arg forms are the JS
|
|
3150
3150
|
// constants ("", false, 0). `new String(...)` (wrapper objects) stays
|
|
3151
3151
|
// on the SC2020 fence.
|
|
3152
|
+
if (ts.isIdentifier(expr.expression) &&
|
|
3153
|
+
expr.expression.text === "BigInt" &&
|
|
3154
|
+
lowerer.isStdlibSymbol(lowerer.resolveValueSymbol(expr.expression) ?? undefined)) {
|
|
3155
|
+
if (expr.arguments.length !== 1) {
|
|
3156
|
+
lowerer.noLowering(`BigInt with ${expr.arguments.length} arguments`, expr);
|
|
3157
|
+
}
|
|
3158
|
+
const argNode = expr.arguments[0];
|
|
3159
|
+
const arg = lowerer.lowerExpr(argNode);
|
|
3160
|
+
if (arg.type.kind === "bigint")
|
|
3161
|
+
return arg;
|
|
3162
|
+
if (arg.type.kind === "string") {
|
|
3163
|
+
return { kind: "libCall", fn: "bigint.parse", args: [arg], type: BIGINT_T, loc };
|
|
3164
|
+
}
|
|
3165
|
+
if (arg.type.kind === "f64") {
|
|
3166
|
+
return { kind: "libCall", fn: "bigint.fromF64", args: [arg], type: BIGINT_T, loc };
|
|
3167
|
+
}
|
|
3168
|
+
if (arg.type.kind === "bool") {
|
|
3169
|
+
return {
|
|
3170
|
+
kind: "ternary",
|
|
3171
|
+
cond: arg,
|
|
3172
|
+
then: { kind: "libCall", fn: "bigint.parse", args: [{ kind: "strLit", value: "1", type: STRING, loc }], type: BIGINT_T, loc },
|
|
3173
|
+
else_: { kind: "libCall", fn: "bigint.parse", args: [{ kind: "strLit", value: "0", type: STRING, loc }], type: BIGINT_T, loc },
|
|
3174
|
+
type: BIGINT_T,
|
|
3175
|
+
loc,
|
|
3176
|
+
};
|
|
3177
|
+
}
|
|
3178
|
+
lowerer.noLowering(`BigInt of ${lowerer.fmt(arg.type)} values`, argNode, "string, number, boolean, and bigint arguments are supported");
|
|
3179
|
+
}
|
|
3152
3180
|
if (ts.isIdentifier(expr.expression) &&
|
|
3153
3181
|
(expr.expression.text === "String" ||
|
|
3154
3182
|
expr.expression.text === "Boolean" ||
|
|
@@ -3184,6 +3212,9 @@ export function lowerCall(lowerer, expr) {
|
|
|
3184
3212
|
const arg = lowerer.lowerExpr(argNode);
|
|
3185
3213
|
if (name === "String")
|
|
3186
3214
|
return lowerer.ensureString(arg, argNode);
|
|
3215
|
+
if (name === "Number" && arg.type.kind === "bigint") {
|
|
3216
|
+
return { kind: "libCall", fn: "bigint.toF64", args: [arg], type: F64, loc };
|
|
3217
|
+
}
|
|
3187
3218
|
if (arg.type.kind === "f64")
|
|
3188
3219
|
return arg;
|
|
3189
3220
|
if (arg.type.kind === "bool") {
|
|
@@ -3922,10 +3953,12 @@ export function lowerCall(lowerer, expr) {
|
|
|
3922
3953
|
lowerer.lowerUrlMethodCall(expr, expr.expression) ??
|
|
3923
3954
|
lowerer.lowerSearchParamsMethodCall(expr, expr.expression) ??
|
|
3924
3955
|
lowerer.lowerStatsMethodCall(expr, expr.expression) ??
|
|
3956
|
+
lowerCryptoHashMethodCall(lowerer, expr, expr.expression) ??
|
|
3925
3957
|
lowerFileHandleMethodCall(lowerer, expr, expr.expression) ??
|
|
3926
3958
|
lowerer.lowerChildMethodCall(expr, expr.expression) ??
|
|
3927
3959
|
// Piped child-output stream receivers — on/once("data" | "end").
|
|
3928
3960
|
lowerChildStreamMethodCall(lowerer, expr, expr.expression) ??
|
|
3961
|
+
lowerChildWriterMethodCall(lowerer, expr, expr.expression) ??
|
|
3929
3962
|
// First-class process-stream receivers — write(data).
|
|
3930
3963
|
lowerProcStreamMethodCall(lowerer, expr, expr.expression) ??
|
|
3931
3964
|
// FSWatcher receivers — close() (fs.watch's handle).
|
|
@@ -4008,6 +4041,8 @@ export function lowerCall(lowerer, expr) {
|
|
|
4008
4041
|
// by the receiver's own element.
|
|
4009
4042
|
lowerer.lowerFilterNarrowCall(expr, expr.expression) ??
|
|
4010
4043
|
lowerArrayIsArrayCall(lowerer, expr, expr.expression) ??
|
|
4044
|
+
lowerBigIntStaticCall(lowerer, expr, expr.expression) ??
|
|
4045
|
+
lowerBigIntMethodCall(lowerer, expr, expr.expression) ??
|
|
4011
4046
|
lowerSymbolStaticCall(lowerer, expr, expr.expression) ??
|
|
4012
4047
|
lowerSymbolMethodCall(lowerer, expr, expr.expression) ??
|
|
4013
4048
|
lowerRegExpStaticCall(lowerer, expr, expr.expression) ??
|
|
@@ -5527,19 +5562,38 @@ export function isTopLevelFnSymbol(lowerer, ident) {
|
|
|
5527
5562
|
ts.isFunctionDeclaration(decl) &&
|
|
5528
5563
|
(ts.isSourceFile(decl.parent) || lowerer.nsBlocks.get(decl.parent) === "flattened"));
|
|
5529
5564
|
}
|
|
5530
|
-
/** Nested `function name(...) {...}`:
|
|
5531
|
-
*
|
|
5532
|
-
*
|
|
5533
|
-
*
|
|
5534
|
-
*
|
|
5535
|
-
*
|
|
5565
|
+
/** Nested `function name(...) {...}`: declare the mutable function binding
|
|
5566
|
+
* before lowering its body, then initialize it with the lifted closure.
|
|
5567
|
+
* The early declaration is observable only when another nested closure
|
|
5568
|
+
* captures the binding: its box must exist before either side of a mutual
|
|
5569
|
+
* recursion cycle builds its closure. Forward source references use the
|
|
5570
|
+
* same split declaration/assignment through predeclareForwardFnDecl.
|
|
5571
|
+
* Self-references inside the body lower to `selfRef`, not a capture: a box
|
|
5572
|
+
* holding its own closure would be an RC cycle. */
|
|
5536
5573
|
export function lowerNestedFunctionDecl(lowerer, stmt) {
|
|
5537
5574
|
if (!stmt.name)
|
|
5538
5575
|
lowerer.unsupported("SC1090", stmt, "anonymous function declarations");
|
|
5539
5576
|
const { funcType } = lowerer.lambdaSignature(stmt);
|
|
5540
|
-
|
|
5577
|
+
// Function declaration bindings are mutable in JavaScript. More
|
|
5578
|
+
// importantly, putting the empty slot into the owning statement list
|
|
5579
|
+
// BEFORE lowerLambda lets a sibling lowered from that body capture this
|
|
5580
|
+
// local's eventual box. The local object may become boxed while either
|
|
5581
|
+
// body lowers; backends inspect its final shape when emitting varDecl.
|
|
5582
|
+
const local = lowerer.declareLocal(stmt.name, stmt.name.text, funcType, true);
|
|
5583
|
+
let declared = false;
|
|
5584
|
+
for (let i = lowerer.activeStmtLists.length - 1; i >= 0; i--) {
|
|
5585
|
+
const entry = lowerer.activeStmtLists[i];
|
|
5586
|
+
if (entry.ctx !== lowerer.ctx || !entry.stmts.includes(stmt))
|
|
5587
|
+
continue;
|
|
5588
|
+
entry.out.push({ kind: "varDecl", localId: local.id, init: null, loc: locOf(stmt) });
|
|
5589
|
+
declared = true;
|
|
5590
|
+
break;
|
|
5591
|
+
}
|
|
5592
|
+
if (!declared) {
|
|
5593
|
+
throw new InternalCompilerError("lowerer bug: nested function declaration has no active statement list");
|
|
5594
|
+
}
|
|
5541
5595
|
const init = lowerer.lowerLambda(stmt);
|
|
5542
|
-
return { kind: "
|
|
5596
|
+
return { kind: "assign", localId: local.id, value: init, loc: locOf(stmt) };
|
|
5543
5597
|
}
|
|
5544
5598
|
/** Signature checks + param shapes + IR func type for any lambda-like
|
|
5545
5599
|
* node. The func type's params are the ABI types, so a lambda with
|
|
@@ -5765,11 +5819,13 @@ export function lowerLambda(lowerer, node) {
|
|
|
5765
5819
|
// the validator's bare-unitLit rule (typeCheckReturnExpression).
|
|
5766
5820
|
// A `void e` body rides the statement lowering (the value is
|
|
5767
5821
|
// discarded here, so the operand evaluates for effect alone —
|
|
5768
|
-
// `(name) => void doThing(name)`, the fire-and-forget arrow).
|
|
5822
|
+
// `(name) => void doThing(name)`, the fire-and-forget arrow). A
|
|
5823
|
+
// conditional body does the same so its void arms become lazy
|
|
5824
|
+
// statement branches instead of a forbidden void-valued ternary.
|
|
5769
5825
|
let stripped = bodyExpr;
|
|
5770
5826
|
while (ts.isParenthesizedExpression(stripped))
|
|
5771
5827
|
stripped = stripped.expression;
|
|
5772
|
-
if (ts.isVoidExpression(stripped)) {
|
|
5828
|
+
if (ts.isVoidExpression(stripped) || ts.isConditionalExpression(stripped)) {
|
|
5773
5829
|
body = [lowerer.lowerExprStatement(stripped)];
|
|
5774
5830
|
}
|
|
5775
5831
|
else {
|
|
@@ -6769,6 +6825,48 @@ function lowerSymbolStaticCall(lowerer, call, access) {
|
|
|
6769
6825
|
}
|
|
6770
6826
|
lowerer.unsupported("SC1090", call, `well-known symbols as values (Symbol.${member} — for-of, iteration protocols, and template literals compile through their language constructs; the reified symbol has no static lowering)`);
|
|
6771
6827
|
}
|
|
6828
|
+
function lowerBigIntStaticCall(lowerer, call, access) {
|
|
6829
|
+
if (call.questionDotToken || access.questionDotToken)
|
|
6830
|
+
return null;
|
|
6831
|
+
if (!lowerer.isStdlibGlobal(access.expression, "BigInt"))
|
|
6832
|
+
return null;
|
|
6833
|
+
const name = access.name.text;
|
|
6834
|
+
if (name !== "asUintN" && name !== "asIntN")
|
|
6835
|
+
return null;
|
|
6836
|
+
if (call.arguments.length !== 2) {
|
|
6837
|
+
lowerer.noLowering(`BigInt.${name} with ${call.arguments.length} arguments`, call);
|
|
6838
|
+
}
|
|
6839
|
+
const loc = locOf(call);
|
|
6840
|
+
const bits = lowerer.lowerExprExpecting(call.arguments[0], F64);
|
|
6841
|
+
const value = lowerer.lowerExprExpecting(call.arguments[1], BIGINT_T);
|
|
6842
|
+
return {
|
|
6843
|
+
kind: "libCall",
|
|
6844
|
+
fn: name === "asUintN" ? "bigint.asUintN" : "bigint.asIntN",
|
|
6845
|
+
args: [bits, value],
|
|
6846
|
+
type: BIGINT_T,
|
|
6847
|
+
loc,
|
|
6848
|
+
};
|
|
6849
|
+
}
|
|
6850
|
+
function lowerBigIntMethodCall(lowerer, call, access) {
|
|
6851
|
+
if (lowerer.mapTypeOf(lowerer.typeOf(access.expression))?.kind !== "bigint")
|
|
6852
|
+
return null;
|
|
6853
|
+
if (!lowerer.isStdlibMember(access))
|
|
6854
|
+
return null;
|
|
6855
|
+
const name = access.name.text;
|
|
6856
|
+
const loc = locOf(call);
|
|
6857
|
+
const receiver = lowerer.lowerExpr(access.expression);
|
|
6858
|
+
if (receiver.type.kind !== "bigint")
|
|
6859
|
+
return null;
|
|
6860
|
+
if (name === "valueOf" && call.arguments.length === 0)
|
|
6861
|
+
return receiver;
|
|
6862
|
+
if (name === "toString" && call.arguments.length <= 1) {
|
|
6863
|
+
const radix = call.arguments[0]
|
|
6864
|
+
? lowerer.lowerExprExpecting(call.arguments[0], F64)
|
|
6865
|
+
: { kind: "numLit", value: 10, type: F64, loc };
|
|
6866
|
+
return { kind: "libCall", fn: "bigint.toString", args: [receiver, radix], type: STRING, loc };
|
|
6867
|
+
}
|
|
6868
|
+
return null;
|
|
6869
|
+
}
|
|
6772
6870
|
/** Method calls on symbol-typed receivers: `.toString()` is the
|
|
6773
6871
|
* "Symbol(desc)" text (Node's Symbol.prototype.toString — note that
|
|
6774
6872
|
* template literals and concatenation THROW in JS and stay fenced;
|