OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 | 5 // Flags: --expose-wasm |
6 | 6 |
7 load("test/mjsunit/wasm/wasm-constants.js"); | 7 load("test/mjsunit/wasm/wasm-constants.js"); |
8 | 8 |
9 function testCallImport(func, check) { | 9 function testCallImport(func, check) { |
10 var kBodySize = 6; | 10 var kBodySize = 7; |
11 var kNameFunOffset = kHeaderSize + 29 + kBodySize + 1; | 11 var kNameFunOffset = kHeaderSize + 29 + kBodySize + 1; |
12 var kNameMainOffset = kNameFunOffset + 4; | 12 var kNameMainOffset = kNameFunOffset + 4; |
13 | 13 |
14 var ffi = new Object(); | 14 var ffi = new Object(); |
15 ffi.fun = func; | 15 ffi.fun = func; |
16 | 16 |
17 var data = bytesWithHeader( | 17 var data = bytesWithHeader( |
18 // signatures | 18 // signatures |
19 kDeclSignatures, 1, | 19 kDeclSignatures, 1, |
20 2, kAstI32, kAstF64, kAstF64, // (f64,f64) -> int | 20 2, kAstI32, kAstF64, kAstF64, // (f64,f64) -> int |
21 // -- main function | 21 // -- main function |
22 kDeclFunctions, | 22 kDeclFunctions, |
23 1, | 23 1, |
24 kDeclFunctionName | kDeclFunctionExport, | 24 kDeclFunctionName | kDeclFunctionExport, |
25 0, 0, | 25 0, 0, |
26 kNameMainOffset, 0, 0, 0, // name offset | 26 kNameMainOffset, 0, 0, 0, // name offset |
27 kBodySize, 0, | 27 kBodySize, 0, |
28 // main body | 28 // main body |
| 29 kDeclNoLocals, |
29 kExprCallImport, 0, // -- | 30 kExprCallImport, 0, // -- |
30 kExprGetLocal, 0, // -- | 31 kExprGetLocal, 0, // -- |
31 kExprGetLocal, 1, // -- | 32 kExprGetLocal, 1, // -- |
32 // imports | 33 // imports |
33 kDeclImportTable, | 34 kDeclImportTable, |
34 1, | 35 1, |
35 0, 0, // sig index | 36 0, 0, // sig index |
36 0, 0, 0, 0, // module name offset | 37 0, 0, 0, 0, // module name offset |
37 kNameFunOffset, 0, 0, 0, // function name offset | 38 kNameFunOffset, 0, 0, 0, // function name offset |
38 // names | 39 // names |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 testCallImport(returnValue(null), checkReturn(0)); | 186 testCallImport(returnValue(null), checkReturn(0)); |
186 testCallImport(returnValue("0"), checkReturn(0)); | 187 testCallImport(returnValue("0"), checkReturn(0)); |
187 testCallImport(returnValue("-77"), checkReturn(-77)); | 188 testCallImport(returnValue("-77"), checkReturn(-77)); |
188 | 189 |
189 var objWithValueOf = {valueOf: function() { return 198; }} | 190 var objWithValueOf = {valueOf: function() { return 198; }} |
190 | 191 |
191 testCallImport(returnValue(objWithValueOf), checkReturn(198)); | 192 testCallImport(returnValue(objWithValueOf), checkReturn(198)); |
192 | 193 |
193 | 194 |
194 function testCallBinopVoid(type, func, check) { | 195 function testCallBinopVoid(type, func, check) { |
195 var kBodySize = 10; | 196 var kBodySize = 11; |
196 var kNameFunOffset = kHeaderSize + 28 + kBodySize + 1; | 197 var kNameFunOffset = kHeaderSize + 28 + kBodySize + 1; |
197 var kNameMainOffset = kNameFunOffset + 4; | 198 var kNameMainOffset = kNameFunOffset + 4; |
198 | 199 |
199 var ffi = new Object(); | 200 var ffi = new Object(); |
200 | 201 |
201 var passed_length = -1; | 202 var passed_length = -1; |
202 var passed_a = -1; | 203 var passed_a = -1; |
203 var passed_b = -1; | 204 var passed_b = -1; |
204 var args_a = -1; | 205 var args_a = -1; |
205 var args_b = -1; | 206 var args_b = -1; |
(...skipping 15 matching lines...) Expand all Loading... |
221 kDeclFunctions, 2, | 222 kDeclFunctions, 2, |
222 kDeclFunctionName | kDeclFunctionImport, | 223 kDeclFunctionName | kDeclFunctionImport, |
223 0, 0, // signature index | 224 0, 0, // signature index |
224 kNameFunOffset, 0, 0, 0, // name offset | 225 kNameFunOffset, 0, 0, 0, // name offset |
225 // -- main function | 226 // -- main function |
226 kDeclFunctionName | kDeclFunctionExport, | 227 kDeclFunctionName | kDeclFunctionExport, |
227 1, 0, // signature index | 228 1, 0, // signature index |
228 kNameMainOffset, 0, 0, 0, // name offset | 229 kNameMainOffset, 0, 0, 0, // name offset |
229 kBodySize, 0, // body size | 230 kBodySize, 0, // body size |
230 // main body | 231 // main body |
| 232 kDeclNoLocals, |
231 kExprBlock, 2, // -- | 233 kExprBlock, 2, // -- |
232 kExprCallFunction, 0, // -- | 234 kExprCallFunction, 0, // -- |
233 kExprGetLocal, 0, // -- | 235 kExprGetLocal, 0, // -- |
234 kExprGetLocal, 1, // -- | 236 kExprGetLocal, 1, // -- |
235 kExprI8Const, 99, // -- | 237 kExprI8Const, 99, // -- |
236 // names | 238 // names |
237 kDeclEnd, | 239 kDeclEnd, |
238 'f', 'u', 'n', 0, // -- | 240 'f', 'u', 'n', 0, // -- |
239 'm', 'a', 'i', 'n', 0 // -- | 241 'm', 'a', 'i', 'n', 0 // -- |
240 ); | 242 ); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 | 280 |
279 | 281 |
280 testCallBinopVoid(kAstI32); | 282 testCallBinopVoid(kAstI32); |
281 // TODO testCallBinopVoid(kAstI64); | 283 // TODO testCallBinopVoid(kAstI64); |
282 testCallBinopVoid(kAstF32); | 284 testCallBinopVoid(kAstF32); |
283 testCallBinopVoid(kAstF64); | 285 testCallBinopVoid(kAstF64); |
284 | 286 |
285 | 287 |
286 | 288 |
287 function testCallPrint() { | 289 function testCallPrint() { |
288 var kBodySize = 10; | 290 var kBodySize = 11; |
289 var kNamePrintOffset = kHeaderSize + 10 + 7 + 7 + 9 + kBodySize + 1; | 291 var kNamePrintOffset = kHeaderSize + 10 + 7 + 7 + 9 + kBodySize + 1; |
290 var kNameMainOffset = kNamePrintOffset + 6; | 292 var kNameMainOffset = kNamePrintOffset + 6; |
291 | 293 |
292 var ffi = new Object(); | 294 var ffi = new Object(); |
293 ffi.print = print; | 295 ffi.print = print; |
294 | 296 |
295 var data = bytesWithHeader( | 297 var data = bytesWithHeader( |
296 // -- signatures | 298 // -- signatures |
297 kDeclSignatures, 2, | 299 kDeclSignatures, 2, |
298 1, kAstStmt, kAstI32, // i32->void | 300 1, kAstStmt, kAstI32, // i32->void |
299 1, kAstStmt, kAstF64, // f64->int | 301 1, kAstStmt, kAstF64, // f64->int |
300 kDeclFunctions, 3, | 302 kDeclFunctions, 3, |
301 // -- import print i32 | 303 // -- import print i32 |
302 kDeclFunctionName | kDeclFunctionImport, | 304 kDeclFunctionName | kDeclFunctionImport, |
303 0, 0, // signature index | 305 0, 0, // signature index |
304 kNamePrintOffset, 0, 0, 0, // name offset | 306 kNamePrintOffset, 0, 0, 0, // name offset |
305 // -- import print f64 | 307 // -- import print f64 |
306 kDeclFunctionName | kDeclFunctionImport, | 308 kDeclFunctionName | kDeclFunctionImport, |
307 1, 0, // signature index | 309 1, 0, // signature index |
308 kNamePrintOffset, 0, 0, 0, // name offset | 310 kNamePrintOffset, 0, 0, 0, // name offset |
309 // -- decl main | 311 // -- decl main |
310 kDeclFunctionName | kDeclFunctionExport, | 312 kDeclFunctionName | kDeclFunctionExport, |
311 1, 0, // signature index | 313 1, 0, // signature index |
312 kNameMainOffset, 0, 0, 0, // name offset | 314 kNameMainOffset, 0, 0, 0, // name offset |
313 kBodySize, 0, // body size | 315 kBodySize, 0, // body size |
314 // main body | 316 // main body |
| 317 kDeclNoLocals, |
315 kExprBlock, 2, // -- | 318 kExprBlock, 2, // -- |
316 kExprCallFunction, 0, // -- | 319 kExprCallFunction, 0, // -- |
317 kExprI8Const, 97, // -- | 320 kExprI8Const, 97, // -- |
318 kExprCallFunction, 1, // -- | 321 kExprCallFunction, 1, // -- |
319 kExprGetLocal, 0, // -- | 322 kExprGetLocal, 0, // -- |
320 // names | 323 // names |
321 kDeclEnd, | 324 kDeclEnd, |
322 'p', 'r', 'i', 'n', 't', 0, // -- | 325 'p', 'r', 'i', 'n', 't', 0, // -- |
323 'm', 'a', 'i', 'n', 0 // -- | 326 'm', 'a', 'i', 'n', 0 // -- |
324 ); | 327 ); |
325 | 328 |
326 var module = _WASMEXP_.instantiateModule(data, ffi); | 329 var module = _WASMEXP_.instantiateModule(data, ffi); |
327 | 330 |
328 assertEquals("function", typeof module.main); | 331 assertEquals("function", typeof module.main); |
329 | 332 |
330 for (var i = -9; i < 900; i += 6.125) { | 333 for (var i = -9; i < 900; i += 6.125) { |
331 module.main(i); | 334 module.main(i); |
332 } | 335 } |
333 } | 336 } |
334 | 337 |
335 testCallPrint(); | 338 testCallPrint(); |
336 testCallPrint(); | 339 testCallPrint(); |
337 | 340 |
338 | 341 |
339 function testCallImport2(foo, bar, expected) { | 342 function testCallImport2(foo, bar, expected) { |
340 var kBodySize = 5; | 343 var kBodySize = 6; |
341 var kNameFooOffset = kHeaderSize + 37 + kBodySize + 1; | 344 var kNameFooOffset = kHeaderSize + 37 + kBodySize + 1; |
342 var kNameBarOffset = kNameFooOffset + 4; | 345 var kNameBarOffset = kNameFooOffset + 4; |
343 var kNameMainOffset = kNameBarOffset + 4; | 346 var kNameMainOffset = kNameBarOffset + 4; |
344 | 347 |
345 var ffi = new Object(); | 348 var ffi = new Object(); |
346 ffi.foo = foo; | 349 ffi.foo = foo; |
347 ffi.bar = bar; | 350 ffi.bar = bar; |
348 | 351 |
349 var data = bytesWithHeader( | 352 var data = bytesWithHeader( |
350 // signatures | 353 // signatures |
351 kDeclSignatures, 1, | 354 kDeclSignatures, 1, |
352 0, kAstI32, // void -> i32 | 355 0, kAstI32, // void -> i32 |
353 // -- main function | 356 // -- main function |
354 kDeclFunctions, | 357 kDeclFunctions, |
355 1, | 358 1, |
356 kDeclFunctionName | kDeclFunctionExport, | 359 kDeclFunctionName | kDeclFunctionExport, |
357 0, 0, | 360 0, 0, |
358 kNameMainOffset, 0, 0, 0, // name offset | 361 kNameMainOffset, 0, 0, 0, // name offset |
359 kBodySize, 0, | 362 kBodySize, 0, |
360 // main body | 363 // main body |
| 364 kDeclNoLocals, |
361 kExprI32Add, // -- | 365 kExprI32Add, // -- |
362 kExprCallImport, 0, // -- | 366 kExprCallImport, 0, // -- |
363 kExprCallImport, 1, // -- | 367 kExprCallImport, 1, // -- |
364 // imports | 368 // imports |
365 kDeclImportTable, | 369 kDeclImportTable, |
366 2, | 370 2, |
367 0, 0, // sig index | 371 0, 0, // sig index |
368 0, 0, 0, 0, // module name offset | 372 0, 0, 0, 0, // module name offset |
369 kNameFooOffset, 0, 0, 0, // function name offset | 373 kNameFooOffset, 0, 0, 0, // function name offset |
370 0, 0, // sig index | 374 0, 0, // sig index |
371 0, 0, 0, 0, // module name offset | 375 0, 0, 0, 0, // module name offset |
372 kNameBarOffset, 0, 0, 0, // function name offset | 376 kNameBarOffset, 0, 0, 0, // function name offset |
373 // names | 377 // names |
374 kDeclEnd, | 378 kDeclEnd, |
375 'f', 'o', 'o', 0, // -- | 379 'f', 'o', 'o', 0, // -- |
376 'b', 'a', 'r', 0, // -- | 380 'b', 'a', 'r', 0, // -- |
377 'm', 'a', 'i', 'n', 0 // -- | 381 'm', 'a', 'i', 'n', 0 // -- |
378 ); | 382 ); |
379 | 383 |
380 var module = _WASMEXP_.instantiateModule(data, ffi); | 384 var module = _WASMEXP_.instantiateModule(data, ffi); |
381 | 385 |
382 assertEquals("function", typeof module.main); | 386 assertEquals("function", typeof module.main); |
383 | 387 |
384 assertEquals(expected, module.main()); | 388 assertEquals(expected, module.main()); |
385 } | 389 } |
386 | 390 |
387 testCallImport2(function() { return 33; }, function () { return 44; }, 77); | 391 testCallImport2(function() { return 33; }, function () { return 44; }, 77); |
OLD | NEW |