diff options
author | Alon Zakai <azakai@google.com> | 2024-11-21 11:26:33 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-21 11:26:33 -0800 |
commit | 3342d56e4a13170c094a29138b32ff17cad4c01d (patch) | |
tree | 8a63abc6e8f0e9cdb01eef40ffbd9010bf009d8b /test/wasm2js | |
parent | af5f74aeb3c53081ffaedbde18a77bdede0a697e (diff) | |
download | binaryen-3342d56e4a13170c094a29138b32ff17cad4c01d.tar.gz binaryen-3342d56e4a13170c094a29138b32ff17cad4c01d.tar.bz2 binaryen-3342d56e4a13170c094a29138b32ff17cad4c01d.zip |
[wasm2js] Properly handle loops without labels (#7100)
When a loop has no name, the name does not matter, but we also cannot
emit the same name for all such loops, as that is invalid JS. Just do not
emit a while(){} at all in that case, as no continue can exist anyhow.
Fixes #7099
Also fix two missing * in error reporting logic, that was printing pointers
rather than the expression we wanted to print. I think we changed how
iostream prints things years ago, and forgot to update these.
Diffstat (limited to 'test/wasm2js')
-rw-r--r-- | test/wasm2js/br_table_temp.2asm.js | 34 | ||||
-rw-r--r-- | test/wasm2js/empty_loop.2asm.js | 28 | ||||
-rw-r--r-- | test/wasm2js/empty_loop.2asm.js.opt | 26 | ||||
-rw-r--r-- | test/wasm2js/empty_loop.wast | 18 |
4 files changed, 86 insertions, 20 deletions
diff --git a/test/wasm2js/br_table_temp.2asm.js b/test/wasm2js/br_table_temp.2asm.js index a8592a186..01a2238e1 100644 --- a/test/wasm2js/br_table_temp.2asm.js +++ b/test/wasm2js/br_table_temp.2asm.js @@ -12554,12 +12554,10 @@ function asmFunc(imports) { function $19() { var $1_1 = 0, $2_1 = 0, $4_1 = 0; label : { - $null_Name_ : while (1) { - $1_1 = 3; - switch (0 | 0) { - default: - break label; - }; + $1_1 = 3; + switch (0 | 0) { + default: + break label; }; } return $1_1 | 0; @@ -12568,13 +12566,11 @@ function asmFunc(imports) { function $20() { var $1_1 = 0, $2_1 = 0, $4_1 = 0; label : { - $null_Name_ : while (1) { - dummy(); - $1_1 = 4; - switch (-1 | 0) { - default: - break label; - }; + dummy(); + $1_1 = 4; + switch (-1 | 0) { + default: + break label; }; } return $1_1 | 0; @@ -12583,13 +12579,11 @@ function asmFunc(imports) { function $21() { var $1_1 = 0; label : { - $null_Name_ : while (1) { - dummy(); - $1_1 = 5; - switch (1 | 0) { - default: - break label; - }; + dummy(); + $1_1 = 5; + switch (1 | 0) { + default: + break label; }; } return $1_1 | 0; diff --git a/test/wasm2js/empty_loop.2asm.js b/test/wasm2js/empty_loop.2asm.js new file mode 100644 index 000000000..7e81b4643 --- /dev/null +++ b/test/wasm2js/empty_loop.2asm.js @@ -0,0 +1,28 @@ + +function wasm2js_trap() { throw new Error('abort'); } + +function asmFunc(imports) { + var Math_imul = Math.imul; + var Math_fround = Math.fround; + var Math_abs = Math.abs; + var Math_clz32 = Math.clz32; + var Math_min = Math.min; + var Math_max = Math.max; + var Math_floor = Math.floor; + var Math_ceil = Math.ceil; + var Math_trunc = Math.trunc; + var Math_sqrt = Math.sqrt; + var g = 0; + function test() { + g = 0; + wasm2js_trap(); + } + + return { + "test": test + }; +} + +var retasmFunc = asmFunc({ +}); +export var test = retasmFunc.test; diff --git a/test/wasm2js/empty_loop.2asm.js.opt b/test/wasm2js/empty_loop.2asm.js.opt new file mode 100644 index 000000000..ff37d056f --- /dev/null +++ b/test/wasm2js/empty_loop.2asm.js.opt @@ -0,0 +1,26 @@ + +function wasm2js_trap() { throw new Error('abort'); } + +function asmFunc(imports) { + var Math_imul = Math.imul; + var Math_fround = Math.fround; + var Math_abs = Math.abs; + var Math_clz32 = Math.clz32; + var Math_min = Math.min; + var Math_max = Math.max; + var Math_floor = Math.floor; + var Math_ceil = Math.ceil; + var Math_trunc = Math.trunc; + var Math_sqrt = Math.sqrt; + function test() { + wasm2js_trap(); + } + + return { + "test": test + }; +} + +var retasmFunc = asmFunc({ +}); +export var test = retasmFunc.test; diff --git a/test/wasm2js/empty_loop.wast b/test/wasm2js/empty_loop.wast new file mode 100644 index 000000000..8f22c033d --- /dev/null +++ b/test/wasm2js/empty_loop.wast @@ -0,0 +1,18 @@ +(module + (global $g (mut i32) (i32.const 0)) + + (func $test (export "test") + ;; Loops without labels. We should not emit anything invalid here (like a + ;; null name, which would end up identical between the two, which is wrong). + (loop + (loop + ;; Some content, so the loop is not trivial. + (global.set $g + (i32.const 0) + ) + (unreachable) + ) + (unreachable) + ) + ) +) |