@scriptc/compiler 0.2.5 → 0.2.7

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 (520) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +62 -48
  2. package/dist/backend/cycle-analysis.d.ts +21 -9
  3. package/dist/backend/cycle-analysis.js +139 -67
  4. package/dist/backend/cycle-analysis.js.map +1 -1
  5. package/dist/backend/cycle-analysis.test.js +283 -3
  6. package/dist/backend/cycle-analysis.test.js.map +1 -1
  7. package/dist/backend/cycle-mutability.d.ts +39 -0
  8. package/dist/backend/cycle-mutability.js +205 -0
  9. package/dist/backend/cycle-mutability.js.map +1 -0
  10. package/dist/backend/executable-features.js +1 -0
  11. package/dist/backend/executable-features.js.map +1 -1
  12. package/dist/backend/link-plan-core.d.ts +4 -1
  13. package/dist/backend/link-plan-core.js +16 -3
  14. package/dist/backend/link-plan-core.js.map +1 -1
  15. package/dist/backend/link-plan.d.ts +3 -1
  16. package/dist/backend/link-plan.js +3 -0
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/alloc.d.ts +40 -0
  19. package/dist/backend/llvm/alloc.js +205 -0
  20. package/dist/backend/llvm/alloc.js.map +1 -0
  21. package/dist/backend/llvm/alloc.test.d.ts +1 -0
  22. package/dist/backend/llvm/alloc.test.js +102 -0
  23. package/dist/backend/llvm/alloc.test.js.map +1 -0
  24. package/dist/backend/llvm/byte-numbers.js +32 -4
  25. package/dist/backend/llvm/byte-numbers.js.map +1 -1
  26. package/dist/backend/llvm/byte-windows.d.ts +31 -0
  27. package/dist/backend/llvm/byte-windows.js +334 -0
  28. package/dist/backend/llvm/byte-windows.js.map +1 -0
  29. package/dist/backend/llvm/byte-windows.test.d.ts +1 -0
  30. package/dist/backend/llvm/byte-windows.test.js +244 -0
  31. package/dist/backend/llvm/byte-windows.test.js.map +1 -0
  32. package/dist/backend/llvm/call-lifetimes.d.ts +17 -5
  33. package/dist/backend/llvm/call-lifetimes.js +58 -24
  34. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  35. package/dist/backend/llvm/call-lifetimes.test.js +170 -0
  36. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  37. package/dist/backend/llvm/classes.d.ts +18 -2
  38. package/dist/backend/llvm/classes.js +115 -41
  39. package/dist/backend/llvm/classes.js.map +1 -1
  40. package/dist/backend/llvm/classes.test.d.ts +1 -0
  41. package/dist/backend/llvm/classes.test.js +132 -0
  42. package/dist/backend/llvm/classes.test.js.map +1 -0
  43. package/dist/backend/llvm/common.d.ts +13 -0
  44. package/dist/backend/llvm/common.js +30 -0
  45. package/dist/backend/llvm/common.js.map +1 -1
  46. package/dist/backend/llvm/constant-callbacks.d.ts +27 -0
  47. package/dist/backend/llvm/constant-callbacks.js +450 -0
  48. package/dist/backend/llvm/constant-callbacks.js.map +1 -0
  49. package/dist/backend/llvm/constant-callbacks.test.d.ts +1 -0
  50. package/dist/backend/llvm/constant-callbacks.test.js +261 -0
  51. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -0
  52. package/dist/backend/llvm/dense-array-access.d.ts +29 -0
  53. package/dist/backend/llvm/dense-array-access.js +335 -0
  54. package/dist/backend/llvm/dense-array-access.js.map +1 -0
  55. package/dist/backend/llvm/dense-array-access.test.d.ts +1 -0
  56. package/dist/backend/llvm/dense-array-access.test.js +149 -0
  57. package/dist/backend/llvm/dense-array-access.test.js.map +1 -0
  58. package/dist/backend/llvm/dyn.d.ts +35 -1
  59. package/dist/backend/llvm/dyn.js +196 -35
  60. package/dist/backend/llvm/dyn.js.map +1 -1
  61. package/dist/backend/llvm/emitter.d.ts +143 -4
  62. package/dist/backend/llvm/emitter.js +882 -136
  63. package/dist/backend/llvm/emitter.js.map +1 -1
  64. package/dist/backend/llvm/emitter.test.js +82 -14
  65. package/dist/backend/llvm/emitter.test.js.map +1 -1
  66. package/dist/backend/llvm/expr-async.js +58 -4
  67. package/dist/backend/llvm/expr-async.js.map +1 -1
  68. package/dist/backend/llvm/expr-async.test.d.ts +1 -0
  69. package/dist/backend/llvm/expr-async.test.js +62 -0
  70. package/dist/backend/llvm/expr-async.test.js.map +1 -0
  71. package/dist/backend/llvm/expr-bytes.js +11 -0
  72. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  73. package/dist/backend/llvm/expr-calls.js +151 -25
  74. package/dist/backend/llvm/expr-calls.js.map +1 -1
  75. package/dist/backend/llvm/expr-containers.js +37 -14
  76. package/dist/backend/llvm/expr-containers.js.map +1 -1
  77. package/dist/backend/llvm/expr-control.js +92 -2
  78. package/dist/backend/llvm/expr-control.js.map +1 -1
  79. package/dist/backend/llvm/expr-dispatch.js +2 -0
  80. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  81. package/dist/backend/llvm/expr-dynamic.js +210 -28
  82. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  83. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  84. package/dist/backend/llvm/expr-primitives.js +58 -23
  85. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  86. package/dist/backend/llvm/expr-primitives.test.js +1 -1
  87. package/dist/backend/llvm/expr-records.js +3 -3
  88. package/dist/backend/llvm/expr-records.js.map +1 -1
  89. package/dist/backend/llvm/expr-stream-bridges.js +59 -2
  90. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  91. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  92. package/dist/backend/llvm/integer-remainder.d.ts +18 -0
  93. package/dist/backend/llvm/integer-remainder.js +117 -0
  94. package/dist/backend/llvm/integer-remainder.js.map +1 -0
  95. package/dist/backend/llvm/layouts.d.ts +2 -1
  96. package/dist/backend/llvm/layouts.js +4 -3
  97. package/dist/backend/llvm/layouts.js.map +1 -1
  98. package/dist/backend/llvm/lazy-captures.d.ts +16 -0
  99. package/dist/backend/llvm/lazy-captures.js +96 -0
  100. package/dist/backend/llvm/lazy-captures.js.map +1 -0
  101. package/dist/backend/llvm/lazy-captures.test.d.ts +1 -0
  102. package/dist/backend/llvm/lazy-captures.test.js +78 -0
  103. package/dist/backend/llvm/lazy-captures.test.js.map +1 -0
  104. package/dist/backend/llvm/lib-abi.js +7 -0
  105. package/dist/backend/llvm/lib-abi.js.map +1 -1
  106. package/dist/backend/llvm/lib-dispatch.js +7 -22
  107. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  108. package/dist/backend/llvm/lib-filesystem.js +3 -4
  109. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  110. package/dist/backend/llvm/lib-shared.js +15 -0
  111. package/dist/backend/llvm/lib-shared.js.map +1 -1
  112. package/dist/backend/llvm/local-array-reads.d.ts +13 -3
  113. package/dist/backend/llvm/local-array-reads.js +159 -77
  114. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  115. package/dist/backend/llvm/local-array-reads.test.js +105 -4
  116. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  117. package/dist/backend/llvm/local-union-storage.d.ts +5 -1
  118. package/dist/backend/llvm/local-union-storage.js +48 -6
  119. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  120. package/dist/backend/llvm/local-union-storage.test.js +91 -4
  121. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  122. package/dist/backend/llvm/loop-array-borrows.d.ts +11 -0
  123. package/dist/backend/llvm/loop-array-borrows.js +70 -0
  124. package/dist/backend/llvm/loop-array-borrows.js.map +1 -0
  125. package/dist/backend/llvm/loop-array-borrows.test.d.ts +1 -0
  126. package/dist/backend/llvm/loop-array-borrows.test.js +145 -0
  127. package/dist/backend/llvm/loop-array-borrows.test.js.map +1 -0
  128. package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
  129. package/dist/backend/llvm/map-read-lifetimes.js +20 -5
  130. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  131. package/dist/backend/llvm/map-read-lifetimes.test.js +1 -1
  132. package/dist/backend/llvm/nullable-fields.d.ts +28 -0
  133. package/dist/backend/llvm/nullable-fields.js +45 -0
  134. package/dist/backend/llvm/nullable-fields.js.map +1 -0
  135. package/dist/backend/llvm/nullable-fields.test.d.ts +1 -0
  136. package/dist/backend/llvm/nullable-fields.test.js +48 -0
  137. package/dist/backend/llvm/nullable-fields.test.js.map +1 -0
  138. package/dist/backend/llvm/reference-effects.d.ts +2 -1
  139. package/dist/backend/llvm/reference-effects.js +7 -0
  140. package/dist/backend/llvm/reference-effects.js.map +1 -1
  141. package/dist/backend/llvm/serialized-ir-emission.test.d.ts +1 -0
  142. package/dist/backend/llvm/serialized-ir-emission.test.js +52 -0
  143. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -0
  144. package/dist/backend/llvm/shapes.d.ts +73 -3
  145. package/dist/backend/llvm/shapes.js +281 -34
  146. package/dist/backend/llvm/shapes.js.map +1 -1
  147. package/dist/backend/llvm/shapes.test.js +114 -5
  148. package/dist/backend/llvm/shapes.test.js.map +1 -1
  149. package/dist/backend/llvm/split-loops.d.ts +48 -0
  150. package/dist/backend/llvm/split-loops.js +183 -0
  151. package/dist/backend/llvm/split-loops.js.map +1 -0
  152. package/dist/backend/llvm/split.js +0 -7
  153. package/dist/backend/llvm/split.js.map +1 -1
  154. package/dist/backend/llvm/split.test.js +66 -2
  155. package/dist/backend/llvm/split.test.js.map +1 -1
  156. package/dist/backend/llvm/stack-callbacks.d.ts +14 -0
  157. package/dist/backend/llvm/stack-callbacks.js +72 -0
  158. package/dist/backend/llvm/stack-callbacks.js.map +1 -0
  159. package/dist/backend/llvm/stack-captures.d.ts +27 -0
  160. package/dist/backend/llvm/stack-captures.js +152 -0
  161. package/dist/backend/llvm/stack-captures.js.map +1 -0
  162. package/dist/backend/llvm/stack-unions.test.js +38 -1
  163. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  164. package/dist/backend/llvm/string-construction.test.js +1 -1
  165. package/dist/backend/llvm/string-key-hash.d.ts +8 -0
  166. package/dist/backend/llvm/string-key-hash.js +59 -0
  167. package/dist/backend/llvm/string-key-hash.js.map +1 -0
  168. package/dist/backend/llvm/string-key-hash.test.d.ts +1 -0
  169. package/dist/backend/llvm/string-key-hash.test.js +34 -0
  170. package/dist/backend/llvm/string-key-hash.test.js.map +1 -0
  171. package/dist/backend/llvm/string-lifetimes.test.js +48 -7
  172. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  173. package/dist/backend/llvm/string-slices.d.ts +20 -0
  174. package/dist/backend/llvm/string-slices.js +87 -0
  175. package/dist/backend/llvm/string-slices.js.map +1 -0
  176. package/dist/backend/llvm/string-slices.test.d.ts +1 -0
  177. package/dist/backend/llvm/string-slices.test.js +98 -0
  178. package/dist/backend/llvm/string-slices.test.js.map +1 -0
  179. package/dist/backend/llvm/switch-dispatch.js +1 -1
  180. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  181. package/dist/backend/llvm/switch-dispatch.test.js +2 -2
  182. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  183. package/dist/backend/llvm/walkers.d.ts +4 -14
  184. package/dist/backend/llvm/walkers.js +53 -311
  185. package/dist/backend/llvm/walkers.js.map +1 -1
  186. package/dist/backend/may-throw.js +4 -1
  187. package/dist/backend/may-throw.js.map +1 -1
  188. package/dist/backend/may-throw.test.js +1 -1
  189. package/dist/backend/native/cache-warm.d.ts +2 -1
  190. package/dist/backend/native/cache-warm.js.map +1 -1
  191. package/dist/backend/native/contracts.d.ts +5 -2
  192. package/dist/backend/native/contracts.js.map +1 -1
  193. package/dist/backend/native/executable.js +12 -4
  194. package/dist/backend/native/executable.js.map +1 -1
  195. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  196. package/dist/backend/native/runtime-inputs.js +3 -0
  197. package/dist/backend/native/runtime-inputs.js.map +1 -1
  198. package/dist/backend/native-codegen-core.d.ts +7 -0
  199. package/dist/backend/native-codegen-core.js +21 -0
  200. package/dist/backend/native-codegen-core.js.map +1 -1
  201. package/dist/backend/native-codegen.d.ts +9 -0
  202. package/dist/backend/native-codegen.js +38 -18
  203. package/dist/backend/native-codegen.js.map +1 -1
  204. package/dist/backend/native-codegen.test.js +70 -2
  205. package/dist/backend/native-codegen.test.js.map +1 -1
  206. package/dist/backend/native-link-info-core.d.ts +4 -2
  207. package/dist/backend/native-link-info-core.js.map +1 -1
  208. package/dist/backend/native-link-info.d.ts +2 -1
  209. package/dist/backend/native-link-info.js.map +1 -1
  210. package/dist/backend/native-link-info.test.js +2 -2
  211. package/dist/backend/native-link-info.test.js.map +1 -1
  212. package/dist/backend/native-tools.d.ts +6 -2
  213. package/dist/backend/native-tools.js +6 -5
  214. package/dist/backend/native-tools.js.map +1 -1
  215. package/dist/backend/optimization.d.ts +25 -0
  216. package/dist/backend/optimization.js +21 -0
  217. package/dist/backend/optimization.js.map +1 -0
  218. package/dist/backend/optimization.test.d.ts +1 -0
  219. package/dist/backend/optimization.test.js +24 -0
  220. package/dist/backend/optimization.test.js.map +1 -0
  221. package/dist/backend/runtime-abi.d.ts +2 -2
  222. package/dist/backend/runtime-abi.js +2 -2
  223. package/dist/backend/runtime-pack-core.d.ts +16 -4
  224. package/dist/backend/runtime-pack-core.js +31 -13
  225. package/dist/backend/runtime-pack-core.js.map +1 -1
  226. package/dist/backend/runtime-pack-native.d.ts +7 -3
  227. package/dist/backend/runtime-pack-native.js +0 -3
  228. package/dist/backend/runtime-pack-native.js.map +1 -1
  229. package/dist/backend/runtime-pack-targets.test.js +41 -4
  230. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  231. package/dist/backend/runtime-pack.d.ts +20 -2
  232. package/dist/backend/runtime-pack.js +23 -0
  233. package/dist/backend/runtime-pack.js.map +1 -1
  234. package/dist/backend/runtime-pack.test.js +125 -2
  235. package/dist/backend/runtime-pack.test.js.map +1 -1
  236. package/dist/backend/target-diagnostics.test.js +1 -1
  237. package/dist/backend/targets.d.ts +2 -1
  238. package/dist/backend/targets.js +1 -1
  239. package/dist/backend/targets.js.map +1 -1
  240. package/dist/cli/command.js +5 -4
  241. package/dist/cli/command.js.map +1 -1
  242. package/dist/cli/host.d.ts +2 -1
  243. package/dist/cli/usage.d.ts +1 -1
  244. package/dist/cli/usage.js +5 -2
  245. package/dist/cli/usage.js.map +1 -1
  246. package/dist/compile-types.d.ts +5 -2
  247. package/dist/diagnostics/diagnostic.js +10 -8
  248. package/dist/diagnostics/diagnostic.js.map +1 -1
  249. package/dist/executable/executable-cache.d.ts +3 -2
  250. package/dist/executable/executable-cache.js +8 -4
  251. package/dist/executable/executable-cache.js.map +1 -1
  252. package/dist/executable/executable-cache.test.js +35 -0
  253. package/dist/executable/executable-cache.test.js.map +1 -1
  254. package/dist/frontend/fork-target.d.ts +5 -0
  255. package/dist/frontend/fork-target.js +40 -8
  256. package/dist/frontend/fork-target.js.map +1 -1
  257. package/dist/frontend/fork-target.test.d.ts +1 -0
  258. package/dist/frontend/fork-target.test.js +59 -0
  259. package/dist/frontend/fork-target.test.js.map +1 -0
  260. package/dist/frontend/lowering/abstract-equality.js +5 -49
  261. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  262. package/dist/frontend/lowering/array-values.d.ts +23 -0
  263. package/dist/frontend/lowering/array-values.js +129 -0
  264. package/dist/frontend/lowering/array-values.js.map +1 -1
  265. package/dist/frontend/lowering/binding-analysis.js +2 -2
  266. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/atomics.d.ts +2 -11
  268. package/dist/frontend/lowering/builtins/atomics.js +64 -28
  269. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  270. package/dist/frontend/lowering/builtins/errors.js +17 -2
  271. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +3 -0
  273. package/dist/frontend/lowering/builtins/filesystem-calls.js +51 -4
  274. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  275. package/dist/frontend/lowering/builtins/module-calls.js +6 -1
  276. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  277. package/dist/frontend/lowering/builtins/process.d.ts +6 -17
  278. package/dist/frontend/lowering/builtins/process.js +56 -29
  279. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  280. package/dist/frontend/lowering/builtins/workers.d.ts +5 -0
  281. package/dist/frontend/lowering/builtins/workers.js +65 -0
  282. package/dist/frontend/lowering/builtins/workers.js.map +1 -0
  283. package/dist/frontend/lowering/caught-value-dispatch.d.ts +11 -0
  284. package/dist/frontend/lowering/caught-value-dispatch.js +87 -0
  285. package/dist/frontend/lowering/caught-value-dispatch.js.map +1 -0
  286. package/dist/frontend/lowering/class-assertions.d.ts +11 -0
  287. package/dist/frontend/lowering/class-assertions.js +104 -0
  288. package/dist/frontend/lowering/class-assertions.js.map +1 -0
  289. package/dist/frontend/lowering/class-callbacks.d.ts +3 -3
  290. package/dist/frontend/lowering/class-callbacks.js +18 -5
  291. package/dist/frontend/lowering/class-callbacks.js.map +1 -1
  292. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +1 -0
  293. package/dist/frontend/lowering/class-dynamic-dispatch.js +4 -1
  294. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  295. package/dist/frontend/lowering/class-method-mutations.d.ts +5 -0
  296. package/dist/frontend/lowering/class-method-mutations.js +472 -0
  297. package/dist/frontend/lowering/class-method-mutations.js.map +1 -0
  298. package/dist/frontend/lowering/class-method-values.js +25 -5
  299. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  300. package/dist/frontend/lowering/class-protocols.d.ts +17 -0
  301. package/dist/frontend/lowering/class-protocols.js +126 -0
  302. package/dist/frontend/lowering/class-protocols.js.map +1 -0
  303. package/dist/frontend/lowering/class-prototypes.js +8 -2
  304. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  305. package/dist/frontend/lowering/class-unions.d.ts +16 -0
  306. package/dist/frontend/lowering/class-unions.js +127 -0
  307. package/dist/frontend/lowering/class-unions.js.map +1 -0
  308. package/dist/frontend/lowering/coercions/builders.js +8 -1
  309. package/dist/frontend/lowering/coercions/builders.js.map +1 -1
  310. package/dist/frontend/lowering/coercions/function-adapters.js +2 -0
  311. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  312. package/dist/frontend/lowering/coercions/identity.d.ts +7 -0
  313. package/dist/frontend/lowering/coercions/identity.js +26 -0
  314. package/dist/frontend/lowering/coercions/identity.js.map +1 -0
  315. package/dist/frontend/lowering/coercions/structural.js +9 -6
  316. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  317. package/dist/frontend/lowering/collection-narrowing.d.ts +6 -0
  318. package/dist/frontend/lowering/collection-narrowing.js +31 -0
  319. package/dist/frontend/lowering/collection-narrowing.js.map +1 -0
  320. package/dist/frontend/lowering/containers/array-callback-call.d.ts +7 -0
  321. package/dist/frontend/lowering/containers/array-callback-call.js +52 -0
  322. package/dist/frontend/lowering/containers/array-callback-call.js.map +1 -0
  323. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -12
  324. package/dist/frontend/lowering/containers/array-callbacks.js +415 -136
  325. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  326. package/dist/frontend/lowering/containers/array-concat.d.ts +7 -0
  327. package/dist/frontend/lowering/containers/array-concat.js +130 -0
  328. package/dist/frontend/lowering/containers/array-concat.js.map +1 -0
  329. package/dist/frontend/lowering/containers/array-construction.d.ts +2 -0
  330. package/dist/frontend/lowering/containers/array-construction.js +95 -3
  331. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  332. package/dist/frontend/lowering/containers/array-methods.d.ts +1 -11
  333. package/dist/frontend/lowering/containers/array-methods.js +43 -132
  334. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  335. package/dist/frontend/lowering/containers/bytes.js +12 -34
  336. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  337. package/dist/frontend/lowering/containers/collection-methods.js +10 -1
  338. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  339. package/dist/frontend/lowering/containers/indexed-objects.js +56 -70
  340. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  341. package/dist/frontend/lowering/containers/string-and-regexp.js +22 -3
  342. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  343. package/dist/frontend/lowering/cycle-initialization.d.ts +41 -0
  344. package/dist/frontend/lowering/cycle-initialization.js +277 -0
  345. package/dist/frontend/lowering/cycle-initialization.js.map +1 -0
  346. package/dist/frontend/lowering/expressions/evaluation-safety.js +4 -0
  347. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  348. package/dist/frontend/lowering/expressions/object-literals.js +140 -38
  349. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  350. package/dist/frontend/lowering/expressions/union-field-write.d.ts +4 -4
  351. package/dist/frontend/lowering/expressions/union-field-write.js +54 -44
  352. package/dist/frontend/lowering/expressions/union-field-write.js.map +1 -1
  353. package/dist/frontend/lowering/generic-functions.d.ts +2 -5
  354. package/dist/frontend/lowering/generic-functions.js +13 -10
  355. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  356. package/dist/frontend/lowering/instantiation-path.d.ts +8 -0
  357. package/dist/frontend/lowering/instantiation-path.js +10 -0
  358. package/dist/frontend/lowering/instantiation-path.js.map +1 -0
  359. package/dist/frontend/lowering/instantiation-path.test.d.ts +1 -0
  360. package/dist/frontend/lowering/instantiation-path.test.js +23 -0
  361. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -0
  362. package/dist/frontend/lowering/iterator-adapters.d.ts +20 -0
  363. package/dist/frontend/lowering/iterator-adapters.js +605 -0
  364. package/dist/frontend/lowering/iterator-adapters.js.map +1 -0
  365. package/dist/frontend/lowering/lower-array-sort.d.ts +1 -1
  366. package/dist/frontend/lowering/lower-array-sort.js +44 -5
  367. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  368. package/dist/frontend/lowering/lower-array-sort.test.d.ts +1 -0
  369. package/dist/frontend/lowering/lower-array-sort.test.js +31 -0
  370. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -0
  371. package/dist/frontend/lowering/lower-assert.js +7 -0
  372. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  373. package/dist/frontend/lowering/lower-builtin-values.js +12 -7
  374. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  375. package/dist/frontend/lowering/lower-calls.d.ts +3 -3
  376. package/dist/frontend/lowering/lower-calls.js +198 -124
  377. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  378. package/dist/frontend/lowering/lower-classes.d.ts +7 -0
  379. package/dist/frontend/lowering/lower-classes.js +166 -96
  380. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  381. package/dist/frontend/lowering/lower-event-emitter.js +1 -1
  382. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  383. package/dist/frontend/lowering/lower-exprs.d.ts +9 -2
  384. package/dist/frontend/lowering/lower-exprs.js +421 -167
  385. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  386. package/dist/frontend/lowering/lower-functions.d.ts +1 -1
  387. package/dist/frontend/lowering/lower-functions.js +33 -20
  388. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  389. package/dist/frontend/lowering/lower-inspect.js +26 -2
  390. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  391. package/dist/frontend/lowering/lower-island.js +1 -1
  392. package/dist/frontend/lowering/lower-island.js.map +1 -1
  393. package/dist/frontend/lowering/lower-modules.d.ts +1 -0
  394. package/dist/frontend/lowering/lower-modules.js +54 -11
  395. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  396. package/dist/frontend/lowering/lower-stmts.js +59 -69
  397. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  398. package/dist/frontend/lowering/lower-stream.js +1 -1
  399. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  400. package/dist/frontend/lowering/lowerer.d.ts +50 -1
  401. package/dist/frontend/lowering/lowerer.js +333 -26
  402. package/dist/frontend/lowering/lowerer.js.map +1 -1
  403. package/dist/frontend/lowering/native-ffi.js +3 -1
  404. package/dist/frontend/lowering/native-ffi.js.map +1 -1
  405. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +15 -0
  406. package/dist/frontend/lowering/runtime-optional-provenance.js +40 -0
  407. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -0
  408. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  409. package/dist/frontend/lowering/split-consumers.d.ts +7 -0
  410. package/dist/frontend/lowering/split-consumers.js +64 -0
  411. package/dist/frontend/lowering/split-consumers.js.map +1 -0
  412. package/dist/frontend/lowering/strict-equality.d.ts +9 -0
  413. package/dist/frontend/lowering/strict-equality.js +116 -0
  414. package/dist/frontend/lowering/strict-equality.js.map +1 -0
  415. package/dist/frontend/lowering/surfaces.d.ts +3 -4
  416. package/dist/frontend/lowering/surfaces.js +38 -7
  417. package/dist/frontend/lowering/surfaces.js.map +1 -1
  418. package/dist/frontend/lowering/union-comparison.d.ts +5 -0
  419. package/dist/frontend/lowering/union-comparison.js +47 -0
  420. package/dist/frontend/lowering/union-comparison.js.map +1 -0
  421. package/dist/frontend/module-source-candidates.d.ts +10 -0
  422. package/dist/frontend/module-source-candidates.js +40 -0
  423. package/dist/frontend/module-source-candidates.js.map +1 -0
  424. package/dist/frontend/module-source-candidates.test.d.ts +1 -0
  425. package/dist/frontend/module-source-candidates.test.js +53 -0
  426. package/dist/frontend/module-source-candidates.test.js.map +1 -0
  427. package/dist/frontend/pipeline.js +2 -2
  428. package/dist/frontend/pipeline.js.map +1 -1
  429. package/dist/frontend/program-analysis.d.ts +2 -0
  430. package/dist/frontend/program-analysis.js +2 -0
  431. package/dist/frontend/program-analysis.js.map +1 -1
  432. package/dist/frontend/program.d.ts +38 -2
  433. package/dist/frontend/program.js +457 -88
  434. package/dist/frontend/program.js.map +1 -1
  435. package/dist/frontend/program.test.js +59 -6
  436. package/dist/frontend/program.test.js.map +1 -1
  437. package/dist/frontend/ts7/ast-node.js +6 -8
  438. package/dist/frontend/ts7/ast-node.js.map +1 -1
  439. package/dist/frontend/ts7/ast-node.test.js +42 -1
  440. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  441. package/dist/frontend/ts7/ast-wire.d.ts +4 -0
  442. package/dist/frontend/ts7/ast-wire.js +28 -0
  443. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  444. package/dist/frontend/ts7/ast.d.ts +2 -1
  445. package/dist/frontend/ts7/ast.js +8 -4
  446. package/dist/frontend/ts7/ast.js.map +1 -1
  447. package/dist/frontend/ts7/checker.d.ts +8 -2
  448. package/dist/frontend/ts7/checker.js +41 -5
  449. package/dist/frontend/ts7/checker.js.map +1 -1
  450. package/dist/frontend/ts7/checker.test.js +42 -0
  451. package/dist/frontend/ts7/checker.test.js.map +1 -1
  452. package/dist/frontend/ts7/program-host.d.ts +7 -0
  453. package/dist/frontend/ts7/program-host.js +26 -2
  454. package/dist/frontend/ts7/program-host.js.map +1 -1
  455. package/dist/frontend/ts7/program-host.test.js +29 -0
  456. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  457. package/dist/frontend/type-mapper.d.ts +4 -1
  458. package/dist/frontend/type-mapper.js +133 -16
  459. package/dist/frontend/type-mapper.js.map +1 -1
  460. package/dist/frontend/type-mapper.test.js +15 -3
  461. package/dist/frontend/type-mapper.test.js.map +1 -1
  462. package/dist/frontend/worker-target.d.ts +6 -0
  463. package/dist/frontend/worker-target.js +108 -0
  464. package/dist/frontend/worker-target.js.map +1 -0
  465. package/dist/frontend/worker-target.test.d.ts +1 -0
  466. package/dist/frontend/worker-target.test.js +71 -0
  467. package/dist/frontend/worker-target.test.js.map +1 -0
  468. package/dist/index.js +47 -14
  469. package/dist/index.js.map +1 -1
  470. package/dist/ir/analysis.d.ts +3 -1
  471. package/dist/ir/analysis.js +4 -0
  472. package/dist/ir/analysis.js.map +1 -1
  473. package/dist/ir/builtin-effects.js +12 -0
  474. package/dist/ir/builtin-effects.js.map +1 -1
  475. package/dist/ir/builtin-signatures.d.ts +1 -1
  476. package/dist/ir/builtin-signatures.js +15 -15
  477. package/dist/ir/builtin-signatures.js.map +1 -1
  478. package/dist/ir/constant-tables.test.js +1 -1
  479. package/dist/ir/initializer-bindings.test.js +1 -1
  480. package/dist/ir/ir.d.ts +85 -23
  481. package/dist/ir/ir.js +20 -6
  482. package/dist/ir/ir.js.map +1 -1
  483. package/dist/ir/numeric-call-specialization.d.ts +8 -0
  484. package/dist/ir/numeric-call-specialization.js +198 -0
  485. package/dist/ir/numeric-call-specialization.js.map +1 -0
  486. package/dist/ir/runtime-features.js +4 -3
  487. package/dist/ir/runtime-features.js.map +1 -1
  488. package/dist/ir/scalar-records.test.js +1 -1
  489. package/dist/ir/serialize.d.ts +1 -1
  490. package/dist/ir/serialize.js +3 -3
  491. package/dist/ir/serialize.js.map +1 -1
  492. package/dist/ir/traverse.js +8 -0
  493. package/dist/ir/traverse.js.map +1 -1
  494. package/dist/ir/validate.js +207 -43
  495. package/dist/ir/validate.js.map +1 -1
  496. package/dist/ir/validate.test.js +356 -8
  497. package/dist/ir/validate.test.js.map +1 -1
  498. package/dist/library/fence-eval.test.js +1 -1
  499. package/dist/library/int-infer.test.js +4 -4
  500. package/dist/library/ir-policy.js +2 -0
  501. package/dist/library/ir-policy.js.map +1 -1
  502. package/dist/library/library-cache.test.js +5 -5
  503. package/dist/library/library-profile.d.ts +2 -1
  504. package/dist/library/library-profile.js +4 -3
  505. package/dist/library/library-profile.js.map +1 -1
  506. package/dist/native/compiler.js +24 -11
  507. package/dist/native/compiler.js.map +1 -1
  508. package/dist/native/compiler.test.js +7 -3
  509. package/dist/native/compiler.test.js.map +1 -1
  510. package/dist/native/library.d.ts +2 -1
  511. package/dist/native/library.js.map +1 -1
  512. package/dist/native/prepare.js +29 -3
  513. package/dist/native/prepare.js.map +1 -1
  514. package/dist/native/sanitizer.d.ts +3 -2
  515. package/dist/native/sanitizer.js +3 -13
  516. package/dist/native/sanitizer.js.map +1 -1
  517. package/dist/native/sanitizer.test.js +1 -0
  518. package/dist/native/sanitizer.test.js.map +1 -1
  519. package/package.json +20 -20
  520. package/surface-manifest.json +37 -3
