parsing.js (3819B)
1 // Make sure we are correctly parsing this custom section. 2 var code =` 3 (module 4 (func $$dummy) 5 (func $main (param i32) (result i32) 6 i32.const 0 7 local.get 0 8 i32.eq 9 ;; Only allowed on br_if and if 10 (@metadata.code.branch_hint "\\00") if 11 call $$dummy 12 i32.const 1 13 return 14 else 15 call $$dummy 16 i32.const 0 17 return 18 end 19 i32.const 3 20 return 21 ) 22 23 (export "_main" (func $main)) 24 )`; 25 26 let branchHintsModule = new WebAssembly.Module(wasmTextToBinary(code)); 27 assertEq(WebAssembly.Module.customSections(branchHintsModule, "metadata.code.branch_hint").length, 1); 28 assertEq(wasmParsedBranchHints(branchHintsModule), true); 29 30 let instance = new WebAssembly.Instance(branchHintsModule); 31 assertEq(instance.exports._main(0), 1); 32 33 // Testing branch hints parsing on `if` and `br_if` 34 branchHintsModule = new WebAssembly.Module(wasmTextToBinary(` 35 (module 36 (func $main 37 i32.const 0 38 (@metadata.code.branch_hint "\\00") 39 if 40 i32.const 0 41 (@metadata.code.branch_hint "\\01") 42 br_if 0 43 end 44 ) 45 (export "_main" (func $main)) 46 )`)); 47 assertEq(wasmParsedBranchHints(branchHintsModule), true); 48 instance = new WebAssembly.Instance(branchHintsModule); 49 instance.exports._main(); 50 51 let m = new WebAssembly.Module(wasmTextToBinary(` 52 (module 53 (type (;0;) (func)) 54 (type (;1;) (func (param i32) (result i32))) 55 (type (;2;) (func (result i32))) 56 (func $__wasm_nullptr (type 0) 57 unreachable) 58 (func $main (type 2) (result i32) 59 (local i32 i32 i32 i32) 60 i32.const 0 61 local.tee 2 62 local.set 3 63 loop 64 local.get 2 65 i32.const 50000 66 i32.eq 67 (@metadata.code.branch_hint "\\00") if 68 i32.const 1 69 local.set 3 70 end 71 local.get 2 72 i32.const 1 73 i32.add 74 local.tee 2 75 i32.const 100000 76 i32.ne 77 (@metadata.code.branch_hint "\\01") br_if 0 (;@1;) 78 end 79 local.get 3) 80 (table (;0;) 1 1 funcref) 81 (memory (;0;) 17 128) 82 (global (;0;) (mut i32) (i32.const 42)) 83 (export "memory" (memory 0)) 84 (export "_main" (func $main)) 85 (elem (;0;) (i32.const 0) func $__wasm_nullptr) 86 (type (;0;) (func (param i32))) 87 )`)); 88 89 assertEq(wasmParsedBranchHints(m), true); 90 instance = new WebAssembly.Instance(m); 91 assertEq(instance.exports._main(0), 1); 92 93 // Testing invalid values for branch hints 94 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` 95 (module 96 (func $main (param i32) (result i32) 97 i32.const 0 98 (@metadata.code.branch_hint "\\0000000") if 99 i32.const 1 100 return 101 end 102 i32.const 42 103 return 104 ) 105 ) 106 `)), SyntaxError, /invalid value for branch hint/); 107 108 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` 109 (module 110 (func $main (param i32) (result i32) 111 i32.const 0 112 (@metadata.code.branch_hint "\\02") if 113 i32.const 1 114 return 115 end 116 i32.const 42 117 return 118 ) 119 ) 120 `)), SyntaxError, /invalid value for branch hint/); 121 122 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` 123 (module 124 (func $main (param i32) (result i32) 125 i32.const 0 126 (@metadata.code.branch_hint "\\aaaa") if 127 i32.const 1 128 return 129 end 130 i32.const 42 131 return 132 ) 133 ) 134 `)), SyntaxError, /wasm text error/); 135 136 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` 137 (module 138 (func $main (param i32) (result i32) 139 i32.const 0 140 (@metadata.code.branch_hint) if 141 i32.const 1 142 return 143 end 144 i32.const 42 145 return 146 ) 147 ) 148 `)), SyntaxError, /wasm text error/); 149 150 assertErrorMessage(() => new WebAssembly.Module(wasmTextToBinary(` 151 (module 152 (@metadata.code.branch_hint) 153 ) 154 `)), SyntaxError, /wasm text error/);