| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Flags: --validate-asm --allow-natives-syntax | 5 // Flags: --validate-asm --allow-natives-syntax |
| 6 | 6 |
| 7 function IsAlwaysOpt(module) { | 7 function assertValidAsm(func) { |
| 8 return %GetOptimizationStatus(module) === 3; | 8 assertTrue(%IsAsmWasmCode(func) || |
| 9 %GetOptimizationStatus(func) === 3); |
| 9 } | 10 } |
| 10 | 11 |
| 11 (function TestModuleArgs() { | 12 (function TestModuleArgs() { |
| 12 function Module1(stdlib) { | 13 function Module1(stdlib) { |
| 13 "use asm"; | 14 "use asm"; |
| 14 function foo() { } | 15 function foo() { } |
| 15 return { foo: foo }; | 16 return { foo: foo }; |
| 16 } | 17 } |
| 17 function Module2(stdlib, ffi) { | 18 function Module2(stdlib, ffi) { |
| 18 "use asm"; | 19 "use asm"; |
| 19 function foo() { } | 20 function foo() { } |
| 20 return { foo: foo }; | 21 return { foo: foo }; |
| 21 } | 22 } |
| 22 function Module3(stdlib, ffi, heap) { | 23 function Module3(stdlib, ffi, heap) { |
| 23 "use asm"; | 24 "use asm"; |
| 24 function foo() { } | 25 function foo() { } |
| 25 return { foo: foo }; | 26 return { foo: foo }; |
| 26 } | 27 } |
| 27 var modules = [Module1, Module2, Module3]; | 28 var modules = [Module1, Module2, Module3]; |
| 28 var heap = new ArrayBuffer(1024 * 1024); | 29 var heap = new ArrayBuffer(1024 * 1024); |
| 29 for (var i = 0; i < modules.length; ++i) { | 30 for (var i = 0; i < modules.length; ++i) { |
| 30 print('Module' + (i + 1)); | 31 print('Module' + (i + 1)); |
| 31 var module = modules[i]; | 32 var module = modules[i]; |
| 32 // TODO(bradnelson): Support modules without the stdlib. | 33 var m = module(); |
| 34 assertValidAsm(module); |
| 33 var m = module({}); | 35 var m = module({}); |
| 34 assertTrue(%IsAsmWasmCode(module) || IsAlwaysOpt(module)); | 36 assertValidAsm(module); |
| 35 var m = module({}, {}); | 37 var m = module({}, {}); |
| 36 assertTrue(%IsAsmWasmCode(module) || IsAlwaysOpt(module)); | 38 assertValidAsm(module); |
| 37 var m = module({}, {}, heap); | 39 var m = module({}, {}, heap); |
| 38 assertTrue(%IsAsmWasmCode(module) || IsAlwaysOpt(module)); | 40 assertValidAsm(module); |
| 39 var m = module({}, {}, heap, {}); | 41 var m = module({}, {}, heap, {}); |
| 40 assertTrue(%IsAsmWasmCode(module) || IsAlwaysOpt(module)); | 42 assertValidAsm(module); |
| 41 } | 43 } |
| 42 })(); | 44 })(); |
| 43 | 45 |
| 44 (function TestBadModule() { | 46 (function TestBadModule() { |
| 45 function Module(stdlib, ffi, heap) { | 47 function Module(stdlib, ffi, heap) { |
| 46 "use asm"; | 48 "use asm"; |
| 47 function foo() { var y = 3; var x = 1 + y; return 123; } | 49 function foo() { var y = 3; var x = 1 + y; return 123; } |
| 48 return { foo: foo }; | 50 return { foo: foo }; |
| 49 } | 51 } |
| 50 var m = Module({}); | 52 var m = Module({}); |
| 51 assertFalse(%IsAsmWasmCode(Module)); | 53 assertFalse(%IsAsmWasmCode(Module)); |
| 52 assertEquals(123, m.foo()); | 54 assertEquals(123, m.foo()); |
| 53 })(); | 55 })(); |
| 54 | 56 |
| 55 (function TestBadArgTypes() { | 57 (function TestBadArgTypes() { |
| 56 function Module(a, b, c) { | 58 function Module(a, b, c) { |
| 57 "use asm"; | 59 "use asm"; |
| 60 var NaN = a.NaN; |
| 58 return {}; | 61 return {}; |
| 59 } | 62 } |
| 60 var m = Module(1, 2, 3); | 63 var m = Module(1, 2, 3); |
| 61 assertFalse(%IsAsmWasmCode(Module)); | 64 assertFalse(%IsAsmWasmCode(Module)); |
| 62 assertEquals({}, m); | 65 assertEquals({}, m); |
| 63 })(); | 66 })(); |
| 64 | 67 |
| 65 (function TestBadArgTypesMismatch() { | 68 (function TestBadArgTypesMismatch() { |
| 66 function Module(a, b, c) { | 69 function Module(a, b, c) { |
| 67 "use asm"; | 70 "use asm"; |
| 71 var NaN = a.NaN; |
| 68 return {}; | 72 return {}; |
| 69 } | 73 } |
| 70 var m = Module(1, 2); | 74 var m = Module(1, 2); |
| 71 assertFalse(%IsAsmWasmCode(Module)); | 75 assertFalse(%IsAsmWasmCode(Module)); |
| 72 assertEquals({}, m); | 76 assertEquals({}, m); |
| 73 })(); | 77 })(); |
| 74 | 78 |
| 75 (function TestModuleNoStdlib() { | 79 (function TestModuleNoStdlib() { |
| 76 // TODO(bradnelson): | |
| 77 // Support modules like this if they don't use the whole stdlib. | |
| 78 function Module() { | 80 function Module() { |
| 79 "use asm"; | 81 "use asm"; |
| 80 function foo() { return 123; } | 82 function foo() { return 123; } |
| 81 return { foo: foo }; | 83 return { foo: foo }; |
| 82 } | 84 } |
| 83 var m = Module({}); | 85 var m = Module({}); |
| 84 assertFalse(%IsAsmWasmCode(Module)); | 86 assertValidAsm(Module); |
| 85 assertEquals(123, m.foo()); | 87 assertEquals(123, m.foo()); |
| 86 })(); | 88 })(); |
| 87 | 89 |
| 88 (function TestModuleWith5() { | 90 (function TestModuleWith5() { |
| 89 function Module(a, b, c, d, e) { | 91 function Module(a, b, c, d, e) { |
| 90 "use asm"; | 92 "use asm"; |
| 91 function foo() { return 123; } | 93 function foo() { return 123; } |
| 92 return { foo: foo }; | 94 return { foo: foo }; |
| 93 } | 95 } |
| 94 var heap = new ArrayBuffer(1024 * 1024); | 96 var heap = new ArrayBuffer(1024 * 1024); |
| 95 var m = Module({}, {}, heap); | 97 var m = Module({}, {}, heap); |
| 96 assertFalse(%IsAsmWasmCode(Module)); | 98 assertFalse(%IsAsmWasmCode(Module)); |
| 97 assertEquals(123, m.foo()); | 99 assertEquals(123, m.foo()); |
| 98 })(); | 100 })(); |
| 99 | 101 |
| 100 (function TestModuleNoStdlibCall() { | 102 (function TestModuleNoStdlibCall() { |
| 101 function Module(stdlib, ffi, heap) { | 103 function Module(stdlib, ffi, heap) { |
| 102 "use asm"; | 104 "use asm"; |
| 103 function foo() { return 123; } | 105 function foo() { return 123; } |
| 104 return { foo: foo }; | 106 return { foo: foo }; |
| 105 } | 107 } |
| 106 // TODO(bradnelson): Support instantiation like this if stdlib is unused. | |
| 107 var m = Module(); | 108 var m = Module(); |
| 108 assertFalse(%IsAsmWasmCode(Module)); | 109 assertValidAsm(Module); |
| 109 assertEquals(123, m.foo()); | 110 assertEquals(123, m.foo()); |
| 110 })(); | 111 })(); |
| 111 | 112 |
| 112 (function TestModuleNew() { | 113 (function TestModuleNew() { |
| 113 function Module(stdlib, ffi, heap) { | 114 function Module(stdlib, ffi, heap) { |
| 114 "use asm"; | 115 "use asm"; |
| 115 function foo() { return 123; } | 116 function foo() { return 123; } |
| 116 return { foo: foo }; | 117 return { foo: foo }; |
| 117 } | 118 } |
| 118 var m = new Module({}, {}); | 119 var m = new Module({}, {}); |
| 119 assertTrue(%IsAsmWasmCode(Module) || IsAlwaysOpt(Module)); | 120 assertValidAsm(Module); |
| 120 assertEquals(123, m.foo()); | 121 assertEquals(123, m.foo()); |
| 121 })(); | 122 })(); |
| 122 | 123 |
| 123 (function TestMultipleFailures() { | 124 (function TestMultipleFailures() { |
| 124 function Module(stdlib) { | 125 function Module(stdlib) { |
| 125 "use asm"; | 126 "use asm"; |
| 127 var NaN = stdlib.NaN; |
| 126 function foo() { return 123; } | 128 function foo() { return 123; } |
| 127 return { foo: foo }; | 129 return { foo: foo }; |
| 128 } | 130 } |
| 129 var m1 = Module(1, 2, 3); | 131 var m1 = Module(1, 2, 3); |
| 130 assertFalse(%IsAsmWasmCode(Module)); | 132 assertFalse(%IsAsmWasmCode(Module)); |
| 131 var m2 = Module(1, 2, 3); | 133 var m2 = Module(1, 2, 3); |
| 132 assertFalse(%IsAsmWasmCode(Module)); | 134 assertFalse(%IsAsmWasmCode(Module)); |
| 133 assertEquals(123, m1.foo()); | 135 assertEquals(123, m1.foo()); |
| 134 assertEquals(123, m2.foo()); | 136 assertEquals(123, m2.foo()); |
| 135 })(); | 137 })(); |
| 136 | 138 |
| 137 (function TestFailureThenSuccess() { | 139 (function TestFailureThenSuccess() { |
| 138 function MkModule() { | 140 function MkModule() { |
| 139 function Module(stdlib, ffi, heap) { | 141 function Module(stdlib, ffi, heap) { |
| 140 "use asm"; | 142 "use asm"; |
| 143 var NaN = stdlib.NaN; |
| 141 function foo() { return 123; } | 144 function foo() { return 123; } |
| 142 return { foo: foo }; | 145 return { foo: foo }; |
| 143 } | 146 } |
| 144 return Module; | 147 return Module; |
| 145 } | 148 } |
| 146 var Module1 = MkModule(); | 149 var Module1 = MkModule(); |
| 147 var Module2 = MkModule(); | 150 var Module2 = MkModule(); |
| 148 var heap = new ArrayBuffer(1024 * 1024); | 151 var heap = new ArrayBuffer(1024 * 1024); |
| 149 var m1 = Module1(1, 2, 3); | 152 var m1 = Module1(1, 2, 3); |
| 150 assertFalse(%IsAsmWasmCode(Module1)); | 153 assertFalse(%IsAsmWasmCode(Module1)); |
| 151 var m2 = Module2({}, {}, heap); | 154 var m2 = Module2({}, {}, heap); |
| 152 assertFalse(%IsAsmWasmCode(Module2)); | 155 assertFalse(%IsAsmWasmCode(Module2)); |
| 153 assertEquals(123, m1.foo()); | 156 assertEquals(123, m1.foo()); |
| 154 assertEquals(123, m2.foo()); | 157 assertEquals(123, m2.foo()); |
| 155 })(); | 158 })(); |
| 156 | 159 |
| 157 (function TestSuccessThenFailure() { | 160 (function TestSuccessThenFailure() { |
| 158 function MkModule() { | 161 function MkModule() { |
| 159 function Module(stdlib, ffi, heap) { | 162 function Module(stdlib, ffi, heap) { |
| 160 "use asm"; | 163 "use asm"; |
| 164 var NaN = stdlib.NaN; |
| 161 function foo() { return 123; } | 165 function foo() { return 123; } |
| 162 return { foo: foo }; | 166 return { foo: foo }; |
| 163 } | 167 } |
| 164 return Module; | 168 return Module; |
| 165 } | 169 } |
| 166 var Module1 = MkModule(); | 170 var Module1 = MkModule(); |
| 167 var Module2 = MkModule(); | 171 var Module2 = MkModule(); |
| 168 var heap = new ArrayBuffer(1024 * 1024); | 172 var heap = new ArrayBuffer(1024 * 1024); |
| 169 var m1 = Module1({}, {}, heap); | 173 var m1 = Module1({NaN: NaN}, {}, heap); |
| 170 assertTrue(%IsAsmWasmCode(Module1) || IsAlwaysOpt(Module1)); | 174 assertValidAsm(Module1); |
| 171 var m2 = Module2(1, 2, 3); | 175 var m2 = Module2(1, 2, 3); |
| 172 assertFalse(%IsAsmWasmCode(Module2)); | 176 assertFalse(%IsAsmWasmCode(Module2)); |
| 173 assertEquals(123, m1.foo()); | 177 assertEquals(123, m1.foo()); |
| 174 assertEquals(123, m2.foo()); | 178 assertEquals(123, m2.foo()); |
| 175 })(); | 179 })(); |
| 176 | 180 |
| 177 (function TestSuccessThenFailureThenRetry() { | 181 (function TestSuccessThenFailureThenRetry() { |
| 178 function MkModule() { | 182 function MkModule() { |
| 179 function Module(stdlib, ffi, heap) { | 183 function Module(stdlib, ffi, heap) { |
| 180 "use asm"; | 184 "use asm"; |
| 185 var NaN = stdlib.NaN; |
| 181 function foo() { return 123; } | 186 function foo() { return 123; } |
| 182 return { foo: foo }; | 187 return { foo: foo }; |
| 183 } | 188 } |
| 184 return Module; | 189 return Module; |
| 185 } | 190 } |
| 186 var Module1 = MkModule(); | 191 var Module1 = MkModule(); |
| 187 var Module2 = MkModule(); | 192 var Module2 = MkModule(); |
| 188 var heap = new ArrayBuffer(1024 * 1024); | 193 var heap = new ArrayBuffer(1024 * 1024); |
| 189 var m1a = Module1({}, {}, heap); | 194 var m1a = Module1({NaN: NaN}, {}, heap); |
| 190 assertTrue(%IsAsmWasmCode(Module1) || IsAlwaysOpt(Module1)); | 195 assertValidAsm(Module1); |
| 191 var m2 = Module2(1, 2, 3); | 196 var m2 = Module2(1, 2, 3); |
| 192 assertFalse(%IsAsmWasmCode(Module2)); | 197 assertFalse(%IsAsmWasmCode(Module2)); |
| 193 var m1b = Module1({}, {}, heap); | 198 var m1b = Module1({NaN: NaN}, {}, heap); |
| 194 assertFalse(%IsAsmWasmCode(Module1)); | 199 assertFalse(%IsAsmWasmCode(Module1)); |
| 195 assertEquals(123, m1a.foo()); | 200 assertEquals(123, m1a.foo()); |
| 196 assertEquals(123, m1b.foo()); | 201 assertEquals(123, m1b.foo()); |
| 197 assertEquals(123, m2.foo()); | 202 assertEquals(123, m2.foo()); |
| 198 })(); | 203 })(); |
| 199 | 204 |
| 200 (function TestBoundFunction() { | 205 (function TestBoundFunction() { |
| 201 function Module(stdlib, ffi, heap) { | 206 function Module(stdlib, ffi, heap) { |
| 202 "use asm"; | 207 "use asm"; |
| 203 function foo() { return 123; } | 208 function foo() { return 123; } |
| 204 return { foo: foo }; | 209 return { foo: foo }; |
| 205 } | 210 } |
| 206 var heap = new ArrayBuffer(1024 * 1024); | 211 var heap = new ArrayBuffer(1024 * 1024); |
| 207 var ModuleBound = Module.bind(this, {}, {}, heap); | 212 var ModuleBound = Module.bind(this, {}, {}, heap); |
| 208 var m = ModuleBound(); | 213 var m = ModuleBound(); |
| 209 assertTrue(%IsAsmWasmCode(Module) || IsAlwaysOpt(Module)); | 214 assertValidAsm(Module); |
| 210 assertEquals(123, m.foo()); | 215 assertEquals(123, m.foo()); |
| 211 })(); | 216 })(); |
| OLD | NEW |