@@ -1,3 +1,5 @@
1
+ import { lowerUnionEquality, tagEqualityMayMissAlias } from "./strict-equality.js";
2
+ import { lowerArrayCallbackCall } from "./containers/array-callback-call.js";
1
3
  /** Dispatch source calls, builtin members and receiver-specific operations.
2
4
  * Signature collection, argument completion and function bodies have their
3
5
  * own owners; this module selects the applicable call path. */
@@ -24,6 +26,7 @@ import { lowerGroupByStaticCall } from "./containers/collection-grouping.js";
24
26
  import { lowerIteratorHelperCall } from "./containers/iterator-helpers.js";
25
27
  import { lowerObjectAssignIndexShape, lowerObjectConstructor, lowerObjectFromEntriesCall, lowerObjectIterOverIndexShape, } from "./containers/indexed-objects.js";
26
28
  import { lowerTupleReadMethodCall } from "./containers/array-methods.js";
29
+ import { tryFuseIndexRead } from "./array-values.js";
27
30
  import { lowerBytesStaticCall } from "./containers/bytes.js";
28
31
  import { lowerRegexMethodCall, lowerStringIndexCall, lowerStringMethodCall, lowerStringPaddingCall, lowerStringSplitCall, } from "./containers/string-and-regexp.js";
