@scriptc/compiler 0.4.3 → 0.4.4

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 (232) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +73 -29
  2. package/dist/backend/llvm/bytes-loop-versions.js +6 -0
  3. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  4. package/dist/backend/llvm/bytes-loop-versions.test.js +7 -2
  5. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  6. package/dist/backend/llvm/debug-info.js +2 -5
  7. package/dist/backend/llvm/debug-info.js.map +1 -1
  8. package/dist/backend/llvm/dyn.d.ts +4 -0
  9. package/dist/backend/llvm/dyn.js +21 -9
  10. package/dist/backend/llvm/dyn.js.map +1 -1
  11. package/dist/backend/llvm/emit-function.js +2 -8
  12. package/dist/backend/llvm/emit-function.js.map +1 -1
  13. package/dist/backend/llvm/emit-module.js +16 -6
  14. package/dist/backend/llvm/emit-module.js.map +1 -1
  15. package/dist/backend/llvm/emitter.d.ts +10 -0
  16. package/dist/backend/llvm/emitter.js +9 -5
  17. package/dist/backend/llvm/emitter.js.map +1 -1
  18. package/dist/backend/llvm/emitter.test.js +11 -2
  19. package/dist/backend/llvm/emitter.test.js.map +1 -1
  20. package/dist/backend/llvm/expr-async.js +11 -13
  21. package/dist/backend/llvm/expr-async.js.map +1 -1
  22. package/dist/backend/llvm/expr-bytes.js +14 -8
  23. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  24. package/dist/backend/llvm/expr-containers.js +14 -0
  25. package/dist/backend/llvm/expr-containers.js.map +1 -1
  26. package/dist/backend/llvm/expr-primitives.js +20 -11
  27. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  28. package/dist/backend/llvm/expr-stream-bridges.js +16 -4
  29. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  30. package/dist/backend/llvm/integer-values.d.ts +5 -0
  31. package/dist/backend/llvm/integer-values.js +27 -3
  32. package/dist/backend/llvm/integer-values.js.map +1 -1
  33. package/dist/backend/llvm/lib-dispatch.js +133 -3
  34. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  35. package/dist/backend/llvm/lib-process.js +37 -1
  36. package/dist/backend/llvm/lib-process.js.map +1 -1
  37. package/dist/backend/llvm/lib-shared.js +21 -0
  38. package/dist/backend/llvm/lib-shared.js.map +1 -1
  39. package/dist/backend/llvm/publish.js +3 -3
  40. package/dist/backend/llvm/publish.js.map +1 -1
  41. package/dist/backend/llvm/reference-effects.js +3 -0
  42. package/dist/backend/llvm/reference-effects.js.map +1 -1
  43. package/dist/backend/llvm/shapes.js +2 -7
  44. package/dist/backend/llvm/shapes.js.map +1 -1
  45. package/dist/backend/llvm/stack-captures.js +1 -5
  46. package/dist/backend/llvm/stack-captures.js.map +1 -1
  47. package/dist/backend/llvm/union-repr.d.ts +4 -3
  48. package/dist/backend/llvm/union-repr.js +6 -5
  49. package/dist/backend/llvm/union-repr.js.map +1 -1
  50. package/dist/backend/llvm/walkers.js +13 -0
  51. package/dist/backend/llvm/walkers.js.map +1 -1
  52. package/dist/backend/native-codegen-core.d.ts +5 -3
  53. package/dist/backend/native-codegen-core.js +13 -6
  54. package/dist/backend/native-codegen-core.js.map +1 -1
  55. package/dist/backend/native-codegen.test.js +6 -4
  56. package/dist/backend/native-codegen.test.js.map +1 -1
  57. package/dist/backend/target-cpu.d.ts +26 -0
  58. package/dist/backend/target-cpu.js +98 -0
  59. package/dist/backend/target-cpu.js.map +1 -0
  60. package/dist/backend/target-cpu.test.d.ts +1 -0
  61. package/dist/backend/target-cpu.test.js +38 -0
  62. package/dist/backend/target-cpu.test.js.map +1 -0
  63. package/dist/cli/command.js +20 -1
  64. package/dist/cli/command.js.map +1 -1
  65. package/dist/cli/usage.d.ts +4 -1
  66. package/dist/cli/usage.js +7 -0
  67. package/dist/cli/usage.js.map +1 -1
  68. package/dist/compile-types.d.ts +7 -0
  69. package/dist/diagnostics/diagnostic.js +1 -1
  70. package/dist/diagnostics/diagnostic.js.map +1 -1
  71. package/dist/executable/executable-cache.d.ts +3 -0
  72. package/dist/executable/executable-cache.js +4 -0
  73. package/dist/executable/executable-cache.js.map +1 -1
  74. package/dist/executable/executable-cache.test.js +2 -0
  75. package/dist/executable/executable-cache.test.js.map +1 -1
  76. package/dist/frontend/decl-projection.js +105 -10
  77. package/dist/frontend/decl-projection.js.map +1 -1
  78. package/dist/frontend/lowering/builtins/async-context.d.ts +8 -2
  79. package/dist/frontend/lowering/builtins/async-context.js +62 -3
  80. package/dist/frontend/lowering/builtins/async-context.js.map +1 -1
  81. package/dist/frontend/lowering/builtins/crypto.js +3 -1
  82. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  83. package/dist/frontend/lowering/builtins/dates.js +4 -1
  84. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  85. package/dist/frontend/lowering/builtins/filesystem-calls.js +3 -3
  86. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  87. package/dist/frontend/lowering/builtins/fs-glob.js +6 -3
  88. package/dist/frontend/lowering/builtins/fs-glob.js.map +1 -1
  89. package/dist/frontend/lowering/builtins/fs-paths.d.ts +43 -5
  90. package/dist/frontend/lowering/builtins/fs-paths.js +245 -93
  91. package/dist/frontend/lowering/builtins/fs-paths.js.map +1 -1
  92. package/dist/frontend/lowering/builtins/module-calls.js +6 -3
  93. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  94. package/dist/frontend/lowering/builtins/promises.d.ts +1 -1
  95. package/dist/frontend/lowering/builtins/promises.js +149 -138
  96. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  97. package/dist/frontend/lowering/call-signatures.js +0 -1
  98. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  99. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  100. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  101. package/dist/frontend/lowering/cjs-inline-require.d.ts +32 -0
  102. package/dist/frontend/lowering/cjs-inline-require.js +307 -4
  103. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  104. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +10 -0
  105. package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
  106. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  107. package/dist/frontend/lowering/class-method-mutations.js +54 -18
  108. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  109. package/dist/frontend/lowering/class-protocols.d.ts +25 -0
  110. package/dist/frontend/lowering/class-protocols.js +183 -1
  111. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  112. package/dist/frontend/lowering/completion-callbacks.d.ts +4 -0
  113. package/dist/frontend/lowering/completion-callbacks.js +146 -0
  114. package/dist/frontend/lowering/completion-callbacks.js.map +1 -0
  115. package/dist/frontend/lowering/containers/array-callbacks.d.ts +5 -4
  116. package/dist/frontend/lowering/containers/array-callbacks.js +7 -6
  117. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  118. package/dist/frontend/lowering/containers/array-construction.js +5 -0
  119. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  120. package/dist/frontend/lowering/containers/array-methods.js +11 -3
  121. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  122. package/dist/frontend/lowering/containers/bytes.d.ts +25 -17
  123. package/dist/frontend/lowering/containers/bytes.js +453 -45
  124. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  125. package/dist/frontend/lowering/date-values.d.ts +11 -0
  126. package/dist/frontend/lowering/date-values.js +207 -0
  127. package/dist/frontend/lowering/date-values.js.map +1 -0
  128. package/dist/frontend/lowering/expressions/array-literals.js +6 -0
  129. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  130. package/dist/frontend/lowering/expressions/binary.js +64 -26
  131. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  132. package/dist/frontend/lowering/expressions/element-access.js +79 -0
  133. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  134. package/dist/frontend/lowering/expressions/identifiers.js +31 -1
  135. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  136. package/dist/frontend/lowering/expressions/property-access.js +56 -0
  137. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  138. package/dist/frontend/lowering/expressions/typeof.js +6 -0
  139. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  140. package/dist/frontend/lowering/expressions/updates.js +17 -0
  141. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  142. package/dist/frontend/lowering/function-returns.js +15 -0
  143. package/dist/frontend/lowering/function-returns.js.map +1 -1
  144. package/dist/frontend/lowering/indexed-unions.d.ts +54 -0
  145. package/dist/frontend/lowering/indexed-unions.js +401 -0
  146. package/dist/frontend/lowering/indexed-unions.js.map +1 -0
  147. package/dist/frontend/lowering/key-order-witness.js +210 -32
  148. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  149. package/dist/frontend/lowering/key-order-witness.test.js +104 -4
  150. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  151. package/dist/frontend/lowering/lower-assert.js +15 -3
  152. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  153. package/dist/frontend/lowering/lower-calls.js +19 -3
  154. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  155. package/dist/frontend/lowering/lower-classes.js +22 -47
  156. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  157. package/dist/frontend/lowering/lower-exprs.js +205 -1
  158. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  159. package/dist/frontend/lowering/lower-generators.js +1 -1
  160. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  161. package/dist/frontend/lowering/lower-inspect.d.ts +1 -1
  162. package/dist/frontend/lowering/lower-inspect.js +35 -11
  163. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  164. package/dist/frontend/lowering/lower-modules.js +21 -5
  165. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  166. package/dist/frontend/lowering/lower-stmts.js +100 -34
  167. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  168. package/dist/frontend/lowering/lowerer.d.ts +30 -2
  169. package/dist/frontend/lowering/lowerer.js +68 -7
  170. package/dist/frontend/lowering/lowerer.js.map +1 -1
  171. package/dist/frontend/lowering/object-factory-new.d.ts +5 -0
  172. package/dist/frontend/lowering/object-factory-new.js +20 -6
  173. package/dist/frontend/lowering/object-factory-new.js.map +1 -1
  174. package/dist/frontend/lowering/overload-choice.d.ts +33 -0
  175. package/dist/frontend/lowering/overload-choice.js +190 -0
  176. package/dist/frontend/lowering/overload-choice.js.map +1 -0
  177. package/dist/frontend/lowering/surfaces.js +55 -2
  178. package/dist/frontend/lowering/surfaces.js.map +1 -1
  179. package/dist/frontend/pipeline.js +1 -1
  180. package/dist/frontend/pipeline.js.map +1 -1
  181. package/dist/frontend/program-analysis.d.ts +5 -1
  182. package/dist/frontend/program-analysis.js +5 -0
  183. package/dist/frontend/program-analysis.js.map +1 -1
  184. package/dist/frontend/program.d.ts +13 -5
  185. package/dist/frontend/program.js +197 -14
  186. package/dist/frontend/program.js.map +1 -1
  187. package/dist/frontend/ts7/semantic-model.d.ts +3 -0
  188. package/dist/frontend/ts7/semantic-model.js +5 -0
  189. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  190. package/dist/frontend/ts7/semantic-model.test.js +6 -1
  191. package/dist/frontend/ts7/semantic-model.test.js.map +1 -1
  192. package/dist/frontend/ts7/semantic-types.d.ts +1 -1
  193. package/dist/frontend/ts7/semantic-types.js +1 -1
  194. package/dist/frontend/ts7/semantic-types.js.map +1 -1
  195. package/dist/frontend/type-mapper.js +45 -16
  196. package/dist/frontend/type-mapper.js.map +1 -1
  197. package/dist/index.js +12 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/ir/builtin-effects.js +8 -0
  200. package/dist/ir/builtin-effects.js.map +1 -1
  201. package/dist/ir/builtin-signatures.d.ts +1 -1
  202. package/dist/ir/builtin-signatures.js +56 -0
  203. package/dist/ir/builtin-signatures.js.map +1 -1
  204. package/dist/ir/int32-slots.js +7 -0
  205. package/dist/ir/int32-slots.js.map +1 -1
  206. package/dist/ir/int32-slots.test.js +33 -0
  207. package/dist/ir/int32-slots.test.js.map +1 -1
  208. package/dist/ir/integer-loops.js +14 -4
  209. package/dist/ir/integer-loops.js.map +1 -1
  210. package/dist/ir/ir.d.ts +13 -3
  211. package/dist/ir/ir.js +19 -5
  212. package/dist/ir/ir.js.map +1 -1
  213. package/dist/ir/ir.test.js +2 -1
  214. package/dist/ir/ir.test.js.map +1 -1
  215. package/dist/ir/js-ic.d.ts +2 -15
  216. package/dist/ir/js-ic.js +11 -79
  217. package/dist/ir/js-ic.js.map +1 -1
  218. package/dist/ir/js-ic.test.js +0 -142
  219. package/dist/ir/js-ic.test.js.map +1 -1
  220. package/dist/ir/runtime-features.js +25 -1
  221. package/dist/ir/runtime-features.js.map +1 -1
  222. package/dist/ir/validate.js +46 -5
  223. package/dist/ir/validate.js.map +1 -1
  224. package/dist/library/ir-policy.js +1 -0
  225. package/dist/library/ir-policy.js.map +1 -1
  226. package/dist/native/prepare.d.ts +1 -1
  227. package/dist/native/prepare.js +11 -1
  228. package/dist/native/prepare.js.map +1 -1
  229. package/dist/native/prepare.test.js +18 -2
  230. package/dist/native/prepare.test.js.map +1 -1
  231. package/package.json +20 -20
  232. package/surface-manifest.json +2 -4
