@scriptc/compiler 0.2.2 → 0.2.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 (178) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +99 -27
  2. package/dist/backend/cycle-analysis.js +63 -50
  3. package/dist/backend/cycle-analysis.js.map +1 -1
  4. package/dist/backend/cycle-analysis.test.js +51 -0
  5. package/dist/backend/cycle-analysis.test.js.map +1 -1
  6. package/dist/backend/llvm/borrowed-receivers.d.ts +9 -0
  7. package/dist/backend/llvm/borrowed-receivers.js +58 -0
  8. package/dist/backend/llvm/borrowed-receivers.js.map +1 -0
  9. package/dist/backend/llvm/call-lifetimes.d.ts +20 -0
  10. package/dist/backend/llvm/call-lifetimes.js +179 -0
  11. package/dist/backend/llvm/call-lifetimes.js.map +1 -0
  12. package/dist/backend/llvm/call-lifetimes.test.d.ts +1 -0
  13. package/dist/backend/llvm/call-lifetimes.test.js +205 -0
  14. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -0
  15. package/dist/backend/llvm/dyn.d.ts +2 -2
  16. package/dist/backend/llvm/dyn.js +79 -35
  17. package/dist/backend/llvm/dyn.js.map +1 -1
  18. package/dist/backend/llvm/emitter.d.ts +33 -0
  19. package/dist/backend/llvm/emitter.js +189 -16
  20. package/dist/backend/llvm/emitter.js.map +1 -1
  21. package/dist/backend/llvm/emitter.test.js +20 -1
  22. package/dist/backend/llvm/emitter.test.js.map +1 -1
  23. package/dist/backend/llvm/expr-async.js +1 -1
  24. package/dist/backend/llvm/expr-async.js.map +1 -1
  25. package/dist/backend/llvm/expr-calls.js +42 -5
  26. package/dist/backend/llvm/expr-calls.js.map +1 -1
  27. package/dist/backend/llvm/expr-containers.js +70 -13
  28. package/dist/backend/llvm/expr-containers.js.map +1 -1
  29. package/dist/backend/llvm/expr-dynamic.js +1 -1
  30. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  31. package/dist/backend/llvm/expr-primitives.js +6 -5
  32. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  33. package/dist/backend/llvm/expr-records.js +1 -1
  34. package/dist/backend/llvm/expr-records.js.map +1 -1
  35. package/dist/backend/llvm/expr-stream-bridges.js +5 -10
  36. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  37. package/dist/backend/llvm/lib-shared.js +35 -1
  38. package/dist/backend/llvm/lib-shared.js.map +1 -1
  39. package/dist/backend/llvm/local-array-reads.d.ts +44 -0
  40. package/dist/backend/llvm/local-array-reads.js +313 -0
  41. package/dist/backend/llvm/local-array-reads.js.map +1 -0
  42. package/dist/backend/llvm/local-array-reads.test.d.ts +1 -0
  43. package/dist/backend/llvm/local-array-reads.test.js +446 -0
  44. package/dist/backend/llvm/local-array-reads.test.js.map +1 -0
  45. package/dist/backend/llvm/map-read-lifetimes.d.ts +36 -0
  46. package/dist/backend/llvm/map-read-lifetimes.js +128 -0
  47. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -0
  48. package/dist/backend/llvm/map-read-lifetimes.test.d.ts +1 -0
  49. package/dist/backend/llvm/map-read-lifetimes.test.js +123 -0
  50. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -0
  51. package/dist/backend/llvm/shapes.js +1 -0
  52. package/dist/backend/llvm/shapes.js.map +1 -1
  53. package/dist/backend/llvm/split.js +15 -5
  54. package/dist/backend/llvm/split.js.map +1 -1
  55. package/dist/backend/llvm/split.test.js +17 -0
  56. package/dist/backend/llvm/split.test.js.map +1 -1
  57. package/dist/backend/llvm/stack-unions.d.ts +20 -0
  58. package/dist/backend/llvm/stack-unions.js +61 -0
  59. package/dist/backend/llvm/stack-unions.js.map +1 -0
  60. package/dist/backend/llvm/stack-unions.test.d.ts +1 -0
  61. package/dist/backend/llvm/stack-unions.test.js +241 -0
  62. package/dist/backend/llvm/stack-unions.test.js.map +1 -0
  63. package/dist/backend/llvm/string-lifetimes.d.ts +12 -0
  64. package/dist/backend/llvm/string-lifetimes.js +70 -0
  65. package/dist/backend/llvm/string-lifetimes.js.map +1 -0
  66. package/dist/backend/llvm/string-lifetimes.test.d.ts +1 -0
  67. package/dist/backend/llvm/string-lifetimes.test.js +230 -0
  68. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -0
  69. package/dist/backend/mangle.d.ts +2 -0
  70. package/dist/backend/mangle.js +4 -0
  71. package/dist/backend/mangle.js.map +1 -1
  72. package/dist/backend/may-throw.js +67 -29
  73. package/dist/backend/may-throw.js.map +1 -1
  74. package/dist/backend/may-throw.test.js +104 -1
  75. package/dist/backend/may-throw.test.js.map +1 -1
  76. package/dist/backend/native-toolchain.d.ts +2 -2
  77. package/dist/backend/native-toolchain.js +2 -0
  78. package/dist/backend/native-toolchain.js.map +1 -1
  79. package/dist/frontend/input-tracker.js +3 -3
  80. package/dist/frontend/input-tracker.js.map +1 -1
  81. package/dist/frontend/input-tracker.test.js +38 -2
  82. package/dist/frontend/input-tracker.test.js.map +1 -1
  83. package/dist/frontend/lowering/collection-ingestion.d.ts +31 -0
  84. package/dist/frontend/lowering/collection-ingestion.js +215 -0
  85. package/dist/frontend/lowering/collection-ingestion.js.map +1 -0
  86. package/dist/frontend/lowering/containers/bytes.js +2 -0
  87. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  88. package/dist/frontend/lowering/import-meta.d.ts +10 -0
  89. package/dist/frontend/lowering/import-meta.js +52 -0
  90. package/dist/frontend/lowering/import-meta.js.map +1 -0
  91. package/dist/frontend/lowering/lower-assert.js +105 -41
  92. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  93. package/dist/frontend/lowering/lower-builtin-values.d.ts +2 -0
  94. package/dist/frontend/lowering/lower-builtin-values.js +22 -1
  95. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  96. package/dist/frontend/lowering/lower-builtins.d.ts +3 -13
  97. package/dist/frontend/lowering/lower-builtins.js +150 -46
  98. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  99. package/dist/frontend/lowering/lower-calls.js +6 -3
  100. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  101. package/dist/frontend/lowering/lower-classes.js +4 -4
  102. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  103. package/dist/frontend/lowering/lower-containers.d.ts +5 -1
  104. package/dist/frontend/lowering/lower-containers.js +40 -3
  105. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  106. package/dist/frontend/lowering/lower-exprs.js +35 -41
  107. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  108. package/dist/frontend/lowering/lower-inspect.js +43 -0
  109. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  110. package/dist/frontend/lowering/lower-stmts.js +72 -68
  111. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  112. package/dist/frontend/lowering/lower-system-errors.d.ts +6 -0
  113. package/dist/frontend/lowering/lower-system-errors.js +29 -0
  114. package/dist/frontend/lowering/lower-system-errors.js.map +1 -0
  115. package/dist/frontend/lowering/lowerer.d.ts +4 -3
  116. package/dist/frontend/lowering/lowerer.js +50 -22
  117. package/dist/frontend/lowering/lowerer.js.map +1 -1
  118. package/dist/frontend/lowering/surfaces.d.ts +2 -2
  119. package/dist/frontend/lowering/surfaces.js +69 -21
  120. package/dist/frontend/lowering/surfaces.js.map +1 -1
  121. package/dist/frontend/module-syntax.d.ts +1 -1
  122. package/dist/frontend/module-syntax.js +8 -1
  123. package/dist/frontend/module-syntax.js.map +1 -1
  124. package/dist/frontend/module-syntax.test.js +10 -0
  125. package/dist/frontend/module-syntax.test.js.map +1 -1
  126. package/dist/frontend/npm.d.ts +4 -0
  127. package/dist/frontend/npm.js +86 -33
  128. package/dist/frontend/npm.js.map +1 -1
  129. package/dist/frontend/npm.test.js +103 -0
  130. package/dist/frontend/npm.test.js.map +1 -1
  131. package/dist/frontend/pipeline-native.js +2 -1
  132. package/dist/frontend/pipeline-native.js.map +1 -1
  133. package/dist/frontend/services-node.js +3 -2
  134. package/dist/frontend/services-node.js.map +1 -1
  135. package/dist/frontend/services.d.ts +5 -1
  136. package/dist/frontend/services.js +9 -1
  137. package/dist/frontend/services.js.map +1 -1
  138. package/dist/frontend/services.test.js +21 -0
  139. package/dist/frontend/services.test.js.map +1 -1
  140. package/dist/frontend/ts7/ast-node.d.ts +2 -0
  141. package/dist/frontend/ts7/ast-node.js +30 -4
  142. package/dist/frontend/ts7/ast-node.js.map +1 -1
  143. package/dist/frontend/ts7/ast-node.test.js +60 -1
  144. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  145. package/dist/frontend/type-mapper.js +6 -0
  146. package/dist/frontend/type-mapper.js.map +1 -1
  147. package/dist/index.js +3 -2
  148. package/dist/index.js.map +1 -1
  149. package/dist/ir/analysis.js +1 -0
  150. package/dist/ir/analysis.js.map +1 -1
  151. package/dist/ir/integer-loops.d.ts +7 -0
  152. package/dist/ir/integer-loops.js +23 -0
  153. package/dist/ir/integer-loops.js.map +1 -1
  154. package/dist/ir/integer-loops.test.d.ts +1 -0
  155. package/dist/ir/integer-loops.test.js +41 -0
  156. package/dist/ir/integer-loops.test.js.map +1 -0
  157. package/dist/ir/ir.d.ts +21 -17
  158. package/dist/ir/ir.js +43 -9
  159. package/dist/ir/ir.js.map +1 -1
  160. package/dist/ir/ir.test.js +18 -0
  161. package/dist/ir/ir.test.js.map +1 -1
  162. package/dist/ir/validate.js +161 -76
  163. package/dist/ir/validate.js.map +1 -1
  164. package/dist/ir/validate.test.js +227 -0
  165. package/dist/ir/validate.test.js.map +1 -1
  166. package/dist/library/fence-eval.js +9 -2
  167. package/dist/library/fence-eval.js.map +1 -1
  168. package/dist/library/fence-eval.test.d.ts +1 -0
  169. package/dist/library/fence-eval.test.js +21 -0
  170. package/dist/library/fence-eval.test.js.map +1 -0
  171. package/dist/native/runtime-typescript.d.ts +4 -0
  172. package/dist/native/runtime-typescript.js +61 -0
  173. package/dist/native/runtime-typescript.js.map +1 -0
  174. package/dist/native/runtime-typescript.test.d.ts +1 -0
  175. package/dist/native/runtime-typescript.test.js +41 -0
  176. package/dist/native/runtime-typescript.test.js.map +1 -0
  177. package/package.json +20 -20
  178. package/surface-manifest.json +271 -17
