@scriptc/compiler 0.2.9 → 0.3.0

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 (505) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +2 -36
  2. package/ambient/scriptc-overrides.d.ts +1 -25
  3. package/ambient/scriptc.d.ts +1 -9
  4. package/dist/backend/cycle-analysis.d.ts +56 -0
  5. package/dist/backend/cycle-analysis.js +175 -14
  6. package/dist/backend/cycle-analysis.js.map +1 -1
  7. package/dist/backend/cycle-analysis.test.js +95 -2
  8. package/dist/backend/cycle-analysis.test.js.map +1 -1
  9. package/dist/backend/cycle-mutability.d.ts +3 -7
  10. package/dist/backend/cycle-mutability.js +4 -30
  11. package/dist/backend/cycle-mutability.js.map +1 -1
  12. package/dist/backend/executable-features.d.ts +1 -1
  13. package/dist/backend/executable-features.js +3 -8
  14. package/dist/backend/executable-features.js.map +1 -1
  15. package/dist/backend/immutability.d.ts +57 -0
  16. package/dist/backend/immutability.js +178 -0
  17. package/dist/backend/immutability.js.map +1 -0
  18. package/dist/backend/immutability.test.js +131 -0
  19. package/dist/backend/immutability.test.js.map +1 -0
  20. package/dist/backend/library-pack.js +0 -2
  21. package/dist/backend/library-pack.js.map +1 -1
  22. package/dist/backend/linker.js +1 -1
  23. package/dist/backend/linker.js.map +1 -1
  24. package/dist/backend/llvm/borrowed-inputs.d.ts +9 -2
  25. package/dist/backend/llvm/borrowed-inputs.js +31 -3
  26. package/dist/backend/llvm/borrowed-inputs.js.map +1 -1
  27. package/dist/backend/llvm/checked-narrows.test.js +1 -1
  28. package/dist/backend/llvm/classes.d.ts +28 -0
  29. package/dist/backend/llvm/classes.js +48 -14
  30. package/dist/backend/llvm/classes.js.map +1 -1
  31. package/dist/backend/llvm/classes.test.js +134 -6
  32. package/dist/backend/llvm/classes.test.js.map +1 -1
  33. package/dist/backend/llvm/common.d.ts +13 -0
  34. package/dist/backend/llvm/common.js +13 -0
  35. package/dist/backend/llvm/common.js.map +1 -1
  36. package/dist/backend/llvm/constant-callbacks.d.ts +1 -1
  37. package/dist/backend/llvm/constant-callbacks.js +3 -3
  38. package/dist/backend/llvm/constant-callbacks.js.map +1 -1
  39. package/dist/backend/llvm/constant-callbacks.test.js +1 -1
  40. package/dist/backend/llvm/dense-array-access.js +5 -4
  41. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  42. package/dist/backend/llvm/dense-array-access.test.js +10 -2
  43. package/dist/backend/llvm/dense-array-access.test.js.map +1 -1
  44. package/dist/backend/llvm/dyn.d.ts +2 -1
  45. package/dist/backend/llvm/dyn.js +3 -76
  46. package/dist/backend/llvm/dyn.js.map +1 -1
  47. package/dist/backend/llvm/emitter.d.ts +67 -19
  48. package/dist/backend/llvm/emitter.js +443 -226
  49. package/dist/backend/llvm/emitter.js.map +1 -1
  50. package/dist/backend/llvm/emitter.test.js +21 -3
  51. package/dist/backend/llvm/emitter.test.js.map +1 -1
  52. package/dist/backend/llvm/expr-async.test.js +1 -1
  53. package/dist/backend/llvm/expr-calls.js +14 -6
  54. package/dist/backend/llvm/expr-calls.js.map +1 -1
  55. package/dist/backend/llvm/expr-containers.js +41 -14
  56. package/dist/backend/llvm/expr-containers.js.map +1 -1
  57. package/dist/backend/llvm/expr-control.js +4 -107
  58. package/dist/backend/llvm/expr-control.js.map +1 -1
  59. package/dist/backend/llvm/expr-dispatch.d.ts +1 -2
  60. package/dist/backend/llvm/expr-dispatch.js +0 -41
  61. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  62. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  63. package/dist/backend/llvm/expr-dynamic.js +13 -27
  64. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  65. package/dist/backend/llvm/expr-primitives.js +30 -3
  66. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  67. package/dist/backend/llvm/expr-primitives.test.js +55 -2
  68. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  69. package/dist/backend/llvm/expr-stream-bridges.js +4 -4
  70. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  71. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  72. package/dist/backend/llvm/lib-dispatch.js +0 -1
  73. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  74. package/dist/backend/llvm/lib-filesystem.js +0 -13
  75. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  76. package/dist/backend/llvm/lib-shared.js +0 -8
  77. package/dist/backend/llvm/lib-shared.js.map +1 -1
  78. package/dist/backend/llvm/local-array-reads.js +3 -3
  79. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  80. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  81. package/dist/backend/llvm/local-union-storage.test.js +1 -1
  82. package/dist/backend/llvm/loop-array-borrows.d.ts +5 -2
  83. package/dist/backend/llvm/loop-array-borrows.js +27 -8
  84. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  85. package/dist/backend/llvm/map-number-lookup.d.ts +14 -0
  86. package/dist/backend/llvm/map-number-lookup.js +33 -2
  87. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  88. package/dist/backend/llvm/map-read-lifetimes.d.ts +5 -0
  89. package/dist/backend/llvm/map-read-lifetimes.js +20 -4
  90. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  91. package/dist/backend/llvm/map-read-lifetimes.test.js +25 -3
  92. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  93. package/dist/backend/llvm/reference-writes.d.ts +124 -0
  94. package/dist/backend/llvm/reference-writes.js +1090 -0
  95. package/dist/backend/llvm/reference-writes.js.map +1 -0
  96. package/dist/backend/llvm/shapes.d.ts +8 -5
  97. package/dist/backend/llvm/shapes.js +37 -13
  98. package/dist/backend/llvm/shapes.js.map +1 -1
  99. package/dist/backend/llvm/shapes.test.js +3 -3
  100. package/dist/backend/llvm/stack-unions.test.js +1 -1
  101. package/dist/backend/llvm/string-construction.test.js +1 -1
  102. package/dist/backend/llvm/string-lifetimes.test.js +40 -11
  103. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  104. package/dist/backend/llvm/string-reads.d.ts +3 -0
  105. package/dist/backend/llvm/string-reads.js +31 -0
  106. package/dist/backend/llvm/string-reads.js.map +1 -1
  107. package/dist/backend/llvm/switch-dispatch.d.ts +2 -2
  108. package/dist/backend/llvm/switch-dispatch.js +35 -22
  109. package/dist/backend/llvm/switch-dispatch.js.map +1 -1
  110. package/dist/backend/llvm/switch-dispatch.test.js +29 -11
  111. package/dist/backend/llvm/switch-dispatch.test.js.map +1 -1
  112. package/dist/backend/llvm/walk-borrows.d.ts +8 -1
  113. package/dist/backend/llvm/walk-borrows.js +15 -4
  114. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  115. package/dist/backend/may-throw.d.ts +36 -2
  116. package/dist/backend/may-throw.js +308 -21
  117. package/dist/backend/may-throw.js.map +1 -1
  118. package/dist/backend/may-throw.test.js +147 -2
  119. package/dist/backend/may-throw.test.js.map +1 -1
  120. package/dist/backend/native/artifact-stamps.js +0 -2
  121. package/dist/backend/native/artifact-stamps.js.map +1 -1
  122. package/dist/backend/native/cache-warm.d.ts +1 -1
  123. package/dist/backend/native/cache-warm.js +2 -3
  124. package/dist/backend/native/cache-warm.js.map +1 -1
  125. package/dist/backend/native/compiler-fingerprint.d.ts +1 -1
  126. package/dist/backend/native/compiler-fingerprint.js +4 -7
  127. package/dist/backend/native/compiler-fingerprint.js.map +1 -1
  128. package/dist/backend/native/contracts.d.ts +3 -28
  129. package/dist/backend/native/driver.js +1 -3
  130. package/dist/backend/native/driver.js.map +1 -1
  131. package/dist/backend/native/executable.d.ts +0 -15
  132. package/dist/backend/native/executable.js +17 -172
  133. package/dist/backend/native/executable.js.map +1 -1
  134. package/dist/backend/native/tool-identity.js +0 -1
  135. package/dist/backend/native/tool-identity.js.map +1 -1
  136. package/dist/backend/native/vendor.d.ts +1 -1
  137. package/dist/backend/native/vendor.js +1 -1
  138. package/dist/backend/native/vendor.js.map +1 -1
  139. package/dist/backend/native-link-info-core.d.ts +0 -2
  140. package/dist/backend/native-link-info-core.js.map +1 -1
  141. package/dist/backend/native-toolchain.test.js +23 -33
  142. package/dist/backend/native-toolchain.test.js.map +1 -1
  143. package/dist/backend/publication.d.ts +5 -0
  144. package/dist/backend/publication.js +10 -0
  145. package/dist/backend/publication.js.map +1 -1
  146. package/dist/backend/publication.test.js +1 -1
  147. package/dist/backend/runtime-abi.d.ts +2 -2
  148. package/dist/backend/runtime-abi.js +2 -2
  149. package/dist/backend/runtime-pack-core.d.ts +1 -2
  150. package/dist/backend/runtime-pack-core.js +5 -14
  151. package/dist/backend/runtime-pack-core.js.map +1 -1
  152. package/dist/backend/runtime-pack-targets.test.js +3 -8
  153. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  154. package/dist/backend/runtime-pack.test.js +22 -19
  155. package/dist/backend/runtime-pack.test.js.map +1 -1
  156. package/dist/backend/target-diagnostics.d.ts +0 -5
  157. package/dist/backend/target-diagnostics.js +1 -11
  158. package/dist/backend/target-diagnostics.js.map +1 -1
  159. package/dist/backend/target-diagnostics.test.js +1 -1
  160. package/dist/backend/vendor-archives.d.ts +1 -7
  161. package/dist/backend/vendor-archives.js +9 -189
  162. package/dist/backend/vendor-archives.js.map +1 -1
  163. package/dist/backend/vendor-inputs.d.ts +0 -1
  164. package/dist/backend/vendor-inputs.js +0 -1
  165. package/dist/backend/vendor-inputs.js.map +1 -1
  166. package/dist/backend/warm-cache.js +3 -5
  167. package/dist/backend/warm-cache.js.map +1 -1
  168. package/dist/cli/command.js +4 -8
  169. package/dist/cli/command.js.map +1 -1
  170. package/dist/cli/host.d.ts +1 -1
  171. package/dist/cli/usage.d.ts +1 -5
  172. package/dist/cli/usage.js +4 -9
  173. package/dist/cli/usage.js.map +1 -1
  174. package/dist/compat/fetch-profile.d.ts +2 -2
  175. package/dist/compat/fetch-profile.js +16 -25
  176. package/dist/compat/fetch-profile.js.map +1 -1
  177. package/dist/compile-types.d.ts +2 -17
  178. package/dist/contracts/check.d.ts +8 -0
  179. package/dist/contracts/check.js +1573 -0
  180. package/dist/contracts/check.js.map +1 -0
  181. package/dist/coverage/report.d.ts +5 -22
  182. package/dist/coverage/report.js +12 -76
  183. package/dist/coverage/report.js.map +1 -1
  184. package/dist/coverage/surface-manifest.d.ts +3 -3
  185. package/dist/coverage/surface-manifest.js +22 -27
  186. package/dist/coverage/surface-manifest.js.map +1 -1
  187. package/dist/coverage/verdict-cache.d.ts +1 -3
  188. package/dist/coverage/verdict-cache.js +2 -7
  189. package/dist/coverage/verdict-cache.js.map +1 -1
  190. package/dist/diagnostics/diagnostic.d.ts +11 -60
  191. package/dist/diagnostics/diagnostic.js +39 -118
  192. package/dist/diagnostics/diagnostic.js.map +1 -1
  193. package/dist/diagnostics/envelope.d.ts +3 -4
  194. package/dist/diagnostics/envelope.js +0 -9
  195. package/dist/diagnostics/envelope.js.map +1 -1
  196. package/dist/diagnostics/envelope.test.js +1 -1
  197. package/dist/diagnostics/envelope.test.js.map +1 -1
  198. package/dist/executable/executable-cache.d.ts +0 -3
  199. package/dist/executable/executable-cache.js +2 -4
  200. package/dist/executable/executable-cache.js.map +1 -1
  201. package/dist/executable/executable-cache.test.js +0 -4
  202. package/dist/executable/executable-cache.test.js.map +1 -1
  203. package/dist/executable/prepare.js +14 -2
  204. package/dist/executable/prepare.js.map +1 -1
  205. package/dist/frontend/analysis.js +10 -10
  206. package/dist/frontend/analysis.js.map +1 -1
  207. package/dist/frontend/cjs-syntax.js +0 -88
  208. package/dist/frontend/cjs-syntax.js.map +1 -1
  209. package/dist/frontend/contract-types.d.ts +50 -0
  210. package/dist/frontend/contract-types.js +232 -0
  211. package/dist/frontend/contract-types.js.map +1 -0
  212. package/dist/frontend/dts-paths.d.ts +1 -1
  213. package/dist/frontend/dts-paths.js +1 -1
  214. package/dist/frontend/lowering/abstract-equality.js +1 -4
  215. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  216. package/dist/frontend/lowering/array-values.js +4 -11
  217. package/dist/frontend/lowering/array-values.js.map +1 -1
  218. package/dist/frontend/lowering/builtins/arguments.js +0 -13
  219. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/crypto.d.ts +0 -4
  221. package/dist/frontend/lowering/builtins/crypto.js +0 -4
  222. package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
  223. package/dist/frontend/lowering/builtins/json.js +1 -39
  224. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/module-resolution.d.ts +0 -15
  226. package/dist/frontend/lowering/builtins/module-resolution.js +5 -44
  227. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/numbers.d.ts +0 -6
  229. package/dist/frontend/lowering/builtins/numbers.js +6 -57
  230. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/promises.js +4 -67
  232. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  233. package/dist/frontend/lowering/builtins/workers.js +1 -1
  234. package/dist/frontend/lowering/builtins/workers.js.map +1 -1
  235. package/dist/frontend/lowering/call-arguments.d.ts +1 -37
  236. package/dist/frontend/lowering/call-arguments.js +11 -94
  237. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  238. package/dist/frontend/lowering/call-signatures.d.ts +1 -6
  239. package/dist/frontend/lowering/call-signatures.js +16 -68
  240. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  241. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +19 -4
  242. package/dist/frontend/lowering/class-dynamic-dispatch.js +168 -98
  243. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  244. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +44 -4
  245. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  246. package/dist/frontend/lowering/class-method-mutations.js +0 -2
  247. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  248. package/dist/frontend/lowering/class-protocols.js +1 -1
  249. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  250. package/dist/frontend/lowering/coercions/function-adapters.js +5 -35
  251. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  252. package/dist/frontend/lowering/coercions/state.d.ts +0 -1
  253. package/dist/frontend/lowering/coercions/state.js +0 -1
  254. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  255. package/dist/frontend/lowering/coercions/structural-plans.js +2 -4
  256. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  257. package/dist/frontend/lowering/coercions/structural.js +2 -12
  258. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  259. package/dist/frontend/lowering/coercions/unions.d.ts +12 -0
  260. package/dist/frontend/lowering/coercions/unions.js +63 -1
  261. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  262. package/dist/frontend/lowering/containers/array-callbacks.js +9 -28
  263. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  264. package/dist/frontend/lowering/containers/array-construction.js +2 -3
  265. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  266. package/dist/frontend/lowering/containers/array-methods.js +10 -54
  267. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  268. package/dist/frontend/lowering/containers/bytes.js +0 -1
  269. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  270. package/dist/frontend/lowering/containers/callback-arguments.js +2 -10
  271. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  272. package/dist/frontend/lowering/containers/collection-methods.js +1 -6
  273. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  274. package/dist/frontend/lowering/containers/indexed-objects.js +0 -2
  275. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  276. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +0 -6
  277. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -10
  278. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  279. package/dist/frontend/lowering/expressions/evaluation-safety.js +0 -3
  280. package/dist/frontend/lowering/expressions/evaluation-safety.js.map +1 -1
  281. package/dist/frontend/lowering/expressions/native-proxy.js +1 -1
  282. package/dist/frontend/lowering/expressions/native-proxy.js.map +1 -1
  283. package/dist/frontend/lowering/expressions/nullish-assignment.js +0 -1
  284. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  285. package/dist/frontend/lowering/expressions/object-literals.d.ts +0 -8
  286. package/dist/frontend/lowering/expressions/object-literals.js +8 -35
  287. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  288. package/dist/frontend/lowering/expressions/optional-chains.d.ts +0 -4
  289. package/dist/frontend/lowering/expressions/optional-chains.js +7 -67
  290. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  291. package/dist/frontend/lowering/function-context.js +0 -1
  292. package/dist/frontend/lowering/function-context.js.map +1 -1
  293. package/dist/frontend/lowering/generic-functions.js +0 -1
  294. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  295. package/dist/frontend/lowering/lib-boundary.js +10 -77
  296. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  297. package/dist/frontend/lowering/lower-array-sort.js +1 -10
  298. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  299. package/dist/frontend/lowering/lower-array-sort.test.js +2 -2
  300. package/dist/frontend/lowering/lower-array-sort.test.js.map +1 -1
  301. package/dist/frontend/lowering/lower-assert.js +2 -3
  302. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  303. package/dist/frontend/lowering/lower-async-iteration.js +1 -1
  304. package/dist/frontend/lowering/lower-calls.d.ts +2 -27
  305. package/dist/frontend/lowering/lower-calls.js +56 -465
  306. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  307. package/dist/frontend/lowering/lower-classes.js +11 -49
  308. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  309. package/dist/frontend/lowering/lower-comptime.js +2 -3
  310. package/dist/frontend/lowering/lower-comptime.js.map +1 -1
  311. package/dist/frontend/lowering/lower-enums.js +5 -8
  312. package/dist/frontend/lowering/lower-enums.js.map +1 -1
  313. package/dist/frontend/lowering/lower-event-emitter.js +3 -4
  314. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  315. package/dist/frontend/lowering/lower-expando.js +3 -5
  316. package/dist/frontend/lowering/lower-expando.js.map +1 -1
  317. package/dist/frontend/lowering/lower-exprs.d.ts +0 -8
  318. package/dist/frontend/lowering/lower-exprs.js +133 -908
  319. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  320. package/dist/frontend/lowering/lower-functions.js +2 -5
  321. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  322. package/dist/frontend/lowering/lower-inspect.js +1 -50
  323. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  324. package/dist/frontend/lowering/lower-modules.d.ts +0 -43
  325. package/dist/frontend/lowering/lower-modules.js +25 -329
  326. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  327. package/dist/frontend/lowering/lower-modules.test.js +5 -5
  328. package/dist/frontend/lowering/lower-modules.test.js.map +1 -1
  329. package/dist/frontend/lowering/lower-server.js +0 -30
  330. package/dist/frontend/lowering/lower-server.js.map +1 -1
  331. package/dist/frontend/lowering/lower-stdlib.d.ts +98 -0
  332. package/dist/frontend/lowering/{lower-island.js → lower-stdlib.js} +97 -1160
  333. package/dist/frontend/lowering/lower-stdlib.js.map +1 -0
  334. package/dist/frontend/lowering/lower-stmts.d.ts +0 -16
  335. package/dist/frontend/lowering/lower-stmts.js +58 -1016
  336. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  337. package/dist/frontend/lowering/lower-stmts.test.js +1 -1
  338. package/dist/frontend/lowering/lower-stmts.test.js.map +1 -1
  339. package/dist/frontend/lowering/lower-stream.js +1 -3
  340. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  341. package/dist/frontend/lowering/lowerer.d.ts +26 -151
  342. package/dist/frontend/lowering/lowerer.js +120 -770
  343. package/dist/frontend/lowering/lowerer.js.map +1 -1
  344. package/dist/frontend/lowering/lowerer.test.js +4 -51
  345. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  346. package/dist/frontend/lowering/narrowing-stability.d.ts +100 -0
  347. package/dist/frontend/lowering/narrowing-stability.js +1174 -0
  348. package/dist/frontend/lowering/narrowing-stability.js.map +1 -0
  349. package/dist/frontend/lowering/narrowing-stability.test.js +150 -0
  350. package/dist/frontend/lowering/narrowing-stability.test.js.map +1 -0
  351. package/dist/frontend/lowering/optional-arguments.js +0 -2
  352. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  353. package/dist/frontend/lowering/sanitize-class-types.test.js +2 -2
  354. package/dist/frontend/lowering/strict-equality.js +1 -1
  355. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  356. package/dist/frontend/lowering/surfaces.d.ts +6 -45
  357. package/dist/frontend/lowering/surfaces.js +5 -65
  358. package/dist/frontend/lowering/surfaces.js.map +1 -1
  359. package/dist/frontend/module-syntax.d.ts +0 -3
  360. package/dist/frontend/module-syntax.js.map +1 -1
  361. package/dist/frontend/npm-node.d.ts +0 -7
  362. package/dist/frontend/npm-node.js +0 -7
  363. package/dist/frontend/npm-node.js.map +1 -1
  364. package/dist/frontend/npm-static-rewrite-syntax.d.ts +1 -1
  365. package/dist/frontend/npm-static-rewrite-syntax.js +6 -82
  366. package/dist/frontend/npm-static-rewrite-syntax.js.map +1 -1
  367. package/dist/frontend/npm-static.d.ts +1 -1
  368. package/dist/frontend/npm-static.js +6 -71
  369. package/dist/frontend/npm-static.js.map +1 -1
  370. package/dist/frontend/npm.d.ts +3 -319
  371. package/dist/frontend/npm.js +6 -1007
  372. package/dist/frontend/npm.js.map +1 -1
  373. package/dist/frontend/npm.test.js +2 -197
  374. package/dist/frontend/npm.test.js.map +1 -1
  375. package/dist/frontend/pipeline-native.js +1 -2
  376. package/dist/frontend/pipeline-native.js.map +1 -1
  377. package/dist/frontend/pipeline.d.ts +3 -11
  378. package/dist/frontend/pipeline.js +37 -56
  379. package/dist/frontend/pipeline.js.map +1 -1
  380. package/dist/frontend/pipeline.test.js +12 -6
  381. package/dist/frontend/pipeline.test.js.map +1 -1
  382. package/dist/frontend/program.d.ts +0 -34
  383. package/dist/frontend/program.js +13 -98
  384. package/dist/frontend/program.js.map +1 -1
  385. package/dist/frontend/provenance-core.d.ts +0 -4
  386. package/dist/frontend/provenance-core.js +4 -37
  387. package/dist/frontend/provenance-core.js.map +1 -1
  388. package/dist/frontend/provenance-registry.d.ts +0 -4
  389. package/dist/frontend/provenance-registry.js +0 -20
  390. package/dist/frontend/provenance-registry.js.map +1 -1
  391. package/dist/frontend/resolve.d.ts +0 -12
  392. package/dist/frontend/resolve.js +0 -34
  393. package/dist/frontend/resolve.js.map +1 -1
  394. package/dist/frontend/runtime-resolve.js +2 -2
  395. package/dist/frontend/runtime-resolve.js.map +1 -1
  396. package/dist/frontend/services-node.js +2 -3
  397. package/dist/frontend/services-node.js.map +1 -1
  398. package/dist/frontend/services.d.ts +1 -8
  399. package/dist/frontend/services.js +2 -22
  400. package/dist/frontend/services.js.map +1 -1
  401. package/dist/frontend/services.test.js +0 -38
  402. package/dist/frontend/services.test.js.map +1 -1
  403. package/dist/frontend/tsc-codes.js +0 -11
  404. package/dist/frontend/tsc-codes.js.map +1 -1
  405. package/dist/frontend/type-mapper.d.ts +2 -27
  406. package/dist/frontend/type-mapper.js +85 -153
  407. package/dist/frontend/type-mapper.js.map +1 -1
  408. package/dist/index.d.ts +1 -1
  409. package/dist/index.js +7 -10
  410. package/dist/index.js.map +1 -1
  411. package/dist/ir/api.d.ts +1 -1
  412. package/dist/ir/api.js +1 -1
  413. package/dist/ir/api.js.map +1 -1
  414. package/dist/ir/builtin-effects.js +0 -5
  415. package/dist/ir/builtin-effects.js.map +1 -1
  416. package/dist/ir/builtin-signatures.d.ts +1 -1
  417. package/dist/ir/builtin-signatures.js +1 -55
  418. package/dist/ir/builtin-signatures.js.map +1 -1
  419. package/dist/ir/constant-globals.test.js +1 -1
  420. package/dist/ir/constant-tables.test.js +1 -1
  421. package/dist/ir/final-fields.test.js +1 -1
  422. package/dist/ir/initializer-bindings.test.js +1 -1
  423. package/dist/ir/int32-slots.d.ts +29 -3
  424. package/dist/ir/int32-slots.js +152 -66
  425. package/dist/ir/int32-slots.js.map +1 -1
  426. package/dist/ir/int32-slots.test.js +1 -1
  427. package/dist/ir/integer-loops.js +3 -0
  428. package/dist/ir/integer-loops.js.map +1 -1
  429. package/dist/ir/integer-loops.test.js +26 -1
  430. package/dist/ir/integer-loops.test.js.map +1 -1
  431. package/dist/ir/integer-ranges.d.ts +20 -0
  432. package/dist/ir/integer-ranges.js +178 -21
  433. package/dist/ir/integer-ranges.js.map +1 -1
  434. package/dist/ir/integer-ranges.test.js +148 -3
  435. package/dist/ir/integer-ranges.test.js.map +1 -1
  436. package/dist/ir/ir.d.ts +44 -284
  437. package/dist/ir/ir.js +10 -259
  438. package/dist/ir/ir.js.map +1 -1
  439. package/dist/ir/ir.test.js +2 -7
  440. package/dist/ir/ir.test.js.map +1 -1
  441. package/dist/ir/runtime-features.d.ts +3 -30
  442. package/dist/ir/runtime-features.js +5 -41
  443. package/dist/ir/runtime-features.js.map +1 -1
  444. package/dist/ir/scalar-records.test.js +1 -1
  445. package/dist/ir/serialize.d.ts +6 -2
  446. package/dist/ir/serialize.js +11 -3
  447. package/dist/ir/serialize.js.map +1 -1
  448. package/dist/ir/traverse.js +0 -21
  449. package/dist/ir/traverse.js.map +1 -1
  450. package/dist/ir/unshare.d.ts +14 -0
  451. package/dist/ir/unshare.js +60 -0
  452. package/dist/ir/unshare.js.map +1 -0
  453. package/dist/ir/unshare.test.js +115 -0
  454. package/dist/ir/unshare.test.js.map +1 -0
  455. package/dist/ir/validate.js +9 -207
  456. package/dist/ir/validate.js.map +1 -1
  457. package/dist/ir/validate.test.js +6 -6
  458. package/dist/library/fence-eval.test.js +1 -1
  459. package/dist/library/int-infer.test.js +4 -4
  460. package/dist/library/library-cache.test.js +5 -5
  461. package/dist/library/prepare.js +14 -20
  462. package/dist/library/prepare.js.map +1 -1
  463. package/dist/native/cli.js +0 -2
  464. package/dist/native/cli.js.map +1 -1
  465. package/dist/native/compiler.test.js +2 -4
  466. package/dist/native/compiler.test.js.map +1 -1
  467. package/dist/native/prepare.js +2 -4
  468. package/dist/native/prepare.js.map +1 -1
  469. package/dist/native/sanitizer.js +2 -16
  470. package/dist/native/sanitizer.js.map +1 -1
  471. package/dist/native/sanitizer.test.js +0 -3
  472. package/dist/native/sanitizer.test.js.map +1 -1
  473. package/dist/startup-cache.js +0 -2
  474. package/dist/startup-cache.js.map +1 -1
  475. package/package.json +20 -20
  476. package/surface-manifest.json +80 -88
  477. package/dist/backend/llvm/expr-island.d.ts +0 -15
  478. package/dist/backend/llvm/expr-island.js +0 -709
  479. package/dist/backend/llvm/expr-island.js.map +0 -1
  480. package/dist/frontend/lowering/coercions/island.d.ts +0 -37
  481. package/dist/frontend/lowering/coercions/island.js +0 -350
  482. package/dist/frontend/lowering/coercions/island.js.map +0 -1
  483. package/dist/frontend/lowering/lower-island.d.ts +0 -229
  484. package/dist/frontend/lowering/lower-island.js.map +0 -1
  485. package/dist/frontend/lowering/lower-island.test.js +0 -56
  486. package/dist/frontend/lowering/lower-island.test.js.map +0 -1
  487. package/dist/frontend/npm-fetch-analysis.d.ts +0 -17
  488. package/dist/frontend/npm-fetch-analysis.js +0 -109
  489. package/dist/frontend/npm-fetch-analysis.js.map +0 -1
  490. package/dist/frontend/npm-fetch-analysis.test.js +0 -130
  491. package/dist/frontend/npm-fetch-analysis.test.js.map +0 -1
  492. package/dist/frontend/npm-fetch-node.d.ts +0 -2
  493. package/dist/frontend/npm-fetch-node.js +0 -12
  494. package/dist/frontend/npm-fetch-node.js.map +0 -1
  495. package/dist/frontend/npm-fetch-syntax.d.ts +0 -6
  496. package/dist/frontend/npm-fetch-syntax.js +0 -202
  497. package/dist/frontend/npm-fetch-syntax.js.map +0 -1
  498. package/dist/native/runtime-typescript.d.ts +0 -4
  499. package/dist/native/runtime-typescript.js +0 -74
  500. package/dist/native/runtime-typescript.js.map +0 -1
  501. package/dist/native/runtime-typescript.test.js +0 -41
  502. package/dist/native/runtime-typescript.test.js.map +0 -1
  503. /package/dist/{frontend/lowering/lower-island.test.d.ts → backend/immutability.test.d.ts} +0 -0
  504. /package/dist/frontend/{npm-fetch-analysis.test.d.ts → lowering/narrowing-stability.test.d.ts} +0 -0
  505. /package/dist/{native/runtime-typescript.test.d.ts → ir/unshare.test.d.ts} +0 -0
