@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.
Files changed (151) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +59 -14
  2. package/dist/backend/c/async.d.ts +5 -0
  3. package/dist/backend/c/async.js +57 -0
  4. package/dist/backend/c/async.js.map +1 -1
  5. package/dist/backend/c/c-emitter.d.ts +3 -0
  6. package/dist/backend/c/c-emitter.js +15 -8
  7. package/dist/backend/c/c-emitter.js.map +1 -1
  8. package/dist/backend/c/exprs.d.ts +8 -1
  9. package/dist/backend/c/exprs.js +152 -9
  10. package/dist/backend/c/exprs.js.map +1 -1
  11. package/dist/backend/c/shapes.js +15 -13
  12. package/dist/backend/c/shapes.js.map +1 -1
  13. package/dist/backend/c/types.d.ts +4 -0
  14. package/dist/backend/c/types.js +18 -1
  15. package/dist/backend/c/types.js.map +1 -1
  16. package/dist/backend/c/types.test.js +8 -1
  17. package/dist/backend/c/types.test.js.map +1 -1
  18. package/dist/backend/c/walkers.js +32 -11
  19. package/dist/backend/c/walkers.js.map +1 -1
  20. package/dist/backend/json-literal.d.ts +7 -0
  21. package/dist/backend/json-literal.js +17 -0
  22. package/dist/backend/json-literal.js.map +1 -0
  23. package/dist/backend/json-literal.test.d.ts +1 -0
  24. package/dist/backend/json-literal.test.js +17 -0
  25. package/dist/backend/json-literal.test.js.map +1 -0
  26. package/dist/backend/link-plan.d.ts +1 -1
  27. package/dist/backend/link-plan.js +5 -1
  28. package/dist/backend/link-plan.js.map +1 -1
  29. package/dist/backend/llvm/classes.js +8 -7
  30. package/dist/backend/llvm/classes.js.map +1 -1
  31. package/dist/backend/llvm/common.d.ts +4 -0
  32. package/dist/backend/llvm/common.js +6 -0
  33. package/dist/backend/llvm/common.js.map +1 -1
  34. package/dist/backend/llvm/common.test.d.ts +1 -0
  35. package/dist/backend/llvm/common.test.js +9 -0
  36. package/dist/backend/llvm/common.test.js.map +1 -0
  37. package/dist/backend/llvm/dyn.d.ts +4 -0
  38. package/dist/backend/llvm/dyn.js +24 -13
  39. package/dist/backend/llvm/dyn.js.map +1 -1
  40. package/dist/backend/llvm/emitter.js +35 -7
  41. package/dist/backend/llvm/emitter.js.map +1 -1
  42. package/dist/backend/llvm/expr-context.d.ts +4 -0
  43. package/dist/backend/llvm/expr-dynamic.js +9 -0
  44. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  45. package/dist/backend/llvm/expr-primitives.js +8 -0
  46. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  47. package/dist/backend/llvm/expr-records.js +3 -3
  48. package/dist/backend/llvm/expr-records.js.map +1 -1
  49. package/dist/backend/llvm/expr-stream-bridges.js +2 -1
  50. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  51. package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
  52. package/dist/backend/llvm/expr-stream-callbacks.js +53 -0
  53. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/lib-dispatch.js +22 -0
  55. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  56. package/dist/backend/llvm/lib-process.js +50 -5
  57. package/dist/backend/llvm/lib-process.js.map +1 -1
  58. package/dist/backend/llvm/lib-shared.js +46 -0
  59. package/dist/backend/llvm/lib-shared.js.map +1 -1
  60. package/dist/backend/llvm/shapes.js +10 -8
  61. package/dist/backend/llvm/shapes.js.map +1 -1
  62. package/dist/backend/llvm/walkers.js +7 -5
  63. package/dist/backend/llvm/walkers.js.map +1 -1
  64. package/dist/backend/native-link-info.d.ts +2 -1
  65. package/dist/backend/native-link-info.js +4 -0
  66. package/dist/backend/native-link-info.js.map +1 -1
  67. package/dist/backend/native-link-info.test.js +24 -1
  68. package/dist/backend/native-link-info.test.js.map +1 -1
  69. package/dist/backend/native-toolchain.d.ts +8 -6
  70. package/dist/backend/native-toolchain.js +28 -13
  71. package/dist/backend/native-toolchain.js.map +1 -1
  72. package/dist/backend/native-toolchain.test.js +36 -1
  73. package/dist/backend/native-toolchain.test.js.map +1 -1
  74. package/dist/backend/runtime-pack-targets.test.js +1 -1
  75. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  76. package/dist/backend/runtime-pack.test.js +1 -0
  77. package/dist/backend/runtime-pack.test.js.map +1 -1
  78. package/dist/backend/targets.d.ts +5 -0
  79. package/dist/backend/targets.js +9 -0
  80. package/dist/backend/targets.js.map +1 -1
  81. package/dist/backend/targets.test.js +6 -1
  82. package/dist/backend/targets.test.js.map +1 -1
  83. package/dist/coverage/surface-manifest.js +1 -0
  84. package/dist/coverage/surface-manifest.js.map +1 -1
  85. package/dist/diagnostics/diagnostic.js +3 -3
  86. package/dist/diagnostics/diagnostic.js.map +1 -1
  87. package/dist/executable/executable-cache.d.ts +1 -0
  88. package/dist/executable/executable-cache.js +1 -0
  89. package/dist/executable/executable-cache.js.map +1 -1
  90. package/dist/executable/executable-cache.test.js +1 -0
  91. package/dist/executable/executable-cache.test.js.map +1 -1
  92. package/dist/frontend/lowering/containers/bytes.d.ts +0 -4
  93. package/dist/frontend/lowering/containers/bytes.js +112 -28
  94. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  95. package/dist/frontend/lowering/lower-assert.js +16 -10
  96. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  97. package/dist/frontend/lowering/lower-builtins.d.ts +22 -21
  98. package/dist/frontend/lowering/lower-builtins.js +392 -67
  99. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  100. package/dist/frontend/lowering/lower-calls.d.ts +8 -6
  101. package/dist/frontend/lowering/lower-calls.js +110 -12
  102. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  103. package/dist/frontend/lowering/lower-containers.js +12 -8
  104. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  105. package/dist/frontend/lowering/lower-exprs.js +104 -5
  106. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  107. package/dist/frontend/lowering/lower-inspect.js +7 -0
  108. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  109. package/dist/frontend/lowering/lower-modules.js +8 -0
  110. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  111. package/dist/frontend/lowering/lower-stmts.d.ts +5 -4
  112. package/dist/frontend/lowering/lower-stmts.js +23 -6
  113. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  114. package/dist/frontend/lowering/lowerer.d.ts +4 -4
  115. package/dist/frontend/lowering/lowerer.js +5 -5
  116. package/dist/frontend/lowering/lowerer.js.map +1 -1
  117. package/dist/frontend/lowering/surfaces.d.ts +5 -3
  118. package/dist/frontend/lowering/surfaces.js +33 -13
  119. package/dist/frontend/lowering/surfaces.js.map +1 -1
  120. package/dist/frontend/npm-static-declarations.js +27 -14
  121. package/dist/frontend/npm-static-declarations.js.map +1 -1
  122. package/dist/frontend/npm-static-declarations.test.js +10 -0
  123. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  124. package/dist/frontend/program.js +18 -2
  125. package/dist/frontend/program.js.map +1 -1
  126. package/dist/frontend/resolve.d.ts +22 -7
  127. package/dist/frontend/resolve.js +83 -22
  128. package/dist/frontend/resolve.js.map +1 -1
  129. package/dist/frontend/resolve.test.js +21 -1
  130. package/dist/frontend/resolve.test.js.map +1 -1
  131. package/dist/frontend/type-mapper.js +52 -10
  132. package/dist/frontend/type-mapper.js.map +1 -1
  133. package/dist/index.js +6 -0
  134. package/dist/index.js.map +1 -1
  135. package/dist/ir/analysis.js +1 -0
  136. package/dist/ir/analysis.js.map +1 -1
  137. package/dist/ir/ir.d.ts +67 -24
  138. package/dist/ir/ir.js +81 -3
  139. package/dist/ir/ir.js.map +1 -1
  140. package/dist/ir/serialize.d.ts +1 -1
  141. package/dist/ir/serialize.js +1 -1
  142. package/dist/ir/validate.js +77 -5
  143. package/dist/ir/validate.js.map +1 -1
  144. package/dist/library/int-infer.test.js +4 -4
  145. package/dist/library/library-cache.d.ts +1 -0
  146. package/dist/library/library-cache.js +1 -0
  147. package/dist/library/library-cache.js.map +1 -1
  148. package/dist/library/library-cache.test.js +18 -5
  149. package/dist/library/library-cache.test.js.map +1 -1
  150. package/package.json +17 -17
  151. 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(...) {...}`: lowered as `const name = <lambda>`
398
- * at the declaration's statement position (JS hoists function declarations
399
- * to the top of the enclosing function — calling one before this statement
400
- * is a compile error here, not a silent divergence). Self-references inside
401
- * the body lower to `selfRef`, not a capture: a box holding its own
402
- * closure would be an RC cycle. */
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(...) {...}`: lowered as `const name = <lambda>`
5531
- * at the declaration's statement position (JS hoists function declarations
5532
- * to the top of the enclosing function — calling one before this statement
5533
- * is a compile error here, not a silent divergence). Self-references inside
5534
- * the body lower to `selfRef`, not a capture: a box holding its own
5535
- * closure would be an RC cycle. */
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
- const local = lowerer.declareLocal(stmt.name, stmt.name.text, funcType, false);
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: "varDecl", localId: local.id, init, loc: locOf(stmt) };
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;