@scriptc/compiler 0.4.7 → 0.4.8

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 (776) hide show
  1. package/ambient/node-fallback/child_process.d.ts +71 -22
  2. package/ambient/node-fallback/crypto.d.ts +15 -7
  3. package/ambient/node-fallback/events.d.ts +23 -5
  4. package/ambient/node-fallback/fs.d.ts +3 -2
  5. package/ambient/node-fallback/http.d.ts +23 -17
  6. package/ambient/node-fallback/https.d.ts +5 -2
  7. package/ambient/node-fallback/net.d.ts +6 -0
  8. package/ambient/node-fallback/os.d.ts +11 -1
  9. package/ambient/node-fallback/path-posix.d.ts +6 -0
  10. package/ambient/node-fallback/path-win32.d.ts +5 -0
  11. package/ambient/node-fallback/path.d.ts +2 -0
  12. package/ambient/node-fallback/zlib.d.ts +31 -2
  13. package/ambient/scriptc-node-fallback.d.ts +37 -7
  14. package/ambient/scriptc.d.ts +7 -2
  15. package/dist/backend/executable-features.js +11 -3
  16. package/dist/backend/executable-features.js.map +1 -1
  17. package/dist/backend/library-pack.d.ts +6 -0
  18. package/dist/backend/library-pack.js +17 -6
  19. package/dist/backend/library-pack.js.map +1 -1
  20. package/dist/backend/library-pack.test.d.ts +1 -0
  21. package/dist/backend/library-pack.test.js +28 -0
  22. package/dist/backend/library-pack.test.js.map +1 -0
  23. package/dist/backend/linker.d.ts +9 -2
  24. package/dist/backend/linker.js +190 -32
  25. package/dist/backend/linker.js.map +1 -1
  26. package/dist/backend/lld.d.ts +8 -4
  27. package/dist/backend/lld.js +19 -13
  28. package/dist/backend/lld.js.map +1 -1
  29. package/dist/backend/lld.test.js +3 -1
  30. package/dist/backend/lld.test.js.map +1 -1
  31. package/dist/backend/llvm/alloc.d.ts +15 -2
  32. package/dist/backend/llvm/alloc.js +172 -36
  33. package/dist/backend/llvm/alloc.js.map +1 -1
  34. package/dist/backend/llvm/alloc.test.js +69 -1
  35. package/dist/backend/llvm/alloc.test.js.map +1 -1
  36. package/dist/backend/llvm/arenas.d.ts +17 -4
  37. package/dist/backend/llvm/arenas.js +105 -10
  38. package/dist/backend/llvm/arenas.js.map +1 -1
  39. package/dist/backend/llvm/arenas.test.js +229 -0
  40. package/dist/backend/llvm/arenas.test.js.map +1 -1
  41. package/dist/backend/llvm/bytes-alias.js +10 -1
  42. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  43. package/dist/backend/llvm/bytes-headers.js +6 -0
  44. package/dist/backend/llvm/bytes-headers.js.map +1 -1
  45. package/dist/backend/llvm/bytes-loop-versions.test.js +25 -0
  46. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  47. package/dist/backend/llvm/call-lifetimes.js +10 -0
  48. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  49. package/dist/backend/llvm/classes.d.ts +16 -9
  50. package/dist/backend/llvm/classes.js +142 -37
  51. package/dist/backend/llvm/classes.js.map +1 -1
  52. package/dist/backend/llvm/classes.test.js +42 -0
  53. package/dist/backend/llvm/classes.test.js.map +1 -1
  54. package/dist/backend/llvm/cpu-dispatch.d.ts +15 -5
  55. package/dist/backend/llvm/cpu-dispatch.js +31 -7
  56. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  57. package/dist/backend/llvm/dyn.d.ts +12 -3
  58. package/dist/backend/llvm/dyn.js +31 -7
  59. package/dist/backend/llvm/dyn.js.map +1 -1
  60. package/dist/backend/llvm/emit-function.js +67 -4
  61. package/dist/backend/llvm/emit-function.js.map +1 -1
  62. package/dist/backend/llvm/emit-module.js +90 -39
  63. package/dist/backend/llvm/emit-module.js.map +1 -1
  64. package/dist/backend/llvm/emit-module.test.d.ts +1 -0
  65. package/dist/backend/llvm/emit-module.test.js +52 -0
  66. package/dist/backend/llvm/emit-module.test.js.map +1 -0
  67. package/dist/backend/llvm/emit-statements.js +99 -15
  68. package/dist/backend/llvm/emit-statements.js.map +1 -1
  69. package/dist/backend/llvm/emitter.d.ts +113 -8
  70. package/dist/backend/llvm/emitter.js +438 -67
  71. package/dist/backend/llvm/emitter.js.map +1 -1
  72. package/dist/backend/llvm/emitter.test.js +31 -3
  73. package/dist/backend/llvm/emitter.test.js.map +1 -1
  74. package/dist/backend/llvm/expr-async.js +19 -1
  75. package/dist/backend/llvm/expr-async.js.map +1 -1
  76. package/dist/backend/llvm/expr-bytes.js +16 -1
  77. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  78. package/dist/backend/llvm/expr-calls.js +18 -2
  79. package/dist/backend/llvm/expr-calls.js.map +1 -1
  80. package/dist/backend/llvm/expr-dynamic.js +31 -10
  81. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  82. package/dist/backend/llvm/expr-primitives.js +31 -3
  83. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  84. package/dist/backend/llvm/expr-records.d.ts +1 -1
  85. package/dist/backend/llvm/expr-records.js +124 -56
  86. package/dist/backend/llvm/expr-records.js.map +1 -1
  87. package/dist/backend/llvm/expr-stream-bridges.js +17 -0
  88. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  89. package/dist/backend/llvm/js-groups.d.ts +21 -0
  90. package/dist/backend/llvm/js-groups.js +277 -0
  91. package/dist/backend/llvm/js-groups.js.map +1 -0
  92. package/dist/backend/llvm/js-ic.d.ts +19 -1
  93. package/dist/backend/llvm/js-ic.js +96 -23
  94. package/dist/backend/llvm/js-ic.js.map +1 -1
  95. package/dist/backend/llvm/lib-dispatch.js +132 -1
  96. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  97. package/dist/backend/llvm/lib-network.js +33 -6
  98. package/dist/backend/llvm/lib-network.js.map +1 -1
  99. package/dist/backend/llvm/lib-process.js +44 -3
  100. package/dist/backend/llvm/lib-process.js.map +1 -1
  101. package/dist/backend/llvm/lib-shared.js +69 -2
  102. package/dist/backend/llvm/lib-shared.js.map +1 -1
  103. package/dist/backend/llvm/local-union-storage.test.js +32 -0
  104. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  105. package/dist/backend/llvm/loop-state.js +7 -2
  106. package/dist/backend/llvm/loop-state.js.map +1 -1
  107. package/dist/backend/llvm/map-entry-fusion.d.ts +8 -0
  108. package/dist/backend/llvm/map-entry-fusion.js +3 -3
  109. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  110. package/dist/backend/llvm/map-number-lookup.test.js +6 -6
  111. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  112. package/dist/backend/llvm/nullable-unions.js +7 -6
  113. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  114. package/dist/backend/llvm/nullable-unions.test.js +4 -1
  115. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  116. package/dist/backend/llvm/receivers.js +3 -0
  117. package/dist/backend/llvm/receivers.js.map +1 -1
  118. package/dist/backend/llvm/record-entry-fusion.d.ts +32 -0
  119. package/dist/backend/llvm/record-entry-fusion.js +217 -0
  120. package/dist/backend/llvm/record-entry-fusion.js.map +1 -0
  121. package/dist/backend/llvm/record-results.d.ts +5 -2
  122. package/dist/backend/llvm/record-results.js +13 -12
  123. package/dist/backend/llvm/record-results.js.map +1 -1
  124. package/dist/backend/llvm/record-views.js +12 -6
  125. package/dist/backend/llvm/record-views.js.map +1 -1
  126. package/dist/backend/llvm/reference-effects.js +1 -0
  127. package/dist/backend/llvm/reference-effects.js.map +1 -1
  128. package/dist/backend/llvm/reference-writes.js +3 -0
  129. package/dist/backend/llvm/reference-writes.js.map +1 -1
  130. package/dist/backend/llvm/region-ir.js +1 -0
  131. package/dist/backend/llvm/region-ir.js.map +1 -1
  132. package/dist/backend/llvm/region-sites.d.ts +18 -0
  133. package/dist/backend/llvm/region-sites.js +79 -1
  134. package/dist/backend/llvm/region-sites.js.map +1 -1
  135. package/dist/backend/llvm/runtime-registries.test.js +53 -6
  136. package/dist/backend/llvm/runtime-registries.test.js.map +1 -1
  137. package/dist/backend/llvm/serialized-ir-emission.test.js +3 -1
  138. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  139. package/dist/backend/llvm/shapes.d.ts +33 -3
  140. package/dist/backend/llvm/shapes.js +183 -13
  141. package/dist/backend/llvm/shapes.js.map +1 -1
  142. package/dist/backend/llvm/stack-objects.d.ts +1 -2
  143. package/dist/backend/llvm/stack-objects.js +8 -5
  144. package/dist/backend/llvm/stack-objects.js.map +1 -1
  145. package/dist/backend/llvm/walkers.d.ts +12 -0
  146. package/dist/backend/llvm/walkers.js +46 -2
  147. package/dist/backend/llvm/walkers.js.map +1 -1
  148. package/dist/backend/may-throw.js +12 -2
  149. package/dist/backend/may-throw.js.map +1 -1
  150. package/dist/backend/may-throw.test.js +13 -0
  151. package/dist/backend/may-throw.test.js.map +1 -1
  152. package/dist/backend/native/contracts.d.ts +48 -8
  153. package/dist/backend/native/executable.js +55 -13
  154. package/dist/backend/native/executable.js.map +1 -1
  155. package/dist/backend/native/helper-identity-record.d.ts +11 -0
  156. package/dist/backend/native/helper-identity-record.js +76 -0
  157. package/dist/backend/native/helper-identity-record.js.map +1 -0
  158. package/dist/backend/native/helper-identity-record.test.d.ts +1 -0
  159. package/dist/backend/native/helper-identity-record.test.js +101 -0
  160. package/dist/backend/native/helper-identity-record.test.js.map +1 -0
  161. package/dist/backend/native/library.js +9 -1
  162. package/dist/backend/native/library.js.map +1 -1
  163. package/dist/backend/native/runtime-inputs.js +4 -1
  164. package/dist/backend/native/runtime-inputs.js.map +1 -1
  165. package/dist/backend/native/vendor.d.ts +1 -1
  166. package/dist/backend/native/vendor.js +1 -1
  167. package/dist/backend/native/vendor.js.map +1 -1
  168. package/dist/backend/native-codegen-core.d.ts +13 -10
  169. package/dist/backend/native-codegen-core.js +26 -13
  170. package/dist/backend/native-codegen-core.js.map +1 -1
  171. package/dist/backend/native-codegen.js +27 -8
  172. package/dist/backend/native-codegen.js.map +1 -1
  173. package/dist/backend/native-codegen.test.js +110 -14
  174. package/dist/backend/native-codegen.test.js.map +1 -1
  175. package/dist/backend/native-link-info-core.d.ts +37 -8
  176. package/dist/backend/native-link-info-core.js.map +1 -1
  177. package/dist/backend/runtime-pack-core.d.ts +17 -2
  178. package/dist/backend/runtime-pack-core.js +18 -3
  179. package/dist/backend/runtime-pack-core.js.map +1 -1
  180. package/dist/backend/runtime-pack-targets.test.js +1 -1
  181. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  182. package/dist/backend/runtime-pack.test.js +211 -2
  183. package/dist/backend/runtime-pack.test.js.map +1 -1
  184. package/dist/backend/tree-classes.d.ts +42 -0
  185. package/dist/backend/tree-classes.js +723 -0
  186. package/dist/backend/tree-classes.js.map +1 -0
  187. package/dist/backend/tree-classes.test.d.ts +1 -0
  188. package/dist/backend/tree-classes.test.js +338 -0
  189. package/dist/backend/tree-classes.test.js.map +1 -0
  190. package/dist/backend/vendor-archives.d.ts +5 -1
  191. package/dist/backend/vendor-archives.js +51 -7
  192. package/dist/backend/vendor-archives.js.map +1 -1
  193. package/dist/backend/vendor-inputs.d.ts +25 -4
  194. package/dist/backend/vendor-inputs.js +68 -4
  195. package/dist/backend/vendor-inputs.js.map +1 -1
  196. package/dist/backend/vendor-inputs.test.js +35 -1
  197. package/dist/backend/vendor-inputs.test.js.map +1 -1
  198. package/dist/backend/warm-cache.js +1 -1
  199. package/dist/backend/warm-cache.js.map +1 -1
  200. package/dist/compat/fetch-profile.js +2 -2
  201. package/dist/coverage/report.js +47 -0
  202. package/dist/coverage/report.js.map +1 -1
  203. package/dist/coverage/surface-manifest.js +1 -1
  204. package/dist/diagnostics/codes.d.ts +8 -0
  205. package/dist/diagnostics/codes.js +8 -0
  206. package/dist/diagnostics/codes.js.map +1 -1
  207. package/dist/diagnostics/diagnostic.d.ts +27 -9
  208. package/dist/diagnostics/diagnostic.js +60 -19
  209. package/dist/diagnostics/diagnostic.js.map +1 -1
  210. package/dist/diagnostics/envelope.d.ts +18 -0
  211. package/dist/diagnostics/envelope.js.map +1 -1
  212. package/dist/executable/executable-cache.d.ts +21 -2
  213. package/dist/executable/executable-cache.js +21 -1
  214. package/dist/executable/executable-cache.js.map +1 -1
  215. package/dist/executable/executable-cache.test.js +123 -1
  216. package/dist/executable/executable-cache.test.js.map +1 -1
  217. package/dist/executable/prepare.js +199 -248
  218. package/dist/executable/prepare.js.map +1 -1
  219. package/dist/frontend/analysis.js +200 -18
  220. package/dist/frontend/analysis.js.map +1 -1
  221. package/dist/frontend/builtin-modules.d.ts +4 -0
  222. package/dist/frontend/builtin-modules.js +10 -0
  223. package/dist/frontend/builtin-modules.js.map +1 -1
  224. package/dist/frontend/early-errors.d.ts +12 -2
  225. package/dist/frontend/early-errors.js +535 -4
  226. package/dist/frontend/early-errors.js.map +1 -1
  227. package/dist/frontend/early-errors.test.js +165 -0
  228. package/dist/frontend/early-errors.test.js.map +1 -1
  229. package/dist/frontend/inferred-js-diagnostics.test.js +65 -0
  230. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  231. package/dist/frontend/jsx-opinion-sites.test.d.ts +1 -0
  232. package/dist/frontend/jsx-opinion-sites.test.js +86 -0
  233. package/dist/frontend/jsx-opinion-sites.test.js.map +1 -0
  234. package/dist/frontend/lib-exports.d.ts +23 -4
  235. package/dist/frontend/lib-exports.js +98 -26
  236. package/dist/frontend/lib-exports.js.map +1 -1
  237. package/dist/frontend/lowering/binding-analysis.js +21 -3
  238. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  239. package/dist/frontend/lowering/buffers.d.ts +8 -0
  240. package/dist/frontend/lowering/buffers.js +43 -0
  241. package/dist/frontend/lowering/buffers.js.map +1 -0
  242. package/dist/frontend/lowering/builtin-calls.js +4 -0
  243. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  244. package/dist/frontend/lowering/builtin-namespaces.d.ts +3 -2
  245. package/dist/frontend/lowering/builtin-namespaces.js +24 -3
  246. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  247. package/dist/frontend/lowering/builtin-statics.d.ts +24 -0
  248. package/dist/frontend/lowering/builtin-statics.js +407 -0
  249. package/dist/frontend/lowering/builtin-statics.js.map +1 -0
  250. package/dist/frontend/lowering/builtins/arguments.d.ts +4 -0
  251. package/dist/frontend/lowering/builtins/arguments.js +12 -0
  252. package/dist/frontend/lowering/builtins/arguments.js.map +1 -1
  253. package/dist/frontend/lowering/builtins/atomics.d.ts +6 -1
  254. package/dist/frontend/lowering/builtins/atomics.js +87 -1
  255. package/dist/frontend/lowering/builtins/atomics.js.map +1 -1
  256. package/dist/frontend/lowering/builtins/child-process-methods.js +2 -2
  257. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  258. package/dist/frontend/lowering/builtins/child-process-sync.d.ts +13 -0
  259. package/dist/frontend/lowering/builtins/child-process-sync.js +1 -13
  260. package/dist/frontend/lowering/builtins/child-process-sync.js.map +1 -1
  261. package/dist/frontend/lowering/builtins/child-process.d.ts +10 -4
  262. package/dist/frontend/lowering/builtins/child-process.js +560 -27
  263. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  264. package/dist/frontend/lowering/builtins/compression.d.ts +2 -2
  265. package/dist/frontend/lowering/builtins/compression.js +41 -21
  266. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  267. package/dist/frontend/lowering/builtins/constants.js +7 -2
  268. package/dist/frontend/lowering/builtins/constants.js.map +1 -1
  269. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  270. package/dist/frontend/lowering/builtins/filesystem-calls.js +28 -2
  271. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  272. package/dist/frontend/lowering/builtins/json.js +4 -0
  273. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  274. package/dist/frontend/lowering/builtins/module-calls.js +3 -1
  275. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  276. package/dist/frontend/lowering/builtins/numbers.d.ts +4 -1
  277. package/dist/frontend/lowering/builtins/numbers.js +10 -2
  278. package/dist/frontend/lowering/builtins/numbers.js.map +1 -1
  279. package/dist/frontend/lowering/builtins/operating-system.d.ts +6 -3
  280. package/dist/frontend/lowering/builtins/operating-system.js +96 -16
  281. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  282. package/dist/frontend/lowering/builtins/process.d.ts +2 -2
  283. package/dist/frontend/lowering/builtins/process.js +103 -8
  284. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  285. package/dist/frontend/lowering/builtins/promises.js +169 -8
  286. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  287. package/dist/frontend/lowering/builtins/properties.js +6 -2
  288. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  289. package/dist/frontend/lowering/builtins/readline.d.ts +6 -4
  290. package/dist/frontend/lowering/builtins/readline.js +180 -36
  291. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  292. package/dist/frontend/lowering/builtins/url.js +35 -12
  293. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  294. package/dist/frontend/lowering/builtins/webassembly.js +2 -0
  295. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  296. package/dist/frontend/lowering/call-arguments.d.ts +10 -0
  297. package/dist/frontend/lowering/call-arguments.js +37 -2
  298. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  299. package/dist/frontend/lowering/call-signatures.d.ts +10 -0
  300. package/dist/frontend/lowering/call-signatures.js +103 -0
  301. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  302. package/dist/frontend/lowering/class-construction.d.ts +14 -2
  303. package/dist/frontend/lowering/class-construction.js +99 -5
  304. package/dist/frontend/lowering/class-construction.js.map +1 -1
  305. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +9 -0
  306. package/dist/frontend/lowering/class-dynamic-dispatch.js +1283 -1030
  307. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  308. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +158 -0
  309. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  310. package/dist/frontend/lowering/class-prototypes.js +20 -15
  311. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  312. package/dist/frontend/lowering/class-runtime-statics.d.ts +8 -0
  313. package/dist/frontend/lowering/class-runtime-statics.js +20 -1
  314. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  315. package/dist/frontend/lowering/class-unions.js +21 -4
  316. package/dist/frontend/lowering/class-unions.js.map +1 -1
  317. package/dist/frontend/lowering/coercions/function-adapters.js +9 -0
  318. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  319. package/dist/frontend/lowering/coercions/state.d.ts +8 -0
  320. package/dist/frontend/lowering/coercions/state.js +17 -0
  321. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  322. package/dist/frontend/lowering/coercions/structural-plans.js +20 -5
  323. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  324. package/dist/frontend/lowering/coercions/structural.js +10 -1
  325. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  326. package/dist/frontend/lowering/coercions/unions.d.ts +2 -1
  327. package/dist/frontend/lowering/coercions/unions.js +54 -10
  328. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  329. package/dist/frontend/lowering/constructor-returns.d.ts +23 -2
  330. package/dist/frontend/lowering/constructor-returns.js +284 -58
  331. package/dist/frontend/lowering/constructor-returns.js.map +1 -1
  332. package/dist/frontend/lowering/containers/array-callbacks.js +156 -62
  333. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  334. package/dist/frontend/lowering/containers/array-construction.js +21 -3
  335. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  336. package/dist/frontend/lowering/containers/array-from-async.js +139 -3
  337. package/dist/frontend/lowering/containers/array-from-async.js.map +1 -1
  338. package/dist/frontend/lowering/containers/array-iteration.d.ts +14 -4
  339. package/dist/frontend/lowering/containers/array-iteration.js +24 -7
  340. package/dist/frontend/lowering/containers/array-iteration.js.map +1 -1
  341. package/dist/frontend/lowering/containers/array-methods.js +14 -11
  342. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  343. package/dist/frontend/lowering/containers/bytes.d.ts +6 -0
  344. package/dist/frontend/lowering/containers/bytes.js +446 -86
  345. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  346. package/dist/frontend/lowering/containers/callback-arguments.d.ts +5 -0
  347. package/dist/frontend/lowering/containers/callback-arguments.js +21 -12
  348. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  349. package/dist/frontend/lowering/containers/collection-grouping.js +421 -2
  350. package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
  351. package/dist/frontend/lowering/containers/collection-methods.js +52 -17
  352. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  353. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +23 -0
  354. package/dist/frontend/lowering/containers/iterator-helpers.js +176 -10
  355. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  356. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +5 -2
  357. package/dist/frontend/lowering/containers/string-and-regexp.js +45 -11
  358. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  359. package/dist/frontend/lowering/crypto-tables.d.ts +3 -3
  360. package/dist/frontend/lowering/crypto-tables.js +5 -5
  361. package/dist/frontend/lowering/dispatch-sites.js +3 -0
  362. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  363. package/dist/frontend/lowering/divergences.d.ts +40 -0
  364. package/dist/frontend/lowering/divergences.js +239 -20
  365. package/dist/frontend/lowering/divergences.js.map +1 -1
  366. package/dist/frontend/lowering/effect-free.d.ts +12 -0
  367. package/dist/frontend/lowering/effect-free.js +44 -0
  368. package/dist/frontend/lowering/effect-free.js.map +1 -0
  369. package/dist/frontend/lowering/expressions/array-literals.d.ts +10 -0
  370. package/dist/frontend/lowering/expressions/array-literals.js +62 -0
  371. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  372. package/dist/frontend/lowering/expressions/binary.js +115 -5
  373. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  374. package/dist/frontend/lowering/expressions/element-access.js +151 -7
  375. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  376. package/dist/frontend/lowering/expressions/hosted-narrowing.d.ts +15 -0
  377. package/dist/frontend/lowering/expressions/hosted-narrowing.js +54 -1
  378. package/dist/frontend/lowering/expressions/hosted-narrowing.js.map +1 -1
  379. package/dist/frontend/lowering/expressions/identifiers.js +31 -2
  380. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  381. package/dist/frontend/lowering/expressions/narrowing.d.ts +3 -0
  382. package/dist/frontend/lowering/expressions/narrowing.js +175 -22
  383. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  384. package/dist/frontend/lowering/expressions/object-literals.js +173 -11
  385. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  386. package/dist/frontend/lowering/expressions/optional-chains.js +5 -1
  387. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  388. package/dist/frontend/lowering/expressions/property-access.d.ts +8 -0
  389. package/dist/frontend/lowering/expressions/property-access.js +379 -109
  390. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  391. package/dist/frontend/lowering/expressions/relational.js +237 -7
  392. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  393. package/dist/frontend/lowering/expressions/typeof.js +8 -0
  394. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  395. package/dist/frontend/lowering/expressions/union-fields.d.ts +20 -1
  396. package/dist/frontend/lowering/expressions/union-fields.js +103 -13
  397. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  398. package/dist/frontend/lowering/expressions/updates.js +74 -55
  399. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  400. package/dist/frontend/lowering/function-returns.js +37 -10
  401. package/dist/frontend/lowering/function-returns.js.map +1 -1
  402. package/dist/frontend/lowering/general-streams.js +5 -0
  403. package/dist/frontend/lowering/general-streams.js.map +1 -1
  404. package/dist/frontend/lowering/generator-delegation.d.ts +15 -7
  405. package/dist/frontend/lowering/generator-delegation.js +301 -118
  406. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  407. package/dist/frontend/lowering/generic-functions.d.ts +27 -1
  408. package/dist/frontend/lowering/generic-functions.js +432 -18
  409. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  410. package/dist/frontend/lowering/global-function-values.d.ts +25 -0
  411. package/dist/frontend/lowering/global-function-values.js +193 -0
  412. package/dist/frontend/lowering/global-function-values.js.map +1 -0
  413. package/dist/frontend/lowering/global-values.d.ts +6 -4
  414. package/dist/frontend/lowering/global-values.js +24 -10
  415. package/dist/frontend/lowering/global-values.js.map +1 -1
  416. package/dist/frontend/lowering/host-global-values.d.ts +31 -0
  417. package/dist/frontend/lowering/host-global-values.js +121 -0
  418. package/dist/frontend/lowering/host-global-values.js.map +1 -0
  419. package/dist/frontend/lowering/host-globals.d.ts +74 -0
  420. package/dist/frontend/lowering/host-globals.js +344 -0
  421. package/dist/frontend/lowering/host-globals.js.map +1 -0
  422. package/dist/frontend/lowering/http2-constants.js +1 -1
  423. package/dist/frontend/lowering/iterator-adapters.js +46 -17
  424. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  425. package/dist/frontend/lowering/iterator-prototype.d.ts +30 -0
  426. package/dist/frontend/lowering/iterator-prototype.js +160 -0
  427. package/dist/frontend/lowering/iterator-prototype.js.map +1 -0
  428. package/dist/frontend/lowering/key-order-witness.js +43 -22
  429. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  430. package/dist/frontend/lowering/key-order-witness.test.js +1 -0
  431. package/dist/frontend/lowering/key-order-witness.test.js.map +1 -1
  432. package/dist/frontend/lowering/lib-boundary.js +11 -3
  433. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  434. package/dist/frontend/lowering/lower-assert.js +30 -15
  435. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  436. package/dist/frontend/lowering/lower-async-iteration.d.ts +11 -0
  437. package/dist/frontend/lowering/lower-async-iteration.js +15 -0
  438. package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
  439. package/dist/frontend/lowering/lower-builtin-values.js +11 -1
  440. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  441. package/dist/frontend/lowering/lower-calls.d.ts +25 -0
  442. package/dist/frontend/lowering/lower-calls.js +929 -227
  443. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  444. package/dist/frontend/lowering/lower-calls.test.js +59 -16
  445. package/dist/frontend/lowering/lower-calls.test.js.map +1 -1
  446. package/dist/frontend/lowering/lower-classes.d.ts +20 -0
  447. package/dist/frontend/lowering/lower-classes.js +468 -44
  448. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  449. package/dist/frontend/lowering/lower-event-emitter.d.ts +6 -2
  450. package/dist/frontend/lowering/lower-event-emitter.js +253 -83
  451. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  452. package/dist/frontend/lowering/lower-exprs.d.ts +1 -1
  453. package/dist/frontend/lowering/lower-exprs.js +71 -20
  454. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  455. package/dist/frontend/lowering/lower-functions.js +25 -6
  456. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  457. package/dist/frontend/lowering/lower-generators.js +57 -10
  458. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  459. package/dist/frontend/lowering/lower-global-value.d.ts +6 -0
  460. package/dist/frontend/lowering/lower-global-value.js +14 -5
  461. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  462. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  463. package/dist/frontend/lowering/lower-inspect.js +638 -64
  464. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  465. package/dist/frontend/lowering/lower-modules.js +48 -2
  466. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  467. package/dist/frontend/lowering/lower-namespaces.js +18 -0
  468. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  469. package/dist/frontend/lowering/lower-node-island.js +16 -6
  470. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  471. package/dist/frontend/lowering/lower-server.js +303 -87
  472. package/dist/frontend/lowering/lower-server.js.map +1 -1
  473. package/dist/frontend/lowering/lower-stdlib.js +45 -0
  474. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  475. package/dist/frontend/lowering/lower-stmts.d.ts +14 -11
  476. package/dist/frontend/lowering/lower-stmts.js +270 -52
  477. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  478. package/dist/frontend/lowering/lower-timers.js +110 -27
  479. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  480. package/dist/frontend/lowering/lower-url.js +6 -3
  481. package/dist/frontend/lowering/lower-url.js.map +1 -1
  482. package/dist/frontend/lowering/lowerer.d.ts +227 -21
  483. package/dist/frontend/lowering/lowerer.js +651 -92
  484. package/dist/frontend/lowering/lowerer.js.map +1 -1
  485. package/dist/frontend/lowering/lowerer.test.js +18 -0
  486. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  487. package/dist/frontend/lowering/lowering-facts.d.ts +110 -0
  488. package/dist/frontend/lowering/lowering-facts.js +323 -0
  489. package/dist/frontend/lowering/lowering-facts.js.map +1 -0
  490. package/dist/frontend/lowering/lowering-facts.test.d.ts +1 -0
  491. package/dist/frontend/lowering/lowering-facts.test.js +100 -0
  492. package/dist/frontend/lowering/lowering-facts.test.js.map +1 -0
  493. package/dist/frontend/lowering/nan-coded-reads.d.ts +27 -4
  494. package/dist/frontend/lowering/nan-coded-reads.js +112 -9
  495. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  496. package/dist/frontend/lowering/optional-arguments.d.ts +4 -0
  497. package/dist/frontend/lowering/optional-arguments.js +26 -2
  498. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  499. package/dist/frontend/lowering/partial-assertions.d.ts +0 -3
  500. package/dist/frontend/lowering/partial-assertions.js +9 -15
  501. package/dist/frontend/lowering/partial-assertions.js.map +1 -1
  502. package/dist/frontend/lowering/primitive-throws.d.ts +100 -0
  503. package/dist/frontend/lowering/primitive-throws.js +241 -0
  504. package/dist/frontend/lowering/primitive-throws.js.map +1 -0
  505. package/dist/frontend/lowering/primitive-wrappers.js +1 -0
  506. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -1
  507. package/dist/frontend/lowering/record-inherited.d.ts +17 -1
  508. package/dist/frontend/lowering/record-inherited.js +16 -2
  509. package/dist/frontend/lowering/record-inherited.js.map +1 -1
  510. package/dist/frontend/lowering/record-links.d.ts +73 -0
  511. package/dist/frontend/lowering/record-links.js +797 -0
  512. package/dist/frontend/lowering/record-links.js.map +1 -0
  513. package/dist/frontend/lowering/runtime-optional-provenance.d.ts +27 -7
  514. package/dist/frontend/lowering/runtime-optional-provenance.js +25 -11
  515. package/dist/frontend/lowering/runtime-optional-provenance.js.map +1 -1
  516. package/dist/frontend/lowering/runtime-optional-report.d.ts +40 -0
  517. package/dist/frontend/lowering/runtime-optional-report.js +300 -0
  518. package/dist/frontend/lowering/runtime-optional-report.js.map +1 -0
  519. package/dist/frontend/lowering/scoped-type-memo.test.d.ts +1 -0
  520. package/dist/frontend/lowering/scoped-type-memo.test.js +86 -0
  521. package/dist/frontend/lowering/scoped-type-memo.test.js.map +1 -0
  522. package/dist/frontend/lowering/static-typeof.d.ts +3 -1
  523. package/dist/frontend/lowering/static-typeof.js +6 -1
  524. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  525. package/dist/frontend/lowering/strict-mode.d.ts +1 -5
  526. package/dist/frontend/lowering/strict-mode.js +4 -30
  527. package/dist/frontend/lowering/strict-mode.js.map +1 -1
  528. package/dist/frontend/lowering/structural-instances.d.ts +7 -0
  529. package/dist/frontend/lowering/structural-instances.js +23 -0
  530. package/dist/frontend/lowering/structural-instances.js.map +1 -1
  531. package/dist/frontend/lowering/surfaces.d.ts +15 -1
  532. package/dist/frontend/lowering/surfaces.js +78 -10
  533. package/dist/frontend/lowering/surfaces.js.map +1 -1
  534. package/dist/frontend/lowering/union-retag.d.ts +13 -1
  535. package/dist/frontend/lowering/union-retag.js +55 -1
  536. package/dist/frontend/lowering/union-retag.js.map +1 -1
  537. package/dist/frontend/lowering/union-retag.test.js +51 -0
  538. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  539. package/dist/frontend/lowering/unit-journal.d.ts +8 -0
  540. package/dist/frontend/lowering/unit-journal.js +14 -0
  541. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  542. package/dist/frontend/lowering/unit-journal.test.js +36 -1
  543. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  544. package/dist/frontend/lowering/zlib-constants.js +3 -2
  545. package/dist/frontend/lowering/zlib-constants.js.map +1 -1
  546. package/dist/frontend/npm-static.js +78 -9
  547. package/dist/frontend/npm-static.js.map +1 -1
  548. package/dist/frontend/npm-static.test.js +95 -2
  549. package/dist/frontend/npm-static.test.js.map +1 -1
  550. package/dist/frontend/pipeline.d.ts +5 -4
  551. package/dist/frontend/pipeline.js +94 -31
  552. package/dist/frontend/pipeline.js.map +1 -1
  553. package/dist/frontend/pipeline.test.js +68 -11
  554. package/dist/frontend/pipeline.test.js.map +1 -1
  555. package/dist/frontend/program.d.ts +62 -2
  556. package/dist/frontend/program.js +695 -422
  557. package/dist/frontend/program.js.map +1 -1
  558. package/dist/frontend/program.test.js +37 -1
  559. package/dist/frontend/program.test.js.map +1 -1
  560. package/dist/frontend/services-node.d.ts +7 -0
  561. package/dist/frontend/services-node.js +32 -1
  562. package/dist/frontend/services-node.js.map +1 -1
  563. package/dist/frontend/services-node.test.js +51 -0
  564. package/dist/frontend/services-node.test.js.map +1 -1
  565. package/dist/frontend/shape-inference/overlay.js +68 -2
  566. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  567. package/dist/frontend/tier-analysis.d.ts +9 -0
  568. package/dist/frontend/tier-analysis.js +1 -0
  569. package/dist/frontend/tier-analysis.js.map +1 -1
  570. package/dist/frontend/tsc-codes.d.ts +57 -3
  571. package/dist/frontend/tsc-codes.js +935 -150
  572. package/dist/frontend/tsc-codes.js.map +1 -1
  573. package/dist/frontend/tsc-codes.test.js +221 -12
  574. package/dist/frontend/tsc-codes.test.js.map +1 -1
  575. package/dist/frontend/type-mapper.d.ts +91 -9
  576. package/dist/frontend/type-mapper.js +622 -181
  577. package/dist/frontend/type-mapper.js.map +1 -1
  578. package/dist/index.d.ts +1 -1
  579. package/dist/index.js +80 -15
  580. package/dist/index.js.map +1 -1
  581. package/dist/index.test.d.ts +1 -0
  582. package/dist/index.test.js +60 -0
  583. package/dist/index.test.js.map +1 -0
  584. package/dist/ir/builtin-effects.js +43 -0
  585. package/dist/ir/builtin-effects.js.map +1 -1
  586. package/dist/ir/builtin-signatures.d.ts +1 -1
  587. package/dist/ir/builtin-signatures.js +242 -16
  588. package/dist/ir/builtin-signatures.js.map +1 -1
  589. package/dist/ir/callback-specialization.d.ts +3 -2
  590. package/dist/ir/callback-specialization.js +35 -25
  591. package/dist/ir/callback-specialization.js.map +1 -1
  592. package/dist/ir/capture-values.d.ts +8 -4
  593. package/dist/ir/capture-values.js +9 -6
  594. package/dist/ir/capture-values.js.map +1 -1
  595. package/dist/ir/char-unit-locals.d.ts +6 -2
  596. package/dist/ir/char-unit-locals.js +11 -2
  597. package/dist/ir/char-unit-locals.js.map +1 -1
  598. package/dist/ir/class-key-index.d.ts +18 -0
  599. package/dist/ir/class-key-index.js +29 -0
  600. package/dist/ir/class-key-index.js.map +1 -0
  601. package/dist/ir/class-key-index.test.d.ts +1 -0
  602. package/dist/ir/class-key-index.test.js +25 -0
  603. package/dist/ir/class-key-index.test.js.map +1 -0
  604. package/dist/ir/codec.generated.d.ts +1 -1
  605. package/dist/ir/codec.generated.js +724 -648
  606. package/dist/ir/codec.generated.js.map +1 -1
  607. package/dist/ir/constant-globals.d.ts +5 -2
  608. package/dist/ir/constant-globals.js +25 -27
  609. package/dist/ir/constant-globals.js.map +1 -1
  610. package/dist/ir/expression-inlining.d.ts +4 -2
  611. package/dist/ir/expression-inlining.js +8 -2
  612. package/dist/ir/expression-inlining.js.map +1 -1
  613. package/dist/ir/field-values.d.ts +5 -2
  614. package/dist/ir/field-values.js +32 -21
  615. package/dist/ir/field-values.js.map +1 -1
  616. package/dist/ir/fields.generated.d.ts +11 -2
  617. package/dist/ir/fields.generated.js +8 -0
  618. package/dist/ir/fields.generated.js.map +1 -1
  619. package/dist/ir/final-fields.js +1 -1
  620. package/dist/ir/final-fields.js.map +1 -1
  621. package/dist/ir/function-references.d.ts +5 -4
  622. package/dist/ir/function-references.js +7 -4
  623. package/dist/ir/function-references.js.map +1 -1
  624. package/dist/ir/function-references.test.js +7 -0
  625. package/dist/ir/function-references.test.js.map +1 -1
  626. package/dist/ir/init-only-globals.d.ts +4 -2
  627. package/dist/ir/init-only-globals.js +17 -18
  628. package/dist/ir/init-only-globals.js.map +1 -1
  629. package/dist/ir/inline-array-views.js +1 -0
  630. package/dist/ir/inline-array-views.js.map +1 -1
  631. package/dist/ir/int32-slots.js +7 -0
  632. package/dist/ir/int32-slots.js.map +1 -1
  633. package/dist/ir/ir.d.ts +59 -4
  634. package/dist/ir/ir.js +7 -0
  635. package/dist/ir/ir.js.map +1 -1
  636. package/dist/ir/js-groups.d.ts +51 -0
  637. package/dist/ir/js-groups.js +394 -0
  638. package/dist/ir/js-groups.js.map +1 -0
  639. package/dist/ir/js-groups.test.d.ts +1 -0
  640. package/dist/ir/js-groups.test.js +555 -0
  641. package/dist/ir/js-groups.test.js.map +1 -0
  642. package/dist/ir/js-ic.js +30 -5
  643. package/dist/ir/js-ic.js.map +1 -1
  644. package/dist/ir/js-ic.test.js +27 -1
  645. package/dist/ir/js-ic.test.js.map +1 -1
  646. package/dist/ir/node-index.d.ts +23 -6
  647. package/dist/ir/node-index.js +126 -49
  648. package/dist/ir/node-index.js.map +1 -1
  649. package/dist/ir/numeric-call-specialization.d.ts +4 -2
  650. package/dist/ir/numeric-call-specialization.js +40 -26
  651. package/dist/ir/numeric-call-specialization.js.map +1 -1
  652. package/dist/ir/paired-while-loops.d.ts +4 -2
  653. package/dist/ir/paired-while-loops.js +8 -2
  654. package/dist/ir/paired-while-loops.js.map +1 -1
  655. package/dist/ir/parameter-versions.d.ts +13 -4
  656. package/dist/ir/parameter-versions.js +63 -42
  657. package/dist/ir/parameter-versions.js.map +1 -1
  658. package/dist/ir/property-bags.d.ts +4 -2
  659. package/dist/ir/property-bags.js +22 -17
  660. package/dist/ir/property-bags.js.map +1 -1
  661. package/dist/ir/row-pairs.d.ts +4 -2
  662. package/dist/ir/row-pairs.js +12 -11
  663. package/dist/ir/row-pairs.js.map +1 -1
  664. package/dist/ir/runtime-features.d.ts +87 -12
  665. package/dist/ir/runtime-features.js +263 -160
  666. package/dist/ir/runtime-features.js.map +1 -1
  667. package/dist/ir/runtime-features.test.js +109 -139
  668. package/dist/ir/runtime-features.test.js.map +1 -1
  669. package/dist/ir/runtime-jam-loops.d.ts +35 -0
  670. package/dist/ir/runtime-jam-loops.js +604 -0
  671. package/dist/ir/runtime-jam-loops.js.map +1 -0
  672. package/dist/ir/runtime-jam-loops.test.d.ts +1 -0
  673. package/dist/ir/runtime-jam-loops.test.js +565 -0
  674. package/dist/ir/runtime-jam-loops.test.js.map +1 -0
  675. package/dist/ir/saturating-loop-jams.d.ts +4 -2
  676. package/dist/ir/saturating-loop-jams.js +11 -10
  677. package/dist/ir/saturating-loop-jams.js.map +1 -1
  678. package/dist/ir/scalar-records.d.ts +5 -2
  679. package/dist/ir/scalar-records.js +12 -2
  680. package/dist/ir/scalar-records.js.map +1 -1
  681. package/dist/ir/self-captures.d.ts +4 -2
  682. package/dist/ir/self-captures.js +32 -27
  683. package/dist/ir/self-captures.js.map +1 -1
  684. package/dist/ir/serialize.d.ts +6 -1
  685. package/dist/ir/serialize.js +87 -23
  686. package/dist/ir/serialize.js.map +1 -1
  687. package/dist/ir/serialize.test.js +26 -0
  688. package/dist/ir/serialize.test.js.map +1 -1
  689. package/dist/ir/tiers.js +1 -0
  690. package/dist/ir/tiers.js.map +1 -1
  691. package/dist/ir/traverse.js +4 -0
  692. package/dist/ir/traverse.js.map +1 -1
  693. package/dist/ir/typed-argument-clones.d.ts +30 -0
  694. package/dist/ir/typed-argument-clones.js +789 -0
  695. package/dist/ir/typed-argument-clones.js.map +1 -0
  696. package/dist/ir/union-arm-loops.d.ts +3 -0
  697. package/dist/ir/union-arm-loops.js +373 -0
  698. package/dist/ir/union-arm-loops.js.map +1 -0
  699. package/dist/ir/union-arm-loops.test.d.ts +1 -0
  700. package/dist/ir/union-arm-loops.test.js +230 -0
  701. package/dist/ir/union-arm-loops.test.js.map +1 -0
  702. package/dist/ir/validate.js +88 -18
  703. package/dist/ir/validate.js.map +1 -1
  704. package/dist/library/compiler-self-identity.d.ts +8 -2
  705. package/dist/library/compiler-self-identity.js +92 -18
  706. package/dist/library/compiler-self-identity.js.map +1 -1
  707. package/dist/library/compiler-self-identity.test.js +150 -3
  708. package/dist/library/compiler-self-identity.test.js.map +1 -1
  709. package/dist/library/int-infer.d.ts +5 -0
  710. package/dist/library/int-infer.js +15 -3
  711. package/dist/library/int-infer.js.map +1 -1
  712. package/dist/library/ir-policy.js +1 -0
  713. package/dist/library/ir-policy.js.map +1 -1
  714. package/dist/library/library-cache.d.ts +4 -0
  715. package/dist/library/library-cache.js +2 -0
  716. package/dist/library/library-cache.js.map +1 -1
  717. package/dist/library/library-cache.test.js +26 -0
  718. package/dist/library/library-cache.test.js.map +1 -1
  719. package/dist/library/prepare.js +99 -31
  720. package/dist/library/prepare.js.map +1 -1
  721. package/dist/native/cache.d.ts +7 -0
  722. package/dist/native/cache.js +47 -0
  723. package/dist/native/cache.js.map +1 -1
  724. package/dist/native/cache.test.js +13 -1
  725. package/dist/native/cache.test.js.map +1 -1
  726. package/dist/native/cli.js +1 -1
  727. package/dist/native/cli.js.map +1 -1
  728. package/dist/native/compiler.js +18 -3
  729. package/dist/native/compiler.js.map +1 -1
  730. package/dist/native/executable-cache-open.test.js +31 -5
  731. package/dist/native/executable-cache-open.test.js.map +1 -1
  732. package/dist/native/executable-cache.d.ts +6 -1
  733. package/dist/native/executable-cache.js +7 -1
  734. package/dist/native/executable-cache.js.map +1 -1
  735. package/dist/native/prepare.d.ts +3 -0
  736. package/dist/native/prepare.js +43 -26
  737. package/dist/native/prepare.js.map +1 -1
  738. package/dist/native/prepare.test.js +25 -3
  739. package/dist/native/prepare.test.js.map +1 -1
  740. package/dist/native/sanitizer.js +10 -1
  741. package/dist/native/sanitizer.js.map +1 -1
  742. package/dist/native/sanitizer.test.js +7 -2
  743. package/dist/native/sanitizer.test.js.map +1 -1
  744. package/dist/node-islands/boundary.d.ts +12 -0
  745. package/dist/node-islands/boundary.js +38 -6
  746. package/dist/node-islands/boundary.js.map +1 -1
  747. package/dist/node-islands/boundary.test.d.ts +1 -0
  748. package/dist/node-islands/boundary.test.js +76 -0
  749. package/dist/node-islands/boundary.test.js.map +1 -0
  750. package/dist/node-islands/detect.d.ts +9 -0
  751. package/dist/node-islands/detect.js +110 -0
  752. package/dist/node-islands/detect.js.map +1 -1
  753. package/dist/node-islands/detect.test.js +24 -0
  754. package/dist/node-islands/detect.test.js.map +1 -1
  755. package/dist/node-islands/graph-islands.d.ts +40 -0
  756. package/dist/node-islands/graph-islands.js +128 -0
  757. package/dist/node-islands/graph-islands.js.map +1 -0
  758. package/dist/node-islands/growth.d.ts +57 -0
  759. package/dist/node-islands/growth.js +205 -0
  760. package/dist/node-islands/growth.js.map +1 -0
  761. package/dist/node-islands/report.d.ts +12 -0
  762. package/dist/node-islands/report.js +28 -0
  763. package/dist/node-islands/report.js.map +1 -1
  764. package/dist/node-islands/report.test.js +2 -0
  765. package/dist/node-islands/report.test.js.map +1 -1
  766. package/dist/node-islands/rules.js +5 -0
  767. package/dist/node-islands/rules.js.map +1 -1
  768. package/dist/node-islands/scan.d.ts +11 -2
  769. package/dist/node-islands/scan.js +61 -9
  770. package/dist/node-islands/scan.js.map +1 -1
  771. package/dist/wasm/translate.js +11 -5
  772. package/dist/wasm/translate.js.map +1 -1
  773. package/dist/wasm/translate.test.js +35 -0
  774. package/dist/wasm/translate.test.js.map +1 -1
  775. package/package.json +20 -20
  776. package/surface-manifest.json +184 -117
