@soundscript/soundscript 0.1.13 → 0.1.15

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 (441) hide show
  1. package/package.json +15 -6
  2. package/project-transform/index.js +2 -0
  3. package/project-transform/index.ts +8 -0
  4. package/project-transform/src/annotation_syntax.js +948 -0
  5. package/project-transform/src/annotation_syntax.ts +1217 -0
  6. package/project-transform/src/build_package.js +475 -0
  7. package/project-transform/src/build_package.ts +683 -0
  8. package/project-transform/src/bundled/portable-web-globals.d.ts +153 -0
  9. package/project-transform/src/bundled/runtime_externs.js +220 -0
  10. package/project-transform/src/bundled/runtime_externs.ts +237 -0
  11. package/project-transform/src/bundled/sound-libs/lib.decorators.d.ts +385 -0
  12. package/project-transform/src/bundled/sound-libs/lib.decorators.legacy.d.ts +22 -0
  13. package/project-transform/src/bundled/sound-libs/lib.dom.asynciterable.d.ts +42 -0
  14. package/project-transform/src/bundled/sound-libs/lib.dom.d.ts +39440 -0
  15. package/project-transform/src/bundled/sound-libs/lib.es2015.collection.d.ts +149 -0
  16. package/project-transform/src/bundled/sound-libs/lib.es2015.core.d.ts +657 -0
  17. package/project-transform/src/bundled/sound-libs/lib.es2015.d.ts +28 -0
  18. package/project-transform/src/bundled/sound-libs/lib.es2015.generator.d.ts +77 -0
  19. package/project-transform/src/bundled/sound-libs/lib.es2015.iterable.d.ts +616 -0
  20. package/project-transform/src/bundled/sound-libs/lib.es2015.promise.d.ts +80 -0
  21. package/project-transform/src/bundled/sound-libs/lib.es2015.proxy.d.ts +128 -0
  22. package/project-transform/src/bundled/sound-libs/lib.es2015.reflect.d.ts +144 -0
  23. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.d.ts +46 -0
  24. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.wellknown.d.ts +170 -0
  25. package/project-transform/src/bundled/sound-libs/lib.es2016.array.include.d.ts +116 -0
  26. package/project-transform/src/bundled/sound-libs/lib.es2016.d.ts +21 -0
  27. package/project-transform/src/bundled/sound-libs/lib.es2017.arraybuffer.d.ts +21 -0
  28. package/project-transform/src/bundled/sound-libs/lib.es2017.d.ts +26 -0
  29. package/project-transform/src/bundled/sound-libs/lib.es2017.date.d.ts +31 -0
  30. package/project-transform/src/bundled/sound-libs/lib.es2017.object.d.ts +49 -0
  31. package/project-transform/src/bundled/sound-libs/lib.es2017.string.d.ts +45 -0
  32. package/project-transform/src/bundled/sound-libs/lib.es2017.typedarrays.d.ts +53 -0
  33. package/project-transform/src/bundled/sound-libs/lib.es2018.asyncgenerator.d.ts +77 -0
  34. package/project-transform/src/bundled/sound-libs/lib.es2018.asynciterable.d.ts +57 -0
  35. package/project-transform/src/bundled/sound-libs/lib.es2018.d.ts +24 -0
  36. package/project-transform/src/bundled/sound-libs/lib.es2018.promise.d.ts +30 -0
  37. package/project-transform/src/bundled/sound-libs/lib.es2018.regexp.d.ts +37 -0
  38. package/project-transform/src/bundled/sound-libs/lib.es2019.array.d.ts +79 -0
  39. package/project-transform/src/bundled/sound-libs/lib.es2019.d.ts +24 -0
  40. package/project-transform/src/bundled/sound-libs/lib.es2019.object.d.ts +47 -0
  41. package/project-transform/src/bundled/sound-libs/lib.es2019.string.d.ts +37 -0
  42. package/project-transform/src/bundled/sound-libs/lib.es2019.symbol.d.ts +24 -0
  43. package/project-transform/src/bundled/sound-libs/lib.es2020.bigint.d.ts +765 -0
  44. package/project-transform/src/bundled/sound-libs/lib.es2020.d.ts +27 -0
  45. package/project-transform/src/bundled/sound-libs/lib.es2020.date.d.ts +42 -0
  46. package/project-transform/src/bundled/sound-libs/lib.es2020.number.d.ts +28 -0
  47. package/project-transform/src/bundled/sound-libs/lib.es2020.promise.d.ts +49 -0
  48. package/project-transform/src/bundled/sound-libs/lib.es2020.string.d.ts +44 -0
  49. package/project-transform/src/bundled/sound-libs/lib.es2020.symbol.wellknown.d.ts +41 -0
  50. package/project-transform/src/bundled/sound-libs/lib.es2021.d.ts +23 -0
  51. package/project-transform/src/bundled/sound-libs/lib.es2021.promise.d.ts +48 -0
  52. package/project-transform/src/bundled/sound-libs/lib.es2021.string.d.ts +33 -0
  53. package/project-transform/src/bundled/sound-libs/lib.es2021.weakref.d.ts +78 -0
  54. package/project-transform/src/bundled/sound-libs/lib.es2022.array.d.ts +121 -0
  55. package/project-transform/src/bundled/sound-libs/lib.es2022.d.ts +25 -0
  56. package/project-transform/src/bundled/sound-libs/lib.es2022.error.d.ts +75 -0
  57. package/project-transform/src/bundled/sound-libs/lib.es2022.object.d.ts +26 -0
  58. package/project-transform/src/bundled/sound-libs/lib.es2022.regexp.d.ts +39 -0
  59. package/project-transform/src/bundled/sound-libs/lib.es2022.string.d.ts +25 -0
  60. package/project-transform/src/bundled/sound-libs/lib.es2023.array.d.ts +924 -0
  61. package/project-transform/src/bundled/sound-libs/lib.es2023.collection.d.ts +21 -0
  62. package/project-transform/src/bundled/sound-libs/lib.es2023.d.ts +22 -0
  63. package/project-transform/src/bundled/sound-libs/lib.es2024.arraybuffer.d.ts +65 -0
  64. package/project-transform/src/bundled/sound-libs/lib.es2024.collection.d.ts +29 -0
  65. package/project-transform/src/bundled/sound-libs/lib.es2024.d.ts +26 -0
  66. package/project-transform/src/bundled/sound-libs/lib.es2024.object.d.ts +33 -0
  67. package/project-transform/src/bundled/sound-libs/lib.es2024.promise.d.ts +35 -0
  68. package/project-transform/src/bundled/sound-libs/lib.es2024.regexp.d.ts +25 -0
  69. package/project-transform/src/bundled/sound-libs/lib.es2024.string.d.ts +29 -0
  70. package/project-transform/src/bundled/sound-libs/lib.es5.d.ts +4924 -0
  71. package/project-transform/src/bundled/sound_stdlib.js +142 -0
  72. package/project-transform/src/bundled/sound_stdlib.ts +180 -0
  73. package/project-transform/src/checker/analyze_project.js +1361 -0
  74. package/project-transform/src/checker/analyze_project.ts +2246 -0
  75. package/project-transform/src/checker/diagnostics.js +112 -0
  76. package/project-transform/src/checker/diagnostics.ts +222 -0
  77. package/project-transform/src/checker/engine/context.js +235 -0
  78. package/project-transform/src/checker/engine/context.ts +340 -0
  79. package/project-transform/src/checker/engine/diagnostic_codes.js +72 -0
  80. package/project-transform/src/checker/engine/diagnostic_codes.ts +95 -0
  81. package/project-transform/src/checker/engine/facts.js +35 -0
  82. package/project-transform/src/checker/engine/facts.ts +48 -0
  83. package/project-transform/src/checker/engine/types.js +1 -0
  84. package/project-transform/src/checker/engine/types.ts +485 -0
  85. package/project-transform/src/checker/proof_escape_hatch_diagnostics.js +104 -0
  86. package/project-transform/src/checker/proof_escape_hatch_diagnostics.ts +173 -0
  87. package/project-transform/src/checker/rules/async_surface.js +231 -0
  88. package/project-transform/src/checker/rules/async_surface.ts +335 -0
  89. package/project-transform/src/checker/rules/class_lifecycle.js +798 -0
  90. package/project-transform/src/checker/rules/class_lifecycle.ts +1276 -0
  91. package/project-transform/src/checker/rules/directive_validation.js +571 -0
  92. package/project-transform/src/checker/rules/directive_validation.ts +938 -0
  93. package/project-transform/src/checker/rules/directives.js +23 -0
  94. package/project-transform/src/checker/rules/directives.ts +25 -0
  95. package/project-transform/src/checker/rules/flow.js +202 -0
  96. package/project-transform/src/checker/rules/flow.ts +333 -0
  97. package/project-transform/src/checker/rules/flow_facts.js +601 -0
  98. package/project-transform/src/checker/rules/flow_facts.ts +978 -0
  99. package/project-transform/src/checker/rules/flow_invalidation.js +1119 -0
  100. package/project-transform/src/checker/rules/flow_invalidation.ts +2150 -0
  101. package/project-transform/src/checker/rules/flow_shared.js +2822 -0
  102. package/project-transform/src/checker/rules/flow_shared.ts +4383 -0
  103. package/project-transform/src/checker/rules/foreign_boundary.js +120 -0
  104. package/project-transform/src/checker/rules/foreign_boundary.ts +196 -0
  105. package/project-transform/src/checker/rules/foreign_projection.js +279 -0
  106. package/project-transform/src/checker/rules/foreign_projection.ts +425 -0
  107. package/project-transform/src/checker/rules/generated_helpers.js +13 -0
  108. package/project-transform/src/checker/rules/generated_helpers.ts +18 -0
  109. package/project-transform/src/checker/rules/index.js +35 -0
  110. package/project-transform/src/checker/rules/index.ts +49 -0
  111. package/project-transform/src/checker/rules/namespace_object.js +845 -0
  112. package/project-transform/src/checker/rules/namespace_object.ts +1224 -0
  113. package/project-transform/src/checker/rules/non_ordinary_recovery.js +1328 -0
  114. package/project-transform/src/checker/rules/non_ordinary_recovery.ts +2391 -0
  115. package/project-transform/src/checker/rules/null_prototype.js +3 -0
  116. package/project-transform/src/checker/rules/null_prototype.ts +6 -0
  117. package/project-transform/src/checker/rules/overloads.js +181 -0
  118. package/project-transform/src/checker/rules/overloads.ts +317 -0
  119. package/project-transform/src/checker/rules/predicate_verification.js +691 -0
  120. package/project-transform/src/checker/rules/predicate_verification.ts +1088 -0
  121. package/project-transform/src/checker/rules/prototype_hardening.js +237 -0
  122. package/project-transform/src/checker/rules/prototype_hardening.ts +343 -0
  123. package/project-transform/src/checker/rules/receiver_discipline.js +263 -0
  124. package/project-transform/src/checker/rules/receiver_discipline.ts +356 -0
  125. package/project-transform/src/checker/rules/relations.js +6861 -0
  126. package/project-transform/src/checker/rules/relations.ts +12158 -0
  127. package/project-transform/src/checker/rules/resolved_builtins.js +274 -0
  128. package/project-transform/src/checker/rules/resolved_builtins.ts +438 -0
  129. package/project-transform/src/checker/rules/trust.js +217 -0
  130. package/project-transform/src/checker/rules/trust.ts +301 -0
  131. package/project-transform/src/checker/rules/type_guards.js +173 -0
  132. package/project-transform/src/checker/rules/type_guards.ts +257 -0
  133. package/project-transform/src/checker/rules/universal.js +17 -0
  134. package/project-transform/src/checker/rules/universal.ts +22 -0
  135. package/project-transform/src/checker/rules/unsafe_value_origin.js +80 -0
  136. package/project-transform/src/checker/rules/unsafe_value_origin.ts +125 -0
  137. package/project-transform/src/checker/rules/unsound_imports.js +218 -0
  138. package/project-transform/src/checker/rules/unsound_imports.ts +301 -0
  139. package/project-transform/src/checker/rules/unsound_syntax.js +1695 -0
  140. package/project-transform/src/checker/rules/unsound_syntax.ts +2540 -0
  141. package/project-transform/src/checker/rules/value_types.js +206 -0
  142. package/project-transform/src/checker/rules/value_types.ts +407 -0
  143. package/project-transform/src/checker/timing.js +43 -0
  144. package/project-transform/src/checker/timing.ts +78 -0
  145. package/project-transform/src/checker/unsupported_feature_messages.js +337 -0
  146. package/project-transform/src/checker/unsupported_feature_messages.ts +531 -0
  147. package/project-transform/src/cli.js +892 -0
  148. package/project-transform/src/cli.ts +1476 -0
  149. package/project-transform/src/compiler/compile_project.js +319 -0
  150. package/project-transform/src/compiler/compile_project.ts +508 -0
  151. package/project-transform/src/compiler/errors.js +10 -0
  152. package/project-transform/src/compiler/errors.ts +29 -0
  153. package/project-transform/src/compiler/ir.js +1 -0
  154. package/project-transform/src/compiler/ir.ts +1526 -0
  155. package/project-transform/src/compiler/lower.js +30550 -0
  156. package/project-transform/src/compiler/lower.ts +43645 -0
  157. package/project-transform/src/compiler/lower_arrays.js +140 -0
  158. package/project-transform/src/compiler/lower_arrays.ts +190 -0
  159. package/project-transform/src/compiler/lower_strings.js +121 -0
  160. package/project-transform/src/compiler/lower_strings.ts +198 -0
  161. package/project-transform/src/compiler/lower_tagged.js +329 -0
  162. package/project-transform/src/compiler/lower_tagged.ts +427 -0
  163. package/project-transform/src/compiler/lower_views.js +171 -0
  164. package/project-transform/src/compiler/lower_views.ts +251 -0
  165. package/project-transform/src/compiler/object_keys.js +25 -0
  166. package/project-transform/src/compiler/object_keys.ts +35 -0
  167. package/project-transform/src/compiler/runtime_ir.js +30 -0
  168. package/project-transform/src/compiler/runtime_ir.ts +727 -0
  169. package/project-transform/src/compiler/tagged_boundary.js +18 -0
  170. package/project-transform/src/compiler/tagged_boundary.ts +37 -0
  171. package/project-transform/src/compiler/toolchain.js +170 -0
  172. package/project-transform/src/compiler/toolchain.ts +229 -0
  173. package/project-transform/src/compiler/unicode_case_data.js +2102 -0
  174. package/project-transform/src/compiler/unicode_case_data.ts +2112 -0
  175. package/project-transform/src/compiler/wasm_js_host_runtime.js +656 -0
  176. package/project-transform/src/compiler/wasm_js_host_runtime.ts +762 -0
  177. package/project-transform/src/compiler/wat_arrays.js +3132 -0
  178. package/project-transform/src/compiler/wat_arrays.ts +3768 -0
  179. package/project-transform/src/compiler/wat_emitter.js +17952 -0
  180. package/project-transform/src/compiler/wat_emitter.ts +22812 -0
  181. package/project-transform/src/compiler/wat_strings.js +129 -0
  182. package/project-transform/src/compiler/wat_strings.ts +187 -0
  183. package/project-transform/src/compiler/wat_tagged.js +548 -0
  184. package/project-transform/src/compiler/wat_tagged.ts +674 -0
  185. package/project-transform/src/compiler_generator_runner.js +153 -0
  186. package/project-transform/src/compiler_generator_runner.ts +171 -0
  187. package/project-transform/src/compiler_object_test_helpers.js +69 -0
  188. package/project-transform/src/compiler_object_test_helpers.ts +96 -0
  189. package/project-transform/src/compiler_promise_runner.js +2116 -0
  190. package/project-transform/src/compiler_promise_runner.ts +2184 -0
  191. package/project-transform/src/compiler_test_helpers.js +854 -0
  192. package/project-transform/src/compiler_test_helpers.ts +1087 -0
  193. package/project-transform/src/config.js +568 -0
  194. package/project-transform/src/config.ts +892 -0
  195. package/project-transform/src/diagnostic_metadata.js +67 -0
  196. package/project-transform/src/diagnostic_metadata.ts +99 -0
  197. package/project-transform/src/diagnostic_reference.js +1368 -0
  198. package/project-transform/src/diagnostic_reference.ts +1523 -0
  199. package/project-transform/src/editor_diagnostics_worker.js +176 -0
  200. package/project-transform/src/editor_diagnostics_worker.ts +250 -0
  201. package/project-transform/src/editor_projection.js +224 -0
  202. package/project-transform/src/editor_projection.ts +421 -0
  203. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.js +47 -0
  204. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.ts +72 -0
  205. package/project-transform/src/frontend/builtin_macro_support.js +842 -0
  206. package/project-transform/src/frontend/builtin_macro_support.ts +1386 -0
  207. package/project-transform/src/frontend/builtin_macros.js +409 -0
  208. package/project-transform/src/frontend/builtin_macros.ts +542 -0
  209. package/project-transform/src/frontend/component_poc_runtime.js +279 -0
  210. package/project-transform/src/frontend/component_poc_runtime.ts +372 -0
  211. package/project-transform/src/frontend/css_macro.js +148 -0
  212. package/project-transform/src/frontend/css_macro.ts +222 -0
  213. package/project-transform/src/frontend/derive_macros.js +2072 -0
  214. package/project-transform/src/frontend/derive_macros.ts +3188 -0
  215. package/project-transform/src/frontend/embedded_fragment_support.js +106 -0
  216. package/project-transform/src/frontend/embedded_fragment_support.ts +172 -0
  217. package/project-transform/src/frontend/error_normalization.js +403 -0
  218. package/project-transform/src/frontend/error_normalization.ts +832 -0
  219. package/project-transform/src/frontend/error_stdlib_support.js +1 -0
  220. package/project-transform/src/frontend/error_stdlib_support.ts +6 -0
  221. package/project-transform/src/frontend/expand_project.js +169 -0
  222. package/project-transform/src/frontend/expand_project.ts +248 -0
  223. package/project-transform/src/frontend/format_soundscript.js +297 -0
  224. package/project-transform/src/frontend/format_soundscript.ts +582 -0
  225. package/project-transform/src/frontend/graphql_macro.js +174 -0
  226. package/project-transform/src/frontend/graphql_macro.ts +253 -0
  227. package/project-transform/src/frontend/hash_context.js +83 -0
  228. package/project-transform/src/frontend/hash_context.ts +113 -0
  229. package/project-transform/src/frontend/hkt_macro.js +448 -0
  230. package/project-transform/src/frontend/hkt_macro.ts +897 -0
  231. package/project-transform/src/frontend/import_binding_usage.js +190 -0
  232. package/project-transform/src/frontend/import_binding_usage.ts +277 -0
  233. package/project-transform/src/frontend/macro_advanced_backend_adapter.js +58 -0
  234. package/project-transform/src/frontend/macro_advanced_backend_adapter.ts +123 -0
  235. package/project-transform/src/frontend/macro_advanced_context.js +826 -0
  236. package/project-transform/src/frontend/macro_advanced_context.ts +1102 -0
  237. package/project-transform/src/frontend/macro_advanced_output.js +21 -0
  238. package/project-transform/src/frontend/macro_advanced_output.ts +41 -0
  239. package/project-transform/src/frontend/macro_api.js +353 -0
  240. package/project-transform/src/frontend/macro_api.ts +1722 -0
  241. package/project-transform/src/frontend/macro_api_internal.js +35 -0
  242. package/project-transform/src/frontend/macro_api_internal.ts +80 -0
  243. package/project-transform/src/frontend/macro_api_module_support.js +39 -0
  244. package/project-transform/src/frontend/macro_api_module_support.ts +65 -0
  245. package/project-transform/src/frontend/macro_backend_adapter.js +272 -0
  246. package/project-transform/src/frontend/macro_backend_adapter.ts +420 -0
  247. package/project-transform/src/frontend/macro_context.js +816 -0
  248. package/project-transform/src/frontend/macro_context.ts +1105 -0
  249. package/project-transform/src/frontend/macro_debug.js +99 -0
  250. package/project-transform/src/frontend/macro_debug.ts +157 -0
  251. package/project-transform/src/frontend/macro_definition_support.js +28 -0
  252. package/project-transform/src/frontend/macro_definition_support.ts +73 -0
  253. package/project-transform/src/frontend/macro_errors.js +40 -0
  254. package/project-transform/src/frontend/macro_errors.ts +70 -0
  255. package/project-transform/src/frontend/macro_expander.js +919 -0
  256. package/project-transform/src/frontend/macro_expander.ts +1611 -0
  257. package/project-transform/src/frontend/macro_factory_support.js +176 -0
  258. package/project-transform/src/frontend/macro_factory_support.ts +263 -0
  259. package/project-transform/src/frontend/macro_host_ast_internal.js +64 -0
  260. package/project-transform/src/frontend/macro_host_ast_internal.ts +109 -0
  261. package/project-transform/src/frontend/macro_index.js +27 -0
  262. package/project-transform/src/frontend/macro_index.ts +50 -0
  263. package/project-transform/src/frontend/macro_loader.js +281 -0
  264. package/project-transform/src/frontend/macro_loader.ts +506 -0
  265. package/project-transform/src/frontend/macro_operand_semantics.js +838 -0
  266. package/project-transform/src/frontend/macro_operand_semantics.ts +1489 -0
  267. package/project-transform/src/frontend/macro_output.js +54 -0
  268. package/project-transform/src/frontend/macro_output.ts +123 -0
  269. package/project-transform/src/frontend/macro_parser.js +611 -0
  270. package/project-transform/src/frontend/macro_parser.ts +832 -0
  271. package/project-transform/src/frontend/macro_resolver.js +69 -0
  272. package/project-transform/src/frontend/macro_resolver.ts +125 -0
  273. package/project-transform/src/frontend/macro_rewrite.js +285 -0
  274. package/project-transform/src/frontend/macro_rewrite.ts +442 -0
  275. package/project-transform/src/frontend/macro_runtime_support.js +232 -0
  276. package/project-transform/src/frontend/macro_runtime_support.ts +324 -0
  277. package/project-transform/src/frontend/macro_scanner.js +393 -0
  278. package/project-transform/src/frontend/macro_scanner.ts +455 -0
  279. package/project-transform/src/frontend/macro_semantic_backend_adapter.js +87 -0
  280. package/project-transform/src/frontend/macro_semantic_backend_adapter.ts +166 -0
  281. package/project-transform/src/frontend/macro_semantic_context.js +5 -0
  282. package/project-transform/src/frontend/macro_semantic_context.ts +12 -0
  283. package/project-transform/src/frontend/macro_semantic_output.js +24 -0
  284. package/project-transform/src/frontend/macro_semantic_output.ts +47 -0
  285. package/project-transform/src/frontend/macro_semantic_types.js +1 -0
  286. package/project-transform/src/frontend/macro_semantic_types.ts +98 -0
  287. package/project-transform/src/frontend/macro_semantics.js +1172 -0
  288. package/project-transform/src/frontend/macro_semantics.ts +1502 -0
  289. package/project-transform/src/frontend/macro_site_kind_support.js +164 -0
  290. package/project-transform/src/frontend/macro_site_kind_support.ts +255 -0
  291. package/project-transform/src/frontend/macro_syntax_internal.js +1950 -0
  292. package/project-transform/src/frontend/macro_syntax_internal.ts +3338 -0
  293. package/project-transform/src/frontend/macro_templates.js +57 -0
  294. package/project-transform/src/frontend/macro_templates.ts +143 -0
  295. package/project-transform/src/frontend/macro_test_helpers.js +82 -0
  296. package/project-transform/src/frontend/macro_test_helpers.ts +136 -0
  297. package/project-transform/src/frontend/macro_types.js +1 -0
  298. package/project-transform/src/frontend/macro_types.ts +103 -0
  299. package/project-transform/src/frontend/macro_vm.js +39 -0
  300. package/project-transform/src/frontend/macro_vm.ts +113 -0
  301. package/project-transform/src/frontend/match_macro.js +885 -0
  302. package/project-transform/src/frontend/match_macro.ts +1220 -0
  303. package/project-transform/src/frontend/numeric_normalization.js +824 -0
  304. package/project-transform/src/frontend/numeric_normalization.ts +1380 -0
  305. package/project-transform/src/frontend/numeric_prelude.js +278 -0
  306. package/project-transform/src/frontend/numeric_prelude.ts +370 -0
  307. package/project-transform/src/frontend/project_frontend.js +2396 -0
  308. package/project-transform/src/frontend/project_frontend.ts +3776 -0
  309. package/project-transform/src/frontend/project_macro_support.js +1401 -0
  310. package/project-transform/src/frontend/project_macro_support.ts +2137 -0
  311. package/project-transform/src/frontend/sql_macro.js +175 -0
  312. package/project-transform/src/frontend/sql_macro.ts +254 -0
  313. package/project-transform/src/frontend/sql_stdlib_support.js +1 -0
  314. package/project-transform/src/frontend/sql_stdlib_support.ts +6 -0
  315. package/project-transform/src/frontend/std_package_support.js +228 -0
  316. package/project-transform/src/frontend/std_package_support.ts +400 -0
  317. package/project-transform/src/frontend/value_normalization.js +306 -0
  318. package/project-transform/src/frontend/value_normalization.ts +599 -0
  319. package/project-transform/src/lsp/project_service.js +4771 -0
  320. package/project-transform/src/lsp/project_service.ts +7580 -0
  321. package/project-transform/src/lsp/protocol.js +9 -0
  322. package/project-transform/src/lsp/protocol.ts +38 -0
  323. package/project-transform/src/lsp/server.js +355 -0
  324. package/project-transform/src/lsp/server.ts +671 -0
  325. package/project-transform/src/lsp/session.js +49 -0
  326. package/project-transform/src/lsp/session.ts +48 -0
  327. package/project-transform/src/lsp/timing.js +43 -0
  328. package/project-transform/src/lsp/timing.ts +76 -0
  329. package/project-transform/src/lsp/transport.js +205 -0
  330. package/project-transform/src/lsp/transport.ts +253 -0
  331. package/project-transform/src/lsp_main.js +5 -0
  332. package/project-transform/src/lsp_main.ts +7 -0
  333. package/project-transform/src/macros.d.ts +1 -0
  334. package/project-transform/src/macros.js +1 -0
  335. package/project-transform/src/macros.ts +1 -0
  336. package/project-transform/src/main.js +24 -0
  337. package/project-transform/src/main.ts +28 -0
  338. package/project-transform/src/platform/host.js +264 -0
  339. package/project-transform/src/platform/host.ts +343 -0
  340. package/project-transform/src/platform/path.js +8 -0
  341. package/project-transform/src/platform/path.ts +20 -0
  342. package/project-transform/src/public_macro_api/macro_api.d.ts +1054 -0
  343. package/project-transform/src/public_macro_api/macro_semantic_types.d.ts +66 -0
  344. package/project-transform/src/public_macro_api/macro_types.d.ts +70 -0
  345. package/project-transform/src/run_program.js +14 -0
  346. package/project-transform/src/run_program.ts +33 -0
  347. package/project-transform/src/runtime/materialize.js +371 -0
  348. package/project-transform/src/runtime/materialize.ts +502 -0
  349. package/project-transform/src/runtime/on_demand.js +203 -0
  350. package/project-transform/src/runtime/on_demand.ts +305 -0
  351. package/project-transform/src/runtime/source_maps.js +205 -0
  352. package/project-transform/src/runtime/source_maps.ts +297 -0
  353. package/project-transform/src/runtime/transform.js +148 -0
  354. package/project-transform/src/runtime/transform.ts +295 -0
  355. package/project-transform/src/service/types.js +1 -0
  356. package/project-transform/src/service/types.ts +22 -0
  357. package/project-transform/src/soundscript_packages.js +477 -0
  358. package/project-transform/src/soundscript_packages.ts +754 -0
  359. package/project-transform/src/soundscript_runtime_specifiers.js +88 -0
  360. package/project-transform/src/soundscript_runtime_specifiers.ts +96 -0
  361. package/project-transform/src/stdlib/async.d.ts +81 -0
  362. package/project-transform/src/stdlib/async.js +213 -0
  363. package/project-transform/src/stdlib/async.ts +315 -0
  364. package/project-transform/src/stdlib/codec.d.ts +32 -0
  365. package/project-transform/src/stdlib/codec.js +30 -0
  366. package/project-transform/src/stdlib/codec.ts +76 -0
  367. package/project-transform/src/stdlib/compare.d.ts +28 -0
  368. package/project-transform/src/stdlib/compare.js +115 -0
  369. package/project-transform/src/stdlib/compare.ts +151 -0
  370. package/project-transform/src/stdlib/css.d.ts +16 -0
  371. package/project-transform/src/stdlib/css.js +9 -0
  372. package/project-transform/src/stdlib/css.ts +28 -0
  373. package/project-transform/src/stdlib/debug.d.ts +2 -0
  374. package/project-transform/src/stdlib/debug.js +9 -0
  375. package/project-transform/src/stdlib/debug.ts +10 -0
  376. package/project-transform/src/stdlib/decode.d.ts +86 -0
  377. package/project-transform/src/stdlib/decode.js +254 -0
  378. package/project-transform/src/stdlib/decode.ts +390 -0
  379. package/project-transform/src/stdlib/derive.d.ts +6 -0
  380. package/project-transform/src/stdlib/derive.js +7 -0
  381. package/project-transform/src/stdlib/derive.ts +7 -0
  382. package/project-transform/src/stdlib/encode.d.ts +100 -0
  383. package/project-transform/src/stdlib/encode.js +130 -0
  384. package/project-transform/src/stdlib/encode.ts +259 -0
  385. package/project-transform/src/stdlib/failures.d.ts +23 -0
  386. package/project-transform/src/stdlib/failures.js +41 -0
  387. package/project-transform/src/stdlib/failures.ts +64 -0
  388. package/project-transform/src/stdlib/fetch.d.ts +67 -0
  389. package/project-transform/src/stdlib/fetch.js +5 -0
  390. package/project-transform/src/stdlib/fetch.ts +11 -0
  391. package/project-transform/src/stdlib/graphql.d.ts +16 -0
  392. package/project-transform/src/stdlib/graphql.js +9 -0
  393. package/project-transform/src/stdlib/graphql.ts +28 -0
  394. package/project-transform/src/stdlib/hash.d.ts +34 -0
  395. package/project-transform/src/stdlib/hash.js +110 -0
  396. package/project-transform/src/stdlib/hash.ts +188 -0
  397. package/project-transform/src/stdlib/hkt.d.ts +40 -0
  398. package/project-transform/src/stdlib/hkt.js +3 -0
  399. package/project-transform/src/stdlib/hkt.ts +41 -0
  400. package/project-transform/src/stdlib/index.d.ts +9 -0
  401. package/project-transform/src/stdlib/index.js +15 -0
  402. package/project-transform/src/stdlib/index.ts +23 -0
  403. package/project-transform/src/stdlib/json.d.ts +125 -0
  404. package/project-transform/src/stdlib/json.js +764 -0
  405. package/project-transform/src/stdlib/json.ts +1034 -0
  406. package/project-transform/src/stdlib/match.d.ts +11 -0
  407. package/project-transform/src/stdlib/match.js +13 -0
  408. package/project-transform/src/stdlib/match.ts +26 -0
  409. package/project-transform/src/stdlib/numerics.d.ts +523 -0
  410. package/project-transform/src/stdlib/numerics.js +1356 -0
  411. package/project-transform/src/stdlib/numerics.ts +1937 -0
  412. package/project-transform/src/stdlib/random.d.ts +19 -0
  413. package/project-transform/src/stdlib/random.js +3 -0
  414. package/project-transform/src/stdlib/random.ts +5 -0
  415. package/project-transform/src/stdlib/result.d.ts +68 -0
  416. package/project-transform/src/stdlib/result.js +139 -0
  417. package/project-transform/src/stdlib/result.ts +248 -0
  418. package/project-transform/src/stdlib/sql.d.ts +22 -0
  419. package/project-transform/src/stdlib/sql.js +23 -0
  420. package/project-transform/src/stdlib/sql.ts +53 -0
  421. package/project-transform/src/stdlib/text.d.ts +24 -0
  422. package/project-transform/src/stdlib/text.js +3 -0
  423. package/project-transform/src/stdlib/text.ts +4 -0
  424. package/project-transform/src/stdlib/thunk.d.ts +2 -0
  425. package/project-transform/src/stdlib/thunk.js +9 -0
  426. package/project-transform/src/stdlib/thunk.ts +15 -0
  427. package/project-transform/src/stdlib/typeclasses.d.ts +57 -0
  428. package/project-transform/src/stdlib/typeclasses.js +78 -0
  429. package/project-transform/src/stdlib/typeclasses.ts +173 -0
  430. package/project-transform/src/stdlib/url.d.ts +37 -0
  431. package/project-transform/src/stdlib/url.js +3 -0
  432. package/project-transform/src/stdlib/url.ts +4 -0
  433. package/project-transform/src/stdlib/value.d.ts +9 -0
  434. package/project-transform/src/stdlib/value.js +104 -0
  435. package/project-transform/src/stdlib/value.ts +133 -0
  436. package/project-transform/src/test_installed_stdlib.js +147 -0
  437. package/project-transform/src/test_installed_stdlib.ts +245 -0
  438. package/project-transform/src/test_macro_package_fixture.js +50 -0
  439. package/project-transform/src/test_macro_package_fixture.ts +68 -0
  440. package/project-transform/src/value_deep_safe.js +191 -0
  441. package/project-transform/src/value_deep_safe.ts +273 -0