@@ -1,4 +1,5 @@
1
1
  import { lowerTupleAliasDecl, stripTypeWrappers } from "./typed-arguments.js";
2
+ import { allBytesArms, indexedUnionArms, lowerIndexedUnionMember, lowerIndexedUnionNumberRead, lowerIndexedUnionRead, } from "./indexed-unions.js";
2
3
  import { declaredMemberOf, isPromisePrototypeRead } from "./expressions/property-access.js";
3
4
  import { hostsAll } from "./expressions/hosted-narrowing.js";
4
5
  import { requestGeneralStreamSurface } from "./general-streams.js";
@@ -26,15 +27,16 @@ import { lowerOptionalIndex } from "./undefined-index.js";
26
27
  import { processDataMemberValue, programReadsExitCode } from "./builtins/process.js";
27
28
  import { requireInitFlagStmt } from "./require-initialization.js";
28
29
  import { isJsonRequireDecl } from "./json-require.js";
30
+ import { isTimeValueDateDeclaration } from "./date-values.js";
29
31
  import { bindingSource } from "../binding-source.js";
30
32
  import { lowerConstructorReturn } from "./constructor-returns.js";
31
- import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, } from "./cjs-inline-require.js";
33
+ import { cjsExportValueByName, cjsNamespaceDestructureOf, cjsTableMethodEntry, inlineProgramRequireOf, requireNestedPatternsOf, splitRequireAssignmentOf, splitRequireBindingOf, splitRequireBindingOfIdent, splitRequireEarlyReadOf, wholeExportSymbolOfModule, } from "./cjs-inline-require.js";
32
34
  import { cjsExportMemberWriteGlobalOf, isCjsExportsIdentifier, isCjsModuleExports, isFreshExportsReset, } from "./cjs-exports-object.js";
