@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
@@ -220,9 +220,13 @@ function bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, has
220
220
  type: F64,
221
221
  loc,
222
222
  });
223
+ // A mutable-buffers program's receiver length can shrink inside the
224
+ // callback (the buffer resizes or detaches), while Node's visit captures
225
+ // %TypedArrayLength once: the loop bound is the captured `n` there.
226
+ const bound = () => (lowerer.buffersMutable ? n() : length());
223
227
  const inRange = () => backward
224
228
  ? { kind: "bin", op: ">=", left: i(), right: numLit(0, loc), type: BOOL, loc }
225
- : { kind: "bin", op: "<", left: i(), right: length(), type: BOOL, loc };
229
+ : { kind: "bin", op: "<", left: i(), right: bound(), type: BOOL, loc };
226
230
  const advance = () => ({
227
231
  kind: "assign",
228
232
  localId: "i.0",
@@ -262,7 +266,26 @@ function bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, has
262
266
  { localId: "f.0", name: "f", type: fnT },
263
267
  ...(hasInit ? [{ localId: "z.0", name: "z", type: resultT }] : []),
264
268
  ];
265
- const visit = [{ kind: "assign", localId: "v.0", value: at(i()), loc }];
269
+ // A mutable-buffers program's visit runs to the captured length even after
270
+ // the buffer shrinks under it, where Node's element Get answers undefined.
271
+ // The typed model has no undefined in an element slot, so an out-of-view
272
+ // index reads as NaN, which is what every numeric use of undefined converts
273
+ // to. The callback still runs, and the result array is independent of the
274
+ // source, so its element Set always stores.
275
+ const inView = () => lowerer.buffersMutable
276
+ ? { kind: "bin", op: "<", left: i(), right: length(), type: BOOL, loc }
277
+ : boolLit(true, loc);
278
+ const visit = lowerer.buffersMutable
279
+ ? [
280
+ {
281
+ kind: "if",
282
+ cond: inView(),
283
+ then: [{ kind: "assign", localId: "v.0", value: at(i()), loc }],
284
+ else_: [{ kind: "assign", localId: "v.0", value: numLit(NaN, loc), loc }],
285
+ loc,
286
+ },
287
+ ]
288
+ : [{ kind: "assign", localId: "v.0", value: at(i()), loc }];
266
289
  let seeded = false;
267
290
  const prologue = [];
268
291
  let epilogue;
@@ -278,13 +301,8 @@ function bytesCallbackHelper(lowerer, method, bytesT, resultT, fnRet, arity, has
278
301
  init: { kind: "bytesNew", source: n(), type: bytesT, loc },
279
302
  loc,
280
303
  });
281
- visit.push({
282
- kind: "bytesSet",
283
- arr: acc(),
284
- index: i(),
285
- value: lowerer.coerceToExpected(callback(), F64),
286
- loc,
287
- });
304
+ const mapped = lowerer.coerceToExpected(callback(), F64);
305
+ visit.push({ kind: "bytesSet", arr: acc(), index: i(), value: mapped, loc });
288
306
  if (bytesT.elem === "u8")
289
307
  prologue.push(copyBrand(acc()));
290
308
  epilogue = [ret(acc())];