@@ -0,0 +1,6 @@
1
+ import type { Lowerer } from "./lowerer.js";
2
+ import { type IrExpr, type SrcLoc } from "../../ir/ir.js";
3
+ /** Build the native Map through the same checked entry conversion as
4
+ * new Map(iterable), so its values use the ordinary mutable tuple layout. */
5
+ export declare function lowerSystemErrorMap(lowerer: Lowerer, loc: SrcLoc): IrExpr;
6
+ export declare function lowerSystemErrorMapValue(lowerer: Lowerer, loc: SrcLoc): IrExpr;
@@ -0,0 +1,29 @@
1
+ import { DYN, F64, STRING } from "../../ir/ir.js";
2
+ import { mapFromSeedValue } from "./lower-containers.js";
3
+ import { InternalCompilerError } from "../../errors.js";
4
+ /** Build the native Map through the same checked entry conversion as
5
+ * new Map(iterable), so its values use the ordinary mutable tuple layout. */
6
+ export function lowerSystemErrorMap(lowerer, loc) {
7
+ const pair = { kind: "record", shapeId: lowerer.shapes.intern([
8
+ { name: "0", type: STRING }, { name: "1", type: STRING },
9
+ ], true) };
10
+ const map = { kind: "map", key: F64, value: pair };
11
+ const entries = { kind: "libCall", fn: "util.systemErrorEntries", args: [], type: DYN, loc };
12
+ const result = mapFromSeedValue(lowerer, entries, map);
13
+ if (!result)
14
+ throw new InternalCompilerError("system error entries must seed a native Map");
15
+ return result;
16
+ }
17
+ export function lowerSystemErrorMapValue(lowerer, loc) {
18
+ const key = "%builtin.util.getSystemErrorMap";
19
+ let name = lowerer.builtinCallableValueFns.get(key);
20
+ const result = lowerSystemErrorMap(lowerer, loc);
21
+ if (!name) {
22
+ name = key;
23
+ lowerer.builtinCallableValueFns.set(key, name);
24
+ lowerer.liftedFns.push({ name, params: [], returnType: result.type, locals: [],
25
+ body: [{ kind: "return", value: result, loc }], loc });
26
+ }
27
+ return { kind: "closure", fnName: name, captures: [], type: { kind: "func", params: [], ret: result.type }, loc };
28
+ }
29
+ //# sourceMappingURL=lower-system-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lower-system-errors.js","sourceRoot":"","sources":["../../../src/frontend/lowering/lower-system-errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAyC,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD;6EAC6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAW;IAC/D,MAAM,IAAI,GAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACpE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;SACzD,EAAE,IAAI,CAAC,EAAE,CAAC;IACX,MAAM,GAAG,GAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrG,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,6CAA6C,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAE,GAAW;IACpE,MAAM,GAAG,GAAG,iCAAiC,CAAC;IAC9C,IAAI,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,GAAG,CAAC;QACX,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC5E,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;AACpH,CAAC"}
@@ -1927,9 +1927,10 @@ export declare class Lowerer {
1927
1927
  exactClassOfReceiver(expr: ts.Expression): ClassInfo | null;
1928
1928
  lowerClassMembers(info: ClassInfo): IrFunction[];
1929
1929
  lowerStaticFieldInits(info: ClassInfo): IrStmt[];
1930
- /** The method-like members (methods and accessors) of a class that have
1931
- * lowerable bodies, with their collected method-map names. */
1932
- classMethodMembers(info: ClassInfo): Generator<{
1930
+ /** Method-like members with their collected method-map names. Body
1931
+ * lowering omits abstract declarations; ABI analysis must include them
1932
+ * because an abstract-typed call selects the same virtual slot. */
1933
+ classMethodMembers(info: ClassInfo, includeAbstract?: boolean): Generator<{
1933
1934
  mName: string;
1934
1935
  member: ts.MethodDeclaration | ts.AccessorDeclaration;
1935
1936
  }>;
@@ -1,4 +1,4 @@
1
- import { pathModuleValue } from "./lower-builtin-values.js";
1
+ import { lowerUtilTypeValue, pathModuleValue, utilTypesModuleValue } from "./lower-builtin-values.js";
2
2
  import { everyExprChild, everyStmtChild, transformStmtList } from "../../ir/traverse.js";
3
3
  import { RuntimeOptionalLocals } from "./runtime-optional-locals.js";
4
4
  import { sanitizeUnregisteredClassTypes } from "./sanitize-class-types.js";
@@ -58,6 +58,7 @@ import { lowerDgramDnsModuleCall, lowerDgramMethodCall } from "./lower-dgram.js"
58
58
  import { lowerNodeTestModuleCall, lowerTestDirectCall, lowerTestMethodCall, lowerTestCtxProperty } from "./lower-test.js";
59
59
  import { lowerAssertModuleCall, lowerAssertDirectCall } from "./lower-assert.js";
60
60
  import { lowerUtilModuleCall } from "./lower-inspect.js";
61
+ import { lowerSystemErrorMapValue } from "./lower-system-errors.js";
61
62
  import { lowerComptime, comptimeBakeable, rejectComptimeCaptures, comptimeValueToIr } from "./lower-comptime.js";
62
63
  import { lowerStmts, hasJsTypeAnnotation, noteBlockedBindings, isBlockedBinding, lowerScopedBlock, predeclareForwardCapture, predeclareForwardFnDecl, predeclareForwardVar, lowerStmt, lowerVarStatement, lowerDestructuringDecl, lowerDestructuringAssignParts, lowerBindingPattern, lowerJsvalBindingPattern, checkBindingElement, bindPatternTarget, isParseArgsDynCheckerType, lowerVarDeclList, lowerVarDecl, lowerSwitch, lowerTry, lowerExprStatement, lowerForOf, lowerForStatement } from "./lower-stmts.js";
63
64
  import { lowerExpr, maybeNarrow, lowerUnitComparison, lowerNullishCoalesce, lowerCondition, ensureBool, requireTruthyUnion, eqComparableUnion, lowerIntrinsicProperty, lowerArrayLiteral, lowerElementAccess, lowerElementWrite, lowerRecordKeyRead, ensureString, lowerTemplate, lowerAsExpression, lowerPrefixUnary, lowerBinary, lowerCaughtTypeofTest, caughtRead, caughtLocalOf, caughtToString, lowerInstanceOf, lowerRegexLiteral, lowerFieldRead, lowerUnionProperty, fieldTarget, fieldGetExpr, fieldSetStmt, lowerFieldCompound, uniqueSymbolKeyOf } from "./lower-exprs.js";
@@ -2789,7 +2790,7 @@ export class Lowerer {
2789
2790
  });
2790
2791
  }