33
35
  import { isDeadTscHelperDecl, tscInteropBindingOfDecl } from "./cjs-tsc-interop.js";
34
36
  import { arrayValueRead, arrayValueStore, arrayValueType, unionArrayValueRead, lowerSafeIndexRead, } from "./array-values.js";
35
37
  import { lowerForAwaitGenerator, lowerForOfGenerator, lowerYieldStarStatement, } from "./lower-generators.js";
36
38
  import { classAsyncGeneratorIterator, lowerForAwaitBuiltin } from "./lower-async-iteration.js";
37
- import { BOOL, BYTES_U8, CAUGHT, DYN, F64, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
39
+ import { BOOL, BYTES_U8, CAUGHT, DATE_T, DYN, F64, SEARCH_PARAMS_T, STRING, UNDEFINED_T, VOID, arrayOf, isDynTypedRefType, isUnitType, shapeHasAccessorSlots, typeEquals, } from "../../ir/ir.js";
38
40
  import { PoisonError, boundIdentifiersOf, dynFallbackType, neverTaintedJsType, staticImportNamespaceType, } from "./lowerer.js";
39
41
  import { enforceLibBoundary, lowerSurplusCalls } from "./lib-boundary.js";
40
42
  import { cjsExportAssignmentOf, cjsExportChainOf, cjsVoidInitPreambleReals, cjsExportDiscardReason, cjsExportTargetLiteral, isCjsJsFile, isEsModuleStamp, isJsSourceFile, locOf, requireEarlyReference, requireSpecOf, } from "../program.js";
@@ -1662,6 +1664,19 @@ export function lowerVarStatement(lowerer, stmt) {
1662
1664
  });
