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 |