@@ -0,0 +1,3768 @@
1
+ import type {
2
+ CompilerFunctionHostTaggedArrayBoundaryIR,
3
+ CompilerModuleIR,
4
+ CompilerTaggedPrimitiveBoundaryKindsIR,
5
+ } from './ir.ts';
6
+ import { CompilerUnsupportedError } from './errors.ts';
7
+ import {
8
+ emitHostTaggedPrimitiveExternrefToTagged,
9
+ emitTaggedPrimitiveToHostExternref,
10
+ } from './wat_tagged.ts';
11
+
12
+ export interface BackendStringRuntimeLayoutLike {
13
+ fallbackCodeUnitArrayWatTypeId: string;
14
+ fallbackWatTypeId: string;
15
+ runtimeWatTypeId: string;
16
+ }
17
+
18
+ export interface ArrayRuntimeImportUsage {
19
+ usesHeapParamBoundary: boolean;
20
+ usesHeapParamCopyBack: boolean;
21
+ usesHeapResultBoundary: boolean;
22
+ usesStringParamBoundary: boolean;
23
+ usesStringParamCopyBack: boolean;
24
+ usesStringResultBoundary: boolean;
25
+ usesNumberParamBoundary: boolean;
26
+ usesNumberParamCopyBack: boolean;
27
+ usesNumberResultBoundary: boolean;
28
+ usesBooleanParamBoundary: boolean;
29
+ usesBooleanParamCopyBack: boolean;
30
+ usesBooleanResultBoundary: boolean;
31
+ usesTaggedParamBoundary: boolean;
32
+ usesTaggedParamCopyBack: boolean;
33
+ usesTaggedResultBoundary: boolean;
34
+ }
35
+
36
+ export interface OwnedArrayTypeUsage {
37
+ usesOwnedHeapArray: boolean;
38
+ usesOwnedStringArray: boolean;
39
+ usesOwnedNumberArray: boolean;
40
+ usesOwnedBooleanArray: boolean;
41
+ usesOwnedTaggedArray: boolean;
42
+ }
43
+
44
+ export interface OwnedArrayBoundaryHelperOptions extends ArrayRuntimeImportUsage {
45
+ indent(level: number): string;
46
+ createUnsupportedHeapRuntimeBackendError(message: string): CompilerUnsupportedError;
47
+ fallbackObjectWatTypeId?: string;
48
+ layoutsByRepresentationName?: ReadonlyMap<string, {
49
+ watTypeId: string;
50
+ fields?: ReadonlyArray<{
51
+ valueType: string;
52
+ taggedPrimitiveKinds?: CompilerTaggedPrimitiveBoundaryKindsIR;
53
+ heapRepresentation?: CompilerFunctionHostTaggedArrayBoundaryIR['representation'];
54
+ }>;
55
+ }>;
56
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike;
57
+ }
58
+
59
+ export interface OwnedArrayPushHelperUsage {
60
+ usesOwnedStringPush: boolean;
61
+ usesOwnedNumberPush: boolean;
62
+ usesOwnedBooleanPush: boolean;
63
+ usesOwnedTaggedPush: boolean;
64
+ usesOwnedStringUnshift: boolean;
65
+ usesOwnedNumberUnshift: boolean;
66
+ usesOwnedBooleanUnshift: boolean;
67
+ usesOwnedTaggedUnshift: boolean;
68
+ usesOwnedHeapPop: boolean;
69
+ usesOwnedStringPop: boolean;
70
+ usesOwnedNumberPop: boolean;
71
+ usesOwnedBooleanPop: boolean;
72
+ usesOwnedTaggedPop: boolean;
73
+ usesOwnedHeapShift: boolean;
74
+ usesOwnedStringShift: boolean;
75
+ usesOwnedNumberShift: boolean;
76
+ usesOwnedBooleanShift: boolean;
77
+ usesOwnedTaggedShift: boolean;
78
+ usesOwnedHeapAt: boolean;
79
+ usesOwnedStringAt: boolean;
80
+ usesOwnedNumberAt: boolean;
81
+ usesOwnedBooleanAt: boolean;
82
+ usesOwnedTaggedAt: boolean;
83
+ usesOwnedStringJoin: boolean;
84
+ usesOwnedNumberJoin: boolean;
85
+ usesOwnedBooleanJoin: boolean;
86
+ usesOwnedHeapReverse: boolean;
87
+ usesOwnedStringReverse: boolean;
88
+ usesOwnedNumberReverse: boolean;
89
+ usesOwnedBooleanReverse: boolean;
90
+ usesOwnedTaggedReverse: boolean;
91
+ usesOwnedHeapFill: boolean;
92
+ usesOwnedStringFill: boolean;
93
+ usesOwnedNumberFill: boolean;
94
+ usesOwnedBooleanFill: boolean;
95
+ usesOwnedTaggedFill: boolean;
96
+ usesOwnedHeapCopyWithin: boolean;
97
+ usesOwnedStringCopyWithin: boolean;
98
+ usesOwnedNumberCopyWithin: boolean;
99
+ usesOwnedBooleanCopyWithin: boolean;
100
+ usesOwnedTaggedCopyWithin: boolean;
101
+ usesOwnedHeapConcat: boolean;
102
+ usesOwnedStringConcat: boolean;
103
+ usesOwnedNumberConcat: boolean;
104
+ usesOwnedBooleanConcat: boolean;
105
+ usesOwnedTaggedConcat: boolean;
106
+ usesOwnedHeapSlice: boolean;
107
+ usesOwnedStringSlice: boolean;
108
+ usesOwnedNumberSlice: boolean;
109
+ usesOwnedBooleanSlice: boolean;
110
+ usesOwnedTaggedSlice: boolean;
111
+ usesOwnedHeapSplice: boolean;
112
+ usesOwnedStringSplice: boolean;
113
+ usesOwnedNumberSplice: boolean;
114
+ usesOwnedBooleanSplice: boolean;
115
+ usesOwnedHeapIncludes: boolean;
116
+ usesOwnedStringIncludes: boolean;
117
+ usesOwnedNumberIncludes: boolean;
118
+ usesOwnedBooleanIncludes: boolean;
119
+ usesOwnedTaggedIncludes: boolean;
120
+ usesOwnedHeapIndexOf: boolean;
121
+ usesOwnedStringIndexOf: boolean;
122
+ usesOwnedNumberIndexOf: boolean;
123
+ usesOwnedBooleanIndexOf: boolean;
124
+ usesOwnedTaggedIndexOf: boolean;
125
+ usesOwnedHeapLastIndexOf: boolean;
126
+ usesOwnedStringLastIndexOf: boolean;
127
+ usesOwnedNumberLastIndexOf: boolean;
128
+ usesOwnedBooleanLastIndexOf: boolean;
129
+ usesOwnedTaggedLastIndexOf: boolean;
130
+ }
131
+
132
+ export function emitArrayRuntimeImports(usage: ArrayRuntimeImportUsage): string[] {
133
+ const {
134
+ usesHeapParamBoundary,
135
+ usesHeapParamCopyBack,
136
+ usesHeapResultBoundary,
137
+ usesStringParamBoundary,
138
+ usesStringParamCopyBack,
139
+ usesStringResultBoundary,
140
+ usesNumberParamBoundary,
141
+ usesNumberParamCopyBack,
142
+ usesNumberResultBoundary,
143
+ usesBooleanParamBoundary,
144
+ usesBooleanParamCopyBack,
145
+ usesBooleanResultBoundary,
146
+ usesTaggedParamBoundary,
147
+ usesTaggedParamCopyBack,
148
+ usesTaggedResultBoundary,
149
+ } = usage;
150
+ if (
151
+ !usesHeapResultBoundary &&
152
+ !usesHeapParamBoundary && !usesHeapParamCopyBack &&
153
+ !usesStringParamBoundary && !usesStringParamCopyBack && !usesStringResultBoundary &&
154
+ !usesNumberParamBoundary && !usesNumberParamCopyBack && !usesNumberResultBoundary &&
155
+ !usesBooleanParamBoundary && !usesBooleanParamCopyBack && !usesBooleanResultBoundary &&
156
+ !usesTaggedParamBoundary && !usesTaggedParamCopyBack && !usesTaggedResultBoundary
157
+ ) {
158
+ return [];
159
+ }
160
+
161
+ const usesAnyParamBoundary = usesHeapParamBoundary || usesStringParamBoundary || usesNumberParamBoundary ||
162
+ usesBooleanParamBoundary || usesTaggedParamBoundary;
163
+ const usesAnyHeapBoundary = usesHeapParamBoundary || usesHeapParamCopyBack || usesHeapResultBoundary;
164
+ const usesAnyParamCopyBack = usesHeapParamCopyBack || usesStringParamCopyBack || usesNumberParamCopyBack ||
165
+ usesBooleanParamCopyBack || usesTaggedParamCopyBack || usesTaggedResultBoundary || usesAnyParamBoundary;
166
+
167
+ return [
168
+ ...(usesAnyParamBoundary || usesAnyHeapBoundary
169
+ ? [
170
+ '(import "soundscript_array" "length" (func $host_array_length (param externref) (result i32)))',
171
+ '(import "soundscript_array" "same" (func $host_array_same (param externref) (param externref) (result i32)))',
172
+ ]
173
+ : []),
174
+ ...(usesAnyHeapBoundary || usesStringParamBoundary || usesTaggedParamBoundary
175
+ ? [
176
+ '(import "soundscript_array" "get" (func $host_array_get (param externref) (param i32) (result externref)))',
177
+ ]
178
+ : []),
179
+ ...(usesHeapResultBoundary || usesHeapParamCopyBack || usesStringParamBoundary || usesStringResultBoundary ||
180
+ usesTaggedParamBoundary || usesTaggedParamCopyBack || usesTaggedResultBoundary
181
+ ? [
182
+ '(import "soundscript_array" "push" (func $host_array_push (param externref) (param externref)))',
183
+ ]
184
+ : []),
185
+ ...(usesAnyParamCopyBack
186
+ ? ['(import "soundscript_array" "clear" (func $host_array_clear (param externref)))']
187
+ : []),
188
+ ...(usesNumberParamBoundary
189
+ ? [
190
+ '(import "soundscript_array" "get_number" (func $host_array_get_number (param externref) (param i32) (result f64)))',
191
+ ]
192
+ : []),
193
+ ...(usesNumberParamBoundary || usesNumberParamCopyBack || usesNumberResultBoundary
194
+ ? [
195
+ '(import "soundscript_array" "push_number" (func $host_number_array_push (param externref) (param f64)))',
196
+ ]
197
+ : []),
198
+ ...(usesBooleanParamBoundary
199
+ ? [
200
+ '(import "soundscript_array" "get_boolean" (func $host_array_get_boolean (param externref) (param i32) (result i32)))',
201
+ ]
202
+ : []),
203
+ ...(usesBooleanParamBoundary || usesBooleanParamCopyBack || usesBooleanResultBoundary
204
+ ? [
205
+ '(import "soundscript_array" "push_boolean" (func $host_boolean_array_push (param externref) (param i32)))',
206
+ ]
207
+ : []),
208
+ ...(usesHeapResultBoundary || usesHeapParamCopyBack || usesStringResultBoundary ||
209
+ usesTaggedParamCopyBack || usesTaggedResultBoundary
210
+ ? ['(import "soundscript_array" "empty" (func $host_array_empty (result externref)))']
211
+ : []),
212
+ ...(usesNumberResultBoundary
213
+ ? [
214
+ '(import "soundscript_array" "empty_number" (func $host_number_array_empty (result externref)))',
215
+ ]
216
+ : []),
217
+ ...(usesBooleanResultBoundary
218
+ ? [
219
+ '(import "soundscript_array" "empty_boolean" (func $host_boolean_array_empty (result externref)))',
220
+ ]
221
+ : []),
222
+ ];
223
+ }
224
+
225
+ function getOwnedArrayDataWatTypeName(kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged'): string {
226
+ switch (kind) {
227
+ case 'heap':
228
+ return 'owned_heap_array_data';
229
+ case 'string':
230
+ return 'owned_string_array_data';
231
+ case 'number':
232
+ return 'owned_number_array_data';
233
+ case 'boolean':
234
+ return 'owned_boolean_array_data';
235
+ case 'tagged':
236
+ return 'owned_tagged_array_data';
237
+ }
238
+ }
239
+
240
+ function getOwnedArrayWatTypeName(kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged'): string {
241
+ switch (kind) {
242
+ case 'heap':
243
+ return 'owned_heap_array';
244
+ case 'string':
245
+ return 'owned_string_array';
246
+ case 'number':
247
+ return 'owned_number_array';
248
+ case 'boolean':
249
+ return 'owned_boolean_array';
250
+ case 'tagged':
251
+ return 'owned_tagged_array';
252
+ }
253
+ }
254
+
255
+ export function emitOwnedArrayTypes(usage: OwnedArrayTypeUsage): string[] {
256
+ const lines: string[] = [];
257
+ if (usage.usesOwnedHeapArray) {
258
+ lines.push('(type $owned_heap_array_data (array (mut (ref null eq))))');
259
+ lines.push(
260
+ '(type $owned_heap_array (struct (field (mut (ref null $owned_heap_array_data)))))',
261
+ );
262
+ }
263
+ if (usage.usesOwnedStringArray) {
264
+ lines.push('(type $owned_string_array_data (array (mut (ref null eq))))');
265
+ lines.push(
266
+ '(type $owned_string_array (struct (field (mut (ref null $owned_string_array_data)))))',
267
+ );
268
+ }
269
+ if (usage.usesOwnedNumberArray) {
270
+ lines.push('(type $owned_number_array_data (array (mut f64)))');
271
+ lines.push(
272
+ '(type $owned_number_array (struct (field (mut (ref null $owned_number_array_data)))))',
273
+ );
274
+ }
275
+ if (usage.usesOwnedBooleanArray) {
276
+ lines.push('(type $owned_boolean_array_data (array (mut i32)))');
277
+ lines.push(
278
+ '(type $owned_boolean_array (struct (field (mut (ref null $owned_boolean_array_data)))))',
279
+ );
280
+ }
281
+ if (usage.usesOwnedTaggedArray) {
282
+ lines.push('(type $owned_tagged_array_data (array (mut (ref null $tagged_value))))');
283
+ lines.push(
284
+ '(type $owned_tagged_array (struct (field (mut (ref null $owned_tagged_array_data)))))',
285
+ );
286
+ }
287
+ return lines;
288
+ }
289
+
290
+ export function getOwnedArrayToHostHelperName(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
291
+ switch (kind) {
292
+ case 'string':
293
+ return 'owned_string_array_to_host_array';
294
+ case 'number':
295
+ return 'owned_number_array_to_host_array';
296
+ case 'boolean':
297
+ return 'owned_boolean_array_to_host_array';
298
+ case 'tagged':
299
+ return 'owned_tagged_array_to_host_array';
300
+ }
301
+ }
302
+
303
+ function getTaggedArrayKindsSuffix(kinds: CompilerFunctionHostTaggedArrayBoundaryIR): string {
304
+ const primitiveSuffix = [
305
+ kinds.includesBoolean ? 'b' : '_',
306
+ kinds.includesNull ? 'n' : '_',
307
+ kinds.includesNumber ? 'd' : '_',
308
+ kinds.includesString ? 's' : '_',
309
+ kinds.includesUndefined ? 'u' : '_',
310
+ ].join('');
311
+ if (!kinds.representation) {
312
+ return primitiveSuffix;
313
+ }
314
+ const representationHex = [...new TextEncoder().encode(kinds.representation.name)]
315
+ .map((byte) => byte.toString(16).padStart(2, '0'))
316
+ .join('');
317
+ return `${primitiveSuffix}__${representationHex}`;
318
+ }
319
+
320
+ export function getHostArrayToOwnedTaggedArrayHelperName(
321
+ kinds: CompilerFunctionHostTaggedArrayBoundaryIR,
322
+ ): string {
323
+ return `host_array_to_owned_tagged_array__${getTaggedArrayKindsSuffix(kinds)}`;
324
+ }
325
+
326
+ export function getOwnedTaggedArrayToHostHelperName(
327
+ kinds: CompilerFunctionHostTaggedArrayBoundaryIR,
328
+ ): string {
329
+ return `owned_tagged_array_to_host_array__${getTaggedArrayKindsSuffix(kinds)}`;
330
+ }
331
+
332
+ export function getCopyOwnedTaggedArrayToHostHelperName(
333
+ kinds: CompilerFunctionHostTaggedArrayBoundaryIR,
334
+ ): string {
335
+ return `copy_owned_tagged_array_to_host_array__${getTaggedArrayKindsSuffix(kinds)}`;
336
+ }
337
+
338
+ function getTaggedArraySpecializedObjectToHostHelperName(watTypeId: string): string {
339
+ return `${watTypeId}_to_host_object`;
340
+ }
341
+
342
+ function getTaggedArrayHostObjectToSpecializedHelperName(watTypeId: string): string {
343
+ return `host_object_to_${watTypeId}`;
344
+ }
345
+
346
+ function getTaggedArrayCopySpecializedObjectToHostHelperName(watTypeId: string): string {
347
+ return `copy_${watTypeId}_to_host_object`;
348
+ }
349
+
350
+ function getTaggedArrayCopyFallbackObjectToHostHelperName(): string {
351
+ return 'copy_fallback_object_to_host_object';
352
+ }
353
+
354
+ function getOwnedArrayPushHelperName(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
355
+ switch (kind) {
356
+ case 'string':
357
+ return 'owned_string_array_push';
358
+ case 'number':
359
+ return 'owned_number_array_push';
360
+ case 'boolean':
361
+ return 'owned_boolean_array_push';
362
+ case 'tagged':
363
+ return 'owned_tagged_array_push';
364
+ }
365
+ }
366
+
367
+ function getOwnedArrayUnshiftHelperName(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
368
+ switch (kind) {
369
+ case 'string':
370
+ return 'owned_string_array_unshift';
371
+ case 'number':
372
+ return 'owned_number_array_unshift';
373
+ case 'boolean':
374
+ return 'owned_boolean_array_unshift';
375
+ case 'tagged':
376
+ return 'owned_tagged_array_unshift';
377
+ }
378
+ }
379
+
380
+ function getOwnedArrayPopHelperName(kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged'): string {
381
+ switch (kind) {
382
+ case 'heap':
383
+ return 'owned_heap_array_pop';
384
+ case 'string':
385
+ return 'owned_string_array_pop';
386
+ case 'number':
387
+ return 'owned_number_array_pop';
388
+ case 'boolean':
389
+ return 'owned_boolean_array_pop';
390
+ case 'tagged':
391
+ return 'owned_tagged_array_pop';
392
+ }
393
+ }
394
+
395
+ function getOwnedArrayShiftHelperName(kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged'): string {
396
+ switch (kind) {
397
+ case 'heap':
398
+ return 'owned_heap_array_shift';
399
+ case 'string':
400
+ return 'owned_string_array_shift';
401
+ case 'number':
402
+ return 'owned_number_array_shift';
403
+ case 'boolean':
404
+ return 'owned_boolean_array_shift';
405
+ case 'tagged':
406
+ return 'owned_tagged_array_shift';
407
+ }
408
+ }
409
+
410
+ function getOwnedArrayAtHelperName(kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged'): string {
411
+ switch (kind) {
412
+ case 'heap':
413
+ return 'owned_heap_array_at';
414
+ case 'string':
415
+ return 'owned_string_array_at';
416
+ case 'number':
417
+ return 'owned_number_array_at';
418
+ case 'boolean':
419
+ return 'owned_boolean_array_at';
420
+ case 'tagged':
421
+ return 'owned_tagged_array_at';
422
+ }
423
+ }
424
+
425
+ function getOwnedArrayJoinHelperName(kind: 'string' | 'number' | 'boolean'): string {
426
+ switch (kind) {
427
+ case 'string':
428
+ return 'owned_string_array_join';
429
+ case 'number':
430
+ return 'owned_number_array_join';
431
+ case 'boolean':
432
+ return 'owned_boolean_array_join';
433
+ }
434
+ }
435
+
436
+ function getOwnedArrayReverseHelperName(
437
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
438
+ ): string {
439
+ switch (kind) {
440
+ case 'heap':
441
+ return 'owned_heap_array_reverse';
442
+ case 'string':
443
+ return 'owned_string_array_reverse';
444
+ case 'number':
445
+ return 'owned_number_array_reverse';
446
+ case 'boolean':
447
+ return 'owned_boolean_array_reverse';
448
+ case 'tagged':
449
+ return 'owned_tagged_array_reverse';
450
+ }
451
+ }
452
+
453
+ function getOwnedArrayFillHelperName(
454
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
455
+ ): string {
456
+ switch (kind) {
457
+ case 'heap':
458
+ return 'owned_heap_array_fill';
459
+ case 'string':
460
+ return 'owned_string_array_fill';
461
+ case 'number':
462
+ return 'owned_number_array_fill';
463
+ case 'boolean':
464
+ return 'owned_boolean_array_fill';
465
+ case 'tagged':
466
+ return 'owned_tagged_array_fill';
467
+ }
468
+ }
469
+
470
+ function getOwnedArrayCopyWithinHelperName(
471
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
472
+ ): string {
473
+ switch (kind) {
474
+ case 'heap':
475
+ return 'owned_heap_array_copy_within';
476
+ case 'string':
477
+ return 'owned_string_array_copy_within';
478
+ case 'number':
479
+ return 'owned_number_array_copy_within';
480
+ case 'boolean':
481
+ return 'owned_boolean_array_copy_within';
482
+ case 'tagged':
483
+ return 'owned_tagged_array_copy_within';
484
+ }
485
+ }
486
+
487
+ function getOwnedArraySliceHelperName(
488
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
489
+ ): string {
490
+ switch (kind) {
491
+ case 'heap':
492
+ return 'owned_heap_array_slice';
493
+ case 'string':
494
+ return 'owned_string_array_slice';
495
+ case 'number':
496
+ return 'owned_number_array_slice';
497
+ case 'boolean':
498
+ return 'owned_boolean_array_slice';
499
+ case 'tagged':
500
+ return 'owned_tagged_array_slice';
501
+ }
502
+ }
503
+
504
+ function getOwnedArraySpliceHelperName(kind: 'heap' | 'string' | 'number' | 'boolean'): string {
505
+ switch (kind) {
506
+ case 'heap':
507
+ return 'owned_heap_array_splice';
508
+ case 'string':
509
+ return 'owned_string_array_splice';
510
+ case 'number':
511
+ return 'owned_number_array_splice';
512
+ case 'boolean':
513
+ return 'owned_boolean_array_splice';
514
+ }
515
+ }
516
+
517
+ function getOwnedArrayConcatHelperName(
518
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
519
+ ): string {
520
+ switch (kind) {
521
+ case 'heap':
522
+ return 'owned_heap_array_concat';
523
+ case 'string':
524
+ return 'owned_string_array_concat';
525
+ case 'number':
526
+ return 'owned_number_array_concat';
527
+ case 'boolean':
528
+ return 'owned_boolean_array_concat';
529
+ case 'tagged':
530
+ return 'owned_tagged_array_concat';
531
+ }
532
+ }
533
+
534
+ function getOwnedArrayIncludesHelperName(
535
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
536
+ ): string {
537
+ switch (kind) {
538
+ case 'heap':
539
+ return 'owned_heap_array_includes';
540
+ case 'string':
541
+ return 'owned_string_array_includes';
542
+ case 'number':
543
+ return 'owned_number_array_includes';
544
+ case 'boolean':
545
+ return 'owned_boolean_array_includes';
546
+ case 'tagged':
547
+ return 'owned_tagged_array_includes';
548
+ }
549
+ }
550
+
551
+ function getOwnedArrayIndexOfHelperName(
552
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
553
+ ): string {
554
+ switch (kind) {
555
+ case 'heap':
556
+ return 'owned_heap_array_index_of';
557
+ case 'string':
558
+ return 'owned_string_array_index_of';
559
+ case 'number':
560
+ return 'owned_number_array_index_of';
561
+ case 'boolean':
562
+ return 'owned_boolean_array_index_of';
563
+ case 'tagged':
564
+ return 'owned_tagged_array_index_of';
565
+ }
566
+ }
567
+
568
+ function getOwnedArrayLastIndexOfHelperName(
569
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
570
+ ): string {
571
+ switch (kind) {
572
+ case 'heap':
573
+ return 'owned_heap_array_last_index_of';
574
+ case 'string':
575
+ return 'owned_string_array_last_index_of';
576
+ case 'number':
577
+ return 'owned_number_array_last_index_of';
578
+ case 'boolean':
579
+ return 'owned_boolean_array_last_index_of';
580
+ case 'tagged':
581
+ return 'owned_tagged_array_last_index_of';
582
+ }
583
+ }
584
+
585
+ function getOwnedArrayBoundaryLabelPrefix(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
586
+ switch (kind) {
587
+ case 'string':
588
+ return 'array';
589
+ case 'number':
590
+ return 'number_array';
591
+ case 'boolean':
592
+ return 'boolean_array';
593
+ case 'tagged':
594
+ return 'tagged_array';
595
+ }
596
+ }
597
+
598
+ function getHostArrayGetHelperName(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
599
+ switch (kind) {
600
+ case 'string':
601
+ return 'host_array_get';
602
+ case 'number':
603
+ return 'host_array_get_number';
604
+ case 'boolean':
605
+ return 'host_array_get_boolean';
606
+ case 'tagged':
607
+ return 'host_array_get';
608
+ }
609
+ }
610
+
611
+ function getHostArrayPushHelperName(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
612
+ switch (kind) {
613
+ case 'string':
614
+ return 'host_array_push';
615
+ case 'number':
616
+ return 'host_number_array_push';
617
+ case 'boolean':
618
+ return 'host_boolean_array_push';
619
+ case 'tagged':
620
+ return 'host_array_push';
621
+ }
622
+ }
623
+
624
+ function getHostArrayEmptyHelperName(kind: 'string' | 'number' | 'boolean' | 'tagged'): string {
625
+ switch (kind) {
626
+ case 'string':
627
+ return 'host_array_empty';
628
+ case 'number':
629
+ return 'host_number_array_empty';
630
+ case 'boolean':
631
+ return 'host_boolean_array_empty';
632
+ case 'tagged':
633
+ return 'host_array_empty';
634
+ }
635
+ }
636
+
637
+ function getOwnedArrayPushValueWatType(
638
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
639
+ ): string {
640
+ switch (kind) {
641
+ case 'heap':
642
+ return '(ref null eq)';
643
+ case 'string':
644
+ return '(ref null $string_runtime)';
645
+ case 'number':
646
+ return 'f64';
647
+ case 'boolean':
648
+ return 'i32';
649
+ case 'tagged':
650
+ return '(ref null $tagged_value)';
651
+ }
652
+ }
653
+
654
+ function emitHostArrayElementToOwnedBackingLines(
655
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
656
+ backingLocalName: string,
657
+ indexLocalName: string,
658
+ sourceLocalName: string,
659
+ indent: (level: number) => string,
660
+ taggedKinds?: CompilerFunctionHostTaggedArrayBoundaryIR,
661
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
662
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
663
+ ): string[] {
664
+ if (kind === 'tagged') {
665
+ if (!taggedKinds) {
666
+ throw new Error('Tagged array host-to-owned helpers require tagged element kinds.');
667
+ }
668
+ if (!taggedKinds.representation) {
669
+ return [
670
+ `${indent(3)}local.get $${sourceLocalName}`,
671
+ `${indent(3)}local.get $${indexLocalName}`,
672
+ `${indent(3)}call $host_array_get`,
673
+ `${indent(3)}local.set $element_host`,
674
+ ...emitHostTaggedPrimitiveExternrefToTagged(
675
+ 'element_host',
676
+ 'element_tag',
677
+ 'element_tagged',
678
+ taggedKinds,
679
+ 3,
680
+ indent,
681
+ ),
682
+ `${indent(3)}local.get $${backingLocalName}`,
683
+ `${indent(3)}local.get $${indexLocalName}`,
684
+ `${indent(3)}local.get $element_tagged`,
685
+ `${indent(3)}array.set $${getOwnedArrayDataWatTypeName(kind)}`,
686
+ ];
687
+ }
688
+ if (!createUnsupportedHeapRuntimeBackendError) {
689
+ throw new Error('Tagged heap-array host-to-owned helpers require backend error construction.');
690
+ }
691
+ const specializedWatTypeId = taggedKinds.representation.kind === 'specialized_object_representation'
692
+ ? layoutsByRepresentationName?.get(taggedKinds.representation.name)?.watTypeId ??
693
+ (() => {
694
+ throw createUnsupportedHeapRuntimeBackendError(
695
+ `Missing specialized object layout for tagged array boundary ${taggedKinds.representation.name}.`,
696
+ );
697
+ })()
698
+ : undefined;
699
+ return [
700
+ `${indent(3)}local.get $${sourceLocalName}`,
701
+ `${indent(3)}local.get $${indexLocalName}`,
702
+ `${indent(3)}call $host_array_get`,
703
+ `${indent(3)}local.set $element_host`,
704
+ `${indent(3)}local.get $element_host`,
705
+ `${indent(3)}call $tagged_type_tag`,
706
+ `${indent(3)}local.set $element_tag`,
707
+ `${indent(3)}(block $element_tagged_done`,
708
+ ...(taggedKinds.includesUndefined
709
+ ? [
710
+ `${indent(4)}local.get $element_tag`,
711
+ `${indent(4)}i32.const 0`,
712
+ `${indent(4)}i32.eq`,
713
+ `${indent(4)}(if`,
714
+ `${indent(5)}(then`,
715
+ `${indent(6)}call $tag_undefined`,
716
+ `${indent(6)}local.set $element_tagged`,
717
+ `${indent(6)}br $element_tagged_done`,
718
+ `${indent(5)})`,
719
+ `${indent(4)})`,
720
+ ]
721
+ : []),
722
+ ...(taggedKinds.includesNull
723
+ ? [
724
+ `${indent(4)}local.get $element_tag`,
725
+ `${indent(4)}i32.const 6`,
726
+ `${indent(4)}i32.eq`,
727
+ `${indent(4)}(if`,
728
+ `${indent(5)}(then`,
729
+ `${indent(6)}call $tag_null`,
730
+ `${indent(6)}local.set $element_tagged`,
731
+ `${indent(6)}br $element_tagged_done`,
732
+ `${indent(5)})`,
733
+ `${indent(4)})`,
734
+ ]
735
+ : []),
736
+ ...(taggedKinds.includesBoolean
737
+ ? [
738
+ `${indent(4)}local.get $element_tag`,
739
+ `${indent(4)}i32.const 1`,
740
+ `${indent(4)}i32.eq`,
741
+ `${indent(4)}(if`,
742
+ `${indent(5)}(then`,
743
+ `${indent(6)}local.get $element_host`,
744
+ `${indent(6)}call $tagged_boolean_value`,
745
+ `${indent(6)}call $tag_boolean`,
746
+ `${indent(6)}local.set $element_tagged`,
747
+ `${indent(6)}br $element_tagged_done`,
748
+ `${indent(5)})`,
749
+ `${indent(4)})`,
750
+ ]
751
+ : []),
752
+ ...(taggedKinds.includesNumber
753
+ ? [
754
+ `${indent(4)}local.get $element_tag`,
755
+ `${indent(4)}i32.const 2`,
756
+ `${indent(4)}i32.eq`,
757
+ `${indent(4)}(if`,
758
+ `${indent(5)}(then`,
759
+ `${indent(6)}local.get $element_host`,
760
+ `${indent(6)}call $tagged_number_value`,
761
+ `${indent(6)}call $tag_number`,
762
+ `${indent(6)}local.set $element_tagged`,
763
+ `${indent(6)}br $element_tagged_done`,
764
+ `${indent(5)})`,
765
+ `${indent(4)})`,
766
+ ]
767
+ : []),
768
+ ...(taggedKinds.includesString
769
+ ? [
770
+ `${indent(4)}local.get $element_tag`,
771
+ `${indent(4)}i32.const 3`,
772
+ `${indent(4)}i32.eq`,
773
+ `${indent(4)}(if`,
774
+ `${indent(5)}(then`,
775
+ `${indent(6)}local.get $element_host`,
776
+ `${indent(6)}call $string_to_owned`,
777
+ `${indent(6)}call $tag_string`,
778
+ `${indent(6)}local.set $element_tagged`,
779
+ `${indent(6)}br $element_tagged_done`,
780
+ `${indent(5)})`,
781
+ `${indent(4)})`,
782
+ ]
783
+ : []),
784
+ `${indent(4)}local.get $element_tag`,
785
+ `${indent(4)}i32.const 4`,
786
+ `${indent(4)}i32.eq`,
787
+ `${indent(4)}(if`,
788
+ `${indent(5)}(then`,
789
+ `${indent(6)}local.get $element_host`,
790
+ `${indent(6)}call $${
791
+ taggedKinds.representation.kind === 'specialized_object_representation'
792
+ ? getTaggedArrayHostObjectToSpecializedHelperName(specializedWatTypeId!)
793
+ : 'host_object_to_fallback_object'
794
+ }`,
795
+ `${indent(6)}call $tag_heap_object`,
796
+ `${indent(6)}local.set $element_tagged`,
797
+ `${indent(6)}br $element_tagged_done`,
798
+ `${indent(5)})`,
799
+ `${indent(4)})`,
800
+ `${indent(4)}unreachable`,
801
+ `${indent(3)})`,
802
+ `${indent(3)}local.get $${backingLocalName}`,
803
+ `${indent(3)}local.get $${indexLocalName}`,
804
+ `${indent(3)}local.get $element_tagged`,
805
+ `${indent(3)}array.set $${getOwnedArrayDataWatTypeName(kind)}`,
806
+ ];
807
+ }
808
+ return [
809
+ `${indent(3)}local.get $${backingLocalName}`,
810
+ `${indent(3)}local.get $${indexLocalName}`,
811
+ `${indent(3)}local.get $${sourceLocalName}`,
812
+ `${indent(3)}local.get $${indexLocalName}`,
813
+ `${indent(3)}call $${getHostArrayGetHelperName(kind)}`,
814
+ ...(kind === 'string' ? [`${indent(3)}call $string_to_owned`] : []),
815
+ `${indent(3)}array.set $${getOwnedArrayDataWatTypeName(kind)}`,
816
+ ];
817
+ }
818
+
819
+ function emitOwnedBackingElementToHostArrayLines(
820
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
821
+ hostTargetLocalName: string,
822
+ backingLocalName: string,
823
+ indexLocalName: string,
824
+ indent: (level: number) => string,
825
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
826
+ taggedKinds?: CompilerFunctionHostTaggedArrayBoundaryIR,
827
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
828
+ fallbackObjectWatTypeId?: string,
829
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
830
+ ): string[] {
831
+ if (kind === 'tagged') {
832
+ if (!taggedKinds) {
833
+ throw new Error('Tagged array owned-to-host helpers require tagged element kinds.');
834
+ }
835
+ if (!taggedKinds.representation) {
836
+ return [
837
+ `${indent(3)}local.get $${backingLocalName}`,
838
+ `${indent(3)}local.get $${indexLocalName}`,
839
+ `${indent(3)}array.get $${getOwnedArrayDataWatTypeName(kind)}`,
840
+ `${indent(3)}local.set $element_tagged`,
841
+ ...emitTaggedPrimitiveToHostExternref(
842
+ 'element_tagged',
843
+ 'element_tag',
844
+ 'element_host',
845
+ taggedKinds,
846
+ 3,
847
+ indent,
848
+ ),
849
+ `${indent(3)}local.get $${hostTargetLocalName}`,
850
+ `${indent(3)}local.get $element_host`,
851
+ `${indent(3)}call $${getHostArrayPushHelperName(kind)}`,
852
+ ];
853
+ }
854
+ if (!createUnsupportedHeapRuntimeBackendError) {
855
+ throw new Error('Tagged heap-array owned-to-host helpers require backend error construction.');
856
+ }
857
+ const specializedWatTypeId = taggedKinds.representation.kind === 'specialized_object_representation'
858
+ ? layoutsByRepresentationName?.get(taggedKinds.representation.name)?.watTypeId ??
859
+ (() => {
860
+ throw createUnsupportedHeapRuntimeBackendError(
861
+ `Missing specialized object layout for tagged array boundary ${taggedKinds.representation.name}.`,
862
+ );
863
+ })()
864
+ : undefined;
865
+ const fallbackWatTypeId = taggedKinds.representation.kind === 'fallback_object_representation'
866
+ ? fallbackObjectWatTypeId ??
867
+ (() => {
868
+ throw createUnsupportedHeapRuntimeBackendError(
869
+ 'Missing fallback object layout for tagged array host boundary helper.',
870
+ );
871
+ })()
872
+ : undefined;
873
+ return [
874
+ `${indent(3)}local.get $${backingLocalName}`,
875
+ `${indent(3)}local.get $${indexLocalName}`,
876
+ `${indent(3)}array.get $${getOwnedArrayDataWatTypeName(kind)}`,
877
+ `${indent(3)}local.set $element_tagged`,
878
+ `${indent(3)}local.get $element_tagged`,
879
+ `${indent(3)}struct.get $tagged_value 0`,
880
+ `${indent(3)}local.set $element_tag`,
881
+ `${indent(3)}(block $element_host_done`,
882
+ ...(taggedKinds.includesUndefined
883
+ ? [
884
+ `${indent(4)}local.get $element_tag`,
885
+ `${indent(4)}i32.const 0`,
886
+ `${indent(4)}i32.eq`,
887
+ `${indent(4)}(if`,
888
+ `${indent(5)}(then`,
889
+ `${indent(6)}call $tagged_undefined_value`,
890
+ `${indent(6)}local.set $element_host`,
891
+ `${indent(6)}br $element_host_done`,
892
+ `${indent(5)})`,
893
+ `${indent(4)})`,
894
+ ]
895
+ : []),
896
+ ...(taggedKinds.includesNull
897
+ ? [
898
+ `${indent(4)}local.get $element_tag`,
899
+ `${indent(4)}i32.const 6`,
900
+ `${indent(4)}i32.eq`,
901
+ `${indent(4)}(if`,
902
+ `${indent(5)}(then`,
903
+ `${indent(6)}ref.null extern`,
904
+ `${indent(6)}local.set $element_host`,
905
+ `${indent(6)}br $element_host_done`,
906
+ `${indent(5)})`,
907
+ `${indent(4)})`,
908
+ ]
909
+ : []),
910
+ ...(taggedKinds.includesBoolean
911
+ ? [
912
+ `${indent(4)}local.get $element_tag`,
913
+ `${indent(4)}i32.const 1`,
914
+ `${indent(4)}i32.eq`,
915
+ `${indent(4)}(if`,
916
+ `${indent(5)}(then`,
917
+ `${indent(6)}local.get $element_tagged`,
918
+ `${indent(6)}call $untag_boolean`,
919
+ `${indent(6)}call $tagged_from_boolean`,
920
+ `${indent(6)}local.set $element_host`,
921
+ `${indent(6)}br $element_host_done`,
922
+ `${indent(5)})`,
923
+ `${indent(4)})`,
924
+ ]
925
+ : []),
926
+ ...(taggedKinds.includesNumber
927
+ ? [
928
+ `${indent(4)}local.get $element_tag`,
929
+ `${indent(4)}i32.const 2`,
930
+ `${indent(4)}i32.eq`,
931
+ `${indent(4)}(if`,
932
+ `${indent(5)}(then`,
933
+ `${indent(6)}local.get $element_tagged`,
934
+ `${indent(6)}call $untag_number`,
935
+ `${indent(6)}call $tagged_from_number`,
936
+ `${indent(6)}local.set $element_host`,
937
+ `${indent(6)}br $element_host_done`,
938
+ `${indent(5)})`,
939
+ `${indent(4)})`,
940
+ ]
941
+ : []),
942
+ ...(taggedKinds.includesString
943
+ ? [
944
+ `${indent(4)}local.get $element_tag`,
945
+ `${indent(4)}i32.const 3`,
946
+ `${indent(4)}i32.eq`,
947
+ `${indent(4)}(if`,
948
+ `${indent(5)}(then`,
949
+ `${indent(6)}local.get $element_tagged`,
950
+ `${indent(6)}call $untag_string`,
951
+ `${indent(6)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
952
+ `${indent(6)}call $owned_string_to_host`,
953
+ `${indent(6)}local.set $element_host`,
954
+ `${indent(6)}br $element_host_done`,
955
+ `${indent(5)})`,
956
+ `${indent(4)})`,
957
+ ]
958
+ : []),
959
+ `${indent(4)}local.get $element_tag`,
960
+ `${indent(4)}i32.const 4`,
961
+ `${indent(4)}i32.eq`,
962
+ `${indent(4)}(if`,
963
+ `${indent(5)}(then`,
964
+ `${indent(6)}local.get $element_tagged`,
965
+ `${indent(6)}call $untag_heap_object`,
966
+ `${indent(6)}ref.cast ${
967
+ taggedKinds.representation.kind === 'specialized_object_representation'
968
+ ? `(ref null $${specializedWatTypeId!})`
969
+ : `(ref null $${fallbackWatTypeId!})`
970
+ }`,
971
+ `${indent(6)}call $${
972
+ taggedKinds.representation.kind === 'specialized_object_representation'
973
+ ? getTaggedArraySpecializedObjectToHostHelperName(specializedWatTypeId!)
974
+ : 'fallback_object_to_host_object'
975
+ }`,
976
+ `${indent(6)}local.set $element_host`,
977
+ `${indent(6)}br $element_host_done`,
978
+ `${indent(5)})`,
979
+ `${indent(4)})`,
980
+ `${indent(4)}unreachable`,
981
+ `${indent(3)})`,
982
+ `${indent(3)}local.get $${hostTargetLocalName}`,
983
+ `${indent(3)}local.get $element_host`,
984
+ `${indent(3)}call $${getHostArrayPushHelperName(kind)}`,
985
+ ];
986
+ }
987
+ return [
988
+ `${indent(3)}local.get $${hostTargetLocalName}`,
989
+ `${indent(3)}local.get $${backingLocalName}`,
990
+ `${indent(3)}local.get $${indexLocalName}`,
991
+ `${indent(3)}array.get $${getOwnedArrayDataWatTypeName(kind)}`,
992
+ ...(kind === 'string'
993
+ ? [
994
+ `${indent(3)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
995
+ `${indent(3)}call $owned_string_to_host`,
996
+ ]
997
+ : []),
998
+ `${indent(3)}call $${getHostArrayPushHelperName(kind)}`,
999
+ ];
1000
+ }
1001
+
1002
+ function emitHostArrayToOwnedArrayHelper(
1003
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
1004
+ indent: (level: number) => string,
1005
+ taggedKinds?: CompilerFunctionHostTaggedArrayBoundaryIR,
1006
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
1007
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
1008
+ ): string[] {
1009
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1010
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1011
+ const labelPrefix = getOwnedArrayBoundaryLabelPrefix(kind);
1012
+ return [
1013
+ `(func $host_array_to_${wrapperTypeName} (param $value externref) (result (ref null $${wrapperTypeName}))`,
1014
+ `${indent(1)}(local $length i32)`,
1015
+ `${indent(1)}(local $index i32)`,
1016
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
1017
+ ...(kind === 'tagged'
1018
+ ? [
1019
+ `${indent(1)}(local $element_host externref)`,
1020
+ `${indent(1)}(local $element_tag i32)`,
1021
+ `${indent(1)}(local $element_tagged (ref null $tagged_value))`,
1022
+ ]
1023
+ : []),
1024
+ `${indent(1)}local.get $value`,
1025
+ `${indent(1)}call $host_array_length`,
1026
+ `${indent(1)}local.set $length`,
1027
+ `${indent(1)}local.get $length`,
1028
+ `${indent(1)}array.new_default $${dataTypeName}`,
1029
+ `${indent(1)}local.set $backing`,
1030
+ `${indent(1)}i32.const 0`,
1031
+ `${indent(1)}local.set $index`,
1032
+ `${indent(1)}(block $host_${labelPrefix}_done`,
1033
+ `${indent(2)}(loop $host_${labelPrefix}_loop`,
1034
+ `${indent(3)}local.get $index`,
1035
+ `${indent(3)}local.get $length`,
1036
+ `${indent(3)}i32.ge_u`,
1037
+ `${indent(3)}br_if $host_${labelPrefix}_done`,
1038
+ ...emitHostArrayElementToOwnedBackingLines(
1039
+ kind,
1040
+ 'backing',
1041
+ 'index',
1042
+ 'value',
1043
+ indent,
1044
+ taggedKinds,
1045
+ layoutsByRepresentationName,
1046
+ createUnsupportedHeapRuntimeBackendError,
1047
+ ),
1048
+ `${indent(3)}local.get $index`,
1049
+ `${indent(3)}i32.const 1`,
1050
+ `${indent(3)}i32.add`,
1051
+ `${indent(3)}local.set $index`,
1052
+ `${indent(3)}br $host_${labelPrefix}_loop`,
1053
+ `${indent(2)})`,
1054
+ `${indent(1)})`,
1055
+ `${indent(1)}local.get $backing`,
1056
+ `${indent(1)}struct.new $${wrapperTypeName}`,
1057
+ ')',
1058
+ ];
1059
+ }
1060
+
1061
+ function emitCopyOwnedArrayToHostArrayHelper(
1062
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
1063
+ indent: (level: number) => string,
1064
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
1065
+ taggedKinds?: CompilerFunctionHostTaggedArrayBoundaryIR,
1066
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
1067
+ fallbackObjectWatTypeId?: string,
1068
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
1069
+ ): string[] {
1070
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1071
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1072
+ const copyElementLines = kind === 'tagged' && taggedKinds?.representation
1073
+ ? (() => {
1074
+ if (!createUnsupportedHeapRuntimeBackendError) {
1075
+ throw new Error('Tagged heap-array owned-to-host copy helpers require backend error construction.');
1076
+ }
1077
+ const specializedWatTypeId = taggedKinds.representation.kind === 'specialized_object_representation'
1078
+ ? layoutsByRepresentationName?.get(taggedKinds.representation.name)?.watTypeId ??
1079
+ (() => {
1080
+ throw createUnsupportedHeapRuntimeBackendError(
1081
+ `Missing specialized object layout for tagged array boundary ${taggedKinds.representation.name}.`,
1082
+ );
1083
+ })()
1084
+ : undefined;
1085
+ const fallbackWatTypeId = taggedKinds.representation.kind === 'fallback_object_representation'
1086
+ ? fallbackObjectWatTypeId ??
1087
+ (() => {
1088
+ throw createUnsupportedHeapRuntimeBackendError(
1089
+ 'Missing fallback object layout for tagged array host copy-back helper.',
1090
+ );
1091
+ })()
1092
+ : undefined;
1093
+ return [
1094
+ `${indent(3)}local.get $backing`,
1095
+ `${indent(3)}local.get $index`,
1096
+ `${indent(3)}array.get $${dataTypeName}`,
1097
+ `${indent(3)}local.set $element_tagged`,
1098
+ `${indent(3)}local.get $element_tagged`,
1099
+ `${indent(3)}struct.get $tagged_value 0`,
1100
+ `${indent(3)}local.set $element_tag`,
1101
+ `${indent(3)}(block $element_host_done`,
1102
+ ...(taggedKinds.includesUndefined
1103
+ ? [
1104
+ `${indent(4)}local.get $element_tag`,
1105
+ `${indent(4)}i32.const 0`,
1106
+ `${indent(4)}i32.eq`,
1107
+ `${indent(4)}(if`,
1108
+ `${indent(5)}(then`,
1109
+ `${indent(6)}call $tagged_undefined_value`,
1110
+ `${indent(6)}local.set $element_host`,
1111
+ `${indent(6)}br $element_host_done`,
1112
+ `${indent(5)})`,
1113
+ `${indent(4)})`,
1114
+ ]
1115
+ : []),
1116
+ ...(taggedKinds.includesNull
1117
+ ? [
1118
+ `${indent(4)}local.get $element_tag`,
1119
+ `${indent(4)}i32.const 6`,
1120
+ `${indent(4)}i32.eq`,
1121
+ `${indent(4)}(if`,
1122
+ `${indent(5)}(then`,
1123
+ `${indent(6)}ref.null extern`,
1124
+ `${indent(6)}local.set $element_host`,
1125
+ `${indent(6)}br $element_host_done`,
1126
+ `${indent(5)})`,
1127
+ `${indent(4)})`,
1128
+ ]
1129
+ : []),
1130
+ ...(taggedKinds.includesBoolean
1131
+ ? [
1132
+ `${indent(4)}local.get $element_tag`,
1133
+ `${indent(4)}i32.const 1`,
1134
+ `${indent(4)}i32.eq`,
1135
+ `${indent(4)}(if`,
1136
+ `${indent(5)}(then`,
1137
+ `${indent(6)}local.get $element_tagged`,
1138
+ `${indent(6)}call $untag_boolean`,
1139
+ `${indent(6)}call $tagged_from_boolean`,
1140
+ `${indent(6)}local.set $element_host`,
1141
+ `${indent(6)}br $element_host_done`,
1142
+ `${indent(5)})`,
1143
+ `${indent(4)})`,
1144
+ ]
1145
+ : []),
1146
+ ...(taggedKinds.includesNumber
1147
+ ? [
1148
+ `${indent(4)}local.get $element_tag`,
1149
+ `${indent(4)}i32.const 2`,
1150
+ `${indent(4)}i32.eq`,
1151
+ `${indent(4)}(if`,
1152
+ `${indent(5)}(then`,
1153
+ `${indent(6)}local.get $element_tagged`,
1154
+ `${indent(6)}call $untag_number`,
1155
+ `${indent(6)}call $tagged_from_number`,
1156
+ `${indent(6)}local.set $element_host`,
1157
+ `${indent(6)}br $element_host_done`,
1158
+ `${indent(5)})`,
1159
+ `${indent(4)})`,
1160
+ ]
1161
+ : []),
1162
+ ...(taggedKinds.includesString
1163
+ ? [
1164
+ `${indent(4)}local.get $element_tag`,
1165
+ `${indent(4)}i32.const 3`,
1166
+ `${indent(4)}i32.eq`,
1167
+ `${indent(4)}(if`,
1168
+ `${indent(5)}(then`,
1169
+ `${indent(6)}local.get $element_tagged`,
1170
+ `${indent(6)}call $untag_string`,
1171
+ `${indent(6)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
1172
+ `${indent(6)}call $owned_string_to_host`,
1173
+ `${indent(6)}local.set $element_host`,
1174
+ `${indent(6)}br $element_host_done`,
1175
+ `${indent(5)})`,
1176
+ `${indent(4)})`,
1177
+ ]
1178
+ : []),
1179
+ `${indent(4)}local.get $element_tag`,
1180
+ `${indent(4)}i32.const 4`,
1181
+ `${indent(4)}i32.eq`,
1182
+ `${indent(4)}(if`,
1183
+ `${indent(5)}(then`,
1184
+ `${indent(6)}local.get $element_tagged`,
1185
+ `${indent(6)}call $untag_heap_object`,
1186
+ `${indent(6)}call $host_object_lookup_cached`,
1187
+ `${indent(6)}local.tee $element_host`,
1188
+ `${indent(6)}ref.is_null`,
1189
+ `${indent(6)}if`,
1190
+ ...(taggedKinds.representation.kind === 'specialized_object_representation'
1191
+ ? [
1192
+ `${indent(7)}local.get $element_tagged`,
1193
+ `${indent(7)}call $untag_heap_object`,
1194
+ `${indent(7)}ref.cast (ref null $${specializedWatTypeId!})`,
1195
+ `${indent(7)}call $${getTaggedArraySpecializedObjectToHostHelperName(specializedWatTypeId!)}`,
1196
+ `${indent(7)}local.set $element_host`,
1197
+ ]
1198
+ : [
1199
+ `${indent(7)}local.get $element_tagged`,
1200
+ `${indent(7)}call $untag_heap_object`,
1201
+ `${indent(7)}ref.cast (ref null $${fallbackWatTypeId!})`,
1202
+ `${indent(7)}call $fallback_object_to_host_object`,
1203
+ `${indent(7)}local.set $element_host`,
1204
+ ]),
1205
+ `${indent(6)}else`,
1206
+ ...(taggedKinds.representation.kind === 'specialized_object_representation'
1207
+ ? [
1208
+ `${indent(7)}local.get $element_host`,
1209
+ `${indent(7)}local.get $element_tagged`,
1210
+ `${indent(7)}call $untag_heap_object`,
1211
+ `${indent(7)}ref.cast (ref null $${specializedWatTypeId!})`,
1212
+ `${indent(7)}call $${getTaggedArrayCopySpecializedObjectToHostHelperName(specializedWatTypeId!)}`,
1213
+ ]
1214
+ : [
1215
+ `${indent(7)}local.get $element_host`,
1216
+ `${indent(7)}local.get $element_tagged`,
1217
+ `${indent(7)}call $untag_heap_object`,
1218
+ `${indent(7)}ref.cast (ref null $${fallbackWatTypeId!})`,
1219
+ `${indent(7)}call $${getTaggedArrayCopyFallbackObjectToHostHelperName()}`,
1220
+ ]),
1221
+ `${indent(6)}end`,
1222
+ `${indent(6)}br $element_host_done`,
1223
+ `${indent(5)})`,
1224
+ `${indent(4)})`,
1225
+ `${indent(4)}unreachable`,
1226
+ `${indent(3)})`,
1227
+ `${indent(3)}local.get $target`,
1228
+ `${indent(3)}local.get $element_host`,
1229
+ `${indent(3)}call $host_array_push`,
1230
+ ];
1231
+ })()
1232
+ : emitOwnedBackingElementToHostArrayLines(
1233
+ kind,
1234
+ 'target',
1235
+ 'backing',
1236
+ 'index',
1237
+ indent,
1238
+ stringRuntimeLayout,
1239
+ taggedKinds,
1240
+ layoutsByRepresentationName,
1241
+ fallbackObjectWatTypeId,
1242
+ createUnsupportedHeapRuntimeBackendError,
1243
+ );
1244
+ return [
1245
+ `(func $copy_${wrapperTypeName}_to_host_array (param $target externref) (param $value (ref null $${wrapperTypeName}))`,
1246
+ `${indent(1)}(local $length i32)`,
1247
+ `${indent(1)}(local $index i32)`,
1248
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
1249
+ ...(kind === 'tagged'
1250
+ ? [
1251
+ `${indent(1)}(local $element_tag i32)`,
1252
+ `${indent(1)}(local $element_tagged (ref null $tagged_value))`,
1253
+ `${indent(1)}(local $element_host externref)`,
1254
+ ]
1255
+ : []),
1256
+ `${indent(1)}local.get $target`,
1257
+ `${indent(1)}call $host_array_clear`,
1258
+ `${indent(1)}local.get $value`,
1259
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1260
+ `${indent(1)}local.set $backing`,
1261
+ `${indent(1)}local.get $backing`,
1262
+ `${indent(1)}array.len`,
1263
+ `${indent(1)}local.set $length`,
1264
+ `${indent(1)}i32.const 0`,
1265
+ `${indent(1)}local.set $index`,
1266
+ `${indent(1)}(block $copy_${wrapperTypeName}_done`,
1267
+ `${indent(2)}(loop $copy_${wrapperTypeName}_loop`,
1268
+ `${indent(3)}local.get $index`,
1269
+ `${indent(3)}local.get $length`,
1270
+ `${indent(3)}i32.ge_u`,
1271
+ `${indent(3)}br_if $copy_${wrapperTypeName}_done`,
1272
+ ...copyElementLines,
1273
+ `${indent(3)}local.get $index`,
1274
+ `${indent(3)}i32.const 1`,
1275
+ `${indent(3)}i32.add`,
1276
+ `${indent(3)}local.set $index`,
1277
+ `${indent(3)}br $copy_${wrapperTypeName}_loop`,
1278
+ `${indent(2)})`,
1279
+ `${indent(1)})`,
1280
+ ')',
1281
+ ];
1282
+ }
1283
+
1284
+ function emitHostArrayToOwnedTaggedArrayHelper(
1285
+ kinds: CompilerFunctionHostTaggedArrayBoundaryIR,
1286
+ indent: (level: number) => string,
1287
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
1288
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
1289
+ ): string[] {
1290
+ const lines = emitHostArrayToOwnedArrayHelper(
1291
+ 'tagged',
1292
+ indent,
1293
+ kinds,
1294
+ layoutsByRepresentationName,
1295
+ createUnsupportedHeapRuntimeBackendError,
1296
+ );
1297
+ lines[0] =
1298
+ `(func $${getHostArrayToOwnedTaggedArrayHelperName(kinds)} (param $value externref) (result (ref null $owned_tagged_array))`;
1299
+ return lines;
1300
+ }
1301
+
1302
+ function emitCopyOwnedTaggedArrayToHostArrayHelper(
1303
+ kinds: CompilerFunctionHostTaggedArrayBoundaryIR,
1304
+ indent: (level: number) => string,
1305
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
1306
+ fallbackObjectWatTypeId?: string,
1307
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
1308
+ ): string[] {
1309
+ const lines = emitCopyOwnedArrayToHostArrayHelper(
1310
+ 'tagged',
1311
+ indent,
1312
+ undefined,
1313
+ kinds,
1314
+ layoutsByRepresentationName,
1315
+ fallbackObjectWatTypeId,
1316
+ createUnsupportedHeapRuntimeBackendError,
1317
+ );
1318
+ lines[0] =
1319
+ `(func $${getCopyOwnedTaggedArrayToHostHelperName(kinds)} (param $target externref) (param $value (ref null $owned_tagged_array))`;
1320
+ return lines;
1321
+ }
1322
+
1323
+ function emitOwnedTaggedArrayToHostArrayHelper(
1324
+ kinds: CompilerFunctionHostTaggedArrayBoundaryIR,
1325
+ indent: (level: number) => string,
1326
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
1327
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
1328
+ fallbackObjectWatTypeId?: string,
1329
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
1330
+ ): string[] {
1331
+ const lines = emitOwnedArrayToHostArrayHelper(
1332
+ 'tagged',
1333
+ indent,
1334
+ stringRuntimeLayout,
1335
+ kinds,
1336
+ layoutsByRepresentationName,
1337
+ fallbackObjectWatTypeId,
1338
+ createUnsupportedHeapRuntimeBackendError,
1339
+ );
1340
+ lines[0] =
1341
+ `(func $${getOwnedTaggedArrayToHostHelperName(kinds)} (param $value (ref null $owned_tagged_array)) (result externref)`;
1342
+ return lines;
1343
+ }
1344
+
1345
+ function collectTaggedArrayBoundaryKindSets(
1346
+ module: CompilerModuleIR,
1347
+ layoutsByRepresentationName?: ReadonlyMap<string, {
1348
+ fields?: ReadonlyArray<{
1349
+ valueType: string;
1350
+ taggedPrimitiveKinds?: CompilerTaggedPrimitiveBoundaryKindsIR;
1351
+ heapRepresentation?: CompilerFunctionHostTaggedArrayBoundaryIR['representation'];
1352
+ }>;
1353
+ }>,
1354
+ ): readonly CompilerFunctionHostTaggedArrayBoundaryIR[] {
1355
+ const sets = new Map<string, CompilerFunctionHostTaggedArrayBoundaryIR>();
1356
+ for (const func of module.functions) {
1357
+ for (const param of func.hostTaggedArrayParams ?? []) {
1358
+ sets.set(getTaggedArrayKindsSuffix(param), param);
1359
+ }
1360
+ if (func.hostTaggedArrayResultKinds) {
1361
+ sets.set(getTaggedArrayKindsSuffix(func.hostTaggedArrayResultKinds), func.hostTaggedArrayResultKinds);
1362
+ }
1363
+ for (const property of func.hostFallbackTaggedArrayProperties ?? []) {
1364
+ sets.set(getTaggedArrayKindsSuffix(property), property);
1365
+ }
1366
+ }
1367
+ for (const layout of layoutsByRepresentationName?.values() ?? []) {
1368
+ for (const field of layout.fields ?? []) {
1369
+ if (field.valueType !== 'owned_tagged_array_ref' || !field.taggedPrimitiveKinds) {
1370
+ continue;
1371
+ }
1372
+ const boundaryKinds: CompilerFunctionHostTaggedArrayBoundaryIR = {
1373
+ ...field.taggedPrimitiveKinds,
1374
+ representation: field.heapRepresentation,
1375
+ };
1376
+ sets.set(getTaggedArrayKindsSuffix(boundaryKinds), boundaryKinds);
1377
+ }
1378
+ }
1379
+ for (const field of module.runtime?.classStaticFields ?? []) {
1380
+ if (field.kind !== 'class_static_tagged_array_field') {
1381
+ continue;
1382
+ }
1383
+ const boundaryKinds: CompilerFunctionHostTaggedArrayBoundaryIR = {
1384
+ includesBoolean: field.includesBoolean,
1385
+ includesNull: field.includesNull,
1386
+ includesNumber: field.includesNumber,
1387
+ includesString: field.includesString,
1388
+ includesUndefined: field.includesUndefined,
1389
+ representation: field.representation,
1390
+ };
1391
+ sets.set(getTaggedArrayKindsSuffix(boundaryKinds), boundaryKinds);
1392
+ }
1393
+ return [...sets.values()];
1394
+ }
1395
+
1396
+ function emitOwnedArrayToHostArrayHelper(
1397
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
1398
+ indent: (level: number) => string,
1399
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
1400
+ taggedKinds?: CompilerFunctionHostTaggedArrayBoundaryIR,
1401
+ layoutsByRepresentationName?: ReadonlyMap<string, { watTypeId: string }>,
1402
+ fallbackObjectWatTypeId?: string,
1403
+ createUnsupportedHeapRuntimeBackendError?: (message: string) => CompilerUnsupportedError,
1404
+ ): string[] {
1405
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1406
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1407
+ const labelPrefix = getOwnedArrayBoundaryLabelPrefix(kind);
1408
+ return [
1409
+ `(func $${getOwnedArrayToHostHelperName(kind)} (param $value (ref null $${wrapperTypeName})) (result externref)`,
1410
+ `${indent(1)}(local $length i32)`,
1411
+ `${indent(1)}(local $index i32)`,
1412
+ `${indent(1)}(local $result externref)`,
1413
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
1414
+ ...(kind === 'tagged'
1415
+ ? [
1416
+ `${indent(1)}(local $element_tag i32)`,
1417
+ `${indent(1)}(local $element_tagged (ref null $tagged_value))`,
1418
+ `${indent(1)}(local $element_host externref)`,
1419
+ ]
1420
+ : []),
1421
+ `${indent(1)}call $${getHostArrayEmptyHelperName(kind)}`,
1422
+ `${indent(1)}local.set $result`,
1423
+ `${indent(1)}local.get $value`,
1424
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1425
+ `${indent(1)}local.set $backing`,
1426
+ `${indent(1)}local.get $backing`,
1427
+ `${indent(1)}array.len`,
1428
+ `${indent(1)}local.set $length`,
1429
+ `${indent(1)}i32.const 0`,
1430
+ `${indent(1)}local.set $index`,
1431
+ `${indent(1)}(block $owned_${labelPrefix}_done`,
1432
+ `${indent(2)}(loop $owned_${labelPrefix}_loop`,
1433
+ `${indent(3)}local.get $index`,
1434
+ `${indent(3)}local.get $length`,
1435
+ `${indent(3)}i32.ge_u`,
1436
+ `${indent(3)}br_if $owned_${labelPrefix}_done`,
1437
+ ...emitOwnedBackingElementToHostArrayLines(
1438
+ kind,
1439
+ 'result',
1440
+ 'backing',
1441
+ 'index',
1442
+ indent,
1443
+ stringRuntimeLayout,
1444
+ taggedKinds,
1445
+ layoutsByRepresentationName,
1446
+ fallbackObjectWatTypeId,
1447
+ createUnsupportedHeapRuntimeBackendError,
1448
+ ),
1449
+ `${indent(3)}local.get $index`,
1450
+ `${indent(3)}i32.const 1`,
1451
+ `${indent(3)}i32.add`,
1452
+ `${indent(3)}local.set $index`,
1453
+ `${indent(3)}br $owned_${labelPrefix}_loop`,
1454
+ `${indent(2)})`,
1455
+ `${indent(1)})`,
1456
+ `${indent(1)}local.get $result`,
1457
+ ')',
1458
+ ];
1459
+ }
1460
+
1461
+ function emitOwnedArrayPushHelper(
1462
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
1463
+ indent: (level: number) => string,
1464
+ ): string[] {
1465
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1466
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1467
+ return [
1468
+ `(func $${getOwnedArrayPushHelperName(kind)} (param $array (ref null $${wrapperTypeName})) (param $value ${
1469
+ getOwnedArrayPushValueWatType(kind)
1470
+ }) (result f64)`,
1471
+ `${indent(1)}(local $old_backing (ref null $${dataTypeName}))`,
1472
+ `${indent(1)}(local $new_backing (ref null $${dataTypeName}))`,
1473
+ `${indent(1)}(local $length i32)`,
1474
+ `${indent(1)}(local $index i32)`,
1475
+ `${indent(1)}local.get $array`,
1476
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1477
+ `${indent(1)}local.set $old_backing`,
1478
+ `${indent(1)}local.get $old_backing`,
1479
+ `${indent(1)}array.len`,
1480
+ `${indent(1)}local.set $length`,
1481
+ `${indent(1)}local.get $length`,
1482
+ `${indent(1)}i32.const 1`,
1483
+ `${indent(1)}i32.add`,
1484
+ `${indent(1)}array.new_default $${dataTypeName}`,
1485
+ `${indent(1)}local.set $new_backing`,
1486
+ `${indent(1)}i32.const 0`,
1487
+ `${indent(1)}local.set $index`,
1488
+ `${indent(1)}(block $${wrapperTypeName}_push_done`,
1489
+ `${indent(2)}(loop $${wrapperTypeName}_push_loop`,
1490
+ `${indent(3)}local.get $index`,
1491
+ `${indent(3)}local.get $length`,
1492
+ `${indent(3)}i32.ge_u`,
1493
+ `${indent(3)}br_if $${wrapperTypeName}_push_done`,
1494
+ `${indent(3)}local.get $new_backing`,
1495
+ `${indent(3)}local.get $index`,
1496
+ `${indent(3)}local.get $old_backing`,
1497
+ `${indent(3)}local.get $index`,
1498
+ `${indent(3)}array.get $${dataTypeName}`,
1499
+ `${indent(3)}array.set $${dataTypeName}`,
1500
+ `${indent(3)}local.get $index`,
1501
+ `${indent(3)}i32.const 1`,
1502
+ `${indent(3)}i32.add`,
1503
+ `${indent(3)}local.set $index`,
1504
+ `${indent(3)}br $${wrapperTypeName}_push_loop`,
1505
+ `${indent(2)})`,
1506
+ `${indent(1)})`,
1507
+ `${indent(1)}local.get $new_backing`,
1508
+ `${indent(1)}local.get $length`,
1509
+ `${indent(1)}local.get $value`,
1510
+ `${indent(1)}array.set $${dataTypeName}`,
1511
+ `${indent(1)}local.get $array`,
1512
+ `${indent(1)}local.get $new_backing`,
1513
+ `${indent(1)}struct.set $${wrapperTypeName} 0`,
1514
+ `${indent(1)}local.get $length`,
1515
+ `${indent(1)}i32.const 1`,
1516
+ `${indent(1)}i32.add`,
1517
+ `${indent(1)}f64.convert_i32_u`,
1518
+ ')',
1519
+ ];
1520
+ }
1521
+
1522
+ function emitOwnedArrayUnshiftHelper(
1523
+ kind: 'string' | 'number' | 'boolean' | 'tagged',
1524
+ indent: (level: number) => string,
1525
+ ): string[] {
1526
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1527
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1528
+ return [
1529
+ `(func $${getOwnedArrayUnshiftHelperName(kind)} (param $array (ref null $${wrapperTypeName})) (param $value ${
1530
+ getOwnedArrayPushValueWatType(kind)
1531
+ }) (result f64)`,
1532
+ `${indent(1)}(local $old_backing (ref null $${dataTypeName}))`,
1533
+ `${indent(1)}(local $new_backing (ref null $${dataTypeName}))`,
1534
+ `${indent(1)}(local $length i32)`,
1535
+ `${indent(1)}(local $index i32)`,
1536
+ `${indent(1)}local.get $array`,
1537
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1538
+ `${indent(1)}local.set $old_backing`,
1539
+ `${indent(1)}local.get $old_backing`,
1540
+ `${indent(1)}array.len`,
1541
+ `${indent(1)}local.set $length`,
1542
+ `${indent(1)}local.get $length`,
1543
+ `${indent(1)}i32.const 1`,
1544
+ `${indent(1)}i32.add`,
1545
+ `${indent(1)}array.new_default $${dataTypeName}`,
1546
+ `${indent(1)}local.set $new_backing`,
1547
+ `${indent(1)}local.get $new_backing`,
1548
+ `${indent(1)}i32.const 0`,
1549
+ `${indent(1)}local.get $value`,
1550
+ `${indent(1)}array.set $${dataTypeName}`,
1551
+ `${indent(1)}i32.const 0`,
1552
+ `${indent(1)}local.set $index`,
1553
+ `${indent(1)}(block $${wrapperTypeName}_unshift_done`,
1554
+ `${indent(2)}(loop $${wrapperTypeName}_unshift_loop`,
1555
+ `${indent(3)}local.get $index`,
1556
+ `${indent(3)}local.get $length`,
1557
+ `${indent(3)}i32.ge_u`,
1558
+ `${indent(3)}br_if $${wrapperTypeName}_unshift_done`,
1559
+ `${indent(3)}local.get $new_backing`,
1560
+ `${indent(3)}local.get $index`,
1561
+ `${indent(3)}i32.const 1`,
1562
+ `${indent(3)}i32.add`,
1563
+ `${indent(3)}local.get $old_backing`,
1564
+ `${indent(3)}local.get $index`,
1565
+ `${indent(3)}array.get $${dataTypeName}`,
1566
+ `${indent(3)}array.set $${dataTypeName}`,
1567
+ `${indent(3)}local.get $index`,
1568
+ `${indent(3)}i32.const 1`,
1569
+ `${indent(3)}i32.add`,
1570
+ `${indent(3)}local.set $index`,
1571
+ `${indent(3)}br $${wrapperTypeName}_unshift_loop`,
1572
+ `${indent(2)})`,
1573
+ `${indent(1)})`,
1574
+ `${indent(1)}local.get $array`,
1575
+ `${indent(1)}local.get $new_backing`,
1576
+ `${indent(1)}struct.set $${wrapperTypeName} 0`,
1577
+ `${indent(1)}local.get $length`,
1578
+ `${indent(1)}i32.const 1`,
1579
+ `${indent(1)}i32.add`,
1580
+ `${indent(1)}f64.convert_i32_u`,
1581
+ ')',
1582
+ ];
1583
+ }
1584
+
1585
+ function emitOwnedArrayPopHelper(
1586
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
1587
+ indent: (level: number) => string,
1588
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
1589
+ ): string[] {
1590
+ if (kind === 'string' && !stringRuntimeLayout) {
1591
+ throw new CompilerUnsupportedError(
1592
+ 'Owned string-array pop helpers require the owned string runtime.',
1593
+ );
1594
+ }
1595
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1596
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1597
+ const helperName = getOwnedArrayPopHelperName(kind);
1598
+ const poppedLocal = kind === 'heap'
1599
+ ? '(local $popped (ref null eq))'
1600
+ : kind === 'string'
1601
+ ? `(local $popped (ref null $${stringRuntimeLayout!.runtimeWatTypeId}))`
1602
+ : kind === 'number'
1603
+ ? '(local $popped f64)'
1604
+ : kind === 'boolean'
1605
+ ? '(local $popped i32)'
1606
+ : '(local $popped (ref null $tagged_value))';
1607
+ const tagLines = kind === 'heap'
1608
+ ? [
1609
+ `${indent(1)}local.get $popped`,
1610
+ `${indent(1)}call $tag_heap_object`,
1611
+ ]
1612
+ : kind === 'string'
1613
+ ? [
1614
+ `${indent(1)}local.get $popped`,
1615
+ `${indent(1)}call $tag_string`,
1616
+ ]
1617
+ : kind === 'number'
1618
+ ? [
1619
+ `${indent(1)}local.get $popped`,
1620
+ `${indent(1)}call $tag_number`,
1621
+ ]
1622
+ : kind === 'boolean'
1623
+ ? [
1624
+ `${indent(1)}local.get $popped`,
1625
+ `${indent(1)}call $tag_boolean`,
1626
+ ]
1627
+ : [
1628
+ `${indent(1)}local.get $popped`,
1629
+ ];
1630
+ const captureLines = kind === 'heap'
1631
+ ? [
1632
+ `${indent(1)}local.get $old_backing`,
1633
+ `${indent(1)}local.get $length`,
1634
+ `${indent(1)}i32.const 1`,
1635
+ `${indent(1)}i32.sub`,
1636
+ `${indent(1)}array.get $${dataTypeName}`,
1637
+ `${indent(1)}local.set $popped`,
1638
+ ]
1639
+ : kind === 'string'
1640
+ ? [
1641
+ `${indent(1)}local.get $old_backing`,
1642
+ `${indent(1)}local.get $length`,
1643
+ `${indent(1)}i32.const 1`,
1644
+ `${indent(1)}i32.sub`,
1645
+ `${indent(1)}array.get $${dataTypeName}`,
1646
+ `${indent(1)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
1647
+ `${indent(1)}local.set $popped`,
1648
+ ]
1649
+ : kind === 'tagged'
1650
+ ? [
1651
+ `${indent(1)}local.get $old_backing`,
1652
+ `${indent(1)}local.get $length`,
1653
+ `${indent(1)}i32.const 1`,
1654
+ `${indent(1)}i32.sub`,
1655
+ `${indent(1)}array.get $${dataTypeName}`,
1656
+ `${indent(1)}local.set $popped`,
1657
+ ]
1658
+ : [
1659
+ `${indent(1)}local.get $old_backing`,
1660
+ `${indent(1)}local.get $length`,
1661
+ `${indent(1)}i32.const 1`,
1662
+ `${indent(1)}i32.sub`,
1663
+ `${indent(1)}array.get $${dataTypeName}`,
1664
+ `${indent(1)}local.set $popped`,
1665
+ ];
1666
+ return [
1667
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (result (ref null $tagged_value))`,
1668
+ `${indent(1)}(local $old_backing (ref null $${dataTypeName}))`,
1669
+ `${indent(1)}(local $new_backing (ref null $${dataTypeName}))`,
1670
+ `${indent(1)}(local $length i32)`,
1671
+ `${indent(1)}(local $index i32)`,
1672
+ `${indent(1)}${poppedLocal}`,
1673
+ `${indent(1)}local.get $array`,
1674
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1675
+ `${indent(1)}local.set $old_backing`,
1676
+ `${indent(1)}local.get $old_backing`,
1677
+ `${indent(1)}array.len`,
1678
+ `${indent(1)}local.set $length`,
1679
+ `${indent(1)}local.get $length`,
1680
+ `${indent(1)}i32.eqz`,
1681
+ `${indent(1)}(if`,
1682
+ `${indent(2)}(then`,
1683
+ `${indent(3)}call $tag_undefined`,
1684
+ `${indent(3)}return`,
1685
+ `${indent(2)})`,
1686
+ `${indent(1)})`,
1687
+ ...captureLines,
1688
+ `${indent(1)}local.get $length`,
1689
+ `${indent(1)}i32.const 1`,
1690
+ `${indent(1)}i32.sub`,
1691
+ `${indent(1)}array.new_default $${dataTypeName}`,
1692
+ `${indent(1)}local.set $new_backing`,
1693
+ `${indent(1)}i32.const 0`,
1694
+ `${indent(1)}local.set $index`,
1695
+ `${indent(1)}(block $${wrapperTypeName}_pop_done`,
1696
+ `${indent(2)}(loop $${wrapperTypeName}_pop_loop`,
1697
+ `${indent(3)}local.get $index`,
1698
+ `${indent(3)}local.get $length`,
1699
+ `${indent(3)}i32.const 1`,
1700
+ `${indent(3)}i32.sub`,
1701
+ `${indent(3)}i32.ge_u`,
1702
+ `${indent(3)}br_if $${wrapperTypeName}_pop_done`,
1703
+ `${indent(3)}local.get $new_backing`,
1704
+ `${indent(3)}local.get $index`,
1705
+ `${indent(3)}local.get $old_backing`,
1706
+ `${indent(3)}local.get $index`,
1707
+ `${indent(3)}array.get $${dataTypeName}`,
1708
+ `${indent(3)}array.set $${dataTypeName}`,
1709
+ `${indent(3)}local.get $index`,
1710
+ `${indent(3)}i32.const 1`,
1711
+ `${indent(3)}i32.add`,
1712
+ `${indent(3)}local.set $index`,
1713
+ `${indent(3)}br $${wrapperTypeName}_pop_loop`,
1714
+ `${indent(2)})`,
1715
+ `${indent(1)})`,
1716
+ `${indent(1)}local.get $array`,
1717
+ `${indent(1)}local.get $new_backing`,
1718
+ `${indent(1)}struct.set $${wrapperTypeName} 0`,
1719
+ ...tagLines,
1720
+ ')',
1721
+ ];
1722
+ }
1723
+
1724
+ function emitOwnedArrayShiftHelper(
1725
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
1726
+ indent: (level: number) => string,
1727
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
1728
+ ): string[] {
1729
+ if (kind === 'string' && !stringRuntimeLayout) {
1730
+ throw new CompilerUnsupportedError(
1731
+ 'Owned string-array shift helpers require the owned string runtime.',
1732
+ );
1733
+ }
1734
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1735
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1736
+ const helperName = getOwnedArrayShiftHelperName(kind);
1737
+ const shiftedLocal = kind === 'heap'
1738
+ ? '(local $shifted (ref null eq))'
1739
+ : kind === 'string'
1740
+ ? `(local $shifted (ref null $${stringRuntimeLayout!.runtimeWatTypeId}))`
1741
+ : kind === 'number'
1742
+ ? '(local $shifted f64)'
1743
+ : kind === 'boolean'
1744
+ ? '(local $shifted i32)'
1745
+ : '(local $shifted (ref null $tagged_value))';
1746
+ const tagLines = kind === 'heap'
1747
+ ? [
1748
+ `${indent(1)}local.get $shifted`,
1749
+ `${indent(1)}call $tag_heap_object`,
1750
+ ]
1751
+ : kind === 'string'
1752
+ ? [
1753
+ `${indent(1)}local.get $shifted`,
1754
+ `${indent(1)}call $tag_string`,
1755
+ ]
1756
+ : kind === 'number'
1757
+ ? [
1758
+ `${indent(1)}local.get $shifted`,
1759
+ `${indent(1)}call $tag_number`,
1760
+ ]
1761
+ : kind === 'boolean'
1762
+ ? [
1763
+ `${indent(1)}local.get $shifted`,
1764
+ `${indent(1)}call $tag_boolean`,
1765
+ ]
1766
+ : [
1767
+ `${indent(1)}local.get $shifted`,
1768
+ ];
1769
+ const captureLines = kind === 'heap'
1770
+ ? [
1771
+ `${indent(1)}local.get $old_backing`,
1772
+ `${indent(1)}i32.const 0`,
1773
+ `${indent(1)}array.get $${dataTypeName}`,
1774
+ `${indent(1)}local.set $shifted`,
1775
+ ]
1776
+ : kind === 'string'
1777
+ ? [
1778
+ `${indent(1)}local.get $old_backing`,
1779
+ `${indent(1)}i32.const 0`,
1780
+ `${indent(1)}array.get $${dataTypeName}`,
1781
+ `${indent(1)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
1782
+ `${indent(1)}local.set $shifted`,
1783
+ ]
1784
+ : kind === 'tagged'
1785
+ ? [
1786
+ `${indent(1)}local.get $old_backing`,
1787
+ `${indent(1)}i32.const 0`,
1788
+ `${indent(1)}array.get $${dataTypeName}`,
1789
+ `${indent(1)}local.set $shifted`,
1790
+ ]
1791
+ : [
1792
+ `${indent(1)}local.get $old_backing`,
1793
+ `${indent(1)}i32.const 0`,
1794
+ `${indent(1)}array.get $${dataTypeName}`,
1795
+ `${indent(1)}local.set $shifted`,
1796
+ ];
1797
+ return [
1798
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (result (ref null $tagged_value))`,
1799
+ `${indent(1)}(local $old_backing (ref null $${dataTypeName}))`,
1800
+ `${indent(1)}(local $new_backing (ref null $${dataTypeName}))`,
1801
+ `${indent(1)}(local $length i32)`,
1802
+ `${indent(1)}(local $index i32)`,
1803
+ `${indent(1)}${shiftedLocal}`,
1804
+ `${indent(1)}local.get $array`,
1805
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1806
+ `${indent(1)}local.set $old_backing`,
1807
+ `${indent(1)}local.get $old_backing`,
1808
+ `${indent(1)}array.len`,
1809
+ `${indent(1)}local.set $length`,
1810
+ `${indent(1)}local.get $length`,
1811
+ `${indent(1)}i32.eqz`,
1812
+ `${indent(1)}(if`,
1813
+ `${indent(2)}(then`,
1814
+ `${indent(3)}call $tag_undefined`,
1815
+ `${indent(3)}return`,
1816
+ `${indent(2)})`,
1817
+ `${indent(1)})`,
1818
+ ...captureLines,
1819
+ `${indent(1)}local.get $length`,
1820
+ `${indent(1)}i32.const 1`,
1821
+ `${indent(1)}i32.sub`,
1822
+ `${indent(1)}array.new_default $${dataTypeName}`,
1823
+ `${indent(1)}local.set $new_backing`,
1824
+ `${indent(1)}i32.const 0`,
1825
+ `${indent(1)}local.set $index`,
1826
+ `${indent(1)}(block $${wrapperTypeName}_shift_done`,
1827
+ `${indent(2)}(loop $${wrapperTypeName}_shift_loop`,
1828
+ `${indent(3)}local.get $index`,
1829
+ `${indent(3)}local.get $length`,
1830
+ `${indent(3)}i32.const 1`,
1831
+ `${indent(3)}i32.sub`,
1832
+ `${indent(3)}i32.ge_u`,
1833
+ `${indent(3)}br_if $${wrapperTypeName}_shift_done`,
1834
+ `${indent(3)}local.get $new_backing`,
1835
+ `${indent(3)}local.get $index`,
1836
+ `${indent(3)}local.get $old_backing`,
1837
+ `${indent(3)}local.get $index`,
1838
+ `${indent(3)}i32.const 1`,
1839
+ `${indent(3)}i32.add`,
1840
+ `${indent(3)}array.get $${dataTypeName}`,
1841
+ `${indent(3)}array.set $${dataTypeName}`,
1842
+ `${indent(3)}local.get $index`,
1843
+ `${indent(3)}i32.const 1`,
1844
+ `${indent(3)}i32.add`,
1845
+ `${indent(3)}local.set $index`,
1846
+ `${indent(3)}br $${wrapperTypeName}_shift_loop`,
1847
+ `${indent(2)})`,
1848
+ `${indent(1)})`,
1849
+ `${indent(1)}local.get $array`,
1850
+ `${indent(1)}local.get $new_backing`,
1851
+ `${indent(1)}struct.set $${wrapperTypeName} 0`,
1852
+ ...tagLines,
1853
+ ')',
1854
+ ];
1855
+ }
1856
+
1857
+ function emitOwnedArrayAtHelper(
1858
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
1859
+ indent: (level: number) => string,
1860
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
1861
+ ): string[] {
1862
+ if (kind === 'string' && !stringRuntimeLayout) {
1863
+ throw new CompilerUnsupportedError(
1864
+ 'Owned string-array at helpers require the owned string runtime.',
1865
+ );
1866
+ }
1867
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
1868
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
1869
+ const helperName = getOwnedArrayAtHelperName(kind);
1870
+ const valueLines = kind === 'heap'
1871
+ ? [
1872
+ `${indent(1)}local.get $backing`,
1873
+ `${indent(1)}local.get $normalized_index`,
1874
+ `${indent(1)}array.get $${dataTypeName}`,
1875
+ `${indent(1)}call $tag_heap_object`,
1876
+ ]
1877
+ : kind === 'string'
1878
+ ? [
1879
+ `${indent(1)}local.get $backing`,
1880
+ `${indent(1)}local.get $normalized_index`,
1881
+ `${indent(1)}array.get $${dataTypeName}`,
1882
+ `${indent(1)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
1883
+ `${indent(1)}call $tag_string`,
1884
+ ]
1885
+ : kind === 'number'
1886
+ ? [
1887
+ `${indent(1)}local.get $backing`,
1888
+ `${indent(1)}local.get $normalized_index`,
1889
+ `${indent(1)}array.get $${dataTypeName}`,
1890
+ `${indent(1)}call $tag_number`,
1891
+ ]
1892
+ : kind === 'boolean'
1893
+ ? [
1894
+ `${indent(1)}local.get $backing`,
1895
+ `${indent(1)}local.get $normalized_index`,
1896
+ `${indent(1)}array.get $${dataTypeName}`,
1897
+ `${indent(1)}call $tag_boolean`,
1898
+ ]
1899
+ : [
1900
+ `${indent(1)}local.get $backing`,
1901
+ `${indent(1)}local.get $normalized_index`,
1902
+ `${indent(1)}array.get $${dataTypeName}`,
1903
+ ];
1904
+ return [
1905
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $index f64) (result (ref null $tagged_value))`,
1906
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
1907
+ `${indent(1)}(local $length i32)`,
1908
+ `${indent(1)}(local $normalized_index i32)`,
1909
+ `${indent(1)}local.get $array`,
1910
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
1911
+ `${indent(1)}local.set $backing`,
1912
+ `${indent(1)}local.get $backing`,
1913
+ `${indent(1)}array.len`,
1914
+ `${indent(1)}local.set $length`,
1915
+ `${indent(1)}local.get $index`,
1916
+ `${indent(1)}local.get $index`,
1917
+ `${indent(1)}f64.ne`,
1918
+ `${indent(1)}(if`,
1919
+ `${indent(2)}(then`,
1920
+ `${indent(3)}i32.const 0`,
1921
+ `${indent(3)}local.set $normalized_index`,
1922
+ `${indent(2)})`,
1923
+ `${indent(2)}(else`,
1924
+ `${indent(3)}local.get $index`,
1925
+ `${indent(3)}f64.const 0`,
1926
+ `${indent(3)}f64.ge`,
1927
+ `${indent(3)}(if`,
1928
+ `${indent(4)}(then`,
1929
+ `${indent(5)}local.get $index`,
1930
+ `${indent(5)}local.get $length`,
1931
+ `${indent(5)}f64.convert_i32_s`,
1932
+ `${indent(5)}f64.ge`,
1933
+ `${indent(5)}(if`,
1934
+ `${indent(6)}(then`,
1935
+ `${indent(7)}local.get $length`,
1936
+ `${indent(7)}local.set $normalized_index`,
1937
+ `${indent(6)})`,
1938
+ `${indent(6)}(else`,
1939
+ `${indent(7)}local.get $index`,
1940
+ `${indent(7)}f64.floor`,
1941
+ `${indent(7)}i32.trunc_f64_s`,
1942
+ `${indent(7)}local.set $normalized_index`,
1943
+ `${indent(6)})`,
1944
+ `${indent(5)})`,
1945
+ `${indent(4)})`,
1946
+ `${indent(4)}(else`,
1947
+ `${indent(5)}local.get $index`,
1948
+ `${indent(5)}local.get $length`,
1949
+ `${indent(5)}f64.convert_i32_s`,
1950
+ `${indent(5)}f64.neg`,
1951
+ `${indent(5)}f64.lt`,
1952
+ `${indent(5)}(if`,
1953
+ `${indent(6)}(then`,
1954
+ `${indent(7)}i32.const -1`,
1955
+ `${indent(7)}local.set $normalized_index`,
1956
+ `${indent(6)})`,
1957
+ `${indent(6)}(else`,
1958
+ `${indent(7)}local.get $length`,
1959
+ `${indent(7)}local.get $index`,
1960
+ `${indent(7)}f64.ceil`,
1961
+ `${indent(7)}i32.trunc_f64_s`,
1962
+ `${indent(7)}i32.add`,
1963
+ `${indent(7)}local.set $normalized_index`,
1964
+ `${indent(6)})`,
1965
+ `${indent(5)})`,
1966
+ `${indent(4)})`,
1967
+ `${indent(3)})`,
1968
+ `${indent(2)})`,
1969
+ `${indent(1)})`,
1970
+ `${indent(1)}local.get $normalized_index`,
1971
+ `${indent(1)}i32.const 0`,
1972
+ `${indent(1)}i32.lt_s`,
1973
+ `${indent(1)}(if (result (ref null $tagged_value))`,
1974
+ `${indent(2)}(then`,
1975
+ `${indent(3)}call $tag_undefined`,
1976
+ `${indent(2)})`,
1977
+ `${indent(2)}(else`,
1978
+ `${indent(3)}local.get $normalized_index`,
1979
+ `${indent(3)}local.get $length`,
1980
+ `${indent(3)}i32.ge_s`,
1981
+ `${indent(3)}(if (result (ref null $tagged_value))`,
1982
+ `${indent(4)}(then`,
1983
+ `${indent(5)}call $tag_undefined`,
1984
+ `${indent(4)})`,
1985
+ `${indent(4)}(else`,
1986
+ ...valueLines.map((line) => `${indent(3)}${line.slice(indent(1).length)}`),
1987
+ `${indent(4)})`,
1988
+ `${indent(3)})`,
1989
+ `${indent(2)})`,
1990
+ `${indent(1)})`,
1991
+ ')',
1992
+ ];
1993
+ }
1994
+
1995
+ function emitTaggedValueComparisonLines(
1996
+ mode: 'strict' | 'same_value_zero',
1997
+ matchLines: readonly string[],
1998
+ indent: (level: number) => string,
1999
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
2000
+ ): { locals: string[]; lines: string[] } {
2001
+ const numberEqualityLines = mode === 'same_value_zero'
2002
+ ? [
2003
+ `${indent(7)}local.get $candidate_number`,
2004
+ `${indent(7)}local.get $search_number`,
2005
+ `${indent(7)}f64.eq`,
2006
+ `${indent(7)}(if`,
2007
+ `${indent(8)}(then`,
2008
+ ...matchLines.map((line) => `${indent(9)}${line}`),
2009
+ `${indent(8)})`,
2010
+ `${indent(7)})`,
2011
+ `${indent(7)}local.get $candidate_number`,
2012
+ `${indent(7)}local.get $candidate_number`,
2013
+ `${indent(7)}f64.ne`,
2014
+ `${indent(7)}local.get $search_number`,
2015
+ `${indent(7)}local.get $search_number`,
2016
+ `${indent(7)}f64.ne`,
2017
+ `${indent(7)}i32.and`,
2018
+ `${indent(7)}(if`,
2019
+ `${indent(8)}(then`,
2020
+ ...matchLines.map((line) => `${indent(9)}${line}`),
2021
+ `${indent(8)})`,
2022
+ `${indent(7)})`,
2023
+ ]
2024
+ : [
2025
+ `${indent(7)}local.get $candidate_number`,
2026
+ `${indent(7)}local.get $search_number`,
2027
+ `${indent(7)}f64.eq`,
2028
+ `${indent(7)}(if`,
2029
+ `${indent(8)}(then`,
2030
+ ...matchLines.map((line) => `${indent(9)}${line}`),
2031
+ `${indent(8)})`,
2032
+ `${indent(7)})`,
2033
+ ];
2034
+ return {
2035
+ locals: [
2036
+ '(local $candidate_tag i32)',
2037
+ '(local $search_tag i32)',
2038
+ '(local $candidate_number f64)',
2039
+ '(local $search_number f64)',
2040
+ ],
2041
+ lines: [
2042
+ `${indent(3)}local.get $candidate`,
2043
+ `${indent(3)}struct.get $tagged_value 0`,
2044
+ `${indent(3)}local.set $candidate_tag`,
2045
+ `${indent(3)}local.get $search`,
2046
+ `${indent(3)}struct.get $tagged_value 0`,
2047
+ `${indent(3)}local.set $search_tag`,
2048
+ `${indent(3)}local.get $candidate_tag`,
2049
+ `${indent(3)}local.get $search_tag`,
2050
+ `${indent(3)}i32.eq`,
2051
+ `${indent(3)}(if`,
2052
+ `${indent(4)}(then`,
2053
+ `${indent(5)}local.get $candidate_tag`,
2054
+ `${indent(5)}i32.const 0`,
2055
+ `${indent(5)}i32.eq`,
2056
+ `${indent(5)}(if`,
2057
+ `${indent(6)}(then`,
2058
+ ...matchLines.map((line) => `${indent(7)}${line}`),
2059
+ `${indent(6)})`,
2060
+ `${indent(5)})`,
2061
+ `${indent(5)}local.get $candidate_tag`,
2062
+ `${indent(5)}i32.const 6`,
2063
+ `${indent(5)}i32.eq`,
2064
+ `${indent(5)}(if`,
2065
+ `${indent(6)}(then`,
2066
+ ...matchLines.map((line) => `${indent(7)}${line}`),
2067
+ `${indent(6)})`,
2068
+ `${indent(5)})`,
2069
+ `${indent(5)}local.get $candidate_tag`,
2070
+ `${indent(5)}i32.const 1`,
2071
+ `${indent(5)}i32.eq`,
2072
+ `${indent(5)}(if`,
2073
+ `${indent(6)}(then`,
2074
+ `${indent(7)}local.get $candidate`,
2075
+ `${indent(7)}struct.get $tagged_value 1`,
2076
+ `${indent(7)}local.set $candidate_number`,
2077
+ `${indent(7)}local.get $search`,
2078
+ `${indent(7)}struct.get $tagged_value 1`,
2079
+ `${indent(7)}local.set $search_number`,
2080
+ `${indent(7)}local.get $candidate_number`,
2081
+ `${indent(7)}local.get $search_number`,
2082
+ `${indent(7)}f64.eq`,
2083
+ `${indent(7)}(if`,
2084
+ `${indent(8)}(then`,
2085
+ ...matchLines.map((line) => `${indent(9)}${line}`),
2086
+ `${indent(8)})`,
2087
+ `${indent(7)})`,
2088
+ `${indent(6)})`,
2089
+ `${indent(5)})`,
2090
+ `${indent(5)}local.get $candidate_tag`,
2091
+ `${indent(5)}i32.const 2`,
2092
+ `${indent(5)}i32.eq`,
2093
+ `${indent(5)}(if`,
2094
+ `${indent(6)}(then`,
2095
+ `${indent(7)}local.get $candidate`,
2096
+ `${indent(7)}struct.get $tagged_value 1`,
2097
+ `${indent(7)}local.set $candidate_number`,
2098
+ `${indent(7)}local.get $search`,
2099
+ `${indent(7)}struct.get $tagged_value 1`,
2100
+ `${indent(7)}local.set $search_number`,
2101
+ ...numberEqualityLines,
2102
+ `${indent(6)})`,
2103
+ `${indent(5)})`,
2104
+ ...(stringRuntimeLayout
2105
+ ? [
2106
+ `${indent(5)}local.get $candidate_tag`,
2107
+ `${indent(5)}i32.const 3`,
2108
+ `${indent(5)}i32.eq`,
2109
+ `${indent(5)}(if`,
2110
+ `${indent(6)}(then`,
2111
+ `${indent(7)}local.get $candidate`,
2112
+ `${indent(7)}struct.get $tagged_value 2`,
2113
+ `${indent(7)}ref.cast (ref null $${stringRuntimeLayout.runtimeWatTypeId})`,
2114
+ `${indent(7)}local.get $search`,
2115
+ `${indent(7)}struct.get $tagged_value 2`,
2116
+ `${indent(7)}ref.cast (ref null $${stringRuntimeLayout.runtimeWatTypeId})`,
2117
+ `${indent(7)}call $owned_string_equals`,
2118
+ `${indent(7)}(if`,
2119
+ `${indent(8)}(then`,
2120
+ ...matchLines.map((line) => `${indent(9)}${line}`),
2121
+ `${indent(8)})`,
2122
+ `${indent(7)})`,
2123
+ `${indent(6)})`,
2124
+ `${indent(5)})`,
2125
+ ]
2126
+ : []),
2127
+ `${indent(4)})`,
2128
+ `${indent(3)})`,
2129
+ ],
2130
+ };
2131
+ }
2132
+
2133
+ function emitOwnedArrayJoinHelper(
2134
+ kind: 'string' | 'number' | 'boolean',
2135
+ indent: (level: number) => string,
2136
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
2137
+ ): string[] {
2138
+ if (!stringRuntimeLayout) {
2139
+ throw new CompilerUnsupportedError(
2140
+ 'Owned array join helpers require the owned string runtime.',
2141
+ );
2142
+ }
2143
+ const arrayTypeName = getOwnedArrayWatTypeName(kind);
2144
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2145
+ const helperName = getOwnedArrayJoinHelperName(kind);
2146
+ if (kind === 'string') {
2147
+ return [
2148
+ `(func $${helperName} (param $array (ref null $${arrayTypeName})) (param $separator (ref null $${stringRuntimeLayout.runtimeWatTypeId})) (param $empty (ref null $${stringRuntimeLayout.runtimeWatTypeId})) (result (ref null $${stringRuntimeLayout.runtimeWatTypeId}))`,
2149
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2150
+ `${indent(1)}(local $length i32)`,
2151
+ `${indent(1)}(local $index i32)`,
2152
+ `${indent(1)}(local $result (ref null $${stringRuntimeLayout.runtimeWatTypeId}))`,
2153
+ `${indent(1)}(local $current (ref null $${stringRuntimeLayout.runtimeWatTypeId}))`,
2154
+ `${indent(1)}local.get $array`,
2155
+ `${indent(1)}struct.get $${arrayTypeName} 0`,
2156
+ `${indent(1)}local.set $backing`,
2157
+ `${indent(1)}local.get $backing`,
2158
+ `${indent(1)}array.len`,
2159
+ `${indent(1)}local.set $length`,
2160
+ `${indent(1)}local.get $length`,
2161
+ `${indent(1)}i32.eqz`,
2162
+ `${indent(1)}(if`,
2163
+ `${indent(2)}(then`,
2164
+ `${indent(3)}local.get $empty`,
2165
+ `${indent(3)}return`,
2166
+ `${indent(2)})`,
2167
+ `${indent(1)})`,
2168
+ `${indent(1)}local.get $backing`,
2169
+ `${indent(1)}i32.const 0`,
2170
+ `${indent(1)}array.get $${dataTypeName}`,
2171
+ `${indent(1)}ref.cast (ref null $${stringRuntimeLayout.runtimeWatTypeId})`,
2172
+ `${indent(1)}local.set $result`,
2173
+ `${indent(1)}i32.const 1`,
2174
+ `${indent(1)}local.set $index`,
2175
+ `${indent(1)}(block $${arrayTypeName}_join_done`,
2176
+ `${indent(2)}(loop $${arrayTypeName}_join_loop`,
2177
+ `${indent(3)}local.get $index`,
2178
+ `${indent(3)}local.get $length`,
2179
+ `${indent(3)}i32.ge_u`,
2180
+ `${indent(3)}br_if $${arrayTypeName}_join_done`,
2181
+ `${indent(3)}local.get $result`,
2182
+ `${indent(3)}local.get $separator`,
2183
+ `${indent(3)}call $owned_string_concat`,
2184
+ `${indent(3)}local.set $result`,
2185
+ `${indent(3)}local.get $backing`,
2186
+ `${indent(3)}local.get $index`,
2187
+ `${indent(3)}array.get $${dataTypeName}`,
2188
+ `${indent(3)}ref.cast (ref null $${stringRuntimeLayout.runtimeWatTypeId})`,
2189
+ `${indent(3)}local.set $current`,
2190
+ `${indent(3)}local.get $result`,
2191
+ `${indent(3)}local.get $current`,
2192
+ `${indent(3)}call $owned_string_concat`,
2193
+ `${indent(3)}local.set $result`,
2194
+ `${indent(3)}local.get $index`,
2195
+ `${indent(3)}i32.const 1`,
2196
+ `${indent(3)}i32.add`,
2197
+ `${indent(3)}local.set $index`,
2198
+ `${indent(3)}br $${arrayTypeName}_join_loop`,
2199
+ `${indent(2)})`,
2200
+ `${indent(1)})`,
2201
+ `${indent(1)}local.get $result`,
2202
+ ')',
2203
+ ];
2204
+ }
2205
+
2206
+ const firstValueLines = kind === 'number'
2207
+ ? [
2208
+ `${indent(1)}local.get $backing`,
2209
+ `${indent(1)}i32.const 0`,
2210
+ `${indent(1)}array.get $${dataTypeName}`,
2211
+ `${indent(1)}call $tagged_from_number`,
2212
+ `${indent(1)}local.set $host_result`,
2213
+ ]
2214
+ : [
2215
+ `${indent(1)}local.get $backing`,
2216
+ `${indent(1)}i32.const 0`,
2217
+ `${indent(1)}array.get $${dataTypeName}`,
2218
+ `${indent(1)}call $tagged_from_boolean`,
2219
+ `${indent(1)}local.set $host_result`,
2220
+ ];
2221
+ const appendCurrentLines = kind === 'number'
2222
+ ? [
2223
+ `${indent(3)}local.get $host_result`,
2224
+ `${indent(3)}local.get $backing`,
2225
+ `${indent(3)}local.get $index`,
2226
+ `${indent(3)}array.get $${dataTypeName}`,
2227
+ `${indent(3)}call $tagged_from_number`,
2228
+ `${indent(3)}call $string_concat`,
2229
+ `${indent(3)}local.set $host_result`,
2230
+ ]
2231
+ : [
2232
+ `${indent(3)}local.get $host_result`,
2233
+ `${indent(3)}local.get $backing`,
2234
+ `${indent(3)}local.get $index`,
2235
+ `${indent(3)}array.get $${dataTypeName}`,
2236
+ `${indent(3)}call $tagged_from_boolean`,
2237
+ `${indent(3)}call $string_concat`,
2238
+ `${indent(3)}local.set $host_result`,
2239
+ ];
2240
+ return [
2241
+ `(func $${helperName} (param $array (ref null $${arrayTypeName})) (param $separator (ref null $${stringRuntimeLayout.runtimeWatTypeId})) (param $empty (ref null $${stringRuntimeLayout.runtimeWatTypeId})) (result (ref null $${stringRuntimeLayout.runtimeWatTypeId}))`,
2242
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2243
+ `${indent(1)}(local $length i32)`,
2244
+ `${indent(1)}(local $index i32)`,
2245
+ `${indent(1)}(local $host_separator externref)`,
2246
+ `${indent(1)}(local $host_result externref)`,
2247
+ `${indent(1)}local.get $array`,
2248
+ `${indent(1)}struct.get $${arrayTypeName} 0`,
2249
+ `${indent(1)}local.set $backing`,
2250
+ `${indent(1)}local.get $backing`,
2251
+ `${indent(1)}array.len`,
2252
+ `${indent(1)}local.set $length`,
2253
+ `${indent(1)}local.get $length`,
2254
+ `${indent(1)}i32.eqz`,
2255
+ `${indent(1)}(if`,
2256
+ `${indent(2)}(then`,
2257
+ `${indent(3)}local.get $empty`,
2258
+ `${indent(3)}return`,
2259
+ `${indent(2)})`,
2260
+ `${indent(1)})`,
2261
+ `${indent(1)}local.get $separator`,
2262
+ `${indent(1)}call $owned_string_to_host`,
2263
+ `${indent(1)}local.set $host_separator`,
2264
+ ...firstValueLines,
2265
+ `${indent(1)}i32.const 1`,
2266
+ `${indent(1)}local.set $index`,
2267
+ `${indent(1)}(block $${arrayTypeName}_join_done`,
2268
+ `${indent(2)}(loop $${arrayTypeName}_join_loop`,
2269
+ `${indent(3)}local.get $index`,
2270
+ `${indent(3)}local.get $length`,
2271
+ `${indent(3)}i32.ge_u`,
2272
+ `${indent(3)}br_if $${arrayTypeName}_join_done`,
2273
+ `${indent(3)}local.get $host_result`,
2274
+ `${indent(3)}local.get $host_separator`,
2275
+ `${indent(3)}call $string_concat`,
2276
+ `${indent(3)}local.set $host_result`,
2277
+ ...appendCurrentLines,
2278
+ `${indent(3)}local.get $index`,
2279
+ `${indent(3)}i32.const 1`,
2280
+ `${indent(3)}i32.add`,
2281
+ `${indent(3)}local.set $index`,
2282
+ `${indent(3)}br $${arrayTypeName}_join_loop`,
2283
+ `${indent(2)})`,
2284
+ `${indent(1)})`,
2285
+ `${indent(1)}local.get $host_result`,
2286
+ `${indent(1)}call $string_to_owned`,
2287
+ ')',
2288
+ ];
2289
+ }
2290
+
2291
+ function emitNormalizeSliceIndexLines(
2292
+ sourceLocalName: string,
2293
+ targetLocalName: string,
2294
+ indent: (level: number) => string,
2295
+ ): string[] {
2296
+ return [
2297
+ `${indent(1)}local.get $${sourceLocalName}`,
2298
+ `${indent(1)}local.get $${sourceLocalName}`,
2299
+ `${indent(1)}f64.ne`,
2300
+ `${indent(1)}(if`,
2301
+ `${indent(2)}(then`,
2302
+ `${indent(3)}i32.const 0`,
2303
+ `${indent(3)}local.set $${targetLocalName}`,
2304
+ `${indent(2)})`,
2305
+ `${indent(2)}(else`,
2306
+ `${indent(3)}local.get $${sourceLocalName}`,
2307
+ `${indent(3)}f64.const 0`,
2308
+ `${indent(3)}f64.ge`,
2309
+ `${indent(3)}(if`,
2310
+ `${indent(4)}(then`,
2311
+ `${indent(5)}local.get $${sourceLocalName}`,
2312
+ `${indent(5)}local.get $length`,
2313
+ `${indent(5)}f64.convert_i32_s`,
2314
+ `${indent(5)}f64.ge`,
2315
+ `${indent(5)}(if`,
2316
+ `${indent(6)}(then`,
2317
+ `${indent(7)}local.get $length`,
2318
+ `${indent(7)}local.set $${targetLocalName}`,
2319
+ `${indent(6)})`,
2320
+ `${indent(6)}(else`,
2321
+ `${indent(7)}local.get $${sourceLocalName}`,
2322
+ `${indent(7)}f64.floor`,
2323
+ `${indent(7)}i32.trunc_f64_s`,
2324
+ `${indent(7)}local.set $${targetLocalName}`,
2325
+ `${indent(6)})`,
2326
+ `${indent(5)})`,
2327
+ `${indent(4)})`,
2328
+ `${indent(4)}(else`,
2329
+ `${indent(5)}local.get $${sourceLocalName}`,
2330
+ `${indent(5)}local.get $length`,
2331
+ `${indent(5)}f64.convert_i32_s`,
2332
+ `${indent(5)}f64.neg`,
2333
+ `${indent(5)}f64.le`,
2334
+ `${indent(5)}(if`,
2335
+ `${indent(6)}(then`,
2336
+ `${indent(7)}i32.const 0`,
2337
+ `${indent(7)}local.set $${targetLocalName}`,
2338
+ `${indent(6)})`,
2339
+ `${indent(6)}(else`,
2340
+ `${indent(7)}local.get $length`,
2341
+ `${indent(7)}local.get $${sourceLocalName}`,
2342
+ `${indent(7)}f64.ceil`,
2343
+ `${indent(7)}i32.trunc_f64_s`,
2344
+ `${indent(7)}i32.add`,
2345
+ `${indent(7)}local.set $${targetLocalName}`,
2346
+ `${indent(6)})`,
2347
+ `${indent(5)})`,
2348
+ `${indent(4)})`,
2349
+ `${indent(3)})`,
2350
+ `${indent(2)})`,
2351
+ `${indent(1)})`,
2352
+ ];
2353
+ }
2354
+
2355
+ function emitNormalizeLastIndexFromIndexLines(
2356
+ sourceLocalName: string,
2357
+ targetLocalName: string,
2358
+ indent: (level: number) => string,
2359
+ ): string[] {
2360
+ return [
2361
+ `${indent(1)}local.get $${sourceLocalName}`,
2362
+ `${indent(1)}local.get $${sourceLocalName}`,
2363
+ `${indent(1)}f64.ne`,
2364
+ `${indent(1)}(if`,
2365
+ `${indent(2)}(then`,
2366
+ `${indent(3)}i32.const 0`,
2367
+ `${indent(3)}local.set $${targetLocalName}`,
2368
+ `${indent(2)})`,
2369
+ `${indent(2)}(else`,
2370
+ `${indent(3)}local.get $${sourceLocalName}`,
2371
+ `${indent(3)}f64.const 0`,
2372
+ `${indent(3)}f64.ge`,
2373
+ `${indent(3)}(if`,
2374
+ `${indent(4)}(then`,
2375
+ `${indent(5)}local.get $${sourceLocalName}`,
2376
+ `${indent(5)}local.get $length`,
2377
+ `${indent(5)}f64.convert_i32_s`,
2378
+ `${indent(5)}f64.ge`,
2379
+ `${indent(5)}(if`,
2380
+ `${indent(6)}(then`,
2381
+ `${indent(7)}local.get $length`,
2382
+ `${indent(7)}i32.const 1`,
2383
+ `${indent(7)}i32.sub`,
2384
+ `${indent(7)}local.set $${targetLocalName}`,
2385
+ `${indent(6)})`,
2386
+ `${indent(6)}(else`,
2387
+ `${indent(7)}local.get $${sourceLocalName}`,
2388
+ `${indent(7)}f64.floor`,
2389
+ `${indent(7)}i32.trunc_f64_s`,
2390
+ `${indent(7)}local.set $${targetLocalName}`,
2391
+ `${indent(6)})`,
2392
+ `${indent(5)})`,
2393
+ `${indent(4)})`,
2394
+ `${indent(4)}(else`,
2395
+ `${indent(5)}local.get $${sourceLocalName}`,
2396
+ `${indent(5)}local.get $length`,
2397
+ `${indent(5)}f64.convert_i32_s`,
2398
+ `${indent(5)}f64.neg`,
2399
+ `${indent(5)}f64.le`,
2400
+ `${indent(5)}(if`,
2401
+ `${indent(6)}(then`,
2402
+ `${indent(7)}i32.const -1`,
2403
+ `${indent(7)}local.set $${targetLocalName}`,
2404
+ `${indent(6)})`,
2405
+ `${indent(6)}(else`,
2406
+ `${indent(7)}local.get $length`,
2407
+ `${indent(7)}local.get $${sourceLocalName}`,
2408
+ `${indent(7)}f64.ceil`,
2409
+ `${indent(7)}i32.trunc_f64_s`,
2410
+ `${indent(7)}i32.add`,
2411
+ `${indent(7)}local.set $${targetLocalName}`,
2412
+ `${indent(6)})`,
2413
+ `${indent(5)})`,
2414
+ `${indent(4)})`,
2415
+ `${indent(3)})`,
2416
+ `${indent(2)})`,
2417
+ `${indent(1)})`,
2418
+ ];
2419
+ }
2420
+
2421
+ function emitOwnedArraySliceHelper(
2422
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
2423
+ indent: (level: number) => string,
2424
+ ): string[] {
2425
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
2426
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2427
+ const helperName = getOwnedArraySliceHelperName(kind);
2428
+ return [
2429
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $start f64) (param $end f64) (param $has_end i32) (result (ref null $${wrapperTypeName}))`,
2430
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2431
+ `${indent(1)}(local $result_backing (ref null $${dataTypeName}))`,
2432
+ `${indent(1)}(local $length i32)`,
2433
+ `${indent(1)}(local $normalized_start i32)`,
2434
+ `${indent(1)}(local $normalized_end i32)`,
2435
+ `${indent(1)}(local $result_length i32)`,
2436
+ `${indent(1)}(local $index i32)`,
2437
+ `${indent(1)}local.get $array`,
2438
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2439
+ `${indent(1)}local.set $backing`,
2440
+ `${indent(1)}local.get $backing`,
2441
+ `${indent(1)}array.len`,
2442
+ `${indent(1)}local.set $length`,
2443
+ ...emitNormalizeSliceIndexLines('start', 'normalized_start', indent),
2444
+ `${indent(1)}local.get $has_end`,
2445
+ `${indent(1)}(if`,
2446
+ `${indent(2)}(then`,
2447
+ ...emitNormalizeSliceIndexLines('end', 'normalized_end', indent).map((line) => `${indent(1)}${line.slice(indent(1).length)}`),
2448
+ `${indent(2)})`,
2449
+ `${indent(2)}(else`,
2450
+ `${indent(3)}local.get $length`,
2451
+ `${indent(3)}local.set $normalized_end`,
2452
+ `${indent(2)})`,
2453
+ `${indent(1)})`,
2454
+ `${indent(1)}local.get $normalized_end`,
2455
+ `${indent(1)}local.get $normalized_start`,
2456
+ `${indent(1)}i32.lt_s`,
2457
+ `${indent(1)}(if`,
2458
+ `${indent(2)}(then`,
2459
+ `${indent(3)}local.get $normalized_start`,
2460
+ `${indent(3)}local.set $normalized_end`,
2461
+ `${indent(2)})`,
2462
+ `${indent(1)})`,
2463
+ `${indent(1)}local.get $normalized_end`,
2464
+ `${indent(1)}local.get $normalized_start`,
2465
+ `${indent(1)}i32.sub`,
2466
+ `${indent(1)}local.set $result_length`,
2467
+ `${indent(1)}local.get $result_length`,
2468
+ `${indent(1)}array.new_default $${dataTypeName}`,
2469
+ `${indent(1)}local.set $result_backing`,
2470
+ `${indent(1)}i32.const 0`,
2471
+ `${indent(1)}local.set $index`,
2472
+ `${indent(1)}(block $${wrapperTypeName}_slice_done`,
2473
+ `${indent(2)}(loop $${wrapperTypeName}_slice_loop`,
2474
+ `${indent(3)}local.get $index`,
2475
+ `${indent(3)}local.get $result_length`,
2476
+ `${indent(3)}i32.ge_u`,
2477
+ `${indent(3)}br_if $${wrapperTypeName}_slice_done`,
2478
+ `${indent(3)}local.get $result_backing`,
2479
+ `${indent(3)}local.get $index`,
2480
+ `${indent(3)}local.get $backing`,
2481
+ `${indent(3)}local.get $normalized_start`,
2482
+ `${indent(3)}local.get $index`,
2483
+ `${indent(3)}i32.add`,
2484
+ `${indent(3)}array.get $${dataTypeName}`,
2485
+ `${indent(3)}array.set $${dataTypeName}`,
2486
+ `${indent(3)}local.get $index`,
2487
+ `${indent(3)}i32.const 1`,
2488
+ `${indent(3)}i32.add`,
2489
+ `${indent(3)}local.set $index`,
2490
+ `${indent(3)}br $${wrapperTypeName}_slice_loop`,
2491
+ `${indent(2)})`,
2492
+ `${indent(1)})`,
2493
+ `${indent(1)}local.get $result_backing`,
2494
+ `${indent(1)}struct.new $${wrapperTypeName}`,
2495
+ ')',
2496
+ ];
2497
+ }
2498
+
2499
+ function emitOwnedArrayConcatHelper(
2500
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
2501
+ indent: (level: number) => string,
2502
+ ): string[] {
2503
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
2504
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2505
+ const helperName = getOwnedArrayConcatHelperName(kind);
2506
+ return [
2507
+ `(func $${helperName} (param $left (ref null $${wrapperTypeName})) (param $right (ref null $${wrapperTypeName})) (result (ref null $${wrapperTypeName}))`,
2508
+ `${indent(1)}(local $left_backing (ref null $${dataTypeName}))`,
2509
+ `${indent(1)}(local $right_backing (ref null $${dataTypeName}))`,
2510
+ `${indent(1)}(local $result_backing (ref null $${dataTypeName}))`,
2511
+ `${indent(1)}(local $left_length i32)`,
2512
+ `${indent(1)}(local $right_length i32)`,
2513
+ `${indent(1)}(local $index i32)`,
2514
+ `${indent(1)}local.get $left`,
2515
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2516
+ `${indent(1)}local.set $left_backing`,
2517
+ `${indent(1)}local.get $right`,
2518
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2519
+ `${indent(1)}local.set $right_backing`,
2520
+ `${indent(1)}local.get $left_backing`,
2521
+ `${indent(1)}array.len`,
2522
+ `${indent(1)}local.set $left_length`,
2523
+ `${indent(1)}local.get $right_backing`,
2524
+ `${indent(1)}array.len`,
2525
+ `${indent(1)}local.set $right_length`,
2526
+ `${indent(1)}local.get $left_length`,
2527
+ `${indent(1)}local.get $right_length`,
2528
+ `${indent(1)}i32.add`,
2529
+ `${indent(1)}array.new_default $${dataTypeName}`,
2530
+ `${indent(1)}local.set $result_backing`,
2531
+ `${indent(1)}i32.const 0`,
2532
+ `${indent(1)}local.set $index`,
2533
+ `${indent(1)}(block $${wrapperTypeName}_concat_left_done`,
2534
+ `${indent(2)}(loop $${wrapperTypeName}_concat_left_loop`,
2535
+ `${indent(3)}local.get $index`,
2536
+ `${indent(3)}local.get $left_length`,
2537
+ `${indent(3)}i32.ge_u`,
2538
+ `${indent(3)}br_if $${wrapperTypeName}_concat_left_done`,
2539
+ `${indent(3)}local.get $result_backing`,
2540
+ `${indent(3)}local.get $index`,
2541
+ `${indent(3)}local.get $left_backing`,
2542
+ `${indent(3)}local.get $index`,
2543
+ `${indent(3)}array.get $${dataTypeName}`,
2544
+ `${indent(3)}array.set $${dataTypeName}`,
2545
+ `${indent(3)}local.get $index`,
2546
+ `${indent(3)}i32.const 1`,
2547
+ `${indent(3)}i32.add`,
2548
+ `${indent(3)}local.set $index`,
2549
+ `${indent(3)}br $${wrapperTypeName}_concat_left_loop`,
2550
+ `${indent(2)})`,
2551
+ `${indent(1)})`,
2552
+ `${indent(1)}i32.const 0`,
2553
+ `${indent(1)}local.set $index`,
2554
+ `${indent(1)}(block $${wrapperTypeName}_concat_right_done`,
2555
+ `${indent(2)}(loop $${wrapperTypeName}_concat_right_loop`,
2556
+ `${indent(3)}local.get $index`,
2557
+ `${indent(3)}local.get $right_length`,
2558
+ `${indent(3)}i32.ge_u`,
2559
+ `${indent(3)}br_if $${wrapperTypeName}_concat_right_done`,
2560
+ `${indent(3)}local.get $result_backing`,
2561
+ `${indent(3)}local.get $left_length`,
2562
+ `${indent(3)}local.get $index`,
2563
+ `${indent(3)}i32.add`,
2564
+ `${indent(3)}local.get $right_backing`,
2565
+ `${indent(3)}local.get $index`,
2566
+ `${indent(3)}array.get $${dataTypeName}`,
2567
+ `${indent(3)}array.set $${dataTypeName}`,
2568
+ `${indent(3)}local.get $index`,
2569
+ `${indent(3)}i32.const 1`,
2570
+ `${indent(3)}i32.add`,
2571
+ `${indent(3)}local.set $index`,
2572
+ `${indent(3)}br $${wrapperTypeName}_concat_right_loop`,
2573
+ `${indent(2)})`,
2574
+ `${indent(1)})`,
2575
+ `${indent(1)}local.get $result_backing`,
2576
+ `${indent(1)}struct.new $${wrapperTypeName}`,
2577
+ ')',
2578
+ ];
2579
+ }
2580
+
2581
+ function emitOwnedArraySpliceHelper(
2582
+ kind: 'heap' | 'string' | 'number' | 'boolean',
2583
+ indent: (level: number) => string,
2584
+ ): string[] {
2585
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
2586
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2587
+ const helperName = getOwnedArraySpliceHelperName(kind);
2588
+ return [
2589
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $start f64) (param $delete_count f64) (param $items (ref null $${wrapperTypeName})) (result (ref null $${wrapperTypeName}))`,
2590
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2591
+ `${indent(1)}(local $items_backing (ref null $${dataTypeName}))`,
2592
+ `${indent(1)}(local $remaining_backing (ref null $${dataTypeName}))`,
2593
+ `${indent(1)}(local $removed_backing (ref null $${dataTypeName}))`,
2594
+ `${indent(1)}(local $length i32)`,
2595
+ `${indent(1)}(local $insert_length i32)`,
2596
+ `${indent(1)}(local $normalized_start i32)`,
2597
+ `${indent(1)}(local $available_delete_count i32)`,
2598
+ `${indent(1)}(local $normalized_delete_count i32)`,
2599
+ `${indent(1)}(local $remaining_length i32)`,
2600
+ `${indent(1)}(local $index i32)`,
2601
+ `${indent(1)}local.get $array`,
2602
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2603
+ `${indent(1)}local.set $backing`,
2604
+ `${indent(1)}local.get $items`,
2605
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2606
+ `${indent(1)}local.set $items_backing`,
2607
+ `${indent(1)}local.get $backing`,
2608
+ `${indent(1)}array.len`,
2609
+ `${indent(1)}local.set $length`,
2610
+ `${indent(1)}local.get $items_backing`,
2611
+ `${indent(1)}array.len`,
2612
+ `${indent(1)}local.set $insert_length`,
2613
+ ...emitNormalizeSliceIndexLines('start', 'normalized_start', indent),
2614
+ `${indent(1)}local.get $length`,
2615
+ `${indent(1)}local.get $normalized_start`,
2616
+ `${indent(1)}i32.sub`,
2617
+ `${indent(1)}local.set $available_delete_count`,
2618
+ `${indent(1)}local.get $delete_count`,
2619
+ `${indent(1)}local.get $delete_count`,
2620
+ `${indent(1)}f64.ne`,
2621
+ `${indent(1)}(if`,
2622
+ `${indent(2)}(then`,
2623
+ `${indent(3)}i32.const 0`,
2624
+ `${indent(3)}local.set $normalized_delete_count`,
2625
+ `${indent(2)})`,
2626
+ `${indent(2)}(else`,
2627
+ `${indent(3)}local.get $delete_count`,
2628
+ `${indent(3)}f64.const 0`,
2629
+ `${indent(3)}f64.le`,
2630
+ `${indent(3)}(if`,
2631
+ `${indent(4)}(then`,
2632
+ `${indent(5)}i32.const 0`,
2633
+ `${indent(5)}local.set $normalized_delete_count`,
2634
+ `${indent(4)})`,
2635
+ `${indent(4)}(else`,
2636
+ `${indent(5)}local.get $delete_count`,
2637
+ `${indent(5)}local.get $available_delete_count`,
2638
+ `${indent(5)}f64.convert_i32_s`,
2639
+ `${indent(5)}f64.ge`,
2640
+ `${indent(5)}(if`,
2641
+ `${indent(6)}(then`,
2642
+ `${indent(7)}local.get $available_delete_count`,
2643
+ `${indent(7)}local.set $normalized_delete_count`,
2644
+ `${indent(6)})`,
2645
+ `${indent(6)}(else`,
2646
+ `${indent(7)}local.get $delete_count`,
2647
+ `${indent(7)}f64.floor`,
2648
+ `${indent(7)}i32.trunc_f64_s`,
2649
+ `${indent(7)}local.set $normalized_delete_count`,
2650
+ `${indent(6)})`,
2651
+ `${indent(5)})`,
2652
+ `${indent(4)})`,
2653
+ `${indent(3)})`,
2654
+ `${indent(2)})`,
2655
+ `${indent(1)})`,
2656
+ `${indent(1)}local.get $normalized_delete_count`,
2657
+ `${indent(1)}array.new_default $${dataTypeName}`,
2658
+ `${indent(1)}local.set $removed_backing`,
2659
+ `${indent(1)}local.get $length`,
2660
+ `${indent(1)}local.get $normalized_delete_count`,
2661
+ `${indent(1)}i32.sub`,
2662
+ `${indent(1)}local.get $insert_length`,
2663
+ `${indent(1)}i32.add`,
2664
+ `${indent(1)}local.set $remaining_length`,
2665
+ `${indent(1)}local.get $remaining_length`,
2666
+ `${indent(1)}array.new_default $${dataTypeName}`,
2667
+ `${indent(1)}local.set $remaining_backing`,
2668
+ `${indent(1)}i32.const 0`,
2669
+ `${indent(1)}local.set $index`,
2670
+ `${indent(1)}(block $${wrapperTypeName}_splice_removed_done`,
2671
+ `${indent(2)}(loop $${wrapperTypeName}_splice_removed_loop`,
2672
+ `${indent(3)}local.get $index`,
2673
+ `${indent(3)}local.get $normalized_delete_count`,
2674
+ `${indent(3)}i32.ge_u`,
2675
+ `${indent(3)}br_if $${wrapperTypeName}_splice_removed_done`,
2676
+ `${indent(3)}local.get $removed_backing`,
2677
+ `${indent(3)}local.get $index`,
2678
+ `${indent(3)}local.get $backing`,
2679
+ `${indent(3)}local.get $normalized_start`,
2680
+ `${indent(3)}local.get $index`,
2681
+ `${indent(3)}i32.add`,
2682
+ `${indent(3)}array.get $${dataTypeName}`,
2683
+ `${indent(3)}array.set $${dataTypeName}`,
2684
+ `${indent(3)}local.get $index`,
2685
+ `${indent(3)}i32.const 1`,
2686
+ `${indent(3)}i32.add`,
2687
+ `${indent(3)}local.set $index`,
2688
+ `${indent(3)}br $${wrapperTypeName}_splice_removed_loop`,
2689
+ `${indent(2)})`,
2690
+ `${indent(1)})`,
2691
+ `${indent(1)}i32.const 0`,
2692
+ `${indent(1)}local.set $index`,
2693
+ `${indent(1)}(block $${wrapperTypeName}_splice_prefix_done`,
2694
+ `${indent(2)}(loop $${wrapperTypeName}_splice_prefix_loop`,
2695
+ `${indent(3)}local.get $index`,
2696
+ `${indent(3)}local.get $normalized_start`,
2697
+ `${indent(3)}i32.ge_u`,
2698
+ `${indent(3)}br_if $${wrapperTypeName}_splice_prefix_done`,
2699
+ `${indent(3)}local.get $remaining_backing`,
2700
+ `${indent(3)}local.get $index`,
2701
+ `${indent(3)}local.get $backing`,
2702
+ `${indent(3)}local.get $index`,
2703
+ `${indent(3)}array.get $${dataTypeName}`,
2704
+ `${indent(3)}array.set $${dataTypeName}`,
2705
+ `${indent(3)}local.get $index`,
2706
+ `${indent(3)}i32.const 1`,
2707
+ `${indent(3)}i32.add`,
2708
+ `${indent(3)}local.set $index`,
2709
+ `${indent(3)}br $${wrapperTypeName}_splice_prefix_loop`,
2710
+ `${indent(2)})`,
2711
+ `${indent(1)})`,
2712
+ `${indent(1)}local.get $normalized_start`,
2713
+ `${indent(1)}local.set $index`,
2714
+ `${indent(1)}(block $${wrapperTypeName}_splice_insert_done`,
2715
+ `${indent(2)}(loop $${wrapperTypeName}_splice_insert_loop`,
2716
+ `${indent(3)}local.get $index`,
2717
+ `${indent(3)}local.get $normalized_start`,
2718
+ `${indent(3)}local.get $insert_length`,
2719
+ `${indent(3)}i32.add`,
2720
+ `${indent(3)}i32.ge_u`,
2721
+ `${indent(3)}br_if $${wrapperTypeName}_splice_insert_done`,
2722
+ `${indent(3)}local.get $remaining_backing`,
2723
+ `${indent(3)}local.get $index`,
2724
+ `${indent(3)}local.get $items_backing`,
2725
+ `${indent(3)}local.get $index`,
2726
+ `${indent(3)}local.get $normalized_start`,
2727
+ `${indent(3)}i32.sub`,
2728
+ `${indent(3)}array.get $${dataTypeName}`,
2729
+ `${indent(3)}array.set $${dataTypeName}`,
2730
+ `${indent(3)}local.get $index`,
2731
+ `${indent(3)}i32.const 1`,
2732
+ `${indent(3)}i32.add`,
2733
+ `${indent(3)}local.set $index`,
2734
+ `${indent(3)}br $${wrapperTypeName}_splice_insert_loop`,
2735
+ `${indent(2)})`,
2736
+ `${indent(1)})`,
2737
+ `${indent(1)}local.get $normalized_start`,
2738
+ `${indent(1)}local.get $insert_length`,
2739
+ `${indent(1)}i32.add`,
2740
+ `${indent(1)}local.set $index`,
2741
+ `${indent(1)}(block $${wrapperTypeName}_splice_suffix_done`,
2742
+ `${indent(2)}(loop $${wrapperTypeName}_splice_suffix_loop`,
2743
+ `${indent(3)}local.get $index`,
2744
+ `${indent(3)}local.get $remaining_length`,
2745
+ `${indent(3)}i32.ge_u`,
2746
+ `${indent(3)}br_if $${wrapperTypeName}_splice_suffix_done`,
2747
+ `${indent(3)}local.get $remaining_backing`,
2748
+ `${indent(3)}local.get $index`,
2749
+ `${indent(3)}local.get $backing`,
2750
+ `${indent(3)}local.get $index`,
2751
+ `${indent(3)}local.get $insert_length`,
2752
+ `${indent(3)}i32.sub`,
2753
+ `${indent(3)}local.get $normalized_delete_count`,
2754
+ `${indent(3)}i32.add`,
2755
+ `${indent(3)}array.get $${dataTypeName}`,
2756
+ `${indent(3)}array.set $${dataTypeName}`,
2757
+ `${indent(3)}local.get $index`,
2758
+ `${indent(3)}i32.const 1`,
2759
+ `${indent(3)}i32.add`,
2760
+ `${indent(3)}local.set $index`,
2761
+ `${indent(3)}br $${wrapperTypeName}_splice_suffix_loop`,
2762
+ `${indent(2)})`,
2763
+ `${indent(1)})`,
2764
+ `${indent(1)}local.get $array`,
2765
+ `${indent(1)}local.get $remaining_backing`,
2766
+ `${indent(1)}struct.set $${wrapperTypeName} 0`,
2767
+ `${indent(1)}local.get $removed_backing`,
2768
+ `${indent(1)}struct.new $${wrapperTypeName}`,
2769
+ ')',
2770
+ ];
2771
+ }
2772
+
2773
+ function emitOwnedArrayReverseHelper(
2774
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
2775
+ indent: (level: number) => string,
2776
+ ): string[] {
2777
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
2778
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2779
+ const helperName = getOwnedArrayReverseHelperName(kind);
2780
+ const tempLocal = kind === 'heap'
2781
+ ? '(local $temp (ref null eq))'
2782
+ : kind === 'string'
2783
+ ? '(local $temp (ref null eq))'
2784
+ : kind === 'number'
2785
+ ? '(local $temp f64)'
2786
+ : kind === 'boolean'
2787
+ ? '(local $temp i32)'
2788
+ : '(local $temp (ref null $tagged_value))';
2789
+ return [
2790
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (result (ref null $${wrapperTypeName}))`,
2791
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2792
+ `${indent(1)}(local $left i32)`,
2793
+ `${indent(1)}(local $right i32)`,
2794
+ `${indent(1)}${tempLocal}`,
2795
+ `${indent(1)}local.get $array`,
2796
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2797
+ `${indent(1)}local.set $backing`,
2798
+ `${indent(1)}i32.const 0`,
2799
+ `${indent(1)}local.set $left`,
2800
+ `${indent(1)}local.get $backing`,
2801
+ `${indent(1)}array.len`,
2802
+ `${indent(1)}i32.const 1`,
2803
+ `${indent(1)}i32.sub`,
2804
+ `${indent(1)}local.set $right`,
2805
+ `${indent(1)}(block $${wrapperTypeName}_reverse_done`,
2806
+ `${indent(2)}(loop $${wrapperTypeName}_reverse_loop`,
2807
+ `${indent(3)}local.get $left`,
2808
+ `${indent(3)}local.get $right`,
2809
+ `${indent(3)}i32.ge_s`,
2810
+ `${indent(3)}br_if $${wrapperTypeName}_reverse_done`,
2811
+ `${indent(3)}local.get $backing`,
2812
+ `${indent(3)}local.get $left`,
2813
+ `${indent(3)}array.get $${dataTypeName}`,
2814
+ `${indent(3)}local.set $temp`,
2815
+ `${indent(3)}local.get $backing`,
2816
+ `${indent(3)}local.get $left`,
2817
+ `${indent(3)}local.get $backing`,
2818
+ `${indent(3)}local.get $right`,
2819
+ `${indent(3)}array.get $${dataTypeName}`,
2820
+ `${indent(3)}array.set $${dataTypeName}`,
2821
+ `${indent(3)}local.get $backing`,
2822
+ `${indent(3)}local.get $right`,
2823
+ `${indent(3)}local.get $temp`,
2824
+ `${indent(3)}array.set $${dataTypeName}`,
2825
+ `${indent(3)}local.get $left`,
2826
+ `${indent(3)}i32.const 1`,
2827
+ `${indent(3)}i32.add`,
2828
+ `${indent(3)}local.set $left`,
2829
+ `${indent(3)}local.get $right`,
2830
+ `${indent(3)}i32.const 1`,
2831
+ `${indent(3)}i32.sub`,
2832
+ `${indent(3)}local.set $right`,
2833
+ `${indent(3)}br $${wrapperTypeName}_reverse_loop`,
2834
+ `${indent(2)})`,
2835
+ `${indent(1)})`,
2836
+ `${indent(1)}local.get $array`,
2837
+ ')',
2838
+ ];
2839
+ }
2840
+
2841
+ function emitOwnedArrayFillHelper(
2842
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
2843
+ indent: (level: number) => string,
2844
+ ): string[] {
2845
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
2846
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2847
+ const helperName = getOwnedArrayFillHelperName(kind);
2848
+ const valueType = getOwnedArrayPushValueWatType(kind);
2849
+ return [
2850
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $value ${valueType}) (param $start f64) (param $end f64) (param $has_end i32) (result (ref null $${wrapperTypeName}))`,
2851
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2852
+ `${indent(1)}(local $length i32)`,
2853
+ `${indent(1)}(local $normalized_start i32)`,
2854
+ `${indent(1)}(local $normalized_end i32)`,
2855
+ `${indent(1)}(local $index i32)`,
2856
+ `${indent(1)}local.get $array`,
2857
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2858
+ `${indent(1)}local.set $backing`,
2859
+ `${indent(1)}local.get $backing`,
2860
+ `${indent(1)}array.len`,
2861
+ `${indent(1)}local.set $length`,
2862
+ ...emitNormalizeSliceIndexLines('start', 'normalized_start', indent),
2863
+ `${indent(1)}local.get $has_end`,
2864
+ `${indent(1)}(if`,
2865
+ `${indent(2)}(then`,
2866
+ ...emitNormalizeSliceIndexLines('end', 'normalized_end', indent).map((line) =>
2867
+ `${indent(1)}${line.slice(indent(1).length)}`
2868
+ ),
2869
+ `${indent(2)})`,
2870
+ `${indent(2)}(else`,
2871
+ `${indent(3)}local.get $length`,
2872
+ `${indent(3)}local.set $normalized_end`,
2873
+ `${indent(2)})`,
2874
+ `${indent(1)})`,
2875
+ `${indent(1)}local.get $normalized_start`,
2876
+ `${indent(1)}local.set $index`,
2877
+ `${indent(1)}(block $${wrapperTypeName}_fill_done`,
2878
+ `${indent(2)}(loop $${wrapperTypeName}_fill_loop`,
2879
+ `${indent(3)}local.get $index`,
2880
+ `${indent(3)}local.get $normalized_end`,
2881
+ `${indent(3)}i32.ge_u`,
2882
+ `${indent(3)}br_if $${wrapperTypeName}_fill_done`,
2883
+ `${indent(3)}local.get $backing`,
2884
+ `${indent(3)}local.get $index`,
2885
+ `${indent(3)}local.get $value`,
2886
+ `${indent(3)}array.set $${dataTypeName}`,
2887
+ `${indent(3)}local.get $index`,
2888
+ `${indent(3)}i32.const 1`,
2889
+ `${indent(3)}i32.add`,
2890
+ `${indent(3)}local.set $index`,
2891
+ `${indent(3)}br $${wrapperTypeName}_fill_loop`,
2892
+ `${indent(2)})`,
2893
+ `${indent(1)})`,
2894
+ `${indent(1)}local.get $array`,
2895
+ ')',
2896
+ ];
2897
+ }
2898
+
2899
+ function emitOwnedArrayCopyWithinHelper(
2900
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
2901
+ indent: (level: number) => string,
2902
+ ): string[] {
2903
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
2904
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
2905
+ const helperName = getOwnedArrayCopyWithinHelperName(kind);
2906
+ return [
2907
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $target f64) (param $start f64) (param $end f64) (param $has_end i32) (result (ref null $${wrapperTypeName}))`,
2908
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
2909
+ `${indent(1)}(local $copy_backing (ref null $${dataTypeName}))`,
2910
+ `${indent(1)}(local $length i32)`,
2911
+ `${indent(1)}(local $normalized_target i32)`,
2912
+ `${indent(1)}(local $normalized_start i32)`,
2913
+ `${indent(1)}(local $normalized_end i32)`,
2914
+ `${indent(1)}(local $copy_length i32)`,
2915
+ `${indent(1)}(local $available_target i32)`,
2916
+ `${indent(1)}(local $index i32)`,
2917
+ `${indent(1)}local.get $array`,
2918
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
2919
+ `${indent(1)}local.set $backing`,
2920
+ `${indent(1)}local.get $backing`,
2921
+ `${indent(1)}array.len`,
2922
+ `${indent(1)}local.set $length`,
2923
+ ...emitNormalizeSliceIndexLines('target', 'normalized_target', indent),
2924
+ ...emitNormalizeSliceIndexLines('start', 'normalized_start', indent),
2925
+ `${indent(1)}local.get $has_end`,
2926
+ `${indent(1)}(if`,
2927
+ `${indent(2)}(then`,
2928
+ ...emitNormalizeSliceIndexLines('end', 'normalized_end', indent).map((line) =>
2929
+ `${indent(1)}${line.slice(indent(1).length)}`
2930
+ ),
2931
+ `${indent(2)})`,
2932
+ `${indent(2)}(else`,
2933
+ `${indent(3)}local.get $length`,
2934
+ `${indent(3)}local.set $normalized_end`,
2935
+ `${indent(2)})`,
2936
+ `${indent(1)})`,
2937
+ `${indent(1)}local.get $normalized_end`,
2938
+ `${indent(1)}local.get $normalized_start`,
2939
+ `${indent(1)}i32.lt_s`,
2940
+ `${indent(1)}(if`,
2941
+ `${indent(2)}(then`,
2942
+ `${indent(3)}local.get $normalized_start`,
2943
+ `${indent(3)}local.set $normalized_end`,
2944
+ `${indent(2)})`,
2945
+ `${indent(1)})`,
2946
+ `${indent(1)}local.get $normalized_end`,
2947
+ `${indent(1)}local.get $normalized_start`,
2948
+ `${indent(1)}i32.sub`,
2949
+ `${indent(1)}local.set $copy_length`,
2950
+ `${indent(1)}local.get $length`,
2951
+ `${indent(1)}local.get $normalized_target`,
2952
+ `${indent(1)}i32.sub`,
2953
+ `${indent(1)}local.set $available_target`,
2954
+ `${indent(1)}local.get $available_target`,
2955
+ `${indent(1)}local.get $copy_length`,
2956
+ `${indent(1)}i32.lt_s`,
2957
+ `${indent(1)}(if`,
2958
+ `${indent(2)}(then`,
2959
+ `${indent(3)}local.get $available_target`,
2960
+ `${indent(3)}i32.const 0`,
2961
+ `${indent(3)}i32.lt_s`,
2962
+ `${indent(3)}(if`,
2963
+ `${indent(4)}(then`,
2964
+ `${indent(5)}i32.const 0`,
2965
+ `${indent(5)}local.set $copy_length`,
2966
+ `${indent(4)})`,
2967
+ `${indent(4)}(else`,
2968
+ `${indent(5)}local.get $available_target`,
2969
+ `${indent(5)}local.set $copy_length`,
2970
+ `${indent(4)})`,
2971
+ `${indent(3)})`,
2972
+ `${indent(2)})`,
2973
+ `${indent(1)})`,
2974
+ `${indent(1)}local.get $copy_length`,
2975
+ `${indent(1)}array.new_default $${dataTypeName}`,
2976
+ `${indent(1)}local.set $copy_backing`,
2977
+ `${indent(1)}i32.const 0`,
2978
+ `${indent(1)}local.set $index`,
2979
+ `${indent(1)}(block $${wrapperTypeName}_copy_within_capture_done`,
2980
+ `${indent(2)}(loop $${wrapperTypeName}_copy_within_capture_loop`,
2981
+ `${indent(3)}local.get $index`,
2982
+ `${indent(3)}local.get $copy_length`,
2983
+ `${indent(3)}i32.ge_u`,
2984
+ `${indent(3)}br_if $${wrapperTypeName}_copy_within_capture_done`,
2985
+ `${indent(3)}local.get $copy_backing`,
2986
+ `${indent(3)}local.get $index`,
2987
+ `${indent(3)}local.get $backing`,
2988
+ `${indent(3)}local.get $normalized_start`,
2989
+ `${indent(3)}local.get $index`,
2990
+ `${indent(3)}i32.add`,
2991
+ `${indent(3)}array.get $${dataTypeName}`,
2992
+ `${indent(3)}array.set $${dataTypeName}`,
2993
+ `${indent(3)}local.get $index`,
2994
+ `${indent(3)}i32.const 1`,
2995
+ `${indent(3)}i32.add`,
2996
+ `${indent(3)}local.set $index`,
2997
+ `${indent(3)}br $${wrapperTypeName}_copy_within_capture_loop`,
2998
+ `${indent(2)})`,
2999
+ `${indent(1)})`,
3000
+ `${indent(1)}i32.const 0`,
3001
+ `${indent(1)}local.set $index`,
3002
+ `${indent(1)}(block $${wrapperTypeName}_copy_within_write_done`,
3003
+ `${indent(2)}(loop $${wrapperTypeName}_copy_within_write_loop`,
3004
+ `${indent(3)}local.get $index`,
3005
+ `${indent(3)}local.get $copy_length`,
3006
+ `${indent(3)}i32.ge_u`,
3007
+ `${indent(3)}br_if $${wrapperTypeName}_copy_within_write_done`,
3008
+ `${indent(3)}local.get $backing`,
3009
+ `${indent(3)}local.get $normalized_target`,
3010
+ `${indent(3)}local.get $index`,
3011
+ `${indent(3)}i32.add`,
3012
+ `${indent(3)}local.get $copy_backing`,
3013
+ `${indent(3)}local.get $index`,
3014
+ `${indent(3)}array.get $${dataTypeName}`,
3015
+ `${indent(3)}array.set $${dataTypeName}`,
3016
+ `${indent(3)}local.get $index`,
3017
+ `${indent(3)}i32.const 1`,
3018
+ `${indent(3)}i32.add`,
3019
+ `${indent(3)}local.set $index`,
3020
+ `${indent(3)}br $${wrapperTypeName}_copy_within_write_loop`,
3021
+ `${indent(2)})`,
3022
+ `${indent(1)})`,
3023
+ `${indent(1)}local.get $array`,
3024
+ ')',
3025
+ ];
3026
+ }
3027
+
3028
+ function emitOwnedArrayIncludesHelper(
3029
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
3030
+ indent: (level: number) => string,
3031
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
3032
+ ): string[] {
3033
+ if (kind === 'string' && !stringRuntimeLayout) {
3034
+ throw new CompilerUnsupportedError(
3035
+ 'Owned string-array includes helpers require the owned string runtime.',
3036
+ );
3037
+ }
3038
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
3039
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
3040
+ const helperName = getOwnedArrayIncludesHelperName(kind);
3041
+ const searchType = getOwnedArrayPushValueWatType(kind);
3042
+ const taggedComparison = kind === 'tagged'
3043
+ ? emitTaggedValueComparisonLines(
3044
+ 'same_value_zero',
3045
+ [
3046
+ 'i32.const 1',
3047
+ 'local.set $found',
3048
+ `br $${wrapperTypeName}_includes_done`,
3049
+ ],
3050
+ indent,
3051
+ stringRuntimeLayout,
3052
+ )
3053
+ : undefined;
3054
+ const candidateLocal =
3055
+ kind === 'heap'
3056
+ ? '(local $candidate (ref null eq))'
3057
+ : kind === 'string'
3058
+ ? `(local $candidate (ref null $${stringRuntimeLayout!.runtimeWatTypeId}))`
3059
+ : kind === 'number'
3060
+ ? '(local $candidate f64)'
3061
+ : kind === 'boolean'
3062
+ ? '(local $candidate i32)'
3063
+ : '(local $candidate (ref null $tagged_value))';
3064
+ const equalityLines = kind === 'heap'
3065
+ ? [
3066
+ `${indent(3)}local.get $candidate`,
3067
+ `${indent(3)}local.get $search`,
3068
+ `${indent(3)}ref.eq`,
3069
+ `${indent(3)}(if`,
3070
+ `${indent(4)}(then`,
3071
+ `${indent(5)}i32.const 1`,
3072
+ `${indent(5)}local.set $found`,
3073
+ `${indent(5)}br $${wrapperTypeName}_includes_done`,
3074
+ `${indent(4)})`,
3075
+ `${indent(3)})`,
3076
+ ]
3077
+ : kind === 'string'
3078
+ ? [
3079
+ `${indent(3)}local.get $candidate`,
3080
+ `${indent(3)}local.get $search`,
3081
+ `${indent(3)}call $owned_string_equals`,
3082
+ `${indent(3)}(if`,
3083
+ `${indent(4)}(then`,
3084
+ `${indent(5)}i32.const 1`,
3085
+ `${indent(5)}local.set $found`,
3086
+ `${indent(5)}br $${wrapperTypeName}_includes_done`,
3087
+ `${indent(4)})`,
3088
+ `${indent(3)})`,
3089
+ ]
3090
+ : kind === 'number'
3091
+ ? [
3092
+ `${indent(3)}local.get $candidate`,
3093
+ `${indent(3)}local.get $search`,
3094
+ `${indent(3)}f64.eq`,
3095
+ `${indent(3)}(if`,
3096
+ `${indent(4)}(then`,
3097
+ `${indent(5)}i32.const 1`,
3098
+ `${indent(5)}local.set $found`,
3099
+ `${indent(5)}br $${wrapperTypeName}_includes_done`,
3100
+ `${indent(4)})`,
3101
+ `${indent(3)})`,
3102
+ `${indent(3)}local.get $candidate`,
3103
+ `${indent(3)}local.get $candidate`,
3104
+ `${indent(3)}f64.ne`,
3105
+ `${indent(3)}local.get $search`,
3106
+ `${indent(3)}local.get $search`,
3107
+ `${indent(3)}f64.ne`,
3108
+ `${indent(3)}i32.and`,
3109
+ `${indent(3)}(if`,
3110
+ `${indent(4)}(then`,
3111
+ `${indent(5)}i32.const 1`,
3112
+ `${indent(5)}local.set $found`,
3113
+ `${indent(5)}br $${wrapperTypeName}_includes_done`,
3114
+ `${indent(4)})`,
3115
+ `${indent(3)})`,
3116
+ ]
3117
+ : kind === 'boolean'
3118
+ ? [
3119
+ `${indent(3)}local.get $candidate`,
3120
+ `${indent(3)}local.get $search`,
3121
+ `${indent(3)}i32.eq`,
3122
+ `${indent(3)}(if`,
3123
+ `${indent(4)}(then`,
3124
+ `${indent(5)}i32.const 1`,
3125
+ `${indent(5)}local.set $found`,
3126
+ `${indent(5)}br $${wrapperTypeName}_includes_done`,
3127
+ `${indent(4)})`,
3128
+ `${indent(3)})`,
3129
+ ]
3130
+ : taggedComparison!.lines;
3131
+ return [
3132
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $search ${searchType}) (param $from_index f64) (param $has_from_index i32) (result i32)`,
3133
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
3134
+ `${indent(1)}(local $length i32)`,
3135
+ `${indent(1)}(local $normalized_start i32)`,
3136
+ `${indent(1)}(local $index i32)`,
3137
+ `${indent(1)}(local $found i32)`,
3138
+ `${indent(1)}${candidateLocal}`,
3139
+ ...(taggedComparison?.locals.map((local) => `${indent(1)}${local}`) ?? []),
3140
+ `${indent(1)}local.get $array`,
3141
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
3142
+ `${indent(1)}local.set $backing`,
3143
+ `${indent(1)}local.get $backing`,
3144
+ `${indent(1)}array.len`,
3145
+ `${indent(1)}local.set $length`,
3146
+ `${indent(1)}local.get $has_from_index`,
3147
+ `${indent(1)}(if`,
3148
+ `${indent(2)}(then`,
3149
+ ...emitNormalizeSliceIndexLines('from_index', 'normalized_start', indent).map((line) =>
3150
+ `${indent(1)}${line.slice(indent(1).length)}`
3151
+ ),
3152
+ `${indent(2)})`,
3153
+ `${indent(2)}(else`,
3154
+ `${indent(3)}i32.const 0`,
3155
+ `${indent(3)}local.set $normalized_start`,
3156
+ `${indent(2)})`,
3157
+ `${indent(1)})`,
3158
+ `${indent(1)}local.get $normalized_start`,
3159
+ `${indent(1)}local.set $index`,
3160
+ `${indent(1)}i32.const 0`,
3161
+ `${indent(1)}local.set $found`,
3162
+ `${indent(1)}(block $${wrapperTypeName}_includes_done`,
3163
+ `${indent(2)}(loop $${wrapperTypeName}_includes_loop`,
3164
+ `${indent(3)}local.get $index`,
3165
+ `${indent(3)}local.get $length`,
3166
+ `${indent(3)}i32.ge_u`,
3167
+ `${indent(3)}br_if $${wrapperTypeName}_includes_done`,
3168
+ ...(kind === 'string'
3169
+ ? [
3170
+ `${indent(3)}local.get $backing`,
3171
+ `${indent(3)}local.get $index`,
3172
+ `${indent(3)}array.get $${dataTypeName}`,
3173
+ `${indent(3)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
3174
+ `${indent(3)}local.set $candidate`,
3175
+ ]
3176
+ : [
3177
+ `${indent(3)}local.get $backing`,
3178
+ `${indent(3)}local.get $index`,
3179
+ `${indent(3)}array.get $${dataTypeName}`,
3180
+ `${indent(3)}local.set $candidate`,
3181
+ ]),
3182
+ ...equalityLines,
3183
+ `${indent(3)}local.get $index`,
3184
+ `${indent(3)}i32.const 1`,
3185
+ `${indent(3)}i32.add`,
3186
+ `${indent(3)}local.set $index`,
3187
+ `${indent(3)}br $${wrapperTypeName}_includes_loop`,
3188
+ `${indent(2)})`,
3189
+ `${indent(1)})`,
3190
+ `${indent(1)}local.get $found`,
3191
+ ')',
3192
+ ];
3193
+ }
3194
+
3195
+ function emitOwnedArrayIndexOfHelper(
3196
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
3197
+ indent: (level: number) => string,
3198
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
3199
+ ): string[] {
3200
+ if (kind === 'string' && !stringRuntimeLayout) {
3201
+ throw new CompilerUnsupportedError(
3202
+ 'Owned string-array indexOf helpers require the owned string runtime.',
3203
+ );
3204
+ }
3205
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
3206
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
3207
+ const helperName = getOwnedArrayIndexOfHelperName(kind);
3208
+ const searchType = getOwnedArrayPushValueWatType(kind);
3209
+ const taggedComparison = kind === 'tagged'
3210
+ ? emitTaggedValueComparisonLines(
3211
+ 'strict',
3212
+ [
3213
+ 'local.get $index',
3214
+ 'f64.convert_i32_s',
3215
+ 'return',
3216
+ ],
3217
+ indent,
3218
+ stringRuntimeLayout,
3219
+ )
3220
+ : undefined;
3221
+ const candidateLocal =
3222
+ kind === 'heap'
3223
+ ? '(local $candidate (ref null eq))'
3224
+ : kind === 'string'
3225
+ ? `(local $candidate (ref null $${stringRuntimeLayout!.runtimeWatTypeId}))`
3226
+ : kind === 'number'
3227
+ ? '(local $candidate f64)'
3228
+ : kind === 'boolean'
3229
+ ? '(local $candidate i32)'
3230
+ : '(local $candidate (ref null $tagged_value))';
3231
+ const equalityLines = kind === 'heap'
3232
+ ? [
3233
+ `${indent(3)}local.get $candidate`,
3234
+ `${indent(3)}local.get $search`,
3235
+ `${indent(3)}ref.eq`,
3236
+ `${indent(3)}(if`,
3237
+ `${indent(4)}(then`,
3238
+ `${indent(5)}local.get $index`,
3239
+ `${indent(5)}f64.convert_i32_s`,
3240
+ `${indent(5)}return`,
3241
+ `${indent(4)})`,
3242
+ `${indent(3)})`,
3243
+ ]
3244
+ : kind === 'string'
3245
+ ? [
3246
+ `${indent(3)}local.get $candidate`,
3247
+ `${indent(3)}local.get $search`,
3248
+ `${indent(3)}call $owned_string_equals`,
3249
+ `${indent(3)}(if`,
3250
+ `${indent(4)}(then`,
3251
+ `${indent(5)}local.get $index`,
3252
+ `${indent(5)}f64.convert_i32_s`,
3253
+ `${indent(5)}return`,
3254
+ `${indent(4)})`,
3255
+ `${indent(3)})`,
3256
+ ]
3257
+ : kind === 'number'
3258
+ ? [
3259
+ `${indent(3)}local.get $candidate`,
3260
+ `${indent(3)}local.get $search`,
3261
+ `${indent(3)}f64.eq`,
3262
+ `${indent(3)}(if`,
3263
+ `${indent(4)}(then`,
3264
+ `${indent(5)}local.get $index`,
3265
+ `${indent(5)}f64.convert_i32_s`,
3266
+ `${indent(5)}return`,
3267
+ `${indent(4)})`,
3268
+ `${indent(3)})`,
3269
+ ]
3270
+ : kind === 'boolean'
3271
+ ? [
3272
+ `${indent(3)}local.get $candidate`,
3273
+ `${indent(3)}local.get $search`,
3274
+ `${indent(3)}i32.eq`,
3275
+ `${indent(3)}(if`,
3276
+ `${indent(4)}(then`,
3277
+ `${indent(5)}local.get $index`,
3278
+ `${indent(5)}f64.convert_i32_s`,
3279
+ `${indent(5)}return`,
3280
+ `${indent(4)})`,
3281
+ `${indent(3)})`,
3282
+ ]
3283
+ : taggedComparison!.lines;
3284
+ return [
3285
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $search ${searchType}) (param $from_index f64) (param $has_from_index i32) (result f64)`,
3286
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
3287
+ `${indent(1)}(local $length i32)`,
3288
+ `${indent(1)}(local $normalized_start i32)`,
3289
+ `${indent(1)}(local $index i32)`,
3290
+ `${indent(1)}${candidateLocal}`,
3291
+ ...(taggedComparison?.locals.map((local) => `${indent(1)}${local}`) ?? []),
3292
+ `${indent(1)}local.get $array`,
3293
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
3294
+ `${indent(1)}local.set $backing`,
3295
+ `${indent(1)}local.get $backing`,
3296
+ `${indent(1)}array.len`,
3297
+ `${indent(1)}local.set $length`,
3298
+ `${indent(1)}local.get $has_from_index`,
3299
+ `${indent(1)}(if`,
3300
+ `${indent(2)}(then`,
3301
+ ...emitNormalizeSliceIndexLines('from_index', 'normalized_start', indent).map((line) =>
3302
+ `${indent(1)}${line.slice(indent(1).length)}`
3303
+ ),
3304
+ `${indent(2)})`,
3305
+ `${indent(2)}(else`,
3306
+ `${indent(3)}i32.const 0`,
3307
+ `${indent(3)}local.set $normalized_start`,
3308
+ `${indent(2)})`,
3309
+ `${indent(1)})`,
3310
+ `${indent(1)}local.get $normalized_start`,
3311
+ `${indent(1)}local.set $index`,
3312
+ `${indent(1)}(block $${wrapperTypeName}_index_of_done`,
3313
+ `${indent(2)}(loop $${wrapperTypeName}_index_of_loop`,
3314
+ `${indent(3)}local.get $index`,
3315
+ `${indent(3)}local.get $length`,
3316
+ `${indent(3)}i32.ge_u`,
3317
+ `${indent(3)}br_if $${wrapperTypeName}_index_of_done`,
3318
+ ...(kind === 'string'
3319
+ ? [
3320
+ `${indent(3)}local.get $backing`,
3321
+ `${indent(3)}local.get $index`,
3322
+ `${indent(3)}array.get $${dataTypeName}`,
3323
+ `${indent(3)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
3324
+ `${indent(3)}local.set $candidate`,
3325
+ ]
3326
+ : [
3327
+ `${indent(3)}local.get $backing`,
3328
+ `${indent(3)}local.get $index`,
3329
+ `${indent(3)}array.get $${dataTypeName}`,
3330
+ `${indent(3)}local.set $candidate`,
3331
+ ]),
3332
+ ...equalityLines,
3333
+ `${indent(3)}local.get $index`,
3334
+ `${indent(3)}i32.const 1`,
3335
+ `${indent(3)}i32.add`,
3336
+ `${indent(3)}local.set $index`,
3337
+ `${indent(3)}br $${wrapperTypeName}_index_of_loop`,
3338
+ `${indent(2)})`,
3339
+ `${indent(1)})`,
3340
+ `${indent(1)}f64.const -1`,
3341
+ ')',
3342
+ ];
3343
+ }
3344
+
3345
+ function emitOwnedArrayLastIndexOfHelper(
3346
+ kind: 'heap' | 'string' | 'number' | 'boolean' | 'tagged',
3347
+ indent: (level: number) => string,
3348
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
3349
+ ): string[] {
3350
+ if (kind === 'string' && !stringRuntimeLayout) {
3351
+ throw new CompilerUnsupportedError(
3352
+ 'Owned string-array lastIndexOf helpers require the owned string runtime.',
3353
+ );
3354
+ }
3355
+ const wrapperTypeName = getOwnedArrayWatTypeName(kind);
3356
+ const dataTypeName = getOwnedArrayDataWatTypeName(kind);
3357
+ const helperName = getOwnedArrayLastIndexOfHelperName(kind);
3358
+ const searchType = getOwnedArrayPushValueWatType(kind);
3359
+ const taggedComparison = kind === 'tagged'
3360
+ ? emitTaggedValueComparisonLines(
3361
+ 'strict',
3362
+ [
3363
+ 'local.get $index',
3364
+ 'f64.convert_i32_s',
3365
+ 'return',
3366
+ ],
3367
+ indent,
3368
+ stringRuntimeLayout,
3369
+ )
3370
+ : undefined;
3371
+ const candidateLocal =
3372
+ kind === 'heap'
3373
+ ? '(local $candidate (ref null eq))'
3374
+ : kind === 'string'
3375
+ ? `(local $candidate (ref null $${stringRuntimeLayout!.runtimeWatTypeId}))`
3376
+ : kind === 'number'
3377
+ ? '(local $candidate f64)'
3378
+ : kind === 'boolean'
3379
+ ? '(local $candidate i32)'
3380
+ : '(local $candidate (ref null $tagged_value))';
3381
+ const equalityLines = kind === 'heap'
3382
+ ? [
3383
+ `${indent(3)}local.get $candidate`,
3384
+ `${indent(3)}local.get $search`,
3385
+ `${indent(3)}ref.eq`,
3386
+ `${indent(3)}(if`,
3387
+ `${indent(4)}(then`,
3388
+ `${indent(5)}local.get $index`,
3389
+ `${indent(5)}f64.convert_i32_s`,
3390
+ `${indent(5)}return`,
3391
+ `${indent(4)})`,
3392
+ `${indent(3)})`,
3393
+ ]
3394
+ : kind === 'string'
3395
+ ? [
3396
+ `${indent(3)}local.get $candidate`,
3397
+ `${indent(3)}local.get $search`,
3398
+ `${indent(3)}call $owned_string_equals`,
3399
+ `${indent(3)}(if`,
3400
+ `${indent(4)}(then`,
3401
+ `${indent(5)}local.get $index`,
3402
+ `${indent(5)}f64.convert_i32_s`,
3403
+ `${indent(5)}return`,
3404
+ `${indent(4)})`,
3405
+ `${indent(3)})`,
3406
+ ]
3407
+ : kind === 'number'
3408
+ ? [
3409
+ `${indent(3)}local.get $candidate`,
3410
+ `${indent(3)}local.get $search`,
3411
+ `${indent(3)}f64.eq`,
3412
+ `${indent(3)}(if`,
3413
+ `${indent(4)}(then`,
3414
+ `${indent(5)}local.get $index`,
3415
+ `${indent(5)}f64.convert_i32_s`,
3416
+ `${indent(5)}return`,
3417
+ `${indent(4)})`,
3418
+ `${indent(3)})`,
3419
+ ]
3420
+ : kind === 'boolean'
3421
+ ? [
3422
+ `${indent(3)}local.get $candidate`,
3423
+ `${indent(3)}local.get $search`,
3424
+ `${indent(3)}i32.eq`,
3425
+ `${indent(3)}(if`,
3426
+ `${indent(4)}(then`,
3427
+ `${indent(5)}local.get $index`,
3428
+ `${indent(5)}f64.convert_i32_s`,
3429
+ `${indent(5)}return`,
3430
+ `${indent(4)})`,
3431
+ `${indent(3)})`,
3432
+ ]
3433
+ : taggedComparison!.lines;
3434
+ return [
3435
+ `(func $${helperName} (param $array (ref null $${wrapperTypeName})) (param $search ${searchType}) (param $from_index f64) (param $has_from_index i32) (result f64)`,
3436
+ `${indent(1)}(local $backing (ref null $${dataTypeName}))`,
3437
+ `${indent(1)}(local $length i32)`,
3438
+ `${indent(1)}(local $normalized_start i32)`,
3439
+ `${indent(1)}(local $index i32)`,
3440
+ `${indent(1)}${candidateLocal}`,
3441
+ ...(taggedComparison?.locals.map((local) => `${indent(1)}${local}`) ?? []),
3442
+ `${indent(1)}local.get $array`,
3443
+ `${indent(1)}struct.get $${wrapperTypeName} 0`,
3444
+ `${indent(1)}local.set $backing`,
3445
+ `${indent(1)}local.get $backing`,
3446
+ `${indent(1)}array.len`,
3447
+ `${indent(1)}local.set $length`,
3448
+ `${indent(1)}local.get $length`,
3449
+ `${indent(1)}i32.eqz`,
3450
+ `${indent(1)}(if`,
3451
+ `${indent(2)}(then`,
3452
+ `${indent(3)}f64.const -1`,
3453
+ `${indent(3)}return`,
3454
+ `${indent(2)})`,
3455
+ `${indent(1)})`,
3456
+ `${indent(1)}local.get $has_from_index`,
3457
+ `${indent(1)}(if`,
3458
+ `${indent(2)}(then`,
3459
+ ...emitNormalizeLastIndexFromIndexLines('from_index', 'normalized_start', indent).map((line) =>
3460
+ `${indent(1)}${line.slice(indent(1).length)}`
3461
+ ),
3462
+ `${indent(2)})`,
3463
+ `${indent(2)}(else`,
3464
+ `${indent(3)}local.get $length`,
3465
+ `${indent(3)}i32.const 1`,
3466
+ `${indent(3)}i32.sub`,
3467
+ `${indent(3)}local.set $normalized_start`,
3468
+ `${indent(2)})`,
3469
+ `${indent(1)})`,
3470
+ `${indent(1)}local.get $normalized_start`,
3471
+ `${indent(1)}local.set $index`,
3472
+ `${indent(1)}(block $${wrapperTypeName}_last_index_of_done`,
3473
+ `${indent(2)}(loop $${wrapperTypeName}_last_index_of_loop`,
3474
+ `${indent(3)}local.get $index`,
3475
+ `${indent(3)}i32.const 0`,
3476
+ `${indent(3)}i32.lt_s`,
3477
+ `${indent(3)}br_if $${wrapperTypeName}_last_index_of_done`,
3478
+ ...(kind === 'string'
3479
+ ? [
3480
+ `${indent(3)}local.get $backing`,
3481
+ `${indent(3)}local.get $index`,
3482
+ `${indent(3)}array.get $${dataTypeName}`,
3483
+ `${indent(3)}ref.cast (ref null $${stringRuntimeLayout!.runtimeWatTypeId})`,
3484
+ `${indent(3)}local.set $candidate`,
3485
+ ]
3486
+ : [
3487
+ `${indent(3)}local.get $backing`,
3488
+ `${indent(3)}local.get $index`,
3489
+ `${indent(3)}array.get $${dataTypeName}`,
3490
+ `${indent(3)}local.set $candidate`,
3491
+ ]),
3492
+ ...equalityLines,
3493
+ `${indent(3)}local.get $index`,
3494
+ `${indent(3)}i32.const 1`,
3495
+ `${indent(3)}i32.sub`,
3496
+ `${indent(3)}local.set $index`,
3497
+ `${indent(3)}br $${wrapperTypeName}_last_index_of_loop`,
3498
+ `${indent(2)})`,
3499
+ `${indent(1)})`,
3500
+ `${indent(1)}f64.const -1`,
3501
+ ')',
3502
+ ];
3503
+ }
3504
+
3505
+ export function emitHostOwnedArrayResultAdaptation(
3506
+ resultKind: 'string' | 'number' | 'boolean',
3507
+ ownedArrayParamKinds: readonly ('string' | 'number' | 'boolean')[],
3508
+ level: number,
3509
+ indent: (level: number) => string,
3510
+ ): string[] {
3511
+ return ownedArrayParamKinds.includes(resultKind)
3512
+ ? [
3513
+ `${indent(level)}call $copy_owned_${resultKind}_array_to_host_array`,
3514
+ `${indent(level)}local.get $result_host_param`,
3515
+ ]
3516
+ : [`${indent(level)}call $${getOwnedArrayToHostHelperName(resultKind)}`];
3517
+ }
3518
+
3519
+ export function emitOwnedArrayBoundaryHelpers(
3520
+ module: CompilerModuleIR,
3521
+ options: OwnedArrayBoundaryHelperOptions,
3522
+ ): string[] {
3523
+ const {
3524
+ usesStringParamBoundary,
3525
+ usesStringParamCopyBack,
3526
+ usesStringResultBoundary,
3527
+ usesNumberParamBoundary,
3528
+ usesNumberParamCopyBack,
3529
+ usesNumberResultBoundary,
3530
+ usesBooleanParamBoundary,
3531
+ usesBooleanParamCopyBack,
3532
+ usesBooleanResultBoundary,
3533
+ usesTaggedParamBoundary,
3534
+ usesTaggedParamCopyBack,
3535
+ usesTaggedResultBoundary,
3536
+ indent,
3537
+ createUnsupportedHeapRuntimeBackendError,
3538
+ fallbackObjectWatTypeId,
3539
+ layoutsByRepresentationName,
3540
+ stringRuntimeLayout,
3541
+ } = options;
3542
+ if (
3543
+ !usesStringParamBoundary && !usesStringParamCopyBack && !usesStringResultBoundary &&
3544
+ !usesNumberParamBoundary && !usesNumberParamCopyBack && !usesNumberResultBoundary &&
3545
+ !usesBooleanParamBoundary && !usesBooleanParamCopyBack && !usesBooleanResultBoundary &&
3546
+ !usesTaggedParamBoundary && !usesTaggedParamCopyBack && !usesTaggedResultBoundary
3547
+ ) {
3548
+ return [];
3549
+ }
3550
+ if ((usesStringParamBoundary || usesStringParamCopyBack || usesStringResultBoundary) &&
3551
+ !stringRuntimeLayout) {
3552
+ throw createUnsupportedHeapRuntimeBackendError(
3553
+ 'Owned string-array host boundaries require the owned string runtime.',
3554
+ );
3555
+ }
3556
+ const taggedKindSets = usesTaggedParamBoundary || usesTaggedParamCopyBack || usesTaggedResultBoundary
3557
+ ? collectTaggedArrayBoundaryKindSets(module, layoutsByRepresentationName)
3558
+ : [];
3559
+
3560
+ return [
3561
+ ...(usesStringParamBoundary ? emitHostArrayToOwnedArrayHelper('string', indent) : []),
3562
+ ...(usesStringParamBoundary || usesStringParamCopyBack
3563
+ ? emitCopyOwnedArrayToHostArrayHelper('string', indent, stringRuntimeLayout)
3564
+ : []),
3565
+ ...(usesStringResultBoundary
3566
+ ? emitOwnedArrayToHostArrayHelper('string', indent, stringRuntimeLayout)
3567
+ : []),
3568
+ ...(usesNumberParamBoundary ? emitHostArrayToOwnedArrayHelper('number', indent) : []),
3569
+ ...(usesNumberParamBoundary || usesNumberParamCopyBack
3570
+ ? emitCopyOwnedArrayToHostArrayHelper('number', indent)
3571
+ : []),
3572
+ ...(usesNumberResultBoundary ? emitOwnedArrayToHostArrayHelper('number', indent) : []),
3573
+ ...(usesBooleanParamBoundary ? emitHostArrayToOwnedArrayHelper('boolean', indent) : []),
3574
+ ...(usesBooleanParamBoundary || usesBooleanParamCopyBack
3575
+ ? emitCopyOwnedArrayToHostArrayHelper('boolean', indent)
3576
+ : []),
3577
+ ...(usesBooleanResultBoundary ? emitOwnedArrayToHostArrayHelper('boolean', indent) : []),
3578
+ ...(usesTaggedParamBoundary
3579
+ ? taggedKindSets.flatMap((kinds) =>
3580
+ emitHostArrayToOwnedTaggedArrayHelper(
3581
+ kinds,
3582
+ indent,
3583
+ layoutsByRepresentationName,
3584
+ createUnsupportedHeapRuntimeBackendError,
3585
+ ))
3586
+ : []),
3587
+ ...(usesTaggedParamCopyBack || usesTaggedResultBoundary
3588
+ ? taggedKindSets.flatMap((kinds) =>
3589
+ emitCopyOwnedTaggedArrayToHostArrayHelper(
3590
+ kinds,
3591
+ indent,
3592
+ layoutsByRepresentationName,
3593
+ fallbackObjectWatTypeId,
3594
+ createUnsupportedHeapRuntimeBackendError,
3595
+ ))
3596
+ : []),
3597
+ ...(usesTaggedParamCopyBack || usesTaggedResultBoundary
3598
+ ? taggedKindSets.flatMap((kinds) =>
3599
+ emitOwnedTaggedArrayToHostArrayHelper(
3600
+ kinds,
3601
+ indent,
3602
+ stringRuntimeLayout,
3603
+ layoutsByRepresentationName,
3604
+ fallbackObjectWatTypeId,
3605
+ createUnsupportedHeapRuntimeBackendError,
3606
+ ))
3607
+ : []),
3608
+ ];
3609
+ }
3610
+
3611
+ export function emitOwnedArrayNativeHelpers(
3612
+ options: OwnedArrayPushHelperUsage,
3613
+ indent: (level: number) => string,
3614
+ stringRuntimeLayout?: BackendStringRuntimeLayoutLike,
3615
+ ): string[] {
3616
+ const {
3617
+ usesOwnedStringPush,
3618
+ usesOwnedNumberPush,
3619
+ usesOwnedBooleanPush,
3620
+ usesOwnedTaggedPush,
3621
+ usesOwnedStringUnshift,
3622
+ usesOwnedNumberUnshift,
3623
+ usesOwnedBooleanUnshift,
3624
+ usesOwnedTaggedUnshift,
3625
+ usesOwnedHeapPop,
3626
+ usesOwnedStringPop,
3627
+ usesOwnedNumberPop,
3628
+ usesOwnedBooleanPop,
3629
+ usesOwnedTaggedPop,
3630
+ usesOwnedHeapShift,
3631
+ usesOwnedStringShift,
3632
+ usesOwnedNumberShift,
3633
+ usesOwnedBooleanShift,
3634
+ usesOwnedTaggedShift,
3635
+ usesOwnedHeapAt,
3636
+ usesOwnedStringAt,
3637
+ usesOwnedNumberAt,
3638
+ usesOwnedBooleanAt,
3639
+ usesOwnedTaggedAt,
3640
+ usesOwnedStringJoin,
3641
+ usesOwnedNumberJoin,
3642
+ usesOwnedBooleanJoin,
3643
+ usesOwnedHeapReverse,
3644
+ usesOwnedStringReverse,
3645
+ usesOwnedNumberReverse,
3646
+ usesOwnedBooleanReverse,
3647
+ usesOwnedTaggedReverse,
3648
+ usesOwnedHeapFill,
3649
+ usesOwnedStringFill,
3650
+ usesOwnedNumberFill,
3651
+ usesOwnedBooleanFill,
3652
+ usesOwnedTaggedFill,
3653
+ usesOwnedHeapCopyWithin,
3654
+ usesOwnedStringCopyWithin,
3655
+ usesOwnedNumberCopyWithin,
3656
+ usesOwnedBooleanCopyWithin,
3657
+ usesOwnedTaggedCopyWithin,
3658
+ usesOwnedHeapConcat,
3659
+ usesOwnedStringConcat,
3660
+ usesOwnedNumberConcat,
3661
+ usesOwnedBooleanConcat,
3662
+ usesOwnedTaggedConcat,
3663
+ usesOwnedHeapSlice,
3664
+ usesOwnedStringSlice,
3665
+ usesOwnedNumberSlice,
3666
+ usesOwnedBooleanSlice,
3667
+ usesOwnedTaggedSlice,
3668
+ usesOwnedHeapSplice,
3669
+ usesOwnedStringSplice,
3670
+ usesOwnedNumberSplice,
3671
+ usesOwnedBooleanSplice,
3672
+ usesOwnedHeapIncludes,
3673
+ usesOwnedStringIncludes,
3674
+ usesOwnedNumberIncludes,
3675
+ usesOwnedBooleanIncludes,
3676
+ usesOwnedTaggedIncludes,
3677
+ usesOwnedHeapIndexOf,
3678
+ usesOwnedStringIndexOf,
3679
+ usesOwnedNumberIndexOf,
3680
+ usesOwnedBooleanIndexOf,
3681
+ usesOwnedTaggedIndexOf,
3682
+ usesOwnedHeapLastIndexOf,
3683
+ usesOwnedStringLastIndexOf,
3684
+ usesOwnedNumberLastIndexOf,
3685
+ usesOwnedBooleanLastIndexOf,
3686
+ usesOwnedTaggedLastIndexOf,
3687
+ } = options;
3688
+ return [
3689
+ ...(usesOwnedStringPush ? emitOwnedArrayPushHelper('string', indent) : []),
3690
+ ...(usesOwnedNumberPush ? emitOwnedArrayPushHelper('number', indent) : []),
3691
+ ...(usesOwnedBooleanPush ? emitOwnedArrayPushHelper('boolean', indent) : []),
3692
+ ...(usesOwnedTaggedPush ? emitOwnedArrayPushHelper('tagged', indent) : []),
3693
+ ...(usesOwnedStringUnshift ? emitOwnedArrayUnshiftHelper('string', indent) : []),
3694
+ ...(usesOwnedNumberUnshift ? emitOwnedArrayUnshiftHelper('number', indent) : []),
3695
+ ...(usesOwnedBooleanUnshift ? emitOwnedArrayUnshiftHelper('boolean', indent) : []),
3696
+ ...(usesOwnedTaggedUnshift ? emitOwnedArrayUnshiftHelper('tagged', indent) : []),
3697
+ ...(usesOwnedHeapPop ? emitOwnedArrayPopHelper('heap', indent) : []),
3698
+ ...(usesOwnedStringPop ? emitOwnedArrayPopHelper('string', indent, stringRuntimeLayout) : []),
3699
+ ...(usesOwnedNumberPop ? emitOwnedArrayPopHelper('number', indent) : []),
3700
+ ...(usesOwnedBooleanPop ? emitOwnedArrayPopHelper('boolean', indent) : []),
3701
+ ...(usesOwnedTaggedPop ? emitOwnedArrayPopHelper('tagged', indent) : []),
3702
+ ...(usesOwnedHeapShift ? emitOwnedArrayShiftHelper('heap', indent) : []),
3703
+ ...(usesOwnedStringShift ? emitOwnedArrayShiftHelper('string', indent, stringRuntimeLayout) : []),
3704
+ ...(usesOwnedNumberShift ? emitOwnedArrayShiftHelper('number', indent) : []),
3705
+ ...(usesOwnedBooleanShift ? emitOwnedArrayShiftHelper('boolean', indent) : []),
3706
+ ...(usesOwnedTaggedShift ? emitOwnedArrayShiftHelper('tagged', indent) : []),
3707
+ ...(usesOwnedHeapAt ? emitOwnedArrayAtHelper('heap', indent) : []),
3708
+ ...(usesOwnedStringAt ? emitOwnedArrayAtHelper('string', indent, stringRuntimeLayout) : []),
3709
+ ...(usesOwnedNumberAt ? emitOwnedArrayAtHelper('number', indent) : []),
3710
+ ...(usesOwnedBooleanAt ? emitOwnedArrayAtHelper('boolean', indent) : []),
3711
+ ...(usesOwnedTaggedAt ? emitOwnedArrayAtHelper('tagged', indent) : []),
3712
+ ...(usesOwnedStringJoin ? emitOwnedArrayJoinHelper('string', indent, stringRuntimeLayout) : []),
3713
+ ...(usesOwnedNumberJoin ? emitOwnedArrayJoinHelper('number', indent, stringRuntimeLayout) : []),
3714
+ ...(usesOwnedBooleanJoin ? emitOwnedArrayJoinHelper('boolean', indent, stringRuntimeLayout) : []),
3715
+ ...(usesOwnedHeapReverse ? emitOwnedArrayReverseHelper('heap', indent) : []),
3716
+ ...(usesOwnedStringReverse ? emitOwnedArrayReverseHelper('string', indent) : []),
3717
+ ...(usesOwnedNumberReverse ? emitOwnedArrayReverseHelper('number', indent) : []),
3718
+ ...(usesOwnedBooleanReverse ? emitOwnedArrayReverseHelper('boolean', indent) : []),
3719
+ ...(usesOwnedTaggedReverse ? emitOwnedArrayReverseHelper('tagged', indent) : []),
3720
+ ...(usesOwnedHeapFill ? emitOwnedArrayFillHelper('heap', indent) : []),
3721
+ ...(usesOwnedStringFill ? emitOwnedArrayFillHelper('string', indent) : []),
3722
+ ...(usesOwnedNumberFill ? emitOwnedArrayFillHelper('number', indent) : []),
3723
+ ...(usesOwnedBooleanFill ? emitOwnedArrayFillHelper('boolean', indent) : []),
3724
+ ...(usesOwnedTaggedFill ? emitOwnedArrayFillHelper('tagged', indent) : []),
3725
+ ...(usesOwnedHeapCopyWithin ? emitOwnedArrayCopyWithinHelper('heap', indent) : []),
3726
+ ...(usesOwnedStringCopyWithin ? emitOwnedArrayCopyWithinHelper('string', indent) : []),
3727
+ ...(usesOwnedNumberCopyWithin ? emitOwnedArrayCopyWithinHelper('number', indent) : []),
3728
+ ...(usesOwnedBooleanCopyWithin ? emitOwnedArrayCopyWithinHelper('boolean', indent) : []),
3729
+ ...(usesOwnedTaggedCopyWithin ? emitOwnedArrayCopyWithinHelper('tagged', indent) : []),
3730
+ ...(usesOwnedHeapConcat ? emitOwnedArrayConcatHelper('heap', indent) : []),
3731
+ ...(usesOwnedStringConcat ? emitOwnedArrayConcatHelper('string', indent) : []),
3732
+ ...(usesOwnedNumberConcat ? emitOwnedArrayConcatHelper('number', indent) : []),
3733
+ ...(usesOwnedBooleanConcat ? emitOwnedArrayConcatHelper('boolean', indent) : []),
3734
+ ...(usesOwnedTaggedConcat ? emitOwnedArrayConcatHelper('tagged', indent) : []),
3735
+ ...(usesOwnedHeapSlice ? emitOwnedArraySliceHelper('heap', indent) : []),
3736
+ ...(usesOwnedStringSlice ? emitOwnedArraySliceHelper('string', indent) : []),
3737
+ ...(usesOwnedNumberSlice ? emitOwnedArraySliceHelper('number', indent) : []),
3738
+ ...(usesOwnedBooleanSlice ? emitOwnedArraySliceHelper('boolean', indent) : []),
3739
+ ...(usesOwnedTaggedSlice ? emitOwnedArraySliceHelper('tagged', indent) : []),
3740
+ ...(usesOwnedHeapSplice ? emitOwnedArraySpliceHelper('heap', indent) : []),
3741
+ ...(usesOwnedStringSplice ? emitOwnedArraySpliceHelper('string', indent) : []),
3742
+ ...(usesOwnedNumberSplice ? emitOwnedArraySpliceHelper('number', indent) : []),
3743
+ ...(usesOwnedBooleanSplice ? emitOwnedArraySpliceHelper('boolean', indent) : []),
3744
+ ...(usesOwnedHeapIncludes ? emitOwnedArrayIncludesHelper('heap', indent) : []),
3745
+ ...(usesOwnedStringIncludes
3746
+ ? emitOwnedArrayIncludesHelper('string', indent, stringRuntimeLayout)
3747
+ : []),
3748
+ ...(usesOwnedNumberIncludes ? emitOwnedArrayIncludesHelper('number', indent) : []),
3749
+ ...(usesOwnedBooleanIncludes ? emitOwnedArrayIncludesHelper('boolean', indent) : []),
3750
+ ...(usesOwnedTaggedIncludes ? emitOwnedArrayIncludesHelper('tagged', indent, stringRuntimeLayout) : []),
3751
+ ...(usesOwnedHeapIndexOf ? emitOwnedArrayIndexOfHelper('heap', indent) : []),
3752
+ ...(usesOwnedStringIndexOf
3753
+ ? emitOwnedArrayIndexOfHelper('string', indent, stringRuntimeLayout)
3754
+ : []),
3755
+ ...(usesOwnedNumberIndexOf ? emitOwnedArrayIndexOfHelper('number', indent) : []),
3756
+ ...(usesOwnedBooleanIndexOf ? emitOwnedArrayIndexOfHelper('boolean', indent) : []),
3757
+ ...(usesOwnedTaggedIndexOf ? emitOwnedArrayIndexOfHelper('tagged', indent, stringRuntimeLayout) : []),
3758
+ ...(usesOwnedHeapLastIndexOf ? emitOwnedArrayLastIndexOfHelper('heap', indent) : []),
3759
+ ...(usesOwnedStringLastIndexOf
3760
+ ? emitOwnedArrayLastIndexOfHelper('string', indent, stringRuntimeLayout)
3761
+ : []),
3762
+ ...(usesOwnedNumberLastIndexOf ? emitOwnedArrayLastIndexOfHelper('number', indent) : []),
3763
+ ...(usesOwnedBooleanLastIndexOf ? emitOwnedArrayLastIndexOfHelper('boolean', indent) : []),
3764
+ ...(usesOwnedTaggedLastIndexOf
3765
+ ? emitOwnedArrayLastIndexOfHelper('tagged', indent, stringRuntimeLayout)
3766
+ : []),
3767
+ ];
3768
+ }