@scriptc/compiler 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +342 -16
  2. package/dist/backend/executable-features.js +1 -0
  3. package/dist/backend/executable-features.js.map +1 -1
  4. package/dist/backend/literals.d.ts +7 -0
  5. package/dist/backend/literals.js +32 -0
  6. package/dist/backend/literals.js.map +1 -1
  7. package/dist/backend/literals.test.js +17 -1
  8. package/dist/backend/literals.test.js.map +1 -1
  9. package/dist/backend/llvm/alloc.d.ts +15 -4
  10. package/dist/backend/llvm/alloc.js +39 -15
  11. package/dist/backend/llvm/alloc.js.map +1 -1
  12. package/dist/backend/llvm/alloc.test.js +15 -1
  13. package/dist/backend/llvm/alloc.test.js.map +1 -1
  14. package/dist/backend/llvm/appended-array-literals.d.ts +2 -0
  15. package/dist/backend/llvm/appended-array-literals.js +109 -0
  16. package/dist/backend/llvm/appended-array-literals.js.map +1 -0
  17. package/dist/backend/llvm/appended-array-literals.test.d.ts +1 -0
  18. package/dist/backend/llvm/appended-array-literals.test.js +90 -0
  19. package/dist/backend/llvm/appended-array-literals.test.js.map +1 -0
  20. package/dist/backend/llvm/call-lifetimes.d.ts +4 -1
  21. package/dist/backend/llvm/call-lifetimes.js +51 -3
  22. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  23. package/dist/backend/llvm/classes.js +10 -2
  24. package/dist/backend/llvm/classes.js.map +1 -1
  25. package/dist/backend/llvm/classes.test.js +2 -2
  26. package/dist/backend/llvm/dense-array-access.js +17 -12
  27. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  28. package/dist/backend/llvm/dense-array-access.test.js +15 -2
  29. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  30. package/dist/backend/llvm/dyn.d.ts +2 -0
  31. package/dist/backend/llvm/dyn.js +11 -2
  32. package/dist/backend/llvm/dyn.js.map +1 -1
  33. package/dist/backend/llvm/emitter.d.ts +43 -2
  34. package/dist/backend/llvm/emitter.js +306 -32
  35. package/dist/backend/llvm/emitter.js.map +1 -1
  36. package/dist/backend/llvm/expr-async.js +122 -6
  37. package/dist/backend/llvm/expr-async.js.map +1 -1
  38. package/dist/backend/llvm/expr-callbacks.d.ts +8 -0
  39. package/dist/backend/llvm/expr-callbacks.js +81 -1
  40. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  41. package/dist/backend/llvm/expr-calls.d.ts +12 -1
  42. package/dist/backend/llvm/expr-calls.js +126 -54
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-containers.d.ts +7 -0
  45. package/dist/backend/llvm/expr-containers.js +38 -7
  46. package/dist/backend/llvm/expr-containers.js.map +1 -1
  47. package/dist/backend/llvm/expr-context.d.ts +2 -0
  48. package/dist/backend/llvm/expr-control.d.ts +8 -0
  49. package/dist/backend/llvm/expr-control.js +103 -69
  50. package/dist/backend/llvm/expr-control.js.map +1 -1
  51. package/dist/backend/llvm/expr-dynamic.js +2 -2
  52. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  53. package/dist/backend/llvm/expr-primitives.d.ts +7 -0
  54. package/dist/backend/llvm/expr-primitives.js +30 -26
  55. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  56. package/dist/backend/llvm/expr-records.js +11 -1
  57. package/dist/backend/llvm/expr-records.js.map +1 -1
  58. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  59. package/dist/backend/llvm/expr-stream-bridges.js +77 -8
  60. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  61. package/dist/backend/llvm/expr-stream-bridges.test.js +49 -1
  62. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  63. package/dist/backend/llvm/int32-abi.d.ts +18 -2
  64. package/dist/backend/llvm/int32-abi.js +23 -2
  65. package/dist/backend/llvm/int32-abi.js.map +1 -1
  66. package/dist/backend/llvm/int32-abi.test.js +75 -1
  67. package/dist/backend/llvm/int32-abi.test.js.map +1 -1
  68. package/dist/backend/llvm/lib-dispatch.js +7 -0
  69. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  70. package/dist/backend/llvm/lib-filesystem.js +58 -0
  71. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  72. package/dist/backend/llvm/lib-shared.js +76 -9
  73. package/dist/backend/llvm/lib-shared.js.map +1 -1
  74. package/dist/backend/llvm/local-array-reads.js +5 -3
  75. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  76. package/dist/backend/llvm/local-union-storage.d.ts +24 -2
  77. package/dist/backend/llvm/local-union-storage.js +127 -12
  78. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  79. package/dist/backend/llvm/local-union-storage.test.js +106 -1
  80. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  81. package/dist/backend/llvm/record-results.d.ts +26 -0
  82. package/dist/backend/llvm/record-results.js +252 -0
  83. package/dist/backend/llvm/record-results.js.map +1 -0
  84. package/dist/backend/llvm/reference-effects.js +2 -0
  85. package/dist/backend/llvm/reference-effects.js.map +1 -1
  86. package/dist/backend/llvm/reference-writes.js +15 -9
  87. package/dist/backend/llvm/reference-writes.js.map +1 -1
  88. package/dist/backend/llvm/regions.d.ts +67 -0
  89. package/dist/backend/llvm/regions.js +309 -0
  90. package/dist/backend/llvm/regions.js.map +1 -0
  91. package/dist/backend/llvm/regions.test.d.ts +1 -0
  92. package/dist/backend/llvm/regions.test.js +173 -0
  93. package/dist/backend/llvm/regions.test.js.map +1 -0
  94. package/dist/backend/llvm/shapes.d.ts +34 -7
  95. package/dist/backend/llvm/shapes.js +31 -16
  96. package/dist/backend/llvm/shapes.js.map +1 -1
  97. package/dist/backend/llvm/shapes.test.js +7 -6
  98. package/dist/backend/llvm/shapes.test.js.map +1 -1
  99. package/dist/backend/llvm/split-loops.js +1 -1
  100. package/dist/backend/llvm/split-loops.js.map +1 -1
  101. package/dist/backend/llvm/stack-objects.d.ts +29 -0
  102. package/dist/backend/llvm/stack-objects.js +130 -0
  103. package/dist/backend/llvm/stack-objects.js.map +1 -0
  104. package/dist/backend/llvm/stack-objects.test.d.ts +1 -0
  105. package/dist/backend/llvm/stack-objects.test.js +252 -0
  106. package/dist/backend/llvm/stack-objects.test.js.map +1 -0
  107. package/dist/backend/llvm/string-reads.d.ts +4 -1
  108. package/dist/backend/llvm/string-reads.js +89 -9
  109. package/dist/backend/llvm/string-reads.js.map +1 -1
  110. package/dist/backend/llvm/switch-dispatch.js +5 -4
  111. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  112. package/dist/backend/llvm/walkers.d.ts +2 -0
  113. package/dist/backend/llvm/walkers.js +4 -2
  114. package/dist/backend/llvm/walkers.js.map +1 -1
  115. package/dist/backend/may-throw.js +1 -0
  116. package/dist/backend/may-throw.js.map +1 -1
  117. package/dist/backend/native/contracts.d.ts +5 -0
  118. package/dist/backend/native/executable.js +16 -1
  119. package/dist/backend/native/executable.js.map +1 -1
  120. package/dist/backend/native/library.js +1 -1
  121. package/dist/backend/native/library.js.map +1 -1
  122. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  123. package/dist/backend/native/runtime-inputs.js +2 -0
  124. package/dist/backend/native/runtime-inputs.js.map +1 -1
  125. package/dist/backend/native-link-info-core.d.ts +1 -0
  126. package/dist/backend/native-link-info-core.js.map +1 -1
  127. package/dist/backend/runtime-abi.d.ts +2 -2
  128. package/dist/backend/runtime-abi.js +2 -2
  129. package/dist/backend/runtime-pack-core.d.ts +1 -0
  130. package/dist/backend/runtime-pack-core.js +1 -0
  131. package/dist/backend/runtime-pack-core.js.map +1 -1
  132. package/dist/backend/runtime-pack-targets.test.js +1 -1
  133. package/dist/backend/runtime-pack.test.js +1 -1
  134. package/dist/backend/target-diagnostics.js +14 -0
  135. package/dist/backend/target-diagnostics.js.map +1 -1
  136. package/dist/backend/target-diagnostics.test.js +13 -0
  137. package/dist/backend/target-diagnostics.test.js.map +1 -1
  138. package/dist/executable/executable-cache.d.ts +1 -0
  139. package/dist/executable/executable-cache.js.map +1 -1
  140. package/dist/frontend/experimental-import.d.ts +12 -0
  141. package/dist/frontend/experimental-import.js +63 -0
  142. package/dist/frontend/experimental-import.js.map +1 -0
  143. package/dist/frontend/lowering/builtin-calls.d.ts +6 -1
  144. package/dist/frontend/lowering/builtin-calls.js +36 -0
  145. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  146. package/dist/frontend/lowering/builtins/console.d.ts +16 -6
  147. package/dist/frontend/lowering/builtins/console.js +33 -9
  148. package/dist/frontend/lowering/builtins/console.js.map +1 -1
  149. package/dist/frontend/lowering/builtins/errors.js +20 -0
  150. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  151. package/dist/frontend/lowering/builtins/json.d.ts +2 -2
  152. package/dist/frontend/lowering/builtins/json.js +13 -4
  153. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  154. package/dist/frontend/lowering/builtins/module-calls.js +16 -1
  155. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  156. package/dist/frontend/lowering/builtins/numbers.d.ts +1 -0
  157. package/dist/frontend/lowering/builtins/numbers.js +17 -0
  158. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  159. package/dist/frontend/lowering/builtins/operating-system.d.ts +18 -0
  160. package/dist/frontend/lowering/builtins/operating-system.js +361 -1
  161. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  162. package/dist/frontend/lowering/builtins/process.js +15 -3
  163. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  164. package/dist/frontend/lowering/builtins/promises.js +109 -2
  165. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  166. package/dist/frontend/lowering/builtins/text-codecs.d.ts +3 -4
  167. package/dist/frontend/lowering/builtins/text-codecs.js +3 -4
  168. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  169. package/dist/frontend/lowering/checked-promise-all.d.ts +10 -3
  170. package/dist/frontend/lowering/checked-promise-all.js +52 -6
  171. package/dist/frontend/lowering/checked-promise-all.js.map +1 -1
  172. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +6 -3
  173. package/dist/frontend/lowering/class-dynamic-dispatch.js +54 -31
  174. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  175. package/dist/frontend/lowering/containers/array-callbacks.js +34 -4
  176. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  177. package/dist/frontend/lowering/containers/array-construction.js +8 -4
  178. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  179. package/dist/frontend/lowering/containers/array-pipelines.js +1 -1
  180. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  181. package/dist/frontend/lowering/containers/string-and-regexp.js +91 -0
  182. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  183. package/dist/frontend/lowering/cycle-initialization.d.ts +18 -2
  184. package/dist/frontend/lowering/cycle-initialization.js +166 -12
  185. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  186. package/dist/frontend/lowering/deferred-module-initializers.js +7 -2
  187. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  188. package/dist/frontend/lowering/deferred-module-initializers.test.js +28 -0
  189. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  190. package/dist/frontend/lowering/expressions/object-literals.js +5 -56
  191. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  192. package/dist/frontend/lowering/generator-delegation.d.ts +8 -0
  193. package/dist/frontend/lowering/generator-delegation.js +231 -10
  194. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  195. package/dist/frontend/lowering/lifetime-regions.d.ts +11 -0
  196. package/dist/frontend/lowering/lifetime-regions.js +216 -0
  197. package/dist/frontend/lowering/lifetime-regions.js.map +1 -0
  198. package/dist/frontend/lowering/lower-array-sort.d.ts +28 -2
  199. package/dist/frontend/lowering/lower-array-sort.js +100 -3
  200. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  201. package/dist/frontend/lowering/lower-array-sort.test.js +99 -2
  202. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  203. package/dist/frontend/lowering/lower-calls.js +72 -102
  204. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  205. package/dist/frontend/lowering/lower-classes.d.ts +4 -3
  206. package/dist/frontend/lowering/lower-classes.js +116 -2
  207. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  208. package/dist/frontend/lowering/lower-console.d.ts +13 -0
  209. package/dist/frontend/lowering/lower-console.js +460 -4
  210. package/dist/frontend/lowering/lower-console.js.map +1 -1
  211. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -0
  212. package/dist/frontend/lowering/lower-event-emitter.js +124 -38
  213. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  214. package/dist/frontend/lowering/lower-exprs.js +137 -22
  215. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  216. package/dist/frontend/lowering/lower-generators.d.ts +15 -7
  217. package/dist/frontend/lowering/lower-generators.js +183 -99
  218. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  219. package/dist/frontend/lowering/lower-inspect.d.ts +8 -1
  220. package/dist/frontend/lowering/lower-inspect.js +119 -18
  221. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  222. package/dist/frontend/lowering/lower-modules.js +20 -14
  223. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  224. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -0
  225. package/dist/frontend/lowering/lower-stdlib.js +35 -1
  226. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  227. package/dist/frontend/lowering/lower-stmts.js +66 -11
  228. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  229. package/dist/frontend/lowering/lowerer.d.ts +22 -1
  230. package/dist/frontend/lowering/lowerer.js +116 -8
  231. package/dist/frontend/lowering/lowerer.js.map +1 -1
  232. package/dist/frontend/lowering/regex-span-reads.d.ts +12 -0
  233. package/dist/frontend/lowering/regex-span-reads.js +164 -0
  234. package/dist/frontend/lowering/regex-span-reads.js.map +1 -0
  235. package/dist/frontend/lowering/surfaces.js +112 -10
  236. package/dist/frontend/lowering/surfaces.js.map +1 -1
  237. package/dist/frontend/lowering/var-hoisting.d.ts +3 -0
  238. package/dist/frontend/lowering/var-hoisting.js +261 -0
  239. package/dist/frontend/lowering/var-hoisting.js.map +1 -0
  240. package/dist/frontend/pipeline.js +5 -3
  241. package/dist/frontend/pipeline.js.map +1 -1
  242. package/dist/frontend/program.d.ts +3 -2
  243. package/dist/frontend/program.js +23 -5
  244. package/dist/frontend/program.js.map +1 -1
  245. package/dist/frontend/program.test.js +13 -0
  246. package/dist/frontend/program.test.js.map +1 -1
  247. package/dist/frontend/type-mapper.d.ts +13 -1
  248. package/dist/frontend/type-mapper.js +146 -13
  249. package/dist/frontend/type-mapper.js.map +1 -1
  250. package/dist/index.js +1 -0
  251. package/dist/index.js.map +1 -1
  252. package/dist/ir/builtin-effects.js +29 -2
  253. package/dist/ir/builtin-effects.js.map +1 -1
  254. package/dist/ir/builtin-signatures.d.ts +1 -1
  255. package/dist/ir/builtin-signatures.js +145 -15
  256. package/dist/ir/builtin-signatures.js.map +1 -1
  257. package/dist/ir/function-references.test.js +1 -0
  258. package/dist/ir/function-references.test.js.map +1 -1
  259. package/dist/ir/int32-slots.js +1 -0
  260. package/dist/ir/int32-slots.js.map +1 -1
  261. package/dist/ir/intrinsic-signatures.js +2 -0
  262. package/dist/ir/intrinsic-signatures.js.map +1 -1
  263. package/dist/ir/ir.d.ts +65 -20
  264. package/dist/ir/ir.js +5 -0
  265. package/dist/ir/ir.js.map +1 -1
  266. package/dist/ir/runtime-features.d.ts +1 -0
  267. package/dist/ir/runtime-features.js +35 -1
  268. package/dist/ir/runtime-features.js.map +1 -1
  269. package/dist/ir/scalar-records.js +1 -2
  270. package/dist/ir/scalar-records.js.map +1 -1
  271. package/dist/ir/validate.js +150 -25
  272. package/dist/ir/validate.js.map +1 -1
  273. package/dist/ir/validate.test.js +65 -0
  274. package/dist/ir/validate.test.js.map +1 -1
  275. package/dist/library/ir-policy.js +1 -0
  276. package/dist/library/ir-policy.js.map +1 -1
  277. package/dist/native/sanitizer.test.js +1 -0
  278. package/dist/native/sanitizer.test.js.map +1 -1
  279. package/package.json +20 -20
  280. package/surface-manifest.json +159 -1
