blob: bd4ccf22c3420583c27e59d4af20e6a7aaf3ef43 [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001// 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
3// found in the LICENSE file.
4
5// Flags: --expose-wasm
6
7load("test/mjsunit/wasm/wasm-constants.js");
Ben Murdochda12d292016-06-02 14:46:10 +01008load("test/mjsunit/wasm/wasm-module-builder.js");
Ben Murdoch097c5b22016-05-18 11:27:45 +01009
10function instantiate(sig, body) {
Ben Murdochda12d292016-06-02 14:46:10 +010011 var builder = new WasmModuleBuilder();
Ben Murdoch097c5b22016-05-18 11:27:45 +010012
Ben Murdochda12d292016-06-02 14:46:10 +010013 var func = builder.addFunction("", sig)
14 .addBody(body);
15
16 builder.addStart(func.index);
17
18 return builder.instantiate();
Ben Murdoch097c5b22016-05-18 11:27:45 +010019}
20
21function assertFails(sig, body) {
22 try {
23 var module = instantiate(sig, body);
24 print("expected failure, but passes");
25 assertFalse(true);
26 } catch (expected) {
27 print("ok: " + expected);
28 }
29}
30
31function assertVerifies(sig, body) {
32 var module = instantiate(sig, body);
33 assertFalse(module === undefined);
34 assertFalse(module === null);
35 assertFalse(module === 0);
36 assertEquals("object", typeof module);
37 return module;
38}
39
Ben Murdochda12d292016-06-02 14:46:10 +010040assertVerifies([kAstStmt], [kExprNop]);
41assertVerifies([kAstI32], [kExprI8Const, 0]);
Ben Murdoch097c5b22016-05-18 11:27:45 +010042
43// Arguments aren't allow to start functions.
Ben Murdochda12d292016-06-02 14:46:10 +010044assertFails([kAstI32, kAstI32], [kExprGetLocal, 0]);
45assertFails([kAstI32, kAstI32, kAstF32], [kExprGetLocal, 0]);
46assertFails([kAstI32, kAstI32, kAstF32, kAstF64], [kExprGetLocal, 0]);
Ben Murdoch097c5b22016-05-18 11:27:45 +010047
48(function testInvalidIndex() {
Ben Murdochda12d292016-06-02 14:46:10 +010049 print("testInvalidIndex");
50 var builder = new WasmModuleBuilder();
Ben Murdoch097c5b22016-05-18 11:27:45 +010051
Ben Murdochda12d292016-06-02 14:46:10 +010052 var func = builder.addFunction("", [kAstStmt])
53 .addBody([kExprNop]);
54
55 builder.addStart(func.index + 1);
56
57 assertThrows(builder.instantiate);
Ben Murdoch097c5b22016-05-18 11:27:45 +010058})();
59
60
61(function testTwoStartFuncs() {
Ben Murdochda12d292016-06-02 14:46:10 +010062 print("testTwoStartFuncs");
63 var builder = new WasmModuleBuilder();
Ben Murdoch097c5b22016-05-18 11:27:45 +010064
Ben Murdochda12d292016-06-02 14:46:10 +010065 var func = builder.addFunction("", [kAstStmt])
66 .addBody([kExprNop]);
67
68 builder.addExplicitSection([kDeclStartFunction, 0]);
69 builder.addExplicitSection([kDeclStartFunction, 0]);
70
71 assertThrows(builder.instantiate);
Ben Murdoch097c5b22016-05-18 11:27:45 +010072})();
73
74
75(function testRun() {
Ben Murdochda12d292016-06-02 14:46:10 +010076 print("testRun");
77 var builder = new WasmModuleBuilder();
Ben Murdoch097c5b22016-05-18 11:27:45 +010078
Ben Murdochda12d292016-06-02 14:46:10 +010079 builder.addMemory(12, 12, true);
Ben Murdoch097c5b22016-05-18 11:27:45 +010080
Ben Murdochda12d292016-06-02 14:46:10 +010081 var func = builder.addFunction("", [kAstStmt])
82 .addBody([kExprI32StoreMem, 0, 0, kExprI8Const, 0, kExprI8Const, 77]);
83
84 builder.addStart(func.index);
85
86 var module = builder.instantiate();
87 var memory = module.exports.memory;
Ben Murdoch097c5b22016-05-18 11:27:45 +010088 var view = new Int8Array(memory);
89 assertEquals(77, view[0]);
90})();
91
92(function testStartFFI() {
Ben Murdochda12d292016-06-02 14:46:10 +010093 print("testStartFFI");
Ben Murdoch097c5b22016-05-18 11:27:45 +010094 var ranned = false;
Ben Murdochda12d292016-06-02 14:46:10 +010095 var ffi = { foo : function() {
Ben Murdoch097c5b22016-05-18 11:27:45 +010096 print("we ranned at stert!");
97 ranned = true;
Ben Murdochda12d292016-06-02 14:46:10 +010098 }};
99
100 var builder = new WasmModuleBuilder();
101 var sig_index = builder.addSignature([kAstStmt]);
102
103 builder.addImport("foo", sig_index);
104 var func = builder.addFunction("", sig_index)
105 .addBody([kExprCallImport, 0]);
106
107 builder.addStart(func.index);
108
109 var module = builder.instantiate(ffi);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100110 assertTrue(ranned);
111})();