1663
1665
  }
1664
1666
  function lowerVarDeclarator(lowerer, stmt, decl, isConst, isLet) {
1667
+ // `var m; m = require("./x")`: the declaration is alias plumbing; the
1668
+ // assignment owns the module's run-once %init (cjs-inline-require.ts).
1669
+ // A read that code before the assignment can reach keeps Node's hoisted
1670
+ // `undefined` divergence visible at build time, like a var require
1671
+ // declaration below runnable code.
1672
+ const split = splitRequireBindingOf(lowerer, decl);
1673
+ if (split !== null) {
1674
+ const early = splitRequireEarlyReadOf(lowerer, split);
1675
+ if (early !== null) {
1676
+ lowerer.unsupported("SC1013", early, `var require() binding '${decl.name.text}' below code that can reach it (Node reads undefined before the require runs, which is not modeled — assign the require above the code that can run first)`);
1677
+ }
1678
+ return [];
1679
+ }
1665
1680
  // The canonical ESM bridge to a compiled program module. Like a
1666
1681
  // top-level CommonJS require declaration, the binding is alias
1667
1682
  // plumbing while the dependency evaluates at this statement's
@@ -4535,6 +4550,15 @@ export function lowerVarDecl(lowerer, decl, isLet) {
4535
4550
  if (alias)
4536
4551
  return alias;
4537
4552
  }
4553
+ // A Date local whose identity no use observes stores its time value.
4554
+ if (isTimeValueDateDeclaration(lowerer, decl)) {
4555
+ const loc = locOf(decl);
4556
+ const date = lowerer.lowerExprExpecting(decl.initializer, DATE_T);
4557
+ const local = lowerer.declareLocal(decl.name, decl.name.text, F64, isLet);
4558
+ lowerer.timeValueDateLocals.add(local);
4559
+ const init = { kind: "libCall", fn: "date.getTime", args: [date], type: F64, loc };
4560
+ return { kind: "varDecl", localId: local.id, init, loc };
4561
+ }
4538
4562
  // A NULLISH generic binding (`const i: I<A & B> = null as any` — the
4539
4563
  // declared type has no mapping, the value is provably null/undefined
4540
4564
  // forever): no storage exists; reads know the value (member reads and
@@ -5833,7 +5857,7 @@ function lowerDynSwitch(lowerer, stmt, disc, labels) {
5833
5857
  loc: locOf(expression),
5834
5858
  };
5835
5859
  }