@@ -490,15 +508,36 @@ export function lowerBytesNew(lowerer, expr, symbol) {
490
508
  (ts.symbolName(symbol) === "ArrayBuffer" || ts.symbolName(symbol) === "SharedArrayBuffer") &&
491
509
  lowerer.isStdlibSymbol(symbol)) {
492
510
  const args = expr.arguments?.nodes ?? [];
493
- if (args.length > 1 || args.some(ts.isSpreadElement)) {
511
+ // `new ArrayBuffer(len, { maxByteLength })` is a resizable, growable or
512
+ // detachable buffer (t262-dc C2). Only a JavaScript source may build
513
+ // one: the TypeScript surface keeps the fixed-length refusal.
514
+ const options = args.length === 2 &&
515
+ !args.some(ts.isSpreadElement) &&
516
+ isJsSourceFile(ts.getSourceFileOfNode(expr))
517
+ ? args[1]
518
+ : undefined;
519
+ if (args.length > (options ? 2 : 1) || args.some(ts.isSpreadElement)) {
494
520
  lowerer.noLowering("resizable ArrayBuffer construction", expr, "fixed-length ArrayBuffers accept a byte length; resizable storage is not supported yet");
495
521
  }
496
522
  const length = args[0]
497
523
  ? lowerer.coerceInto(args[0], lowerer.lowerExpr(args[0]), DYN)
498
524
  : dynUndefinedExpr(locOf(expr));
525
+ const shared = ts.symbolName(symbol) === "SharedArrayBuffer";
526
+ if (options) {
527
+ // A resizable or growable construction is the mutableBuffers fact by
528
+ // itself: the buffer it builds can change length later.
529
+ lowerer.buffersMutable = true;
530
+ return {
531
+ kind: "libCall",
532
+ fn: shared ? "sharedArrayBuffer.newGrowable" : "arrayBuffer.newResizable",
533
+ args: [length, lowerer.coerceInto(options, lowerer.lowerExpr(options), DYN)],
534
+ type: DYN,
535
+ loc: locOf(expr),
536
+ };
537
+ }
499
538
  return {
500
539
  kind: "libCall",
501
- fn: ts.symbolName(symbol) === "SharedArrayBuffer" ? "sharedArrayBuffer.new" : "arrayBuffer.new",
540
+ fn: shared ? "sharedArrayBuffer.new" : "arrayBuffer.new",
502
541
  args: [length],
503
542
  type: DYN,
504
543
  loc: locOf(expr),
@@ -970,6 +1009,34 @@ export function lowerBytesMethodCall(lowerer, call, access) {
970
1009
  return null;
971
1010
  const loc = locOf(call);
972
1011
  const nArgs = call.arguments.nodes.length;
1012
+ // In JavaScript, copy, toString, slice and subarray called with an offset
1013
+ // that is not statically a number (`b.copy(c, '0')`, `buf.slice('2')`), or
1014
+ // toString with an encoding that is not statically a string, run as the
1015
+ // checked-dynamic Buffer method, which converts them as Node does; the
1016
+ // result returns to the method's static type.
1017
+ const coerced = own(JS_COERCED_OFFSET_SLOTS, name);
1018
+ if (coerced !== undefined &&
1019
+ receiverIr.elem === "u8" &&
1020
+ isJsSourceFile(ts.getSourceFileOfNode(call)) &&
1021
+ !call.arguments.nodes.some(ts.isSpreadElement) &&
1022
+ call.arguments.nodes.some((a, i) => (coerced.slots.includes(i) && !kindOrUndefinedArgument(lowerer, a, "f64")) ||
1023
+ (coerced.encoding === i && !kindOrUndefinedArgument(lowerer, a, "string")))) {
1024
+ const receiver = lowerer.lowerExprExpecting(access.expression, receiverIr);
1025
+ return {
1026
+ kind: "dynCheck",
1027
+ value: {
1028
+ kind: "dynInvoke",
1029
+ recv: { kind: "dynFrom", value: receiver, type: DYN, loc, liveRef: true },
1030
+ method: name,
1031
+ calleeName: ts.getTextOfNode(access),
1032
+ args: call.arguments.nodes.map((a) => lowerer.lowerExprExpecting(a, DYN)),
1033
+ type: DYN,
1034
+ loc,
1035
+ },
1036
+ type: coerced.result,
1037
+ loc,
1038
+ };
1039
+ }
973
1040
  // Encoded stream callbacks can receive strings even when JavaScript's
974
1041
  // contextual inference still describes their parameter as a Buffer.
975
1042
  if (name === "toString" && nArgs <= 1 && isJsSourceFile(ts.getSourceFileOfNode(call))) {
@@ -1444,6 +1511,134 @@ export function bufEncoding(lowerer, what, encNode) {
1444
1511
  }
1445
1512
  return v;
1446
1513
  }
1514
+ /** A literal encoding argument's canonical name: a string literal node — a
1515
+ * JavaScript argument outside the parameter's type widens to `string` — or
1516
+ * a string literal type, in any letter case Node accepts. Undefined for a
1517
+ * run-time value and for a spelling Node does not know. */
1518
+ function literalBufEncoding(lowerer, encNode) {
1519
+ if (ts.isStringLiteralLike(encNode))
1520
+ return knownBufEncoding(encNode.text);
1521
+ const t = lowerer.typeOf(encNode);
1522
+ return t.isStringLiteralType() ? knownBufEncoding(t.value) : undefined;
1523
+ }
1524
+ /** Whether an encoding argument's checker type is a string or a unit type
1525
+ * Node reads as "no encoding". Node's methods disagree on other values
1526
+ * (fill throws ERR_INVALID_ARG_TYPE; getEncodingOps coerces with `+ ''`),
1527
+ * so those keep the refusal. */
1528
+ function stringOrUnitEncodingType(lowerer, encNode) {
1529
+ const t = lowerer.typeOf(encNode);
1530
+ const arms = t.flags & ts.TypeFlags.Union ? constituentTypes(t) : [t];
1531
+ return arms.every((arm) => (arm.flags &
1532
+ (ts.TypeFlags.StringLike |
1533
+ ts.TypeFlags.Undefined |
1534
+ ts.TypeFlags.Null |
1535
+ ts.TypeFlags.Void)) !==
1536
+ 0);
1537
+ }
1538
+ const BUF_ENCODING_NORMALIZERS = {
1539
+ strict: "buffer.normalizeEncoding",
1540
+ emptyUtf8: "buffer.normalizeEncodingEmptyUtf8",
1541
+ utf8Fallback: "buffer.normalizeEncodingOrUtf8",
1542
+ };
1543
+ /** The encoding argument of a Buffer surface: a canonical literal, or the
1544
+ * run-time value normalized as `mode` names. Node throws inside the method
1545
+ * for the names `mode` rejects; the normalization runs where Node's does,
1546
+ * after the other arguments evaluate. */
1547
+ function bufEncodingArgument(lowerer, what, encNode, mode, loc) {
1548
+ const literal = literalBufEncoding(lowerer, encNode);
1549
+ if (literal !== undefined)
1550
+ return { literal };
1551
+ const undefinedArg = lowerStaticallyUndefinedArgument(lowerer, encNode);
1552
+ if (undefinedArg)
1553
+ return { literal: "utf8", effects: undefinedArg };
1554
+ if (!stringOrUnitEncodingType(lowerer, encNode)) {
1555
+ lowerer.noLowering(`${what} with this encoding`, encNode, 'a literal "utf8", "hex", "base64", "base64url", "latin1", "binary", "ascii", "utf16le", or "ucs2" spelling, or a string value, is the lowered encoding surface');
1556
+ }
1557
+ const raw = lowerOptionalArgument(lowerer, encNode, STRING, {
1558
+ kind: "strLit",
1559
+ value: "utf8",
1560
+ type: STRING,
1561
+ loc,
1562
+ });
1563
+ return { raw, mode };
1564
+ }
1565
+ /** The run-time normalization Node's method applies to an encoding. */
1566
+ function normalizeBufEncoding(enc, loc) {
1567
+ return {
1568
+ kind: "libCall",
1569
+ fn: BUF_ENCODING_NORMALIZERS[enc.mode],
1570
+ args: [enc.raw],
1571
+ type: STRING,
1572
+ loc,
1573
+ };
1574
+ }
1575
+ /** Bind the arguments a Buffer surface evaluates before its encoding (`prior`,
1576
+ * in source order) and then the normalized encoding to hidden locals, so the
1577
+ * normalization (which can throw) runs once, after every argument, and the
1578
+ * name can be read more than once. `passRaw` hands the value over unnormalized
1579
+ * instead, for a surface whose runtime entry reads the name after its own
1580
+ * checks. A literal encoding keeps the call shape unchanged and evaluates
1581
+ * `prior` in place, except that an explicitly undefined argument with
1582
+ * effects binds `prior` and then runs those effects, as JavaScript does. */
1583
+ function withBufEncoding(lowerer, enc, loc, prior, build, passRaw = false) {
1584
+ if ("literal" in enc) {
1585
+ const encoding = { kind: "strLit", value: enc.literal, type: STRING, loc };
1586
+ if (!enc.effects || isSafeToDiscard(enc.effects))
1587
+ return build(prior, encoding);
1588
+ // An explicitly undefined argument that still has effects runs where
1589
+ // JavaScript evaluates it — after the receiver and the preceding
1590
+ // arguments, before the call — so bind those first.
1591
+ const stmts = [];
1592
+ const args = prior.map((expr) => {
1593
+ const local = lowerer.declareHiddenLocal("%bufferArgument", expr.type);
1594
+ stmts.push({ kind: "varDecl", localId: local.id, init: expr, loc });
1595
+ return varRef(local.id, expr.type, loc);
1596
+ });
1597
+ stmts.push({ kind: "exprStmt", expr: enc.effects, loc });
1598
+ const result = build(args, encoding);
1599
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
1600
+ }
1601
+ const stmts = [];
1602
+ const args = prior.map((expr) => {
1603
+ const local = lowerer.declareHiddenLocal("%bufferArgument", expr.type);
1604
+ stmts.push({ kind: "varDecl", localId: local.id, init: expr, loc });
1605
+ return varRef(local.id, expr.type, loc);
1606
+ });
1607
+ let encoding = enc.raw;
1608
+ if (!passRaw) {
1609
+ const nameLocal = lowerer.declareHiddenLocal("%bufferEncoding", STRING);
1610
+ stmts.push({
1611
+ kind: "varDecl",
1612
+ localId: nameLocal.id,
1613
+ init: normalizeBufEncoding(enc, loc),
1614
+ loc,
1615
+ });
1616
+ encoding = varRef(nameLocal.id, STRING, loc);
1617
+ }
1618
+ const result = build(args, encoding);
1619
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
1620
+ }
1621
+ /** The search's unit: Buffer compares whole 2-byte units under utf16le and
1622
+ * searches byte by byte under every other encoding. */
1623
+ function bufEncodingAlign(enc, encoding, loc) {
1624
+ if ("literal" in enc)
1625
+ return numLit(enc.literal === "utf16le" ? 2 : 1, loc);
1626
+ return {
1627
+ kind: "ternary",
1628
+ cond: {
1629
+ kind: "strEq",
1630
+ negated: false,
1631
+ left: encoding,
1632
+ right: { kind: "strLit", value: "utf16le", type: STRING, loc },
1633
+ type: BOOL,
1634
+ loc,
1635
+ },
1636
+ then: numLit(2, loc),
1637
+ else_: numLit(1, loc),
1638
+ type: F64,
1639
+ loc,
1640
+ };
1641
+ }
1447
1642
  const BUF_BIGINT_METHODS = {
1448
1643
  readBigInt64BE: { sign: true, le: false },
1449
1644
  readBigInt64LE: { sign: true, le: true },
@@ -1458,6 +1653,20 @@ const BUF_BIGINT_METHODS = {
1458
1653
  writeBigUint64BE: { sign: false, le: false },
1459
1654
  writeBigUint64LE: { sign: false, le: true },
1460
1655
  };
1656
+ /** The Buffer methods whose arguments JavaScript may pass as other values
1657
+ * (Node converts them): the offset positions, the encoding position, and the
1658
+ * static type of the result. */
1659
+ const JS_COERCED_OFFSET_SLOTS = {
1660
+ copy: { slots: [1, 2, 3], result: F64 },
1661
+ toString: { slots: [1, 2], encoding: 0, result: STRING },
1662
+ slice: { slots: [0, 1], result: BYTES_U8 },
1663
+ subarray: { slots: [0, 1], result: BYTES_U8 },
1664
+ };
1665
+ /** Whether an argument is statically of `kind` or undefined. */
1666
+ function kindOrUndefinedArgument(lowerer, arg, kind) {
1667
+ const t = lowerer.mapTypeOf(lowerer.typeOf(arg));
1668
+ return t?.kind === kind || (t !== undefined && t !== null && isUnitType(t));
1669
+ }
1461
1670
  /** Whether every argument of a numeric read/write is statically a number. */
1462
1671
  function numericArguments(lowerer, call) {
1463
1672
  return call.arguments.nodes.every((a) => lowerer.mapTypeOf(lowerer.typeOf(a))?.kind === "f64");
@@ -1509,7 +1718,15 @@ function lowerBufferInstanceMethod(lowerer, call, access, name, loc) {
1509
1718
  const nArgs = args.length;
1510
1719
  if (args.some(ts.isSpreadElement))
1511
1720
  return null;
1512
- const isStringArg = (i) => lowerer.mapTypeOf(lowerer.typeOf(args[i]))?.kind === "string";
1721
+ // A trailing argument Node reads as the encoding: a string, or a string
1722
+ // that a caller may leave undefined (`enc?: BufferEncoding`). Node treats
1723
+ // an undefined encoding as utf8 and an undefined position as the default,
1724
+ // so the two readings agree.
1725
+ const isEncodingArg = (i) => {
1726
+ const t = lowerer.typeOf(args[i]);
1727
+ const arms = t.flags & ts.TypeFlags.Union ? constituentTypes(t) : [t];
1728
+ return arms.every((arm) => (arm.flags & (ts.TypeFlags.StringLike | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0);
1729
+ };
1513
1730
  const u8Arg = (i) => {
1514
1731
  const v = lowerer.lowerExpr(args[i]);
1515
1732
  if (!(v.type.kind === "bytes" && v.type.elem === "u8")) {
@@ -1584,58 +1801,109 @@ function lowerBufferInstanceMethod(lowerer, call, access, name, loc) {
1584
1801
  lowerer.noLowering(`.${name} with ${nArgs} arguments`, call);
1585
1802
  // The overloads: (v), (v, byteOffset), (v, encoding), (v, byteOffset,
1586
1803
  // encoding) — a trailing string-typed arg is the encoding.
1587
- let encName = "utf8";
1804
+ let encNode;
1588
1805
  let offNode;
1589
1806
  if (nArgs === 3) {
1590
1807
  offNode = args[1];
1591
- encName = bufEncoding(lowerer, `.${name}`, args[2]);
1808
+ encNode = args[2];
1592
1809
  }
1593
1810
  else if (nArgs === 2) {
1594
- if (isStringArg(1))
1595
- encName = bufEncoding(lowerer, `.${name}`, args[1]);
1811
+ if (isEncodingArg(1))
1812
+ encNode = args[1];
1596
1813
  else
1597
1814
  offNode = args[1];
1598
1815
  }
1599
1816
  const resultT = name === "includes" ? BOOL : F64;
1600
1817
  const vT = lowerer.mapTypeOf(lowerer.typeOf(args[0]));
1601
1818
  const receiver = lowerer.lowerExprExpecting(access.expression, BYTES_U8);
1819
+ const off = offNode ? lowerer.lowerExprExpecting(offNode, F64) : undefined;
1602
1820
  if (vT?.kind === "f64") {
1603
- // A number needle wraps & 0xFF at runtime (Buffer semantics; the
1604
- // encoding is irrelevant, like Node).
1821
+ // A number needle wraps & 0xFF at runtime (Buffer semantics). Node
1822
+ // reads the encoding only for string and Buffer needles, but the
1823
+ // argument itself still evaluates.
1605
1824
  const v = lowerer.lowerExprExpecting(args[0], F64);
1606
- const numArgs = [v, ...(offNode ? [lowerer.lowerExprExpecting(offNode, F64)] : [])];
1825
+ const numArgs = [v, ...(off ? [off] : [])];
1607
1826
  const method = name === "indexOf"
1608
1827
  ? "indexOfNum"
1609
1828
  : name === "lastIndexOf"
1610
1829
  ? "lastIndexOfNum"
1611
1830
  : "includesNum";
1612
- return { kind: "bytesIntrinsic", method, receiver, args: numArgs, type: resultT, loc };
1831
+ const result = {
1832
+ kind: "bytesIntrinsic",
1833
+ method,
1834
+ receiver,
1835
+ args: numArgs,
1836
+ type: resultT,
1837
+ loc,
1838
+ };
1839
+ if (encNode === undefined)
1840
+ return result;
1841
+ // The encoding does not name anything for a number needle; only its
1842
+ // expression runs, after the other arguments.
1843
+ const extra = lowerer.lowerExpr(encNode);
1844
+ if (isSafeToDiscard(extra))
1845
+ return result;
1846
+ const stmts = [];
1847
+ const bound = [receiver, ...numArgs].map((expr) => {
1848
+ const local = lowerer.declareHiddenLocal("%bufferArgument", expr.type);
1849
+ stmts.push({ kind: "varDecl", localId: local.id, init: expr, loc });
1850
+ return varRef(local.id, expr.type, loc);
1851
+ });
1852
+ stmts.push({ kind: "exprStmt", expr: extra, loc });
1853
+ return {
1854
+ kind: "seqExpr",
1855
+ stmts,
1856
+ result: {
1857
+ kind: "bytesIntrinsic",
1858
+ method,
1859
+ receiver: bound[0],
1860
+ args: bound.slice(1),
1861
+ type: resultT,
1862
+ loc,
1863
+ },
1864
+ type: resultT,
1865
+ loc,
1866
+ };
1613
1867
  }
1614
- let needle;
1615
- let align = 1;
1616
1868
  if (vT?.kind === "string") {
1869
+ // Buffer compares the encoded needle. A run-time encoding is
1870
+ // normalized after every argument, so an unknown name throws Node's
1871
+ // ERR_UNKNOWN_ENCODING before the search.
1872
+ const enc = encNode
1873
+ ? bufEncodingArgument(lowerer, `.${name}`, encNode, "strict", loc)
1874
+ : { literal: "utf8" };
1617
1875
  const s = lowerer.lowerExprExpecting(args[0], STRING);
1618
- const enc = { kind: "strLit", value: encName, type: STRING, loc };
1619
- needle = { kind: "libCall", fn: "buffer.fromStr", args: [s, enc], type: BYTES_U8, loc };
1620
- if (encName === "utf16le")
1621
- align = 2;
1622
- }
1623
- else if (vT?.kind === "bytes" && vT.elem === "u8") {
1624
- needle = lowerer.lowerExpr(args[0]);
1625
- // A Buffer needle under utf16le also searches whole 2-byte units.
1626
- if (encName === "utf16le")
1627
- align = 2;
1628
- }
1629
- else {
1630
- lowerer.noLowering(`.${name} of '${lowerer.checker.typeToString(lowerer.typeOf(args[0]))}' values`, args[0], "string, number, and Buffer/Uint8Array needles search (narrow unions first)");
1876
+ return withBufEncoding(lowerer, enc, loc, [receiver, s, ...(off ? [off] : [])], ([recv, sRef, offRef], encoding) => ({
1877
+ kind: "bytesIntrinsic",
1878
+ method: name,
1879
+ receiver: recv,
1880
+ args: [
1881
+ { kind: "libCall", fn: "buffer.fromStr", args: [sRef, encoding], type: BYTES_U8, loc },
1882
+ bufEncodingAlign(enc, encoding, loc),
1883
+ ...(offRef ? [offRef] : []),
1884
+ ],
1885
+ type: resultT,
1886
+ loc,
1887
+ }));
1888
+ }
1889
+ if (vT?.kind === "bytes" && vT.elem === "u8") {
1890
+ // A Buffer needle searches byte by byte; only utf16le searches whole
1891
+ // 2-byte units. Node reads an unknown name as utf8 here, without
1892
+ // throwing.
1893
+ const enc = encNode
1894
+ ? bufEncodingArgument(lowerer, `.${name}`, encNode, "utf8Fallback", loc)
1895
+ : { literal: "utf8" };
1896
+ const needle = lowerer.lowerExpr(args[0]);
1897
+ return withBufEncoding(lowerer, enc, loc, [receiver, needle, ...(off ? [off] : [])], ([recv, needleRef, offRef], encoding) => ({
1898
+ kind: "bytesIntrinsic",
1899
+ method: name,
1900
+ receiver: recv,
1901
+ args: [needleRef, bufEncodingAlign(enc, encoding, loc), ...(offRef ? [offRef] : [])],
1902
+ type: resultT,
1903
+ loc,
1904
+ }));
1631
1905
  }
1632
- const alignLit = { kind: "numLit", value: align, type: F64, loc };
1633
- const searchArgs = [
1634
- needle,
1635
- alignLit,
1636
- ...(offNode ? [lowerer.lowerExprExpecting(offNode, F64)] : []),
1637
- ];
1638
- return { kind: "bytesIntrinsic", method: name, receiver, args: searchArgs, type: resultT, loc };
1906
+ lowerer.noLowering(`.${name} of '${lowerer.checker.typeToString(lowerer.typeOf(args[0]))}' values`, args[0], "string, number, and Buffer/Uint8Array needles search (narrow unions first)");
1639
1907
  }
1640
1908
  if (name === "fill") {
1641
1909
  if (nArgs < 1 || nArgs > 4)
@@ -1643,7 +1911,7 @@ function lowerBufferInstanceMethod(lowerer, call, access, name, loc) {
1643
1911
  // A trailing string-typed arg past the value is the encoding.
1644
1912
  let encNode;
1645
1913
  let idxNodes = call.arguments.nodes.slice(1);
1646
- if (idxNodes.length > 0 && isStringArg(nArgs - 1)) {
1914
+ if (idxNodes.length > 0 && isEncodingArg(nArgs - 1)) {
1647
1915
  encNode = idxNodes[idxNodes.length - 1];
1648
1916
  idxNodes = idxNodes.slice(0, -1);
1649
1917
  }
@@ -1656,17 +1924,20 @@ function lowerBufferInstanceMethod(lowerer, call, access, name, loc) {
1656
1924
  const vT = lowerer.mapTypeOf(lowerer.typeOf(args[0]));
1657
1925
  const receiver = lowerer.lowerExprExpecting(access.expression, BYTES_U8);
1658
1926
  if (vT?.kind === "string") {
1659
- const encName = encNode ? bufEncoding(lowerer, ".fill", encNode) : "utf8";
1927
+ // fill's normalization reads an empty encoding as utf8; an unknown
1928
+ // one throws before the range validates, as in Node.
1929
+ const enc = encNode
1930
+ ? bufEncodingArgument(lowerer, ".fill", encNode, "emptyUtf8", loc)
1931
+ : { literal: "utf8" };
1660
1932
  const s = lowerer.lowerExprExpecting(args[0], STRING);
1661
- const enc = { kind: "strLit", value: encName, type: STRING, loc };
1662
- return {
1933
+ return withBufEncoding(lowerer, enc, loc, [receiver, s, ...idx], ([recv, sRef, ...idxRefs], encoding) => ({
1663
1934
  kind: "bytesIntrinsic",
1664
1935
  method: "fillStr",
1665
- receiver,
1666
- args: [s, enc, ...idx],
1936
+ receiver: recv,
1937
+ args: [sRef, encoding, ...idxRefs],
1667
1938
  type: BYTES_U8,
1668
1939
  loc,
1669
- };
1940
+ }));
1670
1941
  }
1671
1942
  if (encNode)
1672
1943
  lowerer.noLowering(".fill with an encoding on a non-string value", encNode);
@@ -1694,6 +1965,28 @@ function lowerBufferInstanceMethod(lowerer, call, access, name, loc) {
1694
1965
  if (name === "copy") {
1695
1966
  if (nArgs < 1 || nArgs > 4)
1696
1967
  lowerer.noLowering(`.copy with ${nArgs} arguments`, call);
1968
+ // Node's copyImpl accepts any ArrayBuffer view as the target and
1969
+ // measures every offset in bytes over it, so a target of another
1970
+ // element type runs as the checked-dynamic method, which re-views it
1971
+ // over its bytes before the copy.
1972
+ const targetIr = lowerer.mapTypeOf(lowerer.typeOf(args[0]));
1973
+ if (targetIr?.kind === "bytes" && targetIr.elem !== "u8") {
1974
+ const receiver = lowerer.lowerExprExpecting(access.expression, BYTES_U8);
1975
+ return {
1976
+ kind: "dynCheck",
1977
+ value: {
1978
+ kind: "dynInvoke",
1979
+ recv: { kind: "dynFrom", value: receiver, type: DYN, loc, liveRef: true },
1980
+ method: name,
1981
+ calleeName: ts.getTextOfNode(access),
1982
+ args: call.arguments.nodes.map((a) => lowerer.lowerExprExpecting(a, DYN)),
1983
+ type: DYN,
1984
+ loc,
1985
+ },
1986
+ type: F64,
1987
+ loc,
1988
+ };
1989
+ }
1697
1990
  const target = u8Arg(0);
1698
1991
  const idx = call.arguments.nodes.slice(1).map((a) => lowerer.lowerExprExpecting(a, F64));
1699
1992
  const receiver = lowerer.lowerExprExpecting(access.expression, BYTES_U8);
@@ -1719,33 +2012,41 @@ function lowerBufferInstanceMethod(lowerer, call, access, name, loc) {
1719
2012
  // (str, offset, length), (str, offset, length, enc).
1720
2013
  let encNode;
1721
2014
  let idxNodes = call.arguments.nodes.slice(1);
1722
- if (idxNodes.length > 0 && isStringArg(nArgs - 1)) {
2015
+ if (idxNodes.length > 0 && isEncodingArg(nArgs - 1)) {
1723
2016
  encNode = idxNodes[idxNodes.length - 1];
1724
2017
  idxNodes = idxNodes.slice(0, -1);
1725
2018
  }
1726
2019
  if (idxNodes.length > 2)
1727
2020
  lowerer.noLowering(`.write with ${nArgs} arguments`, call);
1728
- const encName = encNode ? bufEncoding(lowerer, "Buffer.write", encNode) : "utf8";
2021
+ // write reads an empty encoding as utf8 and throws on any other name
2022
+ // Node does not know, after the offset and length validate.
2023
+ const enc = encNode
2024
+ ? bufEncodingArgument(lowerer, "Buffer.write", encNode, "emptyUtf8", loc)
2025
+ : { literal: "utf8" };
1729
2026
  const s = lowerer.lowerExprExpecting(args[0], STRING);
1730
- const enc = { kind: "strLit", value: encName, type: STRING, loc };
1731
2027
  const offset = idxNodes[0]
1732
2028
  ? lowerer.lowerExprExpecting(idxNodes[0], F64)
1733
2029
  : { kind: "numLit", value: 0, type: F64, loc };
1734
- const writeArgs = [
1735
- s,
1736
- enc,
1737
- offset,
1738
- ...(idxNodes[1] ? [lowerer.lowerExprExpecting(idxNodes[1], F64)] : []),
1739
- ];
1740
2030
  const receiver = lowerer.lowerExprExpecting(access.expression, BYTES_U8);
1741
- return {
1742
- kind: "bytesIntrinsic",
1743
- method: "writeStr",
1744
- receiver,
1745
- args: writeArgs,
1746
- type: F64,
1747
- loc,
1748
- };
2031
+ const length = idxNodes[1] ? lowerer.lowerExprExpecting(idxNodes[1], F64) : undefined;
2032
+ // A run-time name stays raw: Node reports a bad offset or length before
2033
+ // it looks the name up, so the runtime entry normalizes it afterwards.
2034
+ return withBufEncoding(lowerer, enc, loc, [receiver, s, offset, ...(length ? [length] : [])], ([recv, sRef, offsetRef, lengthRef], encoding) => "literal" in enc
2035
+ ? {
2036
+ kind: "bytesIntrinsic",
2037
+ method: "writeStr",
2038
+ receiver: recv,
2039
+ args: [sRef, encoding, offsetRef, ...(lengthRef ? [lengthRef] : [])],
2040
+ type: F64,
2041
+ loc,
2042
+ }
2043
+ : {
2044
+ kind: "libCall",
2045
+ fn: length ? "buffer.writeStrDynLen" : "buffer.writeStrDyn",
2046
+ args: [recv, sRef, encoding, offsetRef, ...(lengthRef ? [lengthRef] : [])],
2047
+ type: F64,
2048
+ loc,
2049
+ }, !("literal" in enc));
1749
2050
  }
1750
2051
  return null;
1751
2052
  }
@@ -2228,14 +2529,54 @@ function lowerBufferStaticValue(lowerer, call, access) {
2228
2529
  // the fresh buffer is the receiver of a whole-range fill.
2229
2530
  const fillT = lowerer.mapTypeOf(lowerer.typeOf(args[1]));
2230
2531
  if (fillT?.kind === "string") {
2231
- const encName = args[2] ? bufEncoding(lowerer, "Buffer.alloc", args[2]) : "utf8";
2532
+ const enc = args[2]
2533
+ ? bufEncodingArgument(lowerer, "Buffer.alloc", args[2], "emptyUtf8", loc)
2534
+ : { literal: "utf8" };
2232
2535
  const s = lowerer.lowerExprExpecting(args[1], STRING);
2233
- const enc = { kind: "strLit", value: encName, type: STRING, loc };
2536
+ if ("literal" in enc) {
2537
+ return withBufEncoding(lowerer, enc, loc, [size, s], ([sizeExpr, fillExpr], encoding) => ({
2538
+ kind: "bytesIntrinsic",
2539
+ method: "fillStr",
2540
+ receiver: { kind: "libCall", fn, args: [sizeExpr], type: BYTES_U8, loc },
2541
+ args: [fillExpr, encoding],
2542
+ type: BYTES_U8,
2543
+ loc,
2544
+ }));
2545
+ }
2546
+ // Node allocates before _fill resolves the name, and runs no fill at
2547
+ // all when the size is zero, so the normalization and its throw are
2548
+ // inside the size > 0 branch.
2549
+ const sizeLocal = lowerer.declareHiddenLocal("%allocSize", F64);
2550
+ const fillLocal = lowerer.declareHiddenLocal("%allocFill", STRING);
2551
+ const encLocal = lowerer.declareHiddenLocal("%bufferEncoding", STRING);
2552
+ const sizeRef = varRef(sizeLocal.id, F64, loc);
2553
+ const alloc = () => ({ kind: "libCall", fn, args: [sizeRef], type: BYTES_U8, loc });
2554
+ const result = {
2555
+ kind: "ternary",
2556
+ cond: { kind: "bin", op: ">", left: sizeRef, right: numLit(0, loc), type: BOOL, loc },
2557
+ then: {
2558
+ kind: "bytesIntrinsic",
2559
+ method: "fillStr",
2560
+ receiver: alloc(),
2561
+ args: [
2562
+ varRef(fillLocal.id, STRING, loc),
2563
+ normalizeBufEncoding({ raw: varRef(encLocal.id, STRING, loc), mode: enc.mode }, loc),
2564
+ ],
2565
+ type: BYTES_U8,
2566
+ loc,
2567
+ },
2568
+ else_: alloc(),
2569
+ type: BYTES_U8,
2570
+ loc,
2571
+ };
2234
2572
  return {
2235
- kind: "bytesIntrinsic",
2236
- method: "fillStr",
2237
- receiver: fresh,
2238
- args: [s, enc],
2573
+ kind: "seqExpr",
2574
+ stmts: [
2575
+ { kind: "varDecl", localId: sizeLocal.id, init: size, loc },
2576
+ { kind: "varDecl", localId: fillLocal.id, init: s, loc },
2577
+ { kind: "varDecl", localId: encLocal.id, init: enc.raw, loc },
2578
+ ],
2579
+ result,
2239
2580
  type: BYTES_U8,
2240
2581
  loc,
2241
2582
  };
@@ -2420,26 +2761,31 @@ function lowerBufferStaticValue(lowerer, call, access) {
2420
2761
  if (args.length >= 1 && args.length <= 2 && !ts.isSpreadElement(args[0])) {
2421
2762
  const srcIr = lowerer.mapTypeOf(lowerer.typeOf(args[0]));
2422
2763
  if (srcIr?.kind === "string") {
2423
- const encName = args[1] ? bufEncoding(lowerer, "Buffer.byteLength", args[1]) : "utf8";
2764
+ // Node reads an unknown or empty name as utf8 here, without throwing.
2765
+ const enc = args[1]
2766
+ ? bufEncodingArgument(lowerer, "Buffer.byteLength", args[1], "utf8Fallback", loc)
2767
+ : { literal: "utf8" };
2424
2768
  const s = lowerer.lowerExprExpecting(args[0], STRING);
2425
- const enc = { kind: "strLit", value: encName, type: STRING, loc };
2426
- return { kind: "libCall", fn: "buffer.byteLenStr", args: [s, enc], type: F64, loc };
2427
- }
2428
- if ((srcIr === null || srcIr.kind === "dyn") &&
2429
- (!args[1] || ts.isStringLiteralLike(args[1]))) {
2430
- const encoding = {
2431
- kind: "strLit",
2432
- value: args[1] ? bufEncoding(lowerer, "Buffer.byteLength", args[1]) : "utf8",
2433
- type: STRING,
2769
+ return withBufEncoding(lowerer, enc, loc, [s], ([sRef], encoding) => ({
2770
+ kind: "libCall",
2771
+ fn: "buffer.byteLenStr",
2772
+ args: [sRef, encoding],
2773
+ type: F64,
2434
2774
  loc,
2435
- };
2436
- return {
2775
+ }));
2776
+ }
2777
+ if (srcIr === null || srcIr.kind === "dyn") {
2778
+ const enc = args[1]
2779
+ ? bufEncodingArgument(lowerer, "Buffer.byteLength", args[1], "utf8Fallback", loc)
2780
+ : { literal: "utf8" };
2781
+ const source = lowerer.lowerExprExpecting(args[0], DYN);
2782
+ return withBufEncoding(lowerer, enc, loc, [source], ([srcRef], encoding) => ({
2437
2783
  kind: "libCall",
2438
2784
  fn: "buffer.byteLenDyn",
2439
- args: [lowerer.lowerExprExpecting(args[0], DYN), encoding],
2785
+ args: [srcRef, encoding],
2440
2786
  type: F64,
2441
2787
  loc,
2442
- };
2788
+ }));
2443
2789
  }
2444
2790
  if (srcIr?.kind === "bytes" && args.length === 1) {
2445
2791
  const receiver = lowerer.lowerExpr(args[0]);
@@ -2516,10 +2862,24 @@ export function lowerBufferPrototypeMember(lowerer, expr) {
2516
2862
  : lowerer.lowerExprExpecting(expr.argumentExpression, DYN);
2517
2863
  return { kind: "libCall", fn: "buffer.prototypeMember", args: [key], type: DYN, loc };
2518
2864
  }
2865
+ /** `Buffer.prototype` read as a value in JavaScript (`const p =
2866
+ * Buffer.prototype; p[\`write${name}\`]`, Object.getOwnPropertyNames over it):
2867
+ * the object scr_buffer_prototype_object answers. Null for other
2868
+ * expressions, and for `Buffer.prototype.<name>` and
2869
+ * `Buffer.prototype[key]`, which lowerBufferPrototypeMember answers. */
2870
+ export function lowerBufferPrototypeObject(lowerer, expr) {
2871
+ if (expr.questionDotToken ||
2872
+ expr.name.text !== "prototype" ||
2873
+ !isJsSourceFile(expr.getSourceFile()) ||
2874
+ stdlibGlobalNameOf(lowerer, expr.expression) !== "Buffer")
2875
+ return null;
2876
+ return { kind: "libCall", fn: "buffer.prototypeObject", args: [], type: DYN, loc: locOf(expr) };
2877
+ }
2519
2878
  const BUFFER_VALUE_FNS = new Set([
2520
2879
  "buffer.constructor",
2521
2880
  "buffer.staticValue",
2522
2881
  "buffer.prototypeMember",
2882
+ "buffer.prototypeObject",
2523
2883
  ]);
2524
2884
  /** A program that reads the Buffer function's value installs it in %main,
2525
2885
  * so a Buffer's `.constructor` answers the same function. */