@@ -0,0 +1,797 @@
1
+ /* Links from narrowed record copies to their sources.
2
+ *
3
+ * TypeScript lets an object with more properties be assigned to a narrower
4
+ * record type; Node keeps the one object. A conversion into a narrower
5
+ * record type builds a copy with the declared fields, so when the source
6
+ * type has properties the target lacks, the copy links to its source
7
+ * (record.link, a native table entry released with the copy). Each such
8
+ * (source type, target type) pair has a number and a compose helper that
9
+ * answers a record of the source type from the copy and its source: the
10
+ * copy's values for the fields both declare, the source's for the others.
11
+ * A reflective surface over the target type (keys, for...in, `in`, the
12
+ * own-key tests, string conversion, Object.values and Object.entries,
13
+ * JSON, inspect and checked views) answers for a linked copy as it does
14
+ * for the composed record, and for any other value as before. Only
15
+ * conversions into a type such a surface can observe link their copies
16
+ * (finalizeRecordLinks); programs without them are unchanged. */
17
+ import { varRef } from "../../ir/build.js";
18
+ import { BOOL, DYN, F64, KEY_ORDER_FIELD, STRING, arrayOf, shapeKeyOrders, typeEquals, typeKey, } from "../../ir/ir.js";
19
+ import { everyStmtList, transformStmtList } from "../../ir/traverse.js";
20
+ import { keyedHelperName } from "./stable-names.js";
21
+ import { recordHasOwnHelper, recordKeysArrayCall } from "./lower-calls.js";
22
+ import { callOwn, callOwnOrBuiltin } from "./record-inherited.js";
23
+ import { recordMayKeepSource } from "./record-sources.js";
24
+ import { inspectHelperCall } from "./lower-inspect.js";
25
+ import { InternalCompilerError } from "../../errors.js";
26
+ import { unsupportedDiag } from "../../diagnostics/diagnostic.js";
27
+ /** The link pair of a conversion from record type `from` into the record
28
+ * type `to`, or null when the conversion keeps no link: the target is a
29
+ * plain closed record and the source has a field it does not declare. */
30
+ export function recordLinkPair(lowerer, from, to, loc) {
31
+ const key = `${from}:${to}`;
32
+ const known = lowerer.recordLinks.get(key);
33
+ if (known)
34
+ return known;
35
+ const source = lowerer.shapes.get(from);
36
+ const target = lowerer.shapes.get(to);
37
+ if (!source ||
38
+ !target ||
39
+ source.tuple ||
40
+ target.tuple ||
41
+ source.indexValue !== undefined ||
42
+ target.indexValue !== undefined ||
43
+ target.fields.length === 0 ||
44
+ target.fields.some((field) => field.name.startsWith("%")) ||
45
+ source.fields.some((field) => field.name.startsWith("%")))
46
+ return null;
47
+ const declared = new Set(target.fields.map((field) => field.name));
48
+ if (!source.fields.some((field) => !declared.has(field.name)))
49
+ return null;
50
+ // The surfaces route through the link helpers only for record types
51
+ // that can carry a source.
52
+ if (!recordMayKeepSource(lowerer, { kind: "record", shapeId: to }))
53
+ return null;
54
+ const compose = keyedHelperName(lowerer, "%rec.compose", `compose:${key}`);
55
+ const link = { pair: lowerer.recordLinks.size + 1, from, to, compose };
56
+ lowerer.recordLinks.set(key, link);
57
+ lowerer.recordLinkLocs.set(compose, loc);
58
+ return link;
59
+ }
60
+ /** Notes that the conversion helper `projection` builds copies of the
61
+ * link's pair. finalizeRecordLinks makes it link each copy to its source
62
+ * when a reflective surface can observe the copy's type. */
63
+ export function registerLinkSite(lowerer, link, projection) {
64
+ lowerer.recordLinkSites.push({ link, projection });
65
+ }
66
+ /** The links whose copies have record type `to`, in pair order. */
67
+ export function recordLinksInto(lowerer, to) {
68
+ return [...lowerer.recordLinks.values()].filter((link) => link.to === to);
69
+ }
70
+ /** `record.link(copy, source, pair)`. */
71
+ export function recordLinkCall(copy, source, link, loc) {
72
+ return {
73
+ kind: "libCall",
74
+ fn: "record.link",
75
+ args: [copy, source, { kind: "numLit", value: link.pair, type: F64, loc }],
76
+ type: { kind: "void" },
77
+ loc,
78
+ };
79
+ }
80
+ /** `record.linkIs(copy, pair)`. */
81
+ export function recordLinkTest(copy, link, loc) {
82
+ return {
83
+ kind: "libCall",
84
+ fn: "record.linkIs",
85
+ args: [copy, { kind: "numLit", value: link.pair, type: F64, loc }],
86
+ type: BOOL,
87
+ loc,
88
+ };
89
+ }
90
+ /** The record of the pair's source type composed from a copy that links
91
+ * through it (record.linkIs held). */
92
+ export function composedRecord(copy, link, loc) {
93
+ const fromT = { kind: "record", shapeId: link.from };
94
+ return {
95
+ kind: "call",
96
+ callee: link.compose,
97
+ args: [
98
+ copy,
99
+ {
100
+ kind: "libCall",
101
+ fn: "record.linkSource",
102
+ args: [copy, { kind: "numLit", value: link.pair, type: F64, loc }],
103
+ type: fromT,
104
+ loc,
105
+ },
106
+ ],
107
+ type: fromT,
108
+ loc,
109
+ };
110
+ }
111
+ /** Registers `fn` (whose first parameter is a record of `shapeId`). */
112
+ export function registerLinkedHelper(lowerer, fn, shapeId, kind) {
113
+ lowerer.linkedHelpers.push({ fn, shapeId, kind });
114
+ }
115
+ /** Makes `fn` (whose first parameter is a record of `shapeId`) first
116
+ * answer `answer(composed)` for each copy linked into the type, where
117
+ * `composed` is the copy's composed record. Answers whether any link
118
+ * targets the type. */
119
+ export function answerLinkedCopies(lowerer, fn, shapeId, answer) {
120
+ const recordT = { kind: "record", shapeId };
121
+ const r = varRef(fn.params[0].localId, recordT, fn.loc);
122
+ const prefix = linkedCopyBranches(lowerer, fn, r, shapeId, answer);
123
+ if (prefix.length === 0)
124
+ return false;
125
+ fn.body = [...prefix, ...fn.body];
126
+ return true;
127
+ }
128
+ /** For each link into `shapeId`, the statement of `fn` that answers
129
+ * `answer(composed)` when `record` is a copy linked through it, with the
130
+ * composed record in a hidden local. Empty when no link targets the type. */
131
+ export function linkedCopyBranches(lowerer, fn, record, shapeId, answer) {
132
+ const loc = fn.loc;
133
+ const branches = [];
134
+ for (const link of recordLinksInto(lowerer, shapeId)) {
135
+ const fromT = { kind: "record", shapeId: link.from };
136
+ // A chain of links can reach a pair again inside another branch.
137
+ let local = `linked.${link.pair}`;
138
+ if (fn.locals.some((l) => l.id === local))
139
+ local = `${local}.${fn.locals.length}`;
140
+ fn.locals.push({ id: local, name: "linked", type: fromT, mutable: false });
141
+ const composed = varRef(local, fromT, loc);
142
+ branches.push({
143
+ kind: "if",
144
+ cond: recordLinkTest(record, link, loc),
145
+ then: [
146
+ { kind: "varDecl", localId: local, init: composedRecord(record, link, loc), loc },
147
+ ...answer(composed),
148
+ ],
149
+ else_: null,
150
+ loc,
151
+ });
152
+ }
153
+ return branches;
154
+ }
155
+ /** Completes the record links after lowering. Links whose copies no
156
+ * reflective surface can observe are dropped (keepObservedLinks); the
157
+ * conversions of the others link each copy, and each kept pair gets its
158
+ * compose helper. A helper over a record type that kept links target
159
+ * first answers for each linked copy as for its composed record, and a
160
+ * helper over a record type whose values a checked conversion can build
161
+ * with a kept source (scanModule) answers for such a record from its live
162
+ * checked view. Every other helper keeps the body it was built with,
163
+ * and string conversions through helpers left with no other answer return
164
+ * to their plain form. Helpers this registers are completed too, and
165
+ * method calls a link source shadows are refused. */
166
+ export function finalizeRecordLinks(lowerer, functions) {
167
+ if (lowerer.linkedHelpers.length === 0 && lowerer.recordLinks.size === 0)
168
+ return;
169
+ const lifted = lowerer.liftedFns.length;
170
+ const scan = scanModule(lowerer, [...functions, ...lowerer.liftedFns]);
171
+ const sourced = scan.sourced;
172
+ keepObservedLinks(lowerer, scan.exposed);
173
+ for (const site of lowerer.recordLinkSites)
174
+ if (lowerer.recordLinks.has(`${site.link.from}:${site.link.to}`))
175
+ linkCopies(site.projection, site.link);
176
+ for (const link of lowerer.recordLinks.values())
177
+ addComposer(lowerer, link, sourced);
178
+ refuseShadowedMethodCalls(lowerer);
179
+ const answering = new Set();
180
+ for (let i = 0; i < lowerer.linkedHelpers.length; i++) {
181
+ const helper = lowerer.linkedHelpers[i];
182
+ if (helper.kind === "custom")
183
+ continue;
184
+ const recordT = { kind: "record", shapeId: helper.shapeId };
185
+ // util.inspect's helper tests a kept source itself.
186
+ if (sourced.has(helper.shapeId) && helper.kind !== "inspect") {
187
+ const loc = helper.fn.loc;
188
+ const r = varRef(helper.fn.params[0].localId, recordT, loc);
189
+ helper.fn.body = [sourcedAnswer(helper, r, loc), ...helper.fn.body];
190
+ answering.add(helper.fn.name);
191
+ }
192
+ if (answerLinkedCopies(lowerer, helper.fn, helper.shapeId, (composed) => linkedAnswer(lowerer, helper, composed, sourced, helper.fn.loc)))
193
+ answering.add(helper.fn.name);
194
+ }
195
+ for (const finalize of lowerer.linkedHelperFinalizers)
196
+ finalize();
197
+ // The module's functions already hold the helpers lifted before.
198
+ functions.push(...lowerer.liftedFns.slice(lifted));
199
+ restoreStringConversions(lowerer, functions, answering);
200
+ }
201
+ /** A call of an Object.prototype method by name on a record type runs
202
+ * the built-in, but a linked copy whose source has an own property of
203
+ * that name would run the source's: such calls are refused. */
204
+ function refuseShadowedMethodCalls(lowerer) {
205
+ for (const call of lowerer.recordMethodCalls) {
206
+ for (const link of recordLinksInto(lowerer, call.shapeId)) {
207
+ const source = lowerer.shapes.get(link.from);
208
+ if (!source?.fields.some((field) => field.name === call.method))
209
+ continue;
210
+ lowerer.pushDiag(unsupportedDiag("SC1090", call.loc, `'${call.method}()' on a record converted from an object with its own '${call.method}' property`, `call the source object's '${call.method}' through its own type`));
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ /** Puts each call of a %rec.string or %rec.primitive helper that answers
216
+ * nothing but "[object Object]" (not in `answering`) back to the
217
+ * conversion it replaced (StringFallback), and drops those helpers. */
218
+ function restoreStringConversions(lowerer, functions, answering) {
219
+ const restored = new Map([...lowerer.recordStringFallbacks].filter(([helper]) => !answering.has(helper)));
220
+ if (restored.size === 0)
221
+ return;
222
+ for (const fn of functions) {
223
+ const calls = !everyStmtList(fn.body, {
224
+ stmt: () => true,
225
+ expr: (e) => e.kind !== "call" || !restored.has(e.callee),
226
+ });
227
+ if (!calls)
228
+ continue;
229
+ fn.body = transformStmtList(fn.body, {
230
+ stmt: (s) => s,
231
+ expr: (e) => {
232
+ const fallback = e.kind === "call" ? restored.get(e.callee) : undefined;
233
+ return fallback !== undefined && e.kind === "call"
234
+ ? stringFallback(fallback, e.args[0], e.loc)
235
+ : e;
236
+ },
237
+ });
238
+ }
239
+ for (const list of [functions, lowerer.liftedFns])
240
+ for (let i = list.length - 1; i >= 0; i--)
241
+ if (restored.has(list[i].name))
242
+ list.splice(i, 1);
243
+ }
244
+ /** Makes the conversion helper `projection` (one `return <copy>`) link
245
+ * the copy it builds to its source record, the helper's parameter. */
246
+ function linkCopies(projection, link) {
247
+ const ret = projection.body[0];
248
+ if (projection.body.length !== 1 || ret?.kind !== "return" || ret.value === null)
249
+ throw new InternalCompilerError("lowerer bug: a record projection is not one return");
250
+ const loc = ret.loc;
251
+ const copyT = projection.returnType;
252
+ const param = projection.params[0];
253
+ const built = varRef("built.0", copyT, loc);
254
+ projection.locals.push({ id: "built.0", name: "built", type: copyT, mutable: false });
255
+ projection.body = [
256
+ { kind: "varDecl", localId: "built.0", init: ret.value, loc },
257
+ {
258
+ kind: "exprStmt",
259
+ expr: recordLinkCall(built, varRef(param.localId, param.type, loc), link, loc),
260
+ loc,
261
+ },
262
+ { kind: "return", value: built, loc },
263
+ ];
264
+ }
265
+ /** Keeps the links whose copies a reflective surface can observe: the
266
+ * record types of the registered helpers (keys, own-key tests, string
267
+ * conversion, inspect, values and entries) and of Object.prototype method
268
+ * calls by name, and every record type that values of the `exposed` types
269
+ * can hold (JSON.stringify, checked views and the serializing library
270
+ * calls convert those through per-type helpers; the fields of a class
271
+ * instance's view are not followed). A kept link observes its
272
+ * source type too, through the composed record. The other links are
273
+ * dropped, so their conversions build plain copies. */
274
+ function keepObservedLinks(lowerer, exposed) {
275
+ if (lowerer.recordLinks.size === 0)
276
+ return;
277
+ // A call of an Object.prototype method by name observes the type too
278
+ // (refuseShadowedMethodCalls).
279
+ const observed = new Set([
280
+ ...lowerer.linkedHelpers.map((helper) => helper.shapeId),
281
+ ...lowerer.recordMethodCalls.map((call) => call.shapeId),
282
+ ]);
283
+ const reached = new Set();
284
+ const visit = (t) => {
285
+ const key = typeKey(t);
286
+ if (reached.has(key))
287
+ return;
288
+ reached.add(key);
289
+ switch (t.kind) {
290
+ case "record": {
291
+ observed.add(t.shapeId);
292
+ const shape = lowerer.shapes.get(t.shapeId);
293
+ for (const field of shape?.fields ?? [])
294
+ visit(field.type);
295
+ if (shape?.indexValue !== undefined)
296
+ visit(shape.indexValue);
297
+ break;
298
+ }
299
+ case "array":
300
+ case "set":
301
+ visit(t.elem);
302
+ break;
303
+ case "map":
304
+ visit(t.key);
305
+ visit(t.value);
306
+ break;
307
+ case "union":
308
+ for (const arm of lowerer.unions.get(t.unionId)?.arms ?? [])
309
+ visit(arm);
310
+ break;
311
+ case "promise":
312
+ visit(t.inner);
313
+ break;
314
+ case "func":
315
+ // A boxed function's results are boxed for its callers.
316
+ visit(t.ret);
317
+ break;
318
+ default:
319
+ break;
320
+ }
321
+ };
322
+ for (const t of exposed)
323
+ visit(t);
324
+ for (let changed = true; changed;) {
325
+ changed = false;
326
+ for (const link of lowerer.recordLinks.values())
327
+ if (observed.has(link.to) && !observed.has(link.from)) {
328
+ observed.add(link.from);
329
+ changed = true;
330
+ }
331
+ }
332
+ for (const [key, link] of lowerer.recordLinks)
333
+ if (!observed.has(link.to))
334
+ lowerer.recordLinks.delete(key);
335
+ }
336
+ /** Builds a link's compose helper once every link is known: a record of
337
+ * the source type with the copy's values for the fields both types declare
338
+ * and the source's for the others, created in the source type's first key
339
+ * order. The source can itself carry other properties: a kept checked
340
+ * source when its type is in `sourced` (record.sourceShare), and a
341
+ * link of its own when the source type is the target of other links (a
342
+ * copy converted again). The composed record keeps both. */
343
+ function addComposer(lowerer, link, sourced) {
344
+ const loc = lowerer.recordLinkLocs.get(link.compose);
345
+ const fromT = { kind: "record", shapeId: link.from };
346
+ const toT = { kind: "record", shapeId: link.to };
347
+ const sourceShape = lowerer.shapes.get(link.from);
348
+ const targetShape = lowerer.shapes.get(link.to);
349
+ const copy = varRef("copy.0", toT, loc);
350
+ const source = varRef("source.0", fromT, loc);
351
+ const composed = varRef("composed.0", fromT, loc);
352
+ const fields = shapeKeyOrders(sourceShape)[0].map((name) => {
353
+ const field = sourceShape.fields.find((f) => f.name === name);
354
+ const own = targetShape.fields.find((f) => f.name === name);
355
+ const [obj, shapeId] = own !== undefined && typeEquals(own.type, field.type) ? [copy, link.to] : [source, link.from];
356
+ const read = { kind: "recordGet", obj, shapeId, field: name, type: field.type, loc };
357
+ return { name, value: lowerer.presenceKeepingCopy(obj, shapeId, name, read, loc) };
358
+ });
359
+ // A source type written in several key orders records each value's order
360
+ // in a hidden field: the composed record enumerates in the source's.
361
+ if (sourceShape.fields.some((f) => f.name === KEY_ORDER_FIELD))
362
+ fields.push({
363
+ name: KEY_ORDER_FIELD,
364
+ value: {
365
+ kind: "recordGet",
366
+ obj: source,
367
+ shapeId: link.from,
368
+ field: KEY_ORDER_FIELD,
369
+ type: F64,
370
+ loc,
371
+ },
372
+ });
373
+ const body = [
374
+ {
375
+ kind: "varDecl",
376
+ localId: "composed.0",
377
+ init: { kind: "recordLit", fields, type: fromT, loc },
378
+ loc,
379
+ },
380
+ ];
381
+ if (sourced.has(link.from))
382
+ body.push({
383
+ kind: "exprStmt",
384
+ expr: {
385
+ kind: "libCall",
386
+ fn: "record.sourceShare",
387
+ args: [composed, source],
388
+ type: { kind: "void" },
389
+ loc,
390
+ },
391
+ loc,
392
+ });
393
+ for (const next of recordLinksInto(lowerer, link.from)) {
394
+ const sourceOf = {
395
+ kind: "libCall",
396
+ fn: "record.linkSource",
397
+ args: [source, { kind: "numLit", value: next.pair, type: F64, loc }],
398
+ type: { kind: "record", shapeId: next.from },
399
+ loc,
400
+ };
401
+ body.push({
402
+ kind: "if",
403
+ cond: recordLinkTest(source, next, loc),
404
+ then: [{ kind: "exprStmt", expr: recordLinkCall(composed, sourceOf, next, loc), loc }],
405
+ else_: null,
406
+ loc,
407
+ });
408
+ }
409
+ body.push({ kind: "return", value: composed, loc });
410
+ lowerer.liftedFns.push({
411
+ name: link.compose,
412
+ params: [
413
+ { localId: "copy.0", name: "copy", type: toT },
414
+ { localId: "source.0", name: "source", type: fromT },
415
+ ],
416
+ returnType: fromT,
417
+ locals: [
418
+ { id: "copy.0", name: "copy", type: toT, mutable: false },
419
+ { id: "source.0", name: "source", type: fromT, mutable: false },
420
+ { id: "composed.0", name: "composed", type: fromT, mutable: false },
421
+ ],
422
+ body,
423
+ loc,
424
+ });
425
+ }
426
+ /** The library calls that serialize, inspect or box their arguments. */
427
+ const EXPOSING_LIB_CALLS = /^(json|insp|dyn|js)\.|^(child|process)\.send$/;
428
+ /** One walk over the module: the record types whose values can keep a
429
+ * checked source (keptSourceTypes), and the types of the values it boxes
430
+ * as checked values, serializes or inspects. */
431
+ function scanModule(lowerer, functions) {
432
+ const sourced = new Set();
433
+ const seen = new Set();
434
+ const exposed = new Map();
435
+ const expose = (t) => {
436
+ if (!exposed.has(typeKey(t)))
437
+ exposed.set(typeKey(t), t);
438
+ };
439
+ const links = lowerer.recordLinks.size > 0;
440
+ for (const fn of functions) {
441
+ everyStmtList(fn.body, {
442
+ stmt: () => true,
443
+ expr: (e) => {
444
+ if (e.kind === "dynCheck")
445
+ keptSourceTypes(lowerer, e.type, sourced, seen);
446
+ // A literal that starts with a spread of a record that kept a
447
+ // source keeps one too, as does a width spread or clone the
448
+ // key-order pass keeps (record.sourceNote).
449
+ if (e.kind === "libCall" &&
450
+ (e.fn === "record.sourceSpread" || e.fn === "record.sourceNote")) {
451
+ const built = e.args[0]?.type;
452
+ if (built?.kind === "record" && recordMayKeepSource(lowerer, built))
453
+ sourced.add(built.shapeId);
454
+ }
455
+ if (!links)
456
+ return true;
457
+ if (e.kind === "dynFrom")
458
+ expose(e.value.type);
459
+ if (e.kind === "jsonStringify")
460
+ expose(e.value.type);
461
+ if (e.kind === "libCall" && EXPOSING_LIB_CALLS.test(e.fn))
462
+ for (const arg of e.args)
463
+ expose(arg.type);
464
+ return true;
465
+ },
466
+ });
467
+ }
468
+ return { sourced, exposed: [...exposed.values()] };
469
+ }
470
+ /** Adds to `out` the record types a checked conversion into `t` can build
471
+ * with a kept source (recordMayKeepSource): `t` and the record types its
472
+ * values hold. `seen` holds the type keys already walked. */
473
+ function keptSourceTypes(lowerer, t, out, seen) {
474
+ const key = typeKey(t);
475
+ if (seen.has(key))
476
+ return;
477
+ seen.add(key);
478
+ switch (t.kind) {
479
+ case "record": {
480
+ if (recordMayKeepSource(lowerer, t))
481
+ out.add(t.shapeId);
482
+ const shape = lowerer.shapes.get(t.shapeId);
483
+ for (const field of shape?.fields ?? [])
484
+ keptSourceTypes(lowerer, field.type, out, seen);
485
+ if (shape?.indexValue !== undefined)
486
+ keptSourceTypes(lowerer, shape.indexValue, out, seen);
487
+ break;
488
+ }
489
+ case "array":
490
+ case "set":
491
+ keptSourceTypes(lowerer, t.elem, out, seen);
492
+ break;
493
+ case "map":
494
+ keptSourceTypes(lowerer, t.key, out, seen);
495
+ keptSourceTypes(lowerer, t.value, out, seen);
496
+ break;
497
+ case "union":
498
+ for (const arm of lowerer.unions.get(t.unionId)?.arms ?? [])
499
+ keptSourceTypes(lowerer, arm, out, seen);
500
+ break;
501
+ case "promise":
502
+ keptSourceTypes(lowerer, t.inner, out, seen);
503
+ break;
504
+ default:
505
+ break;
506
+ }
507
+ }
508
+ /** The helper's answer for the record `composed` of a link's source type.
509
+ * `sourced` holds the record types that can keep a checked source. */
510
+ function linkedAnswer(lowerer, helper, composed, sourced, loc) {
511
+ const source = composed.type.shapeId;
512
+ const shape = lowerer.shapes.get(source);
513
+ // A source type whose values can carry other properties (a copy linked
514
+ // again, or a kept checked source) converts through its own helper when
515
+ // it declares no method of its own for the conversion, so the method
516
+ // those properties hold runs.
517
+ const carries = sourced.has(source) || [...lowerer.recordLinks.values()].some((l) => l.to === source);
518
+ const k = varRef("k.0", STRING, loc);
519
+ switch (helper.kind) {
520
+ case "keys":
521
+ // The source type's helper, which answers for a composed record that
522
+ // keeps a checked source or links further.
523
+ return [
524
+ {
525
+ kind: "return",
526
+ value: recordKeysArrayCall(lowerer, composed, composed.type, shape, loc),
527
+ loc,
528
+ },
529
+ ];
530
+ case "hasOwn":
531
+ return [
532
+ {
533
+ kind: "return",
534
+ value: {
535
+ kind: "call",
536
+ callee: recordHasOwnHelper(lowerer, source, loc),
537
+ args: [composed, k],
538
+ type: BOOL,
539
+ loc,
540
+ },
541
+ loc,
542
+ },
543
+ ];
544
+ case "string":
545
+ if (carries && !shape.fields.some((f) => f.name === "toString"))
546
+ return [{ kind: "return", value: sourceConversion(lowerer, "string", composed, loc), loc }];
547
+ return [{ kind: "return", value: recordToString(lowerer, helper, composed, loc), loc }];
548
+ case "custom":
549
+ throw new InternalCompilerError("lowerer bug: custom helpers answer linked copies themselves");
550
+ case "inspect":
551
+ return [
552
+ {
553
+ kind: "return",
554
+ value: inspectHelperCall(lowerer, composed, varRef("r.0", F64, loc), varRef("d.0", F64, loc), loc),
555
+ loc,
556
+ },
557
+ ];
558
+ case "primitive": {
559
+ const valueOf = shape.fields.find((f) => f.name === "valueOf");
560
+ if (valueOf === undefined || valueOf.type.kind !== "func")
561
+ return [
562
+ {
563
+ kind: "return",
564
+ value: carries
565
+ ? sourceConversion(lowerer, "primitive", composed, loc)
566
+ : recordToString(lowerer, helper, composed, loc),
567
+ loc,
568
+ },
569
+ ];
570
+ // ToPrimitive with the default hint calls an own valueOf first.
571
+ const own = {
572
+ kind: "recordGet",
573
+ obj: composed,
574
+ shapeId: source,
575
+ field: "valueOf",
576
+ type: valueOf.type,
577
+ loc,
578
+ };
579
+ const value = callOwn(lowerer, declarerOf(helper.fn), own, [], valueOf.type.ret, "valueOf", loc);
580
+ // A primitive answer converts as ToString does; an object makes
581
+ // ToPrimitive fall back to toString once valueOf has run.
582
+ if (value.type.kind === "string")
583
+ return [{ kind: "return", value, loc }];
584
+ if (value.type.kind === "f64" || value.type.kind === "bool")
585
+ return [
586
+ { kind: "return", value: { kind: "toString", operand: value, type: STRING, loc }, loc },
587
+ ];
588
+ const fallback = {
589
+ kind: "return",
590
+ value: recordToString(lowerer, helper, composed, loc),
591
+ loc,
592
+ };
593
+ if (OBJECT_KINDS.has(value.type.kind))
594
+ return [{ kind: "exprStmt", expr: value, loc }, fallback];
595
+ // Any other answer is tested once valueOf returns: null answers
596
+ // "object" and is falsy, and every object is truthy.
597
+ const boxed = lowerer.coerceToExpected(value, DYN);
598
+ if (boxed.type.kind !== "dyn")
599
+ return [{ kind: "exprStmt", expr: value, loc }, fallback];
600
+ const resultId = declarerOf(helper.fn)("%valueOfResult", DYN);
601
+ const result = varRef(resultId, DYN, loc);
602
+ const typeOf = {
603
+ kind: "libCall",
604
+ fn: "dyn.typeof",
605
+ args: [result],
606
+ type: STRING,
607
+ loc,
608
+ };
609
+ const typeIs = (name) => ({
610
+ kind: "strEq",
611
+ negated: false,
612
+ left: typeOf,
613
+ right: { kind: "strLit", value: name, type: STRING, loc },
614
+ type: BOOL,
615
+ loc,
616
+ });
617
+ return [
618
+ { kind: "varDecl", localId: resultId, init: boxed, loc },
619
+ {
620
+ kind: "if",
621
+ cond: {
622
+ kind: "logical",
623
+ op: "||",
624
+ left: typeIs("function"),
625
+ right: {
626
+ kind: "logical",
627
+ op: "&&",
628
+ left: typeIs("object"),
629
+ right: { kind: "dynTest", test: "truthy", value: result, type: BOOL, loc },
630
+ type: BOOL,
631
+ loc,
632
+ },
633
+ type: BOOL,
634
+ loc,
635
+ },
636
+ then: [fallback],
637
+ else_: null,
638
+ loc,
639
+ },
640
+ { kind: "return", value: { kind: "toString", operand: result, type: STRING, loc }, loc },
641
+ ];
642
+ }
643
+ }
644
+ }
645
+ /** The IR type kinds whose values are always objects. */
646
+ const OBJECT_KINDS = new Set([
647
+ "record",
648
+ "object",
649
+ "array",
650
+ "map",
651
+ "set",
652
+ "func",
653
+ "promise",
654
+ ]);
655
+ /** `%rec.<hint>.<n>(r)` over the source type of `composed`: ToString (or
656
+ * ToPrimitive with the default hint) as the record's other properties
657
+ * answer, for a copy linked again or a kept checked source, else as
658
+ * recordToString does. finalizeRecordLinks adds the answers, and the
659
+ * helper keeps its own conversion when none applies. */
660
+ function sourceConversion(lowerer, hint, composed, loc) {
661
+ const recordT = composed.type;
662
+ const key = `rec.${hint}.source:${recordT.shapeId}`;
663
+ let name = lowerer.valueHelpers.get(key);
664
+ if (!name) {
665
+ name = keyedHelperName(lowerer, `%rec.${hint}`, key);
666
+ lowerer.valueHelpers.set(key, name);
667
+ const fn = {
668
+ name,
669
+ params: [{ localId: "r.0", name: "r", type: recordT }],
670
+ returnType: STRING,
671
+ locals: [{ id: "r.0", name: "r", type: recordT, mutable: false }],
672
+ body: [],
673
+ loc,
674
+ };
675
+ const helper = { fn, shapeId: recordT.shapeId, kind: hint };
676
+ const r = varRef("r.0", recordT, loc);
677
+ fn.body = [{ kind: "return", value: recordToString(lowerer, helper, r, loc), loc }];
678
+ lowerer.liftedFns.push(fn);
679
+ registerLinkedHelper(lowerer, fn, recordT.shapeId, hint);
680
+ }
681
+ return { kind: "call", callee: name, args: [composed], type: STRING, loc };
682
+ }
683
+ /** ToString of the record `composed`: its own toString when it holds a
684
+ * callable one, else Object.prototype's "[object Object]". */
685
+ function recordToString(lowerer, helper, composed, loc) {
686
+ const source = composed.type.shapeId;
687
+ return callOwnOrBuiltin(lowerer, declarerOf(helper.fn), composed, source, "toString", [], STRING, "toString", loc);
688
+ }
689
+ /** A hidden-local declarer for statements added to `fn`. */
690
+ function declarerOf(fn) {
691
+ return (name, type) => {
692
+ const id = `${name}.${fn.locals.length}`;
693
+ fn.locals.push({ id, name, type, mutable: false });
694
+ return id;
695
+ };
696
+ }
697
+ /** `if (record.sourceHas(r)) return <the live checked view's answer>`. */
698
+ function sourcedAnswer(helper, r, loc) {
699
+ const view = { kind: "dynFrom", value: r, liveRef: true, type: DYN, loc };
700
+ const k = varRef("k.0", STRING, loc);
701
+ let answer;
702
+ switch (helper.kind) {
703
+ case "keys":
704
+ answer = {
705
+ kind: "libCall",
706
+ fn: "dyn.objKeyStrings",
707
+ args: [view],
708
+ type: arrayOf(STRING),
709
+ loc,
710
+ };
711
+ break;
712
+ case "hasOwn":
713
+ answer = {
714
+ kind: "libCall",
715
+ fn: "dyn.hasOwn",
716
+ args: [view, k],
717
+ type: BOOL,
718
+ loc,
719
+ };
720
+ break;
721
+ case "string":
722
+ answer = { kind: "toString", operand: view, type: STRING, loc };
723
+ break;
724
+ case "inspect":
725
+ case "custom":
726
+ throw new InternalCompilerError(`lowerer bug: ${helper.kind} helpers test kept sources themselves`);
727
+ case "primitive":
728
+ answer = {
729
+ kind: "toString",
730
+ operand: {
731
+ kind: "libCall",
732
+ fn: "dyn.add",
733
+ args: [
734
+ {
735
+ kind: "dynFrom",
736
+ value: { kind: "strLit", value: "", type: STRING, loc },
737
+ type: DYN,
738
+ loc,
739
+ },
740
+ view,
741
+ ],
742
+ type: DYN,
743
+ loc,
744
+ },
745
+ type: STRING,
746
+ loc,
747
+ };
748
+ break;
749
+ }
750
+ return {
751
+ kind: "if",
752
+ cond: { kind: "libCall", fn: "record.sourceHas", args: [r], type: BOOL, loc },
753
+ then: [{ kind: "return", value: answer, loc }],
754
+ else_: null,
755
+ loc,
756
+ };
757
+ }
758
+ /** `%rec.string.<n>(r)` (ToString) or `%rec.primitive.<n>(r)` (ToPrimitive
759
+ * with the default hint, then ToString) of a record type whose values
760
+ * answer Object.prototype.toString: "[object Object]", or for a linked
761
+ * copy or a record with a kept source, what its source answers. When no
762
+ * value of the type can answer otherwise, finalizeRecordLinks puts
763
+ * `fallback`, the conversion without the helper, in the calls' place. */
764
+ export function recordStringCall(lowerer, record, hint, loc, fallback) {
765
+ const recordT = record.type;
766
+ const key = `rec.${hint}:${recordT.shapeId}:${fallback}`;
767
+ let helper = lowerer.valueHelpers.get(key);
768
+ if (!helper) {
769
+ helper = keyedHelperName(lowerer, `%rec.${hint}`, key);
770
+ lowerer.valueHelpers.set(key, helper);
771
+ const fn = {
772
+ name: helper,
773
+ params: [{ localId: "r.0", name: "r", type: recordT }],
774
+ returnType: STRING,
775
+ locals: [{ id: "r.0", name: "r", type: recordT, mutable: false }],
776
+ body: [
777
+ {
778
+ kind: "return",
779
+ value: { kind: "strLit", value: "[object Object]", type: STRING, loc },
780
+ loc,
781
+ },
782
+ ],
783
+ loc,
784
+ };
785
+ lowerer.liftedFns.push(fn);
786
+ registerLinkedHelper(lowerer, fn, recordT.shapeId, hint);
787
+ lowerer.recordStringFallbacks.set(helper, fallback);
788
+ }
789
+ return { kind: "call", callee: helper, args: [record], type: STRING, loc };
790
+ }
791
+ /** The conversion `fallback` of `record` at `loc`. */
792
+ function stringFallback(fallback, record, loc) {
793
+ return fallback === "constant"
794
+ ? { kind: "strLit", value: "[object Object]", type: STRING, loc }
795
+ : { kind: "toString", operand: record, type: STRING, loc };
796
+ }
797
+ //# sourceMappingURL=record-links.js.map