2791
2792
  for (const info of this.classes.values()) {
2792
- for (const { mName, member } of this.classMethodMembers(info)) {
2793
+ for (const { mName, member } of this.classMethodMembers(info, true)) {
2793
2794
  if (!member.name || !(ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)))
2794
2795
  continue;
2795
2796
  const symbol = symbolOf(member.name);
@@ -3459,21 +3460,32 @@ export class Lowerer {
3459
3460
  }
3460
3461
  return;
3461
3462
  }
3462
- const set = optionalParams.get(symbol) ?? new Set();
3463
- shape.type = addUndefined(shape.type);
3464
- const before = set.size;
3465
- set.add(i);
3466
- optionalParams.set(symbol, set);
3467
- if (set.size !== before) {
3468
- changed = true;
3469
- const callee = functionDeclBySymbol.get(symbol);
3470
- const parameter = callee?.parameters[i];
3471
- if (parameter) {
3472
- for (const bound of boundIdentifiersOf(parameter.name)) {
3473
- const boundSymbol = symbolOf(bound);
3474
- if (boundSymbol && !optionalSymbols.has(boundSymbol)) {
3475
- optionalSymbols.add(boundSymbol);
3476
- changed = true;
3463
+ // A virtual slot has one argument representation, even when
3464
+ // the unchecked read reaches only a base-typed call site.
3465
+ // Promote every implementation and its parameter bindings so
3466
+ // downstream calls and returns see the same optional value.
3467
+ const family = familyBySymbol.get(symbol);
3468
+ if (family)
3469
+ optionalMethodFamilies.add(family);
3470
+ for (const target of family ?? [symbol]) {
3471
+ const parameterShape = signatureBySymbol.get(target)?.params[i];
3472
+ if (!parameterShape)
3473
+ continue;
3474
+ parameterShape.type = addUndefined(parameterShape.type);
3475
+ const set = optionalParams.get(target) ?? new Set();
3476
+ const before = set.size;
3477
+ set.add(i);
3478
+ optionalParams.set(target, set);
3479
+ if (set.size !== before) {
3480
+ changed = true;
3481
+ const parameter = functionDeclBySymbol.get(target)?.parameters[i];
3482
+ if (parameter) {
3483
+ for (const bound of boundIdentifiersOf(parameter.name)) {
3484
+ const boundSymbol = symbolOf(bound);
3485
+ if (boundSymbol && !optionalSymbols.has(boundSymbol)) {
3486
+ optionalSymbols.add(boundSymbol);
3487
+ changed = true;
3488
+ }
3477
3489
  }
3478
3490
  }
3479
3491
  }
@@ -8749,9 +8761,10 @@ export class Lowerer {
8749
8761
  lowerStaticFieldInits(info) {
8750
8762
  return lowerStaticFieldInits(this, info);
8751
8763
  }
8752
- /** The method-like members (methods and accessors) of a class that have
8753
- * lowerable bodies, with their collected method-map names. */
8754
- *classMethodMembers(info) {
8764
+ /** Method-like members with their collected method-map names. Body
8765
+ * lowering omits abstract declarations; ABI analysis must include them
8766
+ * because an abstract-typed call selects the same virtual slot. */
8767
+ *classMethodMembers(info, includeAbstract = false) {
8755
8768
  if (!info.decl)
8756
8769
  return; // builtin error classes: runtime-provided bodies
8757
8770
  for (const member of info.decl.members) {
@@ -8775,7 +8788,8 @@ export class Lowerer {
8775
8788
  if (baseName === null)
8776
8789
  continue;
8777
8790
  const mName = ts.isMethodDeclaration(fnLike) ? baseName : `${ts.isGetAccessor(fnLike) ? "get" : "set"}:${baseName}`;
8778
- if (!info.methods.get(mName) || !fnLike.body)
8791
+ const signature = info.methods.get(mName);
8792
+ if (!signature || (!fnLike.body && !(includeAbstract && signature.abstract)))
8779
8793
  continue;
8780
8794
  yield { mName, member: fnLike };
8781
8795
  }
@@ -9946,6 +9960,9 @@ export class Lowerer {
9946
9960
  // methods and properties keep their existing process lowerings.
9947
9961
  if (stdlibGlobalNameOf(this, expr) === "process")
9948
9962
  return null;
9963
+ const imported = ts.isIdentifier(expr) ? this.builtinImportOf(expr) : null;
9964
+ if (imported?.module === "util" && imported.member === "types")
9965
+ return "util/types";
9949
9966
  const stored = ts.isIdentifier(expr)
9950
9967
  ? (this.peekLocal(expr)?.type ?? this.globalOf(expr)?.type)
9951
9968
  : undefined;
@@ -10231,6 +10248,12 @@ export class Lowerer {
10231
10248
  * deliberately narrower than table membership because many table rows
10232
10249
  * are only dispatch sentinels for call-site-specific lowering. */
10233
10250
  lowerBuiltinCallableValue(bi, loc) {
10251
+ if (bi.module === "util" && bi.member === "types")
10252
+ return utilTypesModuleValue(this, loc);
10253
+ if (bi.module === "util/types" && builtinModuleFnOf(this, bi.module, bi.member))
10254
+ return lowerUtilTypeValue(this, bi.member, loc);
10255
+ if (bi.module === "util" && bi.member === "getSystemErrorMap")
10256
+ return lowerSystemErrorMapValue(this, loc);
10234
10257
  if (bi.module === "fs" && builtinModuleFnOf(this, bi.module, bi.member)?.fn === "fs.callbackCall") {
10235
10258
  return { kind: "libCall", fn: "fs.callbackValue", args: [{ kind: "strLit", value: bi.member, type: STRING, loc }], type: DYN, loc };
10236
10259
  }
@@ -10245,6 +10268,8 @@ export class Lowerer {
10245
10268
  if (param.mode === "rest")
10246
10269
  return { mode: "rest", type: arrayOf(param.type) };
10247
10270
  if (param.mode === "optional") {
10271
+ if (param.type.kind === "dyn" && param.defaultValue === undefined)
10272
+ return { mode: "omittable", type: DYN };
10248
10273
  return { mode: "omittable", type: this.withUndefinedArm(param.type), bodyType: param.type };
10249
10274
  }
10250
10275
  return { mode: "required", type: param.type };
@@ -10276,7 +10301,10 @@ export class Lowerer {
10276
10301
  };
10277
10302
  if (valueParam.mode !== "optional")
10278
10303
  return ref;
10279
- if ((valueParam.type.kind !== "string" && valueParam.type.kind !== "f64") || param.type.kind !== "union") {
10304
+ // Checked runtime APIs consume undefined directly for omitted options.
10305
+ if (valueParam.type.kind === "dyn" && valueParam.defaultValue === undefined)
10306
+ return ref;
10307
+ if (valueParam.defaultValue === undefined || (valueParam.type.kind !== "string" && valueParam.type.kind !== "f64") || param.type.kind !== "union") {
10280
10308
  throw new InternalCompilerError(`builtin callable value '${display}' has an unsupported optional default`);
10281
10309
  }
10282
10310
  const undefTag = this.armTag(param.type.unionId, UNDEFINED_T);