5836
- if (test.type.kind === "date" || !lowerer.dynConvertible(test.type)) {
5860
+ if (!lowerer.dynConvertible(test.type)) {
5837
5861
  lowerer.unsupported("SC1100", expression, "switch case values that cannot compare strictly with 'unknown'");
5838
5862
  }
5839
5863
  return {
@@ -6411,6 +6435,22 @@ function lowerCjsSingleValueExport(lowerer, expr, loc) {
6411
6435
  return lowerer.requireInitStmt(req.spec, req.call) ?? { kind: "block", body: [], loc };
6412
6436
  }
6413
6437
  if (ts.isIdentifier(rhs)) {
6438
+ const split = splitRequireBindingOfIdent(lowerer, rhs);
6439
+ if (split !== null) {
6440
+ if (wholeExportSymbolOfModule(lowerer, split.dep) === null) {
6441
+ lowerer.unsupported("SC1090", rhs, `the exports object of '${split.spec}' as a value (its exports compile to a static table: read require(${JSON.stringify(split.spec)}).member directly)`);
6442
+ }
6443
+ const root = lowerer.globalsByDeclNode.get(expr);
6444
+ if (root !== undefined) {
6445
+ return {
6446
+ kind: "assign",
6447
+ localId: root.id,
6448
+ value: lowerer.lowerExprExpecting(rhs, root.type),
6449
+ loc: locOf(rhs),
6450
+ };
6451
+ }
6452
+ return { kind: "block", body: [], loc };
6453
+ }
6414
6454
  const sym = lowerer.resolveValueSymbol(rhs);
6415
6455
  if (!sym)
6416
6456
  return null;
@@ -7213,6 +7253,14 @@ export function lowerExprStatement(lowerer, expr) {
7213
7253
  if (!ts.isIdentifier(expr.left)) {
7214
7254
  lowerer.unsupported("SC1090", expr.left, "assignment to non-variables");
7215
7255
  }
7256
+ const splitAssign = splitRequireAssignmentOf(lowerer, expr);
7257
+ if (splitAssign !== null) {
7258
+ return (lowerer.requireInitStmt(splitAssign.spec, splitAssign.call) ?? {
7259
+ kind: "block",
7260
+ body: [],
7261
+ loc: locOf(expr),
7262
+ });
7263
+ }
7216
7264
  const target = lowerer.resolveWritable(expr.left);
7217
7265
  if (!target)
7218
7266
  lowerer.rejectUnresolved(expr.left, `assignment to '${expr.left.text}' (not a writable local or module global)`);
@@ -7498,7 +7546,9 @@ function destrSpellingOf(rhs) {
7498
7546
  return base === null ? null : `${base}.${e.name.text}`;
7499
7547
  }
7500
7548
  // `table[key]` and `list[0]`; V8 prints a numeric key in its canonical
7501
- // number form (`o[1.50]` reads "o[1.5]").
7549
+ // number form (`o[1.50]` reads "o[1.5]"), and a string key as a property
7550
+ // name with its text decoded (`o["a.b"]` and `o[\`a.b\`]` read "o.a.b").
7551
+ // The message is a C string, so a key holding NUL keeps the refusal.
7502
7552
  if (ts.isElementAccessExpression(e) && !e.questionDotToken) {
7503
7553
  const base = destrSpellingOf(e.expression);
7504
7554
  const key = e.argumentExpression;
@@ -7508,6 +7558,9 @@ function destrSpellingOf(rhs) {
7508
7558
  return `${base}[${key.text}]`;
7509
7559
  if (ts.isNumericLiteral(key))
7510
7560
  return `${base}[${String(Number(key.text))}]`;
7561
+ if ((ts.isStringLiteral(key) || ts.isNoSubstitutionTemplateLiteral(key)) &&
7562
+ !key.text.includes("\0"))
7563
+ return `${base}.${key.text}`;
7511
7564
  return null;
7512
7565
  }
7513
7566
  if (ts.isCallExpression(e) && !e.questionDotToken) {
@@ -8667,7 +8720,7 @@ export function lowerForOf(lowerer, stmt) {
8667
8720
  loc: locOf(iterSrc),
8668
8721
  };
8669
8722
  }
8670
- if (iterable.type.kind === "bytes") {
8723
+ if (iterable.type.kind === "bytes" || indexedUnionArms(lowerer, iterable.type)) {
8671
8724
  return lowerForOfBytes(lowerer, stmt, iterable, labels);
8672
8725
  }
8673
8726
  if (iterable.type.kind !== "array") {
@@ -9242,40 +9295,53 @@ function lowerForOfStoredNumericIterator(lowerer, stmt, state, labels) {
9242
9295
  lowerer.unsupported("SC1031", decl.name);
9243
9296
  const loc = locOf(stmt);
9244
9297
  const sourceT = state.sourceType;
9245
- if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") || sourceT.kind === "bytes")) {
9298
+ // A union of typed arrays and number arrays (indexed-unions.ts) reads
9299
+ // through its arms' own length and element reads.
9300
+ const unionArms = indexedUnionArms(lowerer, sourceT);
9301
+ if (!((sourceT.kind === "array" && sourceT.elem.kind === "f64") ||
9302
+ sourceT.kind === "bytes" ||
9303
+ unionArms)) {
9246
9304
  throw new InternalCompilerError("internal: retained numeric iterator has a non-numeric source");
9247
9305
  }
9248
9306
  const indexRef = () => varRef(state.indexLocalId, F64, loc);
9249
9307
  const doneRef = () => varRef(state.doneLocalId, BOOL, loc);
9250
9308
  const sourceRef = () => varRef(state.sourceLocalId, sourceT, loc);
9251
- const sourceLength = () => sourceT.kind === "array"
9252
- ? {
9253
- kind: "arrIntrinsic",
9254
- method: "length",
9255
- receiver: sourceRef(),
9256
- args: [],
9257
- type: F64,
9258
- loc,
9259
- }
9260
- : {
9261
- kind: "bytesIntrinsic",
9262
- method: "length",
9263
- receiver: sourceRef(),
9264
- args: [],
9265
- type: F64,
9266
- loc,
9267
- };
9268
- const valueT = sourceT.kind === "array" ? arrayValueType(lowerer, F64) : F64;
9269
- const sourceValue = () => sourceT.kind === "array"
9270
- ? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
9271
- : {
9272
- kind: "bytesIntrinsic",
9273
- method: "get",
9274
- receiver: sourceRef(),
9275
- args: [indexRef()],
9276
- type: F64,
9277
- loc,
9278
- };
9309
+ const sourceLength = () => unionArms
9310
+ ? lowerIndexedUnionMember(lowerer, sourceRef(), unionArms, "length", loc)
9311
+ : sourceT.kind === "array"
9312
+ ? {
9313
+ kind: "arrIntrinsic",
9314
+ method: "length",
9315
+ receiver: sourceRef(),
9316
+ args: [],
9317
+ type: F64,
9318
+ loc,
9319
+ }
9320
+ : {
9321
+ kind: "bytesIntrinsic",
9322
+ method: "length",
9323
+ receiver: sourceRef(),
9324
+ args: [],
9325
+ type: F64,
9326
+ loc,
9327
+ };
9328
+ const valueT = sourceT.kind === "array" || (unionArms && !allBytesArms(unionArms))
9329
+ ? arrayValueType(lowerer, F64)
9330
+ : F64;
9331
+ const sourceValue = () => unionArms
9332
+ ? allBytesArms(unionArms)
9333
+ ? lowerIndexedUnionNumberRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
9334
+ : lowerIndexedUnionRead(lowerer, sourceRef(), unionArms, indexRef(), loc)
9335
+ : sourceT.kind === "array"
9336
+ ? arrayValueRead(lowerer, sourceRef(), indexRef(), F64, loc)
9337
+ : {
9338
+ kind: "bytesIntrinsic",
9339
+ method: "get",
9340
+ receiver: sourceRef(),
9341
+ args: [indexRef()],
9342
+ type: F64,
9343
+ loc,
9344
+ };
9279
9345
  const one = { kind: "numLit", value: 1, type: F64, loc };
9280
9346
  lowerer.scopes.push(new Map());
9281
9347
  try {