@@ -1,8 +1,10 @@
1
1
  import { generatorDrain } from "./iterator-adapters.js";
2
+ import { lowerEventStaticProperty } from "./builtins/numbers.js";
2
3
  import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
3
4
  import { isOptionalProcessStreamProperty } from "./builtins/process.js";
4
5
  import { lowerWorkerMetadata } from "./builtins/workers.js";
5
6
  import { threadsImportOf } from "../threads-import.js";
7
+ import { experimentalImportOf, lifetimeRegionMemberOf } from "../experimental-import.js";
6
8
  import { dynUndefinedExpr, nodeThrowExpr, numLit, strLit, varRef } from "../../ir/build.js";
7
9
  import { InternalCompilerError } from "../../errors.js";
8
10
  import { SYMBOL_T } from "../../ir/ir.js";
@@ -48,8 +50,8 @@ import { funcTypeFromParamShapes } from "./call-signatures.js";
48
50
  import { implicitMonoFile, objLitGenericFnInfoOf, objLitGenericFnNodeOf, requireObjLitGenericReceiver, } from "./generic-functions.js";
49
51
  import { lowerTaggedTemplate } from "./lower-calls.js";
50
52
  import { mixinFnOfCallee } from "./lower-mixins.js";
51
- import { isConstAssertionTypeNode, isGenericCallableMemberType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
52
- import { lowerYield } from "./lower-generators.js";
53
+ import { isConstAssertionTypeNode, isGenericCallableMemberType, isOsConstantsType, isParseArgsDynTypeName, underConstAssertion, unitOnlyUnion, withUnitArm, } from "../type-mapper.js";
54
+ import { iteratorResultValueRead, lowerYield } from "./lower-generators.js";
53
55
  import { errorPropertyRead, errorPropertyWrite, errorToStringCall } from "./error-methods.js";
54
56
  import { lowerStreamProperty, lowerStreamStateProperty, streamSidesOf } from "./lower-stream.js";
55
57
  import { unionWideningTags } from "../../ir/analysis.js";
@@ -731,7 +733,9 @@ function lowerExprInner(lowerer, expr) {
731
733
  lowerer.unions.get(g.type.unionId)?.arms.length === 2 &&
732
734
  lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "f64") &&
733
735
  lowerer.unions.get(g.type.unionId).arms.some((a) => a.kind === "string");
736
+ const symbol = lowerer.resolveValueSymbol(expr);
734
737
  if (!arithmeticUnion &&
738
+ !(symbol !== null && lowerer.earlyReadVars.has(symbol)) &&
735
739
  g.type.kind === "union" &&
736
740
  narrowed &&
737
741
  narrowed.kind !== "union" &&
@@ -849,6 +853,8 @@ function lowerExprInner(lowerer, expr) {
849
853
  return { kind: "boolLit", value: true, type: BOOL, loc };
850
854
  if (member === "publish")
851
855
  lowerer.noLowering("publish (@scriptc/threads) as a value", expr, "call publish(value) directly");
856
+ if (experimentalImportOf(lowerer.program, expr) === "LifetimeRegion")
857
+ lowerer.noLowering("LifetimeRegion (@scriptc/experimental) as a value", expr, "construct regions with new LifetimeRegion()");
852
858
  }
853
859
  {
854
860
  const bi = lowerer.builtinImportOf(expr);
@@ -872,6 +878,9 @@ function lowerExprInner(lowerer, expr) {
872
878
  if (bi.module === "http" && bi.member === "STATUS_CODES") {
873
879
  return { kind: "libCall", fn: "http.statusCodes", args: [], type: DYN, loc };
874
880
  }
881
+ if (bi.module === "os" && bi.member === "constants") {
882
+ return { kind: "libCall", fn: "os.constants", args: [], type: DYN, loc };
883
+ }
875
884
  // tls.rootCertificates: a runtime-valued module constant (the
876
885
  // cached bundled-CA array) — the one member read that lowers
877
886
  // to a libCall instead of a baked literal.
@@ -1413,6 +1422,11 @@ function lowerExprInner(lowerer, expr) {
1413
1422
  if (ts.isConditionalExpression(expr))
1414
1423
  return lowerTernary(lowerer, expr);
1415
1424
  if (ts.isPropertyAccessExpression(expr)) {
1425
+ {
1426
+ const member = lifetimeRegionMemberOf(lowerer.program, expr, lowerer.experimentalFiles);
1427
+ if (member !== null)
1428
+ lowerer.noLowering(`LifetimeRegion.${member} (@scriptc/experimental) as a value`, expr, `call region.${member}(${member === "run" ? "fn" : ""}) directly`);
1429
+ }
1416
1430
  // Expando statics may still be absent even when JS inference sees
1417
1431
  // the eventual assignment's scalar type. Preserve the checked value.
1418
1432
  const staticField = lowerStaticFieldRead(lowerer, expr);
@@ -1809,6 +1823,7 @@ function lowerExprInner(lowerer, expr) {
1809
1823
  lowerer.lowerJsonProperty(expr) ??
1810
1824
  lowerer.lowerErrorCodeProperty(expr) ??
1811
1825
  lowerer.lowerNumberStaticProperty(expr) ??
1826
+ lowerEventStaticProperty(lowerer, expr) ??
1812
1827
  lowerer.lowerMathProperty(expr) ??
1813
1828
  lowerer.lowerIntrinsicProperty(expr) ??
1814
1829
  // The _readableState/_writableState scalar READS (the suite's
@@ -1831,7 +1846,7 @@ function lowerExprInner(lowerer, expr) {
1831
1846
  // arm is real (`obj.n = bytes[i]; obj.n` is undefined in Node).
1832
1847
  if (runtimeOptionalClassField(lowerer, handled, expr))
1833
1848
  return handled;
1834
- return lowerer.maybeNarrow(handled, expr);
1849
+ return iteratorResultValueRead(lowerer, handled, expr) ?? lowerer.maybeNarrow(handled, expr);
1835
1850
  }
1836
1851
  // `globalThis.<name>` that no lowering above claimed
1837
1852
  // (globalThis.crypto, globalThis.SubtleCrypto, globalThis.localStorage
@@ -2021,14 +2036,15 @@ function lowerExprInner(lowerer, expr) {
2021
2036
  const shape = lowerer.shapes.get(recv.type.shapeId);
2022
2037
  const field = shape?.fields.find((f) => f.name === expr.name.text);
2023
2038
  if (field) {
2024
- return lowerer.maybeNarrow({
2039
+ const read = {
2025
2040
  kind: "recordGet",
2026
2041
  obj: recv,
2027
2042
  shapeId: recv.type.shapeId,
2028
2043
  field: field.name,
2029
2044
  type: field.type,
2030
2045
  loc,
2031
- }, expr);
2046
+ };
2047
+ return iteratorResultValueRead(lowerer, read, expr) ?? lowerer.maybeNarrow(read, expr);
2032
2048
  }
2033
2049
  }
2034
2050
  }
@@ -2055,9 +2071,14 @@ function lowerExprInner(lowerer, expr) {
2055
2071
  const segmentDataProperty = segmentDataSymbol?.name === "SegmentData" &&
2056
2072
  lowerer.isStdlibSymbol(segmentDataSymbol) &&
2057
2073
  ["segment", "index", "input", "isWordLike"].includes(expr.name.text);
2074
+ // os.constants members vary by platform (the declared groups list
2075
+ // every platform's names): a number member reads as `number |
2076
+ // undefined`, like an array element, and a group stays checked.
2077
+ const osConstants = isOsConstantsType(lowerer.typeOf(expr.expression), lowerer);
2058
2078
  if (isParseArgsDynProperty(lowerer, expr) ||
2059
2079
  isStatFsDynProperty(lowerer, expr) ||
2060
- segmentDataProperty) {
2080
+ segmentDataProperty ||
2081
+ osConstants) {
2061
2082
  const recv = lowerer.lowerExpr(expr.expression);
2062
2083
  if (recv.type.kind === "dyn") {
2063
2084
  const key = {
@@ -2067,14 +2088,20 @@ function lowerExprInner(lowerer, expr) {
2067
2088
  loc: locOf(expr.name),
2068
2089
  };
2069
2090
  const opt = hasOptionalChainGuard(expr.expression);
2070
- return lowerer.maybeNarrow({
2091
+ const read = {
2071
2092
  kind: "dynKeyGet",
2072
2093
  key,
2073
2094
  ...(opt ? { optional: true } : {}),
2074
2095
  value: recv,
2075
2096
  type: DYN,
2076
2097
  loc,
2077
- }, expr);
2098
+ };
2099
+ if (osConstants) {
2100
+ return lowerer.mapTypeOf(lowerer.typeOf(expr))?.kind === "f64"
2101
+ ? lowerer.coerceToExpected(read, lowerer.withUndefinedArm(F64))
2102
+ : read;
2103
+ }
2104
+ return lowerer.maybeNarrow(read, expr);
2078
2105
  }
2079
2106
  }
2080
2107
  // A member read through a NULLISH generic binding (`const i: I<A &
@@ -10140,6 +10167,14 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10140
10167
  const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10141
10168
  return { kind: "libCall", fn: "dyn.dataViewIs", args: [value], type: BOOL, loc };
10142
10169
  }
10170
+ {
10171
+ const eventKind = ["Event", "CustomEvent", "EventTarget"].findIndex((name) => lowerer.isStdlibGlobal(expr.right, name));
10172
+ if (eventKind >= 0) {
10173
+ const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10174
+ const kind = { kind: "numLit", value: eventKind, type: F64, loc };
10175
+ return { kind: "libCall", fn: "event.is", args: [value, kind], type: BOOL, loc };
10176
+ }
10177
+ }
10143
10178
  if (lowerer.isStdlibGlobal(expr.right, "SharedArrayBuffer")) {
10144
10179
  const value = lowerer.coerceInto(expr.left, lowerer.lowerExpr(expr.left), DYN);
10145
10180
  return { kind: "libCall", fn: "sharedArrayBuffer.is", args: [value], type: BOOL, loc };
@@ -10339,7 +10374,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10339
10374
  lowerer.isSubclassOf(left.type.className, targetInfo.def.name);
10340
10375
  if (left.kind === "varRef" &&
10341
10376
  (ts.isIdentifier(expr.right) || expr.right.kind === ts.SyntaxKind.ThisKeyword)) {
10342
- return { kind: "boolLit", value, type: BOOL, loc };
10377
+ return readsClassAfter(lowerer, targetInfo, expr.right, [], {
10378
+ kind: "boolLit",
10379
+ value,
10380
+ type: BOOL,
10381
+ loc,
10382
+ });
10343
10383
  }
10344
10384
  lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the values to variables first)");
10345
10385
  }
@@ -10489,13 +10529,12 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10489
10529
  }
10490
10530
  }
10491
10531
  if (left.type.kind !== "object") {
10492
- return {
10493
- kind: "seqExpr",
10494
- stmts: [{ kind: "exprStmt", expr: left, loc }],
10495
- result: { kind: "boolLit", value: false, type: BOOL, loc },
10532
+ return readsClassAfter(lowerer, target, expr.right, [{ kind: "exprStmt", expr: left, loc }], {
10533
+ kind: "boolLit",
10534
+ value: false,
10496
10535
  type: BOOL,
10497
10536
  loc,
10498
- };
10537
+ });
10499
10538
  }
10500
10539
  const lhsInfo = lowerer.classes.get(left.type.className);
10501
10540
  if (!lhsInfo)
@@ -10506,10 +10545,33 @@ export function lowerInstanceOf(lowerer, expr, loc) {
10506
10545
  const value = left.type.className === target.def.name ||
10507
10546
  lowerer.isSubclassOf(left.type.className, target.def.name);
10508
10547
  if (left.kind === "varRef") {
10509
- return { kind: "boolLit", value, type: BOOL, loc };
10548
+ return readsClassAfter(lowerer, target, expr.right, [], {
10549
+ kind: "boolLit",
10550
+ value,
10551
+ type: BOOL,
10552
+ loc,
10553
+ });
10510
10554
  }
10511
10555
  lowerer.unsupported("SC1090", expr, "statically-decided 'instanceof' on computed operands (bind the value to a variable first)");
10512
10556
  }
10557
+ /** A statically decided `instanceof` still reads its class after the left
10558
+ * operand: a class with an initialization flag throws there before its
10559
+ * declaration ran. */
10560
+ function readsClassAfter(lowerer, target, right, stmts, result) {
10561
+ if (!lowerer.classInitFlags.has(target.def.name)) {
10562
+ if (stmts.length === 0)
10563
+ return result;
10564
+ return { kind: "seqExpr", stmts, result, type: result.type, loc: result.loc };
10565
+ }
10566
+ const read = lowerer.lowerExpr(right);
10567
+ return {
10568
+ kind: "seqExpr",
10569
+ stmts: [...stmts, { kind: "exprStmt", expr: read, loc: locOf(right) }],
10570
+ result,
10571
+ type: result.type,
10572
+ loc: result.loc,
10573
+ };
10574
+ }
10513
10575
  /** `#name in obj` — the ergonomic brand check. In this closed world a
10514
10576
  * brand is held by exactly the instances of the declaring class
10515
10577
  * (subclasses included — construction always runs the declaring class's
@@ -10663,11 +10725,27 @@ function lowerPrivateIn(lowerer, expr, priv, loc) {
10663
10725
  return { kind: "boolLit", value, type: BOOL, loc };
10664
10726
  lowerer.unsupported("SC1090", expr, `statically-decided '${pname} in …' on computed operands (bind the value to a variable first)`);
10665
10727
  }
10728
+ /** The string keys every record inherits from Object.prototype. */
10729
+ const OBJECT_PROTOTYPE_KEYS = new Set([
10730
+ "constructor",
10731
+ "__defineGetter__",
10732
+ "__defineSetter__",
10733
+ "hasOwnProperty",
10734
+ "__lookupGetter__",
10735
+ "__lookupSetter__",
10736
+ "isPrototypeOf",
10737
+ "propertyIsEnumerable",
10738
+ "toString",
10739
+ "valueOf",
10740
+ "__proto__",
10741
+ "toLocaleString",
10742
+ ]);
10666
10743
  /** `"key" in v` — the key-presence test. Three lowered receivers:
10667
10744
  * process.env (getenv(3) presence — Node-exact, an empty value still
10668
10745
  * counts as present), and monomorphic record shapes, where the answer is
10669
10746
  * type-directed: a declared non-optional field is a compile-time `true`,
10670
- * a missing field (no index signature) a compile-time `false` — both
10747
+ * a missing field (no index signature) a compile-time `false` unless
10748
+ * Object.prototype has it — both
10671
10749
  * folds limited to side-effect-free receivers, the lowerInstanceOf rule —
10672
10750
  * and an OPTIONAL field (undefined-armed union) is a runtime presence
10673
10751
  * test on the slot: an omitted or deleted property is absent, while a
@@ -10917,7 +10995,11 @@ function lowerInExpression(lowerer, expr, loc) {
10917
10995
  break;
10918
10996
  }
10919
10997
  const f = shape.fields.find((x) => x.name === key);
10920
- if (f && f.type.kind === "union" && lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
10998
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
10999
+ if (f &&
11000
+ !inherited &&
11001
+ f.type.kind === "union" &&
11002
+ lowerer.armTag(f.type.unionId, UNDEFINED_T) >= 0) {
10921
11003
  staticAnswers = false; // an optional slot: presence is per-value
10922
11004
  break;
10923
11005
  }
@@ -10925,7 +11007,7 @@ function lowerInExpression(lowerer, expr, loc) {
10925
11007
  // true without invoking the getter) — either slot present makes
10926
11008
  // the name a member.
10927
11009
  const acc = shape.fields.some((x) => x.name === `%get:${key}` || x.name === `%set:${key}`);
10928
- answers.push({ tag, has: f !== undefined || acc });
11010
+ answers.push({ tag, has: f !== undefined || acc || inherited });
10929
11011
  }
10930
11012
  if (staticAnswers) {
10931
11013
  const pureRecv = recv.kind === "varRef" ||
@@ -10993,7 +11075,9 @@ function lowerInExpression(lowerer, expr, loc) {
10993
11075
  throw new InternalCompilerError(`lowerer bug: unknown shape ${recv.type.shapeId}`);
10994
11076
  const field = shape.fields.find((f) => f.name === key);
10995
11077
  if (field) {
10996
- if (field.type.kind === "union" && lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
11078
+ if (!OBJECT_PROTOTYPE_KEYS.has(key) &&
11079
+ field.type.kind === "union" &&
11080
+ lowerer.armTag(field.type.unionId, UNDEFINED_T) >= 0) {
10997
11081
  // Optional slot: the key is present unless the field is absent
10998
11082
  // (omitted or deleted); an explicit undefined is present.
10999
11083
  return lowerer.recordFieldPresent(recv, recv.type.shapeId, key, loc);
@@ -11021,14 +11105,16 @@ function lowerInExpression(lowerer, expr, loc) {
11021
11105
  }
11022
11106
  lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
11023
11107
  }
11024
- if (shape.indexValue) {
11108
+ // Records are ordinary objects: Object.prototype's members are in them.
11109
+ const inherited = OBJECT_PROTOTYPE_KEYS.has(key);
11110
+ if (shape.indexValue && !inherited) {
11025
11111
  lowerer.unsupported("SC1090", expr, "'in' over index-signature keys (read the key and test '!== undefined' instead)");
11026
11112
  }
11027
11113
  if (recv.kind === "varRef" ||
11028
11114
  recv.kind === "recordGet" ||
11029
11115
  recv.kind === "fieldGet" ||
11030
11116
  pureRecvNode) {
11031
- return { kind: "boolLit", value: false, type: BOOL, loc };
11117
+ return { kind: "boolLit", value: inherited, type: BOOL, loc };
11032
11118
  }
11033
11119
  lowerer.unsupported("SC1090", expr, "statically-decided 'in' on computed receivers (bind the value to a variable first)");
11034
11120
  }
@@ -11081,7 +11167,36 @@ function lowerRuntimeKeyIn(lowerer, expr, loc) {
11081
11167
  // Overflow keys answer through the map's hashed presence probe (a
11082
11168
  // stored undefined value is still present), not a scan over a fresh
11083
11169
  // key snapshot, which made `k in dict` loops quadratic.
11084
- body.push(ret({ kind: "recordOvfHas", obj: r, shapeId: recvT.shapeId, key: k, type: BOOL, loc }));
11170
+ const ovfHas = {
11171
+ kind: "recordOvfHas",
11172
+ obj: r,
11173
+ shapeId: recvT.shapeId,
11174
+ key: k,
11175
+ type: BOOL,
11176
+ loc,
11177
+ };
11178
+ // A miss in the record's own keys still finds Object.prototype's.
11179
+ let inherited = ovfHas;
11180
+ for (const name of OBJECT_PROTOTYPE_KEYS) {
11181
+ if (shape.fields.some((f) => f.name === name))
11182
+ continue;
11183
+ inherited = {
11184
+ kind: "logical",
11185
+ op: "||",
11186
+ left: inherited,
11187
+ right: {
11188
+ kind: "strEq",
11189
+ negated: false,
11190
+ left: k,
11191
+ right: { kind: "strLit", value: name, type: STRING, loc },
11192
+ type: BOOL,
11193
+ loc,
11194
+ },
11195
+ type: BOOL,
11196
+ loc,
11197
+ };
11198
+ }
11199
+ body.push(ret(inherited));
11085
11200
  lowerer.liftedFns.push({
11086
11201
  name: helper,
11087
11202
  params: [