29
32
  import { createRequireSpecOf } from "./builtins/module-bindings.js";
@@ -1143,6 +1146,23 @@ export function lowerCall(lowerer, expr) {
1143
1146
  if (sig && !(jsSpreadArgs && spreadNeedsRuntimeArity(lowerer, sig.params, expr.arguments))) {
1144
1147
  lowerer.noteEdge(sig.name);
1145
1148
  const args = lowerer.completeArgs(expr.arguments, sig.params, loc, expr);
1149
+ const symbol = lowerer.resolveValueSymbol(expr.expression);
1150
+ const declaration = symbol ? lowerer.checker.valueDeclarationOf(symbol) : undefined;
1151
+ // A bare call supplies undefined as this, even inside a callback
1152
+ // currently carrying a receiver. The value-call ABI saves and
1153
+ // restores that ambient receiver around the function invocation.
1154
+ if (declaration &&
1155
+ ts.isFunctionDeclaration(declaration) &&
1156
+ declaration.parameters.some(isThisParameter)) {
1157
+ const callee = lowerer.lowerExpr(expr.expression);
1158
+ return reconcileOverloadReturn(lowerer, expr, {
1159
+ kind: "callValue",
1160
+ callee,
1161
+ args,
1162
+ type: sig.returnType,
1163
+ loc,
1164
+ });
1165
+ }
1146
1166
  return reconcileOverloadReturn(lowerer, expr, {
1147
1167
  kind: "call",
1148
1168
  callee: sig.name,
@@ -1573,6 +1593,11 @@ export function lowerCall(lowerer, expr) {
1573
1593
  !symbolFieldInfo(lowerer, expr.expression)) {
1574
1594
  const access = expr.expression;
1575
1595
  const value = tryLowerExpression(lowerer, access.expression);
1596
+ if (value?.type.kind === "array" && !isJsSourceFile(expr.getSourceFile())) {
1597
+ const callback = lowerArrayCallbackCall(lowerer, expr, access, value);
1598
+ if (callback)
1599
+ return callback;
1600
+ }
1576
1601
  if (value?.type.kind === "dyn" ||
1577
1602
  value?.type.kind === "generator" ||
1578
1603
  (value &&
@@ -1996,6 +2021,23 @@ function lowerNumberConstructorValue(lowerer, argNode, loc) {
1996
2021
  return { kind: "libCall", fn: "num.fromString", args: [arg], type: F64, loc };
1997
2022
  if (arg.type.kind === "dyn")
1998
2023
  return { kind: "libCall", fn: "dyn.numberConstructor", args: [arg], type: F64, loc };
2024
+ // Number(strings[i]) without boxing `string | undefined`: a missing slot
2025
+ // converts like undefined, to NaN.
2026
+ const indexedString = arg.type.kind === "union" &&
2027
+ arg.kind === "call" &&
2028
+ arg.args[0]?.type.kind === "array" &&
2029
+ arg.args[0].type.elem.kind === "string"
2030
+ ? tryFuseIndexRead(lowerer, arg, F64, (read) => ({ kind: "libCall", fn: "num.fromString", args: [read], type: F64, loc }), {
2031
+ kind: "bin",
2032
+ op: "/",
2033
+ left: { kind: "numLit", value: 0, type: F64, loc },
2034
+ right: { kind: "numLit", value: 0, type: F64, loc },
2035
+ type: F64,
2036
+ loc,
2037
+ })
2038
+ : null;
2039
+ if (indexedString)
2040
+ return indexedString;
1999
2041
  if (arg.type.kind === "union" && lowerer.dynConvertible(arg.type))
2000
2042
  return {
2001
2043
  kind: "libCall",
@@ -2871,14 +2913,28 @@ function lowerOptionalStringNumber(lowerer, arg, loc, fn = "num.fromString", lab
2871
2913
  function lowerDynReceiverMethodCall(lowerer, call, access) {
2872
2914
  if (lowerer.chainBlocked(call, access))
2873
2915
  return null;
2874
- if (stdlibGlobalNameOf(lowerer, access.expression) !== null)
2875
- return null;
2916
+ if (stdlibGlobalNameOf(lowerer, access.expression) !== null) {
2917
+ // A named builtin import can resolve to its ambient declaration, too.
2918
+ // parentPort is an instance value whose methods use the native handle;
2919
+ // it must work without a non-null assertion or a namespace spelling.
2920
+ const binding = ts.isIdentifier(access.expression)
2921
+ ? lowerer.builtinImportOf(access.expression)
2922
+ : null;
2923
+ if (binding?.module !== "worker_threads" || binding.member !== "parentPort")
2924
+ return null;
2925
+ }
2876
2926
  // Only checker-untyped receivers: `any`/`unknown`, or the `any[]` an
2877
2927
  // Array.isArray guard narrows them to (the value is STILL the checked-dynamic tree
2878
2928
  // array — scalar narrowings bridge through maybeNarrow's dynCheck and
2879
2929
  // take the ordinary typed paths, but there is no static home for an
2880
2930
  // any-elemented array). Typed receivers keep their own lowerings.
2881
2931
  const recvTs = lowerer.typeOf(access.expression);
2932
+ if (lowerer.classImplementedProtocol(recvTs)) {
2933
+ const property = lowerer.checker.getPropertyOfType(recvTs, access.name.text);
2934
+ if (property &&
2935
+ isGenericCallableMemberType(lowerer.checker.getTypeOfSymbol(property), lowerer.checker))
2936
+ return lowerObjLitGenericMethodCall(lowerer, call, access);
2937
+ }
2882
2938
  const recvSymbol = recvTs.getSymbol();
2883
2939
  if (recvSymbol &&
2884
2940
  ["MapIterator", "SetIterator"].includes(recvSymbol.name) &&
@@ -3458,6 +3514,11 @@ const DYN_DISPATCH_METHODS = new Set([
3458
3514
  "additionalHeaders",
3459
3515
  "altsvc",
3460
3516
  "origin",
3517
+ // Worker and MessagePort methods use the owning context's handle adapter.
3518
+ "postMessage",
3519
+ "terminate",
3520
+ "start",
3521
+ "hasRef",
3461
3522
  ]);
3462
3523
  export function lowerDynDispatchMethodCall(lowerer, call, access, recv, arrayReceiver) {
3463
3524
  const method = access.name.text;
@@ -4180,13 +4241,13 @@ function implicitReceiverOverloadReturn(lowerer, expr) {
4180
4241
  function reconcileOverloadReturn(lowerer, expr, call) {
4181
4242
  const rsig = lowerer.checker.getResolvedSignature(expr);
4182
4243
  const rdecl = rsig ? lowerer.checker.signatureDeclaration(rsig) : undefined;
4183
- // Fluent JS overrides share the base's return ABI, but their result
4184
- // still has the receiver's subclass layout at the call site.
4244
+ // Nominal covariant overrides share the base's return ABI, but retain
4245
+ // their declared subclass result at the call site. Unannotated fluent
4246
+ // JS overrides use the same bridge for their proven receiver result.
4185
4247
  if (call.type.kind === "object" &&
4186
4248
  rdecl &&
4187
4249
  ts.isMethodDeclaration(rdecl) &&
4188
- isJsSourceFile(rdecl.getSourceFile()) &&
4189
- returnsOnlyThis(rdecl)) {
4250
+ (!isJsSourceFile(rdecl.getSourceFile()) || returnsOnlyThis(rdecl))) {
4190
4251
  call = lowerer.maybeNarrow(call, expr);
4191
4252
  }
4192
4253
  const resolvedOverload = rsig &&
@@ -5684,11 +5745,10 @@ function filterNarrowHelper(lowerer, test, elem, outElem, tag, loc) {
5684
5745
  * no runtime walk. ORDER is the shape's first-seen DECLARATION order
5685
5746
  * (threaded through the shape registry), which matches Node whenever
5686
5747
  * objects are constructed in declaration order — the divergence for
5687
- * reordered construction is SEMANTICS.md 36. Fields holding the
5688
- * undefined arm of their union are SKIPPED at runtime (Node's missing
5689
- * key: an unset optional never made it into the object), which also
5690
- * means an EXPLICIT `{ a: undefined }` key is dropped where Node lists
5691
- * it — same rule as jsonStringify, same SEMANTICS entry. Values wrap
5748
+ * reordered construction is SEMANTICS.md 36. Optional fields that are
5749
+ * absent (omitted or deleted) are SKIPPED at runtime, Node's missing key,
5750
+ * while an explicit `{ a: undefined }` is listed with its undefined
5751
+ * value. Values wrap
5692
5752
  * into the checker's result-element type per field; a multi-arm field
5693
5753
  * union that differs from the result union would need a re-tag — fenced.
5694
5754
  * Null when this isn't an Object static over a fixed record (index
@@ -5807,9 +5867,9 @@ function lowerSymbolMethodCall(lowerer, call, access) {
5807
5867
  }
5808
5868
  /** The interned keys-array helper over a FIXED record shape: a call of a
5809
5869
  * lifted helper whose body pushes each declared field name in first-seen
5810
- * DECLARATION order, skipping fields currently holding the undefined arm
5811
- * of their union at runtime (Node's missing key — an unset optional
5812
- * never made it into the object; SEMANTICS.md 37's rules). ONE
5870
+ * DECLARATION order, skipping optional fields that are currently absent
5871
+ * (omitted or deleted — Node's missing key; a field explicitly holding
5872
+ * undefined is present and listed). ONE
5813
5873
  * construction, interned per shape, shared by Object.keys and for-in —
5814
5874
  * for-in iterates exactly the keys Object.keys answers. */
5815
5875
  export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
@@ -5858,32 +5918,11 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5858
5918
  },
5859
5919
  loc,
5860
5920
  };
5861
- // Undefined-armed fields: the push is guarded by a tag test (the
5921
+ // Fields that can be absent push behind their presence test (the
5862
5922
  // key exists exactly when Object.keys would list it).
5863
- const utag = f.type.kind === "union" ? lowerer.armTag(f.type.unionId, UNDEFINED_T) : -1;
5864
- body.push(utag >= 0 && f.type.kind === "union"
5865
- ? {
5866
- kind: "if",
5867
- cond: {
5868
- kind: "unionIsTag",
5869
- unionId: f.type.unionId,
5870
- tag: utag,
5871
- negated: true,
5872
- value: {
5873
- kind: "recordGet",
5874
- obj: ref,
5875
- shapeId: argIr.shapeId,
5876
- field: f.name,
5877
- type: f.type,
5878
- loc,
5879
- },
5880
- type: BOOL,
5881
- loc,
5882
- },
5883
- then: [pushStmt],
5884
- else_: null,
5885
- loc,
5886
- }
5923
+ const present = lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc);
5924
+ body.push(present.kind === "recordHas"
5925
+ ? { kind: "if", cond: present, then: [pushStmt], else_: null, loc }
5887
5926
  : pushStmt);
5888
5927
  }
5889
5928
  body.push({ kind: "return", value: outRef, loc });
@@ -5897,9 +5936,9 @@ export function recordKeysArrayCall(lowerer, receiver, argIr, shape, loc) {
5897
5936
  }
5898
5937
  /** Interned `%obj.hasOwn.<n>(r, k)` — Object.hasOwn's membership walk
5899
5938
  * over a record shape: the key compares against each
5900
- * declared field name, undefined-armed fields answering by their tag
5939
+ * declared field name, optional fields answering by their presence
5901
5940
  * (a key is own exactly when Object.keys would list it — the two share
5902
- * the guard), everything else true. Unmatched keys probe the overflow
5941
+ * the test), everything else true. Unmatched keys probe the overflow
5903
5942
  * map when present, so explicit undefined values remain own keys. */
5904
5943
  function recordHasOwnHelper(lowerer, shapeId, loc) {
5905
5944
  const key = `obj.hasOwn:${shapeId}`;
@@ -5914,18 +5953,7 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
5914
5953
  const kRef = { kind: "varRef", localId: "k.0", type: STRING, loc };
5915
5954
  const body = [];
5916
5955
  for (const f of shape.fields) {
5917
- const utag = f.type.kind === "union" ? lowerer.armTag(f.type.unionId, UNDEFINED_T) : -1;
5918
- const answer = utag >= 0 && f.type.kind === "union"
5919
- ? {
5920
- kind: "unionIsTag",
5921
- unionId: f.type.unionId,
5922
- tag: utag,
5923
- negated: true,
5924
- value: { kind: "recordGet", obj: rRef, shapeId, field: f.name, type: f.type, loc },
5925
- type: BOOL,
5926
- loc,
5927
- }
5928
- : { kind: "boolLit", value: true, type: BOOL, loc };
5956
+ const answer = lowerer.recordFieldPresent(rRef, shapeId, f.name, loc);
5929
5957
  body.push({
5930
5958
  kind: "if",
5931
5959
  cond: {
@@ -5963,8 +5991,9 @@ function recordHasOwnHelper(lowerer, shapeId, loc) {
5963
5991
  }
5964
5992
  /** Interned `%obj.assign.<n>(t, s)` — Object.assign's per-field copy
5965
5993
  * over signature-free records (every source field lands on a same-named,
5966
- * same-typed target field — the caller's gate): undefined-armed source
5967
- * fields copy behind the not-undefined guard, everything else straight,
5994
+ * same-typed target field — the caller's gate): optional source fields
5995
+ * copy only when present (an explicit undefined copies), everything else
5996
+ * straight,
5968
5997
  * and the TARGET returns (JS's aliasing). */
5969
5998
  function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
5970
5999
  const key = `obj.assign:${targetShapeId}:${srcShapeId}`;
@@ -5996,23 +6025,9 @@ function recordAssignHelper(lowerer, targetShapeId, srcShapeId, loc) {
5996
6025
  value: get,
5997
6026
  loc,
5998
6027
  };
5999
- const utag = f.type.kind === "union" ? lowerer.armTag(f.type.unionId, UNDEFINED_T) : -1;
6000
- body.push(utag >= 0 && f.type.kind === "union"
6001
- ? {
6002
- kind: "if",
6003
- cond: {
6004
- kind: "unionIsTag",
6005
- unionId: f.type.unionId,
6006
- tag: utag,
6007
- negated: true,
6008
- value: get,
6009
- type: BOOL,
6010
- loc,
6011
- },
6012
- then: [set],
6013
- else_: null,
6014
- loc,
6015
- }
6028
+ const present = lowerer.recordFieldPresent(sRef, srcShapeId, f.name, loc);
6029
+ body.push(present.kind === "recordHas"
6030
+ ? { kind: "if", cond: present, then: [set], else_: null, loc }
6016
6031
  : set);
6017
6032
  }
6018
6033
  body.push({ kind: "return", value: tRef, loc });
@@ -6290,6 +6305,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6290
6305
  };
6291
6306
  }
6292
6307
  if (left.type.kind === "union" || right.type.kind === "union") {
6308
+ const compared = lowerUnionEquality(lowerer, left, right, false, true, loc);
6309
+ if (compared)
6310
+ return compared;
6293
6311
  const ut = left.type.kind === "union" ? left.type : right.type;
6294
6312
  const bothUnion = left.type.kind === "union" && right.type.kind === "union";
6295
6313
  const sameUnion = bothUnion && typeEquals(left.type, right.type);
@@ -6297,9 +6315,16 @@ function lowerObjectStaticCall(lowerer, call, access) {
6297
6315
  const plain = left.type.kind === "union" ? right : left;
6298
6316
  const arms = lowerer.unions.get(ut.unionId)?.arms ?? [];
6299
6317
  // The plain side wraps into the union exactly like === when the
6300
- // union holds its type; a plain PRIMITIVE the union has no arm
6301
- // for is the disjoint constant false (coercing it would strand).
6302
- if (bothUnion || arms.some((a) => typeEquals(a, plain.type))) {
6318
+ // union holds its type, or when a plain class instance upcasts
6319
+ // into exactly one class arm (the same pointer under a base tag);
6320
+ // a plain PRIMITIVE the union has no arm for is the disjoint
6321
+ // constant false (coercing it would strand).
6322
+ const plainType = plain.type;
6323
+ const upcastArm = plainType.kind === "object" &&
6324
+ arms.filter((a) => a.kind === "object" && lowerer.isSubclassOf(plainType.className, a.className)).length === 1;
6325
+ if (bothUnion || upcastArm || arms.some((a) => typeEquals(a, plain.type))) {
6326
+ if (tagEqualityMayMissAlias(lowerer, ut))
6327
+ lowerer.noLowering("Object.is over related class values beside structural union members", call, NARROW_FIRST);
6303
6328
  const sameValue = arms.some((a) => a.kind === "f64");
6304
6329
  return {
6305
6330
  kind: "unionEq",
@@ -6511,12 +6536,10 @@ function lowerObjectStaticCall(lowerer, call, access) {
6511
6536
  // (the mockable-clock restore: `Object.assign(mocked,
6512
6537
  // implementations)` over one shape): the per-field copy helper,
6513
6538
  // returning the TARGET — JS's aliasing, the target mutates in
6514
- // place. Undefined-armed source fields copy behind the
6515
- // not-undefined guard (an omitted optional field holds the
6516
- // undefined arm and must not erase the target's value — Node
6517
- // copies own keys only; an EXPLICIT `k: undefined` source diverges,
6518
- // the explicit-undefined-is-absent stance). Everything else keeps
6519
- // the spread hint.
6539
+ // place. Optional source fields copy only when present (an omitted
6540
+ // optional field must not erase the target's value — Node copies own
6541
+ // keys only — while an explicit `k: undefined` does). Everything
6542
+ // else keeps the spread hint.
6520
6543
  if (call.arguments.length === 2 && !call.arguments.some((a) => ts.isSpreadElement(a))) {
6521
6544
  const tProbe = tryLowerExpression(lowerer, call.arguments[0]);
6522
6545
  const sProbe = tryLowerExpression(lowerer, call.arguments[1]);
@@ -6893,11 +6916,9 @@ function lowerObjectStaticCall(lowerer, call, access) {
6893
6916
  }
6894
6917
  // `Object.hasOwn(r, k)` over a RECORD receiver: a record's own-key set
6895
6918
  // is its declared field list, so membership is a compare chain against
6896
- // the field names (interned per shape). Undefined-armed (optional)
6897
- // fields answer by their runtime tag — the explicit-undefined-is-absent
6898
- // stance: an omitted optional field holds the undefined arm and reads
6899
- // as NOT own, exactly Node's absent key (an EXPLICIT `k: undefined`
6900
- // diverges — documented next to the child-env/JSON rule). Tuple
6919
+ // the field names (interned per shape). Optional fields answer by
6920
+ // their runtime presence: an omitted or deleted optional field is NOT
6921
+ // own, while an explicit `k: undefined` is, exactly Node's keys. Tuple
6901
6922
  // and accessor-carrying shapes keep the SC2020 fence. Index-signature
6902
6923
  // records additionally probe the overflow map; non-record receivers
6903
6924
  // do too.
@@ -6907,6 +6928,19 @@ function lowerObjectStaticCall(lowerer, call, access) {
6907
6928
  const recvNode = call.arguments[0];
6908
6929
  const keyNode = call.arguments[1];
6909
6930
  const probed = tryLowerExpression(lowerer, recvNode);
6931
+ const arrayKey = probed?.type.kind === "array" ? lowerer.lowerExpr(keyNode) : null;
6932
+ if (probed?.type.kind === "array" && arrayKey?.type.kind === "f64") {
6933
+ // Numeric own keys use the array's slot/property presence directly.
6934
+ // Unlike `in`, this never includes inherited properties. arrayHas
6935
+ // evaluates and keeps the receiver alive before evaluating the key.
6936
+ return {
6937
+ kind: "arrayHas",
6938
+ arr: probed,
6939
+ index: arrayKey,
6940
+ type: BOOL,
6941
+ loc: locOf(call),
6942
+ };
6943
+ }
6910
6944
  const constructor = probed?.type.kind === "classval" ? lowerer.classes.get(probed.type.className) : undefined;
6911
6945
  // A CHECKED-DYNAMIC receiver (the JS file-scope object-literal
6912
6946
  // identity story): the runtime dyn probe — OBJ member presence, ARR
@@ -6918,7 +6952,7 @@ function lowerObjectStaticCall(lowerer, call, access) {
6918
6952
  (probed?.type.kind === "func" && lowerer.dynConvertible(probed.type))) {
6919
6953
  const loc = locOf(call);
6920
6954
  const receiver = lowerer.coerceToExpected(probed, DYN);
6921
- const rawKey = lowerer.lowerExpr(keyNode);
6955
+ const rawKey = arrayKey ?? lowerer.lowerExpr(keyNode);
6922
6956
  if (rawKey.type.kind === "dyn" ||
6923
6957
  rawKey.type.kind === "symbol" ||
6924
6958
  (rawKey.type.kind === "union" && lowerer.dynConvertible(rawKey.type)))
@@ -7163,8 +7197,8 @@ function lowerObjectStaticCall(lowerer, call, access) {
7163
7197
  }
7164
7198
  return null;
7165
7199
  };
7166
- // Undefined-armed fields: the push is guarded by a tag test, and
7167
- // the pushed value is the narrowed non-undefined arm.
7200
+ // Undefined-armed fields: the push is guarded by the field's
7201
+ // presence; a narrowed push re-tags the non-undefined arm.
7168
7202
  let guardUndefTag = null;
7169
7203
  let value = raw;
7170
7204
  let vt = f.type;
@@ -7215,46 +7249,83 @@ function lowerObjectStaticCall(lowerer, call, access) {
7215
7249
  lowerer.unsupported("SC1090", call, `Object.${member} over '${lowerer.fmt(argIr)}' (field '${f.name}' of type '${lowerer.fmt(f.type)}' ` +
7216
7250
  `cannot flow into the '${lowerer.fmt(valueT)}' result element — read the fields directly)`);
7217
7251
  }
7218
- const pushed = member === "values"
7219
- ? coerced
7220
- : {
7221
- kind: "recordLit",
7222
- fields: [
7223
- { name: "0", value: { kind: "strLit", value: f.name, type: STRING, loc } },
7224
- { name: "1", value: coerced },
7225
- ],
7226
- type: tupleT,
7227
- loc,
7228
- };
7229
- const pushStmt = {
7252
+ const pushOf = (element) => ({
7230
7253
  kind: "exprStmt",
7231
7254
  expr: {
7232
7255
  kind: "arrIntrinsic",
7233
7256
  method: "push",
7234
7257
  receiver: outRef,
7235
- args: [pushed],
7258
+ args: [
7259
+ member === "values"
7260
+ ? element
7261
+ : {
7262
+ kind: "recordLit",
7263
+ fields: [
7264
+ { name: "0", value: { kind: "strLit", value: f.name, type: STRING, loc } },
7265
+ { name: "1", value: element },
7266
+ ],
7267
+ type: tupleT,
7268
+ loc,
7269
+ },
7270
+ ],
7236
7271
  type: F64,
7237
7272
  loc,
7238
7273
  },
7239
7274
  loc,
7240
- };
7241
- body.push(guardUndefTag !== null && f.type.kind === "union"
7242
- ? {
7243
- kind: "if",
7244
- cond: {
7245
- kind: "unionIsTag",
7246
- unionId: f.type.unionId,
7247
- tag: guardUndefTag,
7248
- negated: true,
7249
- value: raw,
7250
- type: BOOL,
7275
+ });
7276
+ let stmt = pushOf(coerced);
7277
+ if (guardUndefTag !== null && f.type.kind === "union") {
7278
+ if (value !== raw) {
7279
+ // A narrowed push: a present field holding undefined pushes
7280
+ // the result element's own undefined when it has one; a values
7281
+ // array without one stores a present undefined element (a
7282
+ // runtime-optional field the checker typed as required). An
7283
+ // entries tuple slot has no spelling for it.
7284
+ const undefinedElement = valueT ? lowerer.wrappedUndefined(valueT, loc) : null;
7285
+ const undefinedPush = undefinedElement
7286
+ ? pushOf(undefinedElement)
7287
+ : member === "values"
7288
+ ? {
7289
+ kind: "arraySetUndefined",
7290
+ arr: outRef,
7291
+ index: {
7292
+ kind: "arrIntrinsic",
7293
+ method: "length",
7294
+ receiver: outRef,
7295
+ args: [],
7296
+ type: F64,
7297
+ loc,
7298
+ },
7299
+ loc,
7300
+ }
7301
+ : null;
7302
+ stmt = {
7303
+ kind: "if",
7304
+ cond: {
7305
+ kind: "unionIsTag",
7306
+ unionId: f.type.unionId,
7307
+ tag: guardUndefTag,
7308
+ negated: true,
7309
+ value: raw,
7310
+ type: BOOL,
7311
+ loc,
7312
+ },
7313
+ then: [stmt],
7314
+ else_: undefinedPush ? [undefinedPush] : null,
7251
7315
  loc,
7252
- },
7253
- then: [pushStmt],
7316
+ };
7317
+ }
7318
+ // Absent fields contribute nothing; present ones push their
7319
+ // value, undefined included.
7320
+ stmt = {
7321
+ kind: "if",
7322
+ cond: lowerer.recordFieldPresent(ref, argIr.shapeId, f.name, loc),
7323
+ then: [stmt],
7254
7324
  else_: null,
7255
7325
  loc,
7256
- }
7257
- : pushStmt);
7326
+ };
7327
+ }
7328
+ body.push(stmt);
7258
7329
  }
7259
7330
  body.push({ kind: "return", value: outRef, loc });
7260
7331
  fn.body = body;
@@ -7323,7 +7394,7 @@ function lowerObjectAssignHybrid(lowerer, call) {
7323
7394
  for (const f of shape.fields) {
7324
7395
  const v = values.get(f.name);
7325
7396
  if (!v) {
7326
- const absent = lowerer.wrappedUndefined(f.type, loc);
7397
+ const absent = lowerer.absentFieldValue(f.type, loc);
7327
7398
  if (!absent) {
7328
7399
  lowerer.unsupported("SC1090", call, `Object.assign leaving the required field '${f.name}' of '${lowerer.fmt(mapped)}' unfilled`);
7329
7400
  }
@@ -7801,6 +7872,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7801
7872
  // Use the lowered receiver's representation and retain its evaluation.
7802
7873
  const probe = mappedReceiver?.kind !== "object" &&
7803
7874
  (lowerer.implicitParamTypes !== null ||
7875
+ lowerer.classImplementedProtocol(lowerer.typeOf(access.expression)) ||
7804
7876
  ts.isNewExpression(access.expression) ||
7805
7877
  isJsSourceFile(call.getSourceFile()))
7806
7878
  ? ts.isNewExpression(access.expression)
@@ -7922,7 +7994,9 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7922
7994
  const receiverLocal = lowerer.declareHiddenLocal("%callReceiver", target.obj.type);
7923
7995
  const init = { kind: "varDecl", localId: receiverLocal.id, init: target.obj, loc };
7924
7996
  target.obj = { kind: "varRef", localId: receiverLocal.id, type: receiverLocal.type, loc };
7925
- const receiver = lowerer.coerceToExpected(target.obj, DYN);
7997
+ const receiver = {};
7998
+ if (!lowerer.receiverFreeCallbackFields.has(access.name.text))
7999
+ receiver.receiver = lowerer.coerceToExpected(target.obj, DYN);
7926
8000
  const finish = (result) => ({
7927
8001
  kind: "seqExpr",
7928
8002
  stmts: [init],
@@ -7951,12 +8025,12 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7951
8025
  const boxed = { kind: "dynFrom", value: callee, type: DYN, loc };
7952
8026
  const spread = lowerSpreadArgsCall(lowerer, call, boxed, loc);
7953
8027
  if (spread?.kind === "dynCall")
7954
- return finish({ ...spread, receiver });
8028
+ return finish({ ...spread, ...receiver });
7955
8029
  const args = call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN));
7956
8030
  return finish({
7957
8031
  kind: "dynCall",
7958
8032
  callee: boxed,
7959
- receiver,
8033
+ ...receiver,
7960
8034
  calleeName: access.getText(),
7961
8035
  args,
7962
8036
  type: DYN,
@@ -7964,7 +8038,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7964
8038
  });
7965
8039
  }
7966
8040
  const args = completeFuncValueArgs(lowerer, call, callee.type, locOf(call));
7967
- return finish({ kind: "callValue", callee, receiver, args, type: callee.type.ret, loc });
8041
+ return finish({ kind: "callValue", callee, ...receiver, args, type: callee.type.ret, loc });
7968
8042
  }
7969
8043
  if (callee?.type.kind === "dyn") {
7970
8044
  if (call.arguments.some((a) => ts.isSpreadElement(a))) {
@@ -7974,7 +8048,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
7974
8048
  return finish({
7975
8049
  kind: "dynCall",
7976
8050
  callee,
7977
- receiver,
8051
+ ...receiver,
7978
8052
  calleeName: access.getText(),
7979
8053
  args,
7980
8054
  type: DYN,
@@ -8056,7 +8130,7 @@ export function lowerObjectMethodCall(lowerer, call, access) {
8056
8130
  type: found.sig.ret,
8057
8131
  loc,
8058
8132
  };
8059
- const result = classCallbackCall(lowerer, value, method, call.arguments.map((arg) => lowerer.lowerExprExpecting(arg, DYN)), fallback, loc, access.getText());
8133
+ const result = classCallbackCall(lowerer, value, method, call.arguments, fallback, loc, access.getText());
8060
8134
  return {
8061
8135
  kind: "seqExpr",
8062
8136
  stmts: [{ kind: "varDecl", localId: local.id, init: receiver, loc }],