diff --git a/.github/workflows/build-wasm_of_ocaml.yml b/.github/workflows/build-wasm_of_ocaml.yml index e0f394dc6..97a206ac2 100644 --- a/.github/workflows/build-wasm_of_ocaml.yml +++ b/.github/workflows/build-wasm_of_ocaml.yml @@ -49,7 +49,7 @@ jobs: uses: actions/cache/restore@v4 with: path: binaryen - key: ${{ runner.os }}-binaryen-version_118 + key: ${{ runner.os }}-binaryen-eh - name: Checkout binaryen if: steps.cache-binaryen.outputs.cache-hit != 'true' @@ -58,7 +58,7 @@ jobs: repository: WebAssembly/binaryen path: binaryen submodules: true - ref: version_118 + ref: d200d06fef7f4edd331c1f928493beb332a2d910 - name: Install ninja (Ubuntu) if: matrix.os == 'ubuntu-latest' && steps.cache-binaryen.outputs.cache-hit != 'true' @@ -80,7 +80,7 @@ jobs: uses: actions/cache/save@v4 with: path: binaryen - key: ${{ runner.os }}-binaryen-version_118 + key: ${{ runner.os }}-binaryen-eh - name: Set binaryen's path run: | diff --git a/compiler/lib-wasm/binaryen.ml b/compiler/lib-wasm/binaryen.ml index 24ce55a61..027db075c 100644 --- a/compiler/lib-wasm/binaryen.ml +++ b/compiler/lib-wasm/binaryen.ml @@ -123,6 +123,7 @@ let optimize ~profile ~opt_input_sourcemap ~input_file ~opt_output_sourcemap ~ou in command ("wasm-opt" + :: "--emit-exnref" :: (common_options () @ optimization_options.(level - 1) @ [ Filename.quote input_file; "-o"; Filename.quote output_file ]) diff --git a/compiler/lib-wasm/wasm_output.ml b/compiler/lib-wasm/wasm_output.ml index 02fa6d6ad..be71e2e6b 100644 --- a/compiler/lib-wasm/wasm_output.ml +++ b/compiler/lib-wasm/wasm_output.ml @@ -648,15 +648,16 @@ end = struct output_byte ch 0x0B | Try (typ, l, catches) -> Feature.require exception_handling; - output_byte ch 0x06; + output_byte ch 0x1f; output_blocktype st.type_names ch typ; - List.iter ~f:(fun i' -> output_instruction st ch i') l; + output_uint ch (List.length catches); List.iter - ~f:(fun (tag, l, ty) -> - output_byte ch 0x07; + ~f:(fun (tag, l, _) -> + output_byte ch 0x00; output_uint ch (Hashtbl.find st.tag_names tag); - output_instruction st ch (Br (l + 1, Some (Pop ty)))) + output_uint ch l) catches; + List.iter ~f:(fun i' -> output_instruction st ch i') l; output_byte ch 0X0B and output_instruction st ch i = diff --git a/compiler/lib-wasm/wat_output.ml b/compiler/lib-wasm/wat_output.ml index 7f15a6b82..e0d042118 100644 --- a/compiler/lib-wasm/wat_output.ml +++ b/compiler/lib-wasm/wat_output.ml @@ -444,17 +444,13 @@ let expression_or_instructions ctx st in_function = ] | Try (ty, body, catches) -> [ List - (Atom "try" + (Atom "try_table" :: (block_type st ty - @ List (Atom "do" :: instructions body) - :: List.map - ~f:(fun (tag, i, ty) -> - List - (Atom "catch" - :: index st.tag_names tag - :: (instruction (Wasm_ast.Event Code_generation.hidden_location) - @ instruction (Wasm_ast.Br (i + 1, Some (Pop ty)))))) - catches)) + @ List.map + ~f:(fun (tag, i, _ty) -> + List [ Atom "catch"; index st.tag_names tag; Atom (string_of_int i) ]) + catches + @ instructions body)) ] and instruction i = match i with diff --git a/tools/node_wrapper.sh b/tools/node_wrapper.sh index 9912795db..5e312f639 100755 --- a/tools/node_wrapper.sh +++ b/tools/node_wrapper.sh @@ -1,3 +1,3 @@ #!/bin/sh export PATH=$(echo $PATH | cut -d : -f 2-) # Do not call oneself recursively -exec node --experimental-wasm-imported-strings --experimental-wasm-stack-switching --stack-size=10000 "$@" +exec node --experimental-wasm-exnref --experimental-wasm-imported-strings --experimental-wasm-stack-switching --stack-size=10000 "$@"