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: --expose-wasm --allow-natives-syntax | 5 // Flags: --expose-wasm --allow-natives-syntax |
6 | 6 |
7 load("test/mjsunit/wasm/wasm-constants.js"); | 7 load("test/mjsunit/wasm/wasm-constants.js"); |
8 load("test/mjsunit/wasm/wasm-module-builder.js"); | 8 load("test/mjsunit/wasm/wasm-module-builder.js"); |
9 | 9 |
10 var expect_elison = 0; | 10 var expect_elison = 0; |
11 var expect_no_elison = 1; | 11 var expect_no_elison = 1; |
12 // function calls stack: first_export -> first_func -> first_import -> | 12 // function calls stack: first_export -> first_func -> first_import -> |
13 // second_export -> second_import | 13 // second_export -> second_import |
14 // In this case, first_import and second_export have same signature, | 14 // In this case, first_import and second_export have same signature, |
15 // So that wrappers will be removed | 15 // So that wrappers will be removed |
16 (function TestWasmWrapperElision() { | 16 (function TestWasmWrapperElision() { |
17 var imported = function (a) { | 17 var imported = function (a) { |
18 return a; | 18 return a; |
19 }; | 19 }; |
20 | 20 |
21 var second_module = new WasmModuleBuilder(); | 21 var second_module = new WasmModuleBuilder(); |
22 var sig_index = second_module.addType(kSig_i_i); | 22 var sig_index = second_module.addType(kSig_i_i); |
23 second_module | 23 second_module |
24 .addImportWithModule("import_module_2", "import_name_2", sig_index); | 24 .addImportWithModule("import_module_2", "import_name_2", sig_index); |
25 second_module | 25 second_module |
26 .addFunction("second_export", sig_index) | 26 .addFunction("second_export", sig_index) |
27 .addBody([ | 27 .addBody([ |
28 kExprGetLocal, 0, | 28 kExprGetLocal, 0, |
29 kExprCallImport, kArity1, 0, | 29 kExprCallFunction, 0, |
30 kExprReturn, kArity1 | 30 kExprReturn |
31 ]) | 31 ]) |
32 .exportFunc(); | 32 .exportFunc(); |
33 | 33 |
34 var first_module = new WasmModuleBuilder(); | 34 var first_module = new WasmModuleBuilder(); |
35 var sig_index = first_module.addType(kSig_i_i); | 35 var sig_index = first_module.addType(kSig_i_i); |
36 first_module | 36 first_module |
37 .addImportWithModule("import_module_1", "import_name_1", sig_index); | 37 .addImportWithModule("import_module_1", "import_name_1", sig_index); |
38 first_module | 38 first_module |
39 .addFunction("first_export", sig_index) | 39 .addFunction("first_export", sig_index) |
40 .addBody([ | 40 .addBody([ |
41 kExprGetLocal, 0, | 41 kExprGetLocal, 0, |
42 kExprCallFunction, kArity1, 1, | 42 kExprCallFunction, 2, |
43 kExprReturn, kArity1 | 43 kExprReturn |
44 ]) | 44 ]) |
45 .exportFunc(); | 45 .exportFunc(); |
46 first_module | 46 first_module |
47 .addFunction("first_func", sig_index) | 47 .addFunction("first_func", sig_index) |
48 .addBody([ | 48 .addBody([ |
49 kExprI32Const, 1, | 49 kExprI32Const, 1, |
50 kExprGetLocal, 0, | 50 kExprGetLocal, 0, |
51 kExprI32Add, | 51 kExprI32Add, |
52 kExprCallImport, kArity1, 0, | 52 kExprCallFunction, 0, |
53 kExprReturn, kArity1 | 53 kExprReturn |
54 ]); | 54 ]); |
55 | 55 |
56 var f = second_module | 56 var f = second_module |
57 .instantiate({import_module_2: {import_name_2: imported}}) | 57 .instantiate({import_module_2: {import_name_2: imported}}) |
58 .exports.second_export; | 58 .exports.second_export; |
59 var the_export = first_module | 59 var the_export = first_module |
60 .instantiate({import_module_1: {import_name_1: f}}) | 60 .instantiate({import_module_1: {import_name_1: f}}) |
61 .exports.first_export; | 61 .exports.first_export; |
62 assertEquals(the_export(2), 3); | 62 assertEquals(the_export(2), 3); |
63 assertEquals(the_export(-1), 0); | 63 assertEquals(the_export(-1), 0); |
(...skipping 12 matching lines...) Loading... |
76 }; | 76 }; |
77 | 77 |
78 var second_module = new WasmModuleBuilder(); | 78 var second_module = new WasmModuleBuilder(); |
79 var sig_index_1 = second_module.addType(kSig_i_i); | 79 var sig_index_1 = second_module.addType(kSig_i_i); |
80 second_module | 80 second_module |
81 .addImportWithModule("import_module_2", "import_name_2", sig_index_1); | 81 .addImportWithModule("import_module_2", "import_name_2", sig_index_1); |
82 second_module | 82 second_module |
83 .addFunction("second_export", sig_index_1) | 83 .addFunction("second_export", sig_index_1) |
84 .addBody([ | 84 .addBody([ |
85 kExprGetLocal, 0, | 85 kExprGetLocal, 0, |
86 kExprCallImport, kArity1, 0, | 86 kExprCallFunction, 0, |
87 kExprReturn, kArity1 | 87 kExprReturn |
88 ]) | 88 ]) |
89 .exportFunc(); | 89 .exportFunc(); |
90 | 90 |
91 var first_module = new WasmModuleBuilder(); | 91 var first_module = new WasmModuleBuilder(); |
92 var sig_index_2 = first_module.addType(kSig_i_ii); | 92 var sig_index_2 = first_module.addType(kSig_i_ii); |
93 first_module | 93 first_module |
94 .addImportWithModule("import_module_1", "import_name_1", sig_index_2); | 94 .addImportWithModule("import_module_1", "import_name_1", sig_index_2); |
95 first_module | 95 first_module |
96 .addFunction("first_export", sig_index_2) | 96 .addFunction("first_export", sig_index_2) |
97 .addBody([ | 97 .addBody([ |
98 kExprGetLocal, 0, | 98 kExprGetLocal, 0, |
99 kExprGetLocal, 1, | 99 kExprGetLocal, 1, |
100 kExprCallFunction, kArity2, 1, | 100 kExprCallFunction, 2, |
101 kExprReturn, kArity1 | 101 kExprReturn |
102 ]) | 102 ]) |
103 .exportFunc(); | 103 .exportFunc(); |
104 first_module | 104 first_module |
105 .addFunction("first_func", sig_index_2) | 105 .addFunction("first_func", sig_index_2) |
106 .addBody([ | 106 .addBody([ |
107 kExprGetLocal, 0, | 107 kExprGetLocal, 0, |
108 kExprGetLocal, 1, | 108 kExprGetLocal, 1, |
109 kExprCallImport, kArity2, 0, | 109 kExprCallFunction, 0, |
110 kExprReturn, kArity1 | 110 kExprReturn |
111 ]); | 111 ]); |
112 | 112 |
113 var f = second_module | 113 var f = second_module |
114 .instantiate({import_module_2: {import_name_2: imported}}) | 114 .instantiate({import_module_2: {import_name_2: imported}}) |
115 .exports.second_export; | 115 .exports.second_export; |
116 var the_export = first_module | 116 var the_export = first_module |
117 .instantiate({import_module_1: {import_name_1: f}}) | 117 .instantiate({import_module_1: {import_name_1: f}}) |
118 .exports.first_export; | 118 .exports.first_export; |
119 assertEquals(the_export(4, 5), 4); | 119 assertEquals(the_export(4, 5), 4); |
120 assertEquals(the_export(-1, 4), -1); | 120 assertEquals(the_export(-1, 4), -1); |
(...skipping 14 matching lines...) Loading... |
135 var second_module = new WasmModuleBuilder(); | 135 var second_module = new WasmModuleBuilder(); |
136 var sig_index_3 = second_module.addType(kSig_i_iii); | 136 var sig_index_3 = second_module.addType(kSig_i_iii); |
137 second_module | 137 second_module |
138 .addImportWithModule("import_module_2", "import_name_2", sig_index_3); | 138 .addImportWithModule("import_module_2", "import_name_2", sig_index_3); |
139 second_module | 139 second_module |
140 .addFunction("second_export", sig_index_3) | 140 .addFunction("second_export", sig_index_3) |
141 .addBody([ | 141 .addBody([ |
142 kExprGetLocal, 0, | 142 kExprGetLocal, 0, |
143 kExprGetLocal, 1, | 143 kExprGetLocal, 1, |
144 kExprGetLocal, 2, | 144 kExprGetLocal, 2, |
145 kExprCallImport, kArity3, 0, | 145 kExprCallFunction, 0, |
146 kExprReturn, kArity1 | 146 kExprReturn |
147 ]) | 147 ]) |
148 .exportFunc(); | 148 .exportFunc(); |
149 | 149 |
150 var first_module = new WasmModuleBuilder(); | 150 var first_module = new WasmModuleBuilder(); |
151 var sig_index_2 = first_module.addType(kSig_i_ii); | 151 var sig_index_2 = first_module.addType(kSig_i_ii); |
152 first_module | 152 first_module |
153 .addImportWithModule("import_module_1", "import_name_1", sig_index_2); | 153 .addImportWithModule("import_module_1", "import_name_1", sig_index_2); |
154 first_module | 154 first_module |
155 .addFunction("first_export", sig_index_2) | 155 .addFunction("first_export", sig_index_2) |
156 .addBody([ | 156 .addBody([ |
157 kExprGetLocal, 0, | 157 kExprGetLocal, 0, |
158 kExprGetLocal, 1, | 158 kExprGetLocal, 1, |
159 kExprCallFunction, kArity2, 1, | 159 kExprCallFunction, 2, |
160 kExprReturn, kArity1 | 160 kExprReturn |
161 ]) | 161 ]) |
162 .exportFunc(); | 162 .exportFunc(); |
163 first_module | 163 first_module |
164 .addFunction("first_func", sig_index_2) | 164 .addFunction("first_func", sig_index_2) |
165 .addBody([ | 165 .addBody([ |
166 kExprGetLocal, 0, | 166 kExprGetLocal, 0, |
167 kExprGetLocal, 1, | 167 kExprGetLocal, 1, |
168 kExprCallImport, kArity2, 0, | 168 kExprCallFunction, 0, |
169 kExprReturn, kArity1 | 169 kExprReturn |
170 ]); | 170 ]); |
171 | 171 |
172 var f = second_module | 172 var f = second_module |
173 .instantiate({import_module_2: {import_name_2: imported}}) | 173 .instantiate({import_module_2: {import_name_2: imported}}) |
174 .exports.second_export; | 174 .exports.second_export; |
175 var the_export = first_module | 175 var the_export = first_module |
176 .instantiate({import_module_1: {import_name_1: f}}) | 176 .instantiate({import_module_1: {import_name_1: f}}) |
177 .exports.first_export; | 177 .exports.first_export; |
178 assertEquals(the_export(5, 6), 11); | 178 assertEquals(the_export(5, 6), 11); |
179 assertEquals(the_export(-1, -4), -5); | 179 assertEquals(the_export(-1, -4), -5); |
(...skipping 13 matching lines...) Loading... |
193 | 193 |
194 var second_module = new WasmModuleBuilder(); | 194 var second_module = new WasmModuleBuilder(); |
195 var sig_index_2 = second_module.addType(kSig_d_dd); | 195 var sig_index_2 = second_module.addType(kSig_d_dd); |
196 second_module | 196 second_module |
197 .addImportWithModule("import_module_2", "import_name_2", sig_index_2); | 197 .addImportWithModule("import_module_2", "import_name_2", sig_index_2); |
198 second_module | 198 second_module |
199 .addFunction("second_export", sig_index_2) | 199 .addFunction("second_export", sig_index_2) |
200 .addBody([ | 200 .addBody([ |
201 kExprGetLocal, 0, | 201 kExprGetLocal, 0, |
202 kExprGetLocal, 1, | 202 kExprGetLocal, 1, |
203 kExprCallImport, kArity2, 0, | 203 kExprCallFunction, 0, |
204 kExprReturn, kArity1 | 204 kExprReturn |
205 ]) | 205 ]) |
206 .exportFunc(); | 206 .exportFunc(); |
207 | 207 |
208 var first_module = new WasmModuleBuilder(); | 208 var first_module = new WasmModuleBuilder(); |
209 var sig_index_2 = first_module.addType(kSig_i_ii); | 209 var sig_index_2 = first_module.addType(kSig_i_ii); |
210 first_module | 210 first_module |
211 .addImportWithModule("import_module_1", "import_name_1", sig_index_2); | 211 .addImportWithModule("import_module_1", "import_name_1", sig_index_2); |
212 first_module | 212 first_module |
213 .addFunction("first_export", sig_index_2) | 213 .addFunction("first_export", sig_index_2) |
214 .addBody([ | 214 .addBody([ |
215 kExprGetLocal, 0, | 215 kExprGetLocal, 0, |
216 kExprGetLocal, 1, | 216 kExprGetLocal, 1, |
217 kExprCallFunction, kArity2, 1, | 217 kExprCallFunction, 2, |
218 kExprReturn, kArity1 | 218 kExprReturn |
219 ]) | 219 ]) |
220 .exportFunc(); | 220 .exportFunc(); |
221 first_module | 221 first_module |
222 .addFunction("first_func", sig_index_2) | 222 .addFunction("first_func", sig_index_2) |
223 .addBody([ | 223 .addBody([ |
224 kExprGetLocal, 0, | 224 kExprGetLocal, 0, |
225 kExprGetLocal, 1, | 225 kExprGetLocal, 1, |
226 kExprCallImport, kArity2, 0, | 226 kExprCallFunction, 0, |
227 kExprReturn, kArity1 | 227 kExprReturn |
228 ]); | 228 ]); |
229 | 229 |
230 var f = second_module | 230 var f = second_module |
231 .instantiate({import_module_2: {import_name_2: imported}}) | 231 .instantiate({import_module_2: {import_name_2: imported}}) |
232 .exports.second_export; | 232 .exports.second_export; |
233 var the_export = first_module | 233 var the_export = first_module |
234 .instantiate({import_module_1: {import_name_1: f}}) | 234 .instantiate({import_module_1: {import_name_1: f}}) |
235 .exports.first_export; | 235 .exports.first_export; |
236 assertEquals(the_export(2.8, 9.1), 11); | 236 assertEquals(the_export(2.8, 9.1), 11); |
237 assertEquals(the_export(-1.7, -2.5), -3); | 237 assertEquals(the_export(-1.7, -2.5), -3); |
238 assertEquals(the_export(0.0, 0.0), 0); | 238 assertEquals(the_export(0.0, 0.0), 0); |
239 assertEquals(the_export(2, -2), 0); | 239 assertEquals(the_export(2, -2), 0); |
240 assertEquals(%CheckWasmWrapperElision(the_export, expect_no_elison), true); | 240 assertEquals(%CheckWasmWrapperElision(the_export, expect_no_elison), true); |
241 })(); | 241 })(); |
OLD | NEW |