blob: 72d5a7aaa446ec7bdfc976e1a0fe4d924fa965e6 [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +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');
8load('test/mjsunit/wasm/wasm-module-builder.js');
9
10var debug = false;
11
12(function BasicTest() {
13 var module = new WasmModuleBuilder();
14 module.addMemory(1, 2, false);
Ben Murdochc5610432016-08-08 18:44:38 +010015 module.addFunction("foo", kSig_i)
Ben Murdochda12d292016-06-02 14:46:10 +010016 .addBody([kExprI8Const, 11])
17 .exportAs("blarg");
18
19 var buffer = module.toBuffer(debug);
20 var instance = Wasm.instantiateModule(buffer);
21 assertEquals(11, instance.exports.blarg());
22})();
23
24(function ImportTest() {
25 var module = new WasmModuleBuilder();
Ben Murdochc5610432016-08-08 18:44:38 +010026 var index = module.addImport("print", makeSig_v_x(kAstI32));
27 module.addFunction("foo", kSig_v_v)
28 .addBody([kExprI8Const, 13, kExprCallImport, kArity1, index])
Ben Murdochda12d292016-06-02 14:46:10 +010029 .exportAs("main");
30
31 var buffer = module.toBuffer(debug);
32 var instance = Wasm.instantiateModule(buffer, {print: print});
33 print("should print 13! ");
34 instance.exports.main();
35})();
36
37(function LocalsTest() {
38 var module = new WasmModuleBuilder();
Ben Murdochc5610432016-08-08 18:44:38 +010039 module.addFunction(undefined, kSig_i_i)
Ben Murdochda12d292016-06-02 14:46:10 +010040 .addLocals({i32_count: 1})
Ben Murdochc5610432016-08-08 18:44:38 +010041 .addBody([kExprGetLocal, 0, kExprSetLocal, 1])
Ben Murdochda12d292016-06-02 14:46:10 +010042 .exportAs("main");
43
44 var buffer = module.toBuffer(debug);
45 var instance = Wasm.instantiateModule(buffer);
46 assertEquals(19, instance.exports.main(19));
47 assertEquals(27777, instance.exports.main(27777));
48})();
49
50(function LocalsTest2() {
51 // TODO(titzer): i64 only works on 64-bit platforms.
52 var types = [
53 {locals: {i32_count: 1}, type: kAstI32},
54// {locals: {i64_count: 1}, type: kAstI64},
55 {locals: {f32_count: 1}, type: kAstF32},
56 {locals: {f64_count: 1}, type: kAstF64},
57 ];
58
59 for (p of types) {
60 var module = new WasmModuleBuilder();
Ben Murdochc5610432016-08-08 18:44:38 +010061 module.addFunction(undefined, makeSig_r_x(p.type, p.type))
Ben Murdochda12d292016-06-02 14:46:10 +010062 .addLocals(p.locals)
Ben Murdochc5610432016-08-08 18:44:38 +010063 .addBody([kExprGetLocal, 0, kExprSetLocal, 1])
Ben Murdochda12d292016-06-02 14:46:10 +010064 .exportAs("main");
65
66 var buffer = module.toBuffer(debug);
67 var instance = Wasm.instantiateModule(buffer);
68 assertEquals(19, instance.exports.main(19));
69 assertEquals(27777, instance.exports.main(27777));
70 }
71})();
72
73(function CallTest() {
74 var module = new WasmModuleBuilder();
Ben Murdochc5610432016-08-08 18:44:38 +010075 module.addFunction("add", kSig_i_ii)
76 .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Add]);
77 module.addFunction("main", kSig_i_ii)
78 .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprCallFunction, kArity2, 0])
Ben Murdochda12d292016-06-02 14:46:10 +010079 .exportAs("main");
80
81 var instance = module.instantiate();
82 assertEquals(44, instance.exports.main(11, 33));
83 assertEquals(7777, instance.exports.main(2222, 5555));
84})();
85
86(function IndirectCallTest() {
87 var module = new WasmModuleBuilder();
Ben Murdochc5610432016-08-08 18:44:38 +010088 module.addFunction("add", kSig_i_ii)
89 .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Add]);
90 module.addFunction("main", kSig_i_iii)
91 .addBody([kExprGetLocal,
92 0, kExprGetLocal, 1, kExprGetLocal, 2, kExprCallIndirect, kArity2, 0])
Ben Murdochda12d292016-06-02 14:46:10 +010093 .exportAs("main");
Ben Murdoch61f157c2016-09-16 13:49:30 +010094 module.appendToTable([0]);
Ben Murdochda12d292016-06-02 14:46:10 +010095
96 var instance = module.instantiate();
97 assertEquals(44, instance.exports.main(0, 11, 33));
98 assertEquals(7777, instance.exports.main(0, 2222, 5555));
99 assertThrows(function() { instance.exports.main(1, 1, 1); });
100})();
101
102(function DataSegmentTest() {
103 var module = new WasmModuleBuilder();
104 module.addMemory(1, 1, false);
Ben Murdochc5610432016-08-08 18:44:38 +0100105 module.addFunction("load", kSig_i_i)
106 .addBody([kExprGetLocal, 0, kExprI32LoadMem, 0, 0])
Ben Murdochda12d292016-06-02 14:46:10 +0100107 .exportAs("load");
108 module.addDataSegment(0, [9, 9, 9, 9], true);
109
110 var buffer = module.toBuffer(debug);
111 var instance = Wasm.instantiateModule(buffer);
112 assertEquals(151587081, instance.exports.load(0));
113})();
114
115
116(function BasicTestWithUint8Array() {
117 var module = new WasmModuleBuilder();
118 module.addMemory(1, 2, false);
Ben Murdochc5610432016-08-08 18:44:38 +0100119 module.addFunction("foo", kSig_i)
Ben Murdochda12d292016-06-02 14:46:10 +0100120 .addBody([kExprI8Const, 17])
121 .exportAs("blarg");
122
123 var buffer = module.toBuffer(debug);
124 var array = new Uint8Array(buffer);
125 var instance = Wasm.instantiateModule(array);
126 assertEquals(17, instance.exports.blarg());
127
128 var kPad = 5;
129 var buffer2 = new ArrayBuffer(kPad + buffer.byteLength + kPad);
130 var whole = new Uint8Array(buffer2);
131 for (var i = 0; i < whole.byteLength; i++) {
132 whole[i] = 0xff;
133 }
134 var array2 = new Uint8Array(buffer2, kPad, buffer.byteLength);
135 for (var i = 0; i < array2.byteLength; i++) {
136 array2[i] = array[i];
137 }
138 var instance = Wasm.instantiateModule(array2);
139 assertEquals(17, instance.exports.blarg());
140})();
141
142(function ImportTestTwoLevel() {
143 var module = new WasmModuleBuilder();
Ben Murdochc5610432016-08-08 18:44:38 +0100144 var index = module.addImportWithModule("mod", "print", makeSig_v_x(kAstI32));
145 module.addFunction("foo", kSig_v_v)
146 .addBody([kExprI8Const, 19, kExprCallImport, kArity1, index])
Ben Murdochda12d292016-06-02 14:46:10 +0100147 .exportAs("main");
148
149 var buffer = module.toBuffer(debug);
150 var instance = Wasm.instantiateModule(buffer, {mod: {print: print}});
151 print("should print 19! ");
152 instance.exports.main();
153})();