@@ -164,8 +164,36 @@ export function classInstanceOf(lowerer, value, info, loc, classValue) {
164
164
  loc,
165
165
  };
166
166
  }
167
+ const READ_PROPERTIES = "%dyn.class.readProperties";
168
+ const READ_PROPERTIES_OR_EMPTY = "%dyn.class.readPropertiesOrEmpty";
169
+ function isEmptyBag(value) {
170
+ return value.kind === "dynObjLit" && value.fields?.length === 0;
171
+ }
172
+ /** The property-bag dispatch's class branches without their lazy stores:
173
+ * `if (bag === undefined) bag = init` becomes `return init` (not stored), or
174
+ * nothing for an empty bag unless `orEmpty` asks for a fresh empty object. */
175
+ function readOnlyBagBody(body, orEmpty = false) {
176
+ for (const branch of body) {
177
+ if (branch.kind !== "if")
178
+ continue;
179
+ const absent = branch.then[0];
180
+ const store = absent?.kind === "if" ? absent.then[0] : undefined;
181
+ if (absent?.kind !== "if" ||
182
+ absent.cond.kind !== "dynTest" ||
183
+ absent.cond.test !== "undefined" ||
184
+ absent.then.length !== 1 ||
185
+ store?.kind !== "fieldSet" ||
186
+ store.field !== PROPERTY_BAG)
187
+ continue;
188
+ if (isEmptyBag(store.value) && !orEmpty)
189
+ branch.then.shift();
190
+ else
191
+ absent.then = [{ kind: "return", value: store.value, loc: store.loc }];
192
+ }
193
+ return body;
194
+ }
167
195
  export function classPropertiesHelper(lowerer, loc, readOnly = false) {
168
- const name = readOnly ? "%dyn.class.readProperties" : "%dyn.class.properties";
196
+ const name = readOnly ? READ_PROPERTIES : "%dyn.class.properties";
169
197
  const existing = lowerer.liftedFns.find((fn) => fn.name === name);
170
198
  if (existing)
171
199
  return existing;
@@ -1329,13 +1357,15 @@ export class ClassDynamicDispatch {
1329
1357
  ...(reflect ? [{ localId: "p.reflectReceiver", name: "receiver", type: DYN }] : []),
1330
1358
  ];
1331
1359
  const keyLocal = dynamicKey ? "key.string" : "p.key";
1332
- const bag = {
1333
- kind: "call",
1334
- callee: this.propertyBag.name,
1335
- args: [varRef("p.0", DYN, loc)],
1336
- type: DYN,
1337
- loc,
1338
- };
1360
+ const bag = computedWrite
1361
+ ? {
1362
+ kind: "call",
1363
+ callee: this.propertyBag.name,
1364
+ args: [varRef("p.0", DYN, loc)],
1365
+ type: DYN,
1366
+ loc,
1367
+ }
1368
+ : this.readPropertyBagOrEmpty(lowerer, varRef("p.0", DYN, loc), loc);
1339
1369
  const reflectionFallback = (target, property) => ({
1340
1370
  kind: "libCall",
1341
1371
  fn: computedWrite ? "dyn.reflectSet" : "dyn.reflectGet",
@@ -1561,13 +1591,15 @@ export class ClassDynamicDispatch {
1561
1591
  name: `p${i}`,
1562
1592
  type: DYN,
1563
1593
  }));
1564
- const instanceBag = {
1565
- kind: "call",
1566
- callee: this.propertyBag.name,
1567
- args: [varRef("p.0", DYN, loc)],
1568
- type: DYN,
1569
- loc,
1570
- };
1594
+ const instanceBag = read
1595
+ ? this.readPropertyBagOrEmpty(lowerer, varRef("p.0", DYN, loc), loc)
1596
+ : {
1597
+ kind: "call",
1598
+ callee: this.propertyBag.name,
1599
+ args: [varRef("p.0", DYN, loc)],
1600
+ type: DYN,
1601
+ loc,
1602
+ };
1571
1603
  const bag = read && !["name", "length", "apply"].includes(name)
1572
1604
  ? {
1573
1605
  kind: "call",
@@ -1953,13 +1985,7 @@ export class ClassDynamicDispatch {
1953
1985
  const prototypeMethod = lowerer.prototypeMethodAccesses.has(dispatch.source.method);
1954
1986
  if (prototypeMethod)
1955
1987
  classPrototypeData(lowerer, info, loc);
1956
- const bag = {
1957
- kind: "call",
1958
- callee: this.propertyBag.name,
1959
- args: [value],
1960
- type: DYN,
1961
- loc,
1962
- };
1988
+ const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
1963
1989
  dispatch.callback.body.unshift({
1964
1990
  kind: "if",
1965
1991
  cond: condition,
@@ -2196,13 +2222,7 @@ export class ClassDynamicDispatch {
2196
2222
  const prototypeMethod = lowerer.prototypeMethodAccesses.has(name);
2197
2223
  if (info.fields.has(name) || (dispatch.probe === "in" && !prototypeMethod)) {
2198
2224
  if (info.fields.has(name) && info.def.tracksOwnFields) {
2199
- const bag = {
2200
- kind: "call",
2201
- callee: this.propertyBag.name,
2202
- args: [lowerer.coerceToExpected(receiver, DYN)],
2203
- type: DYN,
2204
- loc,
2205
- };
2225
+ const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
2206
2226
  const symbol = symbolMemberKey(lowerer, info, name, loc);
2207
2227
  const fn = dispatch.probe === "in"
2208
2228
  ? "dyn.hasKey"
@@ -2229,13 +2249,7 @@ export class ClassDynamicDispatch {
2229
2249
  }
2230
2250
  if (prototypeMethod)
2231
2251
  classPrototypeData(lowerer, info, loc, receiver);
2232
- const bag = {
2233
- kind: "call",
2234
- callee: this.propertyBag.name,
2235
- args: [lowerer.coerceToExpected(receiver, DYN)],
2236
- type: DYN,
2237
- loc,
2238
- };
2252
+ const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
2239
2253
  const symbol = name.startsWith("sym:") || name.startsWith("%symbol:");
2240
2254
  const fn = dispatch.probe === "in"
2241
2255
  ? "dyn.hasKey"
@@ -2301,13 +2315,7 @@ export class ClassDynamicDispatch {
2301
2315
  if (!dispatch.write && !dispatch.reflect && !info.def.tracksOwnFields) {
2302
2316
  const value = varRef("p.0", DYN, loc);
2303
2317
  const key = varRef("p.key", DYN, loc);
2304
- const bag = {
2305
- kind: "call",
2306
- callee: this.propertyBag.name,
2307
- args: [value],
2308
- type: DYN,
2309
- loc,
2310
- };
2318
+ const bag = this.readPropertyBagOrEmpty(lowerer, value, loc);
2311
2319
  branches.push({
2312
2320
  kind: "if",
2313
2321
  cond: {
@@ -2507,13 +2515,7 @@ export class ClassDynamicDispatch {
2507
2515
  this.enumerationClasses.add(plan.key);
2508
2516
  const loc = this.enumeration.loc;
2509
2517
  const { condition } = this.propertyReceiver(plan, loc);
2510
- const bag = {
2511
- kind: "call",
2512
- callee: this.propertyBag.name,
2513
- args: [varRef("p.0", DYN, loc)],
2514
- type: DYN,
2515
- loc,
2516
- };
2518
+ const bag = this.readPropertyBagOrEmpty(lowerer, varRef("p.0", DYN, loc), loc);
2517
2519
  this.enumeration.body.unshift({
2518
2520
  kind: "if",
2519
2521
  cond: condition,
@@ -2624,6 +2626,95 @@ export class ClassDynamicDispatch {
2624
2626
  fn.speculativeDispatch = true;
2625
2627
  return changed;
2626
2628
  }
2629
+ /** The receiver's own dynamic properties for a read: undefined while it has
2630
+ * none, and never stored, so reads stay valid on published objects. */
2631
+ readPropertyBag(lowerer, receiver, loc) {
2632
+ const helper = classPropertiesHelper(lowerer, loc, true);
2633
+ this.generated.add(helper);
2634
+ return {
2635
+ kind: "call",
2636
+ callee: helper.name,
2637
+ args: [receiver.type.kind === "dyn" ? receiver : lowerer.coerceToExpected(receiver, DYN)],
2638
+ type: DYN,
2639
+ loc,
2640
+ };
2641
+ }
2642
+ /** The bag a read looks a key up in (`%dyn.class.readPropertiesOrEmpty`):
2643
+ * the receiver's own properties, or a fresh empty object (not stored) while
2644
+ * an instance has none, so inherited Object.prototype members still resolve
2645
+ * as on an empty bag. A non-instance is its own bag; an undefined receiver
2646
+ * stays undefined so the read throws Node's TypeError. */
2647
+ /** A key test on a read-only bag, which is undefined while the object has no
2648
+ * own dynamic properties. A shared helper evaluates the bag once and keeps
2649
+ * each class branch as small as the storing form. */
2650
+ readBagHas(lowerer, fn, bag, key, loc) {
2651
+ const name = fn === "dyn.hasKey" ? "%dyn.class.bagHas" : "%dyn.class.bagHasComputed";
2652
+ let helper = lowerer.liftedFns.find((item) => item.name === name);
2653
+ if (!helper) {
2654
+ const keyType = fn === "dyn.hasKey" ? STRING : DYN;
2655
+ const value = varRef("p.0", DYN, loc);
2656
+ helper = {
2657
+ name,
2658
+ params: [
2659
+ { localId: "p.0", name: "bag", type: DYN },
2660
+ { localId: "p.1", name: "key", type: keyType },
2661
+ ],
2662
+ returnType: BOOL,
2663
+ locals: [
2664
+ { id: "p.0", name: "bag", type: DYN, mutable: false },
2665
+ { id: "p.1", name: "key", type: keyType, mutable: false },
2666
+ ],
2667
+ body: [
2668
+ {
2669
+ kind: "if",
2670
+ cond: { kind: "dynTest", test: "undefined", value, type: BOOL, loc },
2671
+ then: [
2672
+ { kind: "return", value: { kind: "boolLit", value: false, type: BOOL, loc }, loc },
2673
+ ],
2674
+ else_: null,
2675
+ loc,
2676
+ },
2677
+ {
2678
+ kind: "return",
2679
+ value: {
2680
+ kind: "libCall",
2681
+ fn,
2682
+ args: [value, varRef("p.1", keyType, loc)],
2683
+ type: BOOL,
2684
+ loc,
2685
+ },
2686
+ loc,
2687
+ },
2688
+ ],
2689
+ loc,
2690
+ };
2691
+ lowerer.liftedFns.push(helper);
2692
+ }
2693
+ this.generated.add(helper);
2694
+ return { kind: "call", callee: name, args: [bag, key], type: BOOL, loc };
2695
+ }
2696
+ readPropertyBagOrEmpty(lowerer, receiver, loc) {
2697
+ // One call per read site: large JS programs have a branch per class and
2698
+ // property, so the absent-bag handling lives in the shared helper.
2699
+ let helper = lowerer.liftedFns.find((fn) => fn.name === READ_PROPERTIES_OR_EMPTY);
2700
+ if (!helper) {
2701
+ // Settled by finalize; until then, the read-only bag's own dispatch.
2702
+ helper = {
2703
+ ...classPropertiesHelper(lowerer, loc, true),
2704
+ name: READ_PROPERTIES_OR_EMPTY,
2705
+ };
2706
+ helper = structuredClone(helper);
2707
+ lowerer.liftedFns.push(helper);
2708
+ }
2709
+ this.generated.add(helper);
2710
+ return {
2711
+ kind: "call",
2712
+ callee: helper.name,
2713
+ args: [receiver.type.kind === "dyn" ? receiver : lowerer.coerceToExpected(receiver, DYN)],
2714
+ type: DYN,
2715
+ loc,
2716
+ };
2717
+ }
2627
2718
  /** A known native class can access its shared bag directly. Keep the
2628
2719
  * receiver as an owned parameter so calls and temporary instances retain
2629
2720
  * their ordinary evaluation and lifetime rules without a boxed capsule. */
@@ -2684,13 +2775,27 @@ export class ClassDynamicDispatch {
2684
2775
  lowerer.liftedFns.push(helper);
2685
2776
  return helper;
2686
2777
  }
2687
- /** Prototype state may appear in a later reachable body. Only after the
2688
- * dispatch worklist closes can an empty bag initializer be omitted; a
2689
- * prototype-backed bag must still be initialized before inherited reads. */
2690
- finalize() {
2778
+ /** Prototype state may appear in a later reachable body, so read-only bags
2779
+ * settle only after the dispatch worklist closes. A read never stores: an
2780
+ * absent empty bag stays undefined (callers test it), and an absent
2781
+ * prototype-backed bag is produced for this read only. A published object
2782
+ * cannot take the store, and Node's reads never write. */
2783
+ finalize(lowerer) {
2691
2784
  for (const { helper, initialize } of this.readPropertyBags) {
2692
- if (initialize.value.kind === "dynObjLit" && initialize.value.fields?.length === 0)
2785
+ const absent = helper.body[0];
2786
+ if (isEmptyBag(initialize.value))
2693
2787
  helper.body.shift();
2788
+ else if (absent?.kind === "if")
2789
+ absent.then = [{ kind: "return", value: initialize.value, loc: initialize.loc }];
2790
+ }
2791
+ // The untyped read-only accessor selects the receiver's class as the
2792
+ // complete property-bag dispatch does, without its lazy stores.
2793
+ for (const fn of lowerer?.liftedFns ?? []) {
2794
+ if (!this.propertyBag ||
2795
+ (fn.name !== READ_PROPERTIES && fn.name !== READ_PROPERTIES_OR_EMPTY))
2796
+ continue;
2797
+ fn.locals = structuredClone(this.propertyBag.locals);
2798
+ fn.body = readOnlyBagBody(structuredClone(this.propertyBag.body), fn.name === READ_PROPERTIES_OR_EMPTY);
2694
2799
  }
2695
2800
  }
2696
2801
  normalizedDispatches() {
@@ -3089,20 +3194,14 @@ export class ClassDynamicDispatch {
3089
3194
  !info.classDecorators) {
3090
3195
  this.constructors.set(info.def.name, info);
3091
3196
  const cls = lowerer.coerceToExpected(classValueRef(lowerer, info, info.decl), DYN);
3092
- const bag = {
3093
- kind: "call",
3094
- callee: this.propertyBag.name,
3095
- args: [lowerer.coerceToExpected(receiver, DYN)],
3096
- type: DYN,
3097
- loc,
3098
- };
3197
+ const bag = this.readPropertyBag(lowerer, receiver, loc);
3099
3198
  const key = { kind: "strLit", value: name, type: STRING, loc };
3100
3199
  return [
3101
3200
  {
3102
3201
  kind: "return",
3103
3202
  value: {
3104
3203
  kind: "ternary",
3105
- cond: { kind: "libCall", fn: "dyn.hasKey", args: [bag, key], type: BOOL, loc },
3204
+ cond: this.readBagHas(lowerer, "dyn.hasKey", bag, key, loc),
3106
3205
  then: {
3107
3206
  kind: "libCall",
3108
3207
  fn: "dyn.bagGet",
@@ -3167,23 +3266,12 @@ export class ClassDynamicDispatch {
3167
3266
  const prototypeMethod = lowerer.prototypeMethodAccesses.has(name);
3168
3267
  if (prototypeMethod)
3169
3268
  classPrototypeData(lowerer, info, loc, receiver);
3170
- const bag = {
3171
- kind: "call",
3172
- callee: this.propertyBag.name,
3173
- args: [lowerer.coerceToExpected(receiver, DYN)],
3174
- type: DYN,
3175
- loc,
3176
- };
3269
+ // Selecting the method must not give the object own storage.
3270
+ const bag = this.readPropertyBag(lowerer, receiver, loc);
3177
3271
  const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
3178
3272
  body.push({
3179
3273
  kind: "if",
3180
- cond: {
3181
- kind: "libCall",
3182
- fn: symbol ? "dyn.hasOwnComputed" : "dyn.hasKey",
3183
- args: [bag, key],
3184
- type: BOOL,
3185
- loc,
3186
- },
3274
+ cond: this.readBagHas(lowerer, symbol ? "dyn.hasOwnComputed" : "dyn.hasKey", bag, key, loc),
3187
3275
  then: [
3188
3276
  {
3189
3277
  kind: "return",
@@ -3240,13 +3328,7 @@ export class ClassDynamicDispatch {
3240
3328
  }
3241
3329
  if (!field && !accessor) {
3242
3330
  const instance = lowerer.coerceToExpected(receiver, DYN);
3243
- const bag = {
3244
- kind: "call",
3245
- callee: this.propertyBag.name,
3246
- args: [instance],
3247
- type: DYN,
3248
- loc,
3249
- };
3331
+ const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc);
3250
3332
  return [
3251
3333
  {
3252
3334
  kind: "return",
@@ -3273,13 +3355,7 @@ export class ClassDynamicDispatch {
3273
3355
  if (boxed.kind === "dynFrom" && mutable(boxed.value.type))
3274
3356
  boxed.liveRef = true;
3275
3357
  if (accessor) {
3276
- const bag = {
3277
- kind: "call",
3278
- callee: this.propertyBag.name,
3279
- args: [lowerer.coerceToExpected(receiver, DYN)],
3280
- type: DYN,
3281
- loc,
3282
- };
3358
+ const bag = this.readPropertyBagOrEmpty(lowerer, lowerer.coerceToExpected(receiver, DYN), loc);
3283
3359
  const key = { kind: "strLit", value: name, type: STRING, loc };
3284
3360
  return [
3285
3361
  {
@@ -3306,13 +3382,7 @@ export class ClassDynamicDispatch {
3306
3382
  }
3307
3383
  if (field && info.def.tracksOwnFields) {
3308
3384
  const instance = lowerer.coerceToExpected(receiver, DYN);
3309
- const bag = {
3310
- kind: "call",
3311
- callee: this.propertyBag.name,
3312
- args: [instance],
3313
- type: DYN,
3314
- loc,
3315
- };
3385
+ const bag = this.readPropertyBagOrEmpty(lowerer, instance, loc);
3316
3386
  const symbol = symbolMemberKey(lowerer, info, name, loc);
3317
3387
  const key = symbol ?? { kind: "strLit", value: name, type: STRING, loc };
3318
3388
  return [