Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: test/unittests/wasm/ast-decoder-unittest.cc

Issue 1763433002: [wasm] Rework encoding of local declarations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "test/unittests/test-utils.h" 5 #include "test/unittests/test-utils.h"
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "test/cctest/wasm/test-signatures.h" 9 #include "test/cctest/wasm/test-signatures.h"
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 Verify(kSuccess, env, code, code + arraysize(code)); \ 48 Verify(kSuccess, env, code, code + arraysize(code)); \
49 } while (false) 49 } while (false)
50 50
51 51
52 #define EXPECT_FAILURE_INLINE(env, ...) \ 52 #define EXPECT_FAILURE_INLINE(env, ...) \
53 do { \ 53 do { \
54 static byte code[] = {__VA_ARGS__}; \ 54 static byte code[] = {__VA_ARGS__}; \
55 Verify(kError, env, code, code + arraysize(code)); \ 55 Verify(kError, env, code, code + arraysize(code)); \
56 } while (false) 56 } while (false)
57 57
58 #define VERIFY(...) \ 58 #define VERIFY(...) \
59 do { \ 59 do { \
60 static const byte code[] = {__VA_ARGS__}; \ 60 static const byte code[] = {__VA_ARGS__}; \
61 Verify(kSuccess, &env_v_i, code, code + sizeof(code)); \ 61 Verify(kSuccess, sigs.v_i(), code, code + sizeof(code)); \
62 } while (false) 62 } while (false)
63 63
64 class AstDecoderTest : public TestWithZone { 64 class AstDecoderTest : public TestWithZone {
65 public: 65 public:
66 AstDecoderTest() : TestWithZone(), sigs() { 66 typedef std::pair<uint32_t, LocalType> LocalsDecl;
67 init_env(&env_i_i, sigs.i_i()); 67
68 init_env(&env_v_v, sigs.v_v()); 68 AstDecoderTest() : module(nullptr) {}
69 init_env(&env_v_i, sigs.v_i()); 69 TestSignatures sigs;
70 init_env(&env_i_f, sigs.i_f()); 70 ModuleEnv* module;
71 init_env(&env_i_d, sigs.i_d()); 71 LocalDeclEncoder local_decls;
72 init_env(&env_l_l, sigs.l_l()); 72
73 init_env(&env_f_ff, sigs.f_ff()); 73 void AddLocals(LocalType type, uint32_t count) {
74 init_env(&env_d_dd, sigs.d_dd()); 74 local_decls.AddLocals(count, type);
75 } 75 }
76 76
77 TestSignatures sigs; 77 // Preprends local variable declarations and renders nice error messages for
78 // verification failures.
79 void Verify(ErrorCode expected, FunctionSig* sig, const byte* start,
80 const byte* end) {
81 local_decls.Prepend(&start, &end);
82 // Verify the code.
83 TreeResult result = VerifyWasmCode(module, sig, start, end);
78 84
79 FunctionEnv env_i_i;
80 FunctionEnv env_v_v;
81 FunctionEnv env_v_i;
82 FunctionEnv env_i_f;
83 FunctionEnv env_i_d;
84 FunctionEnv env_l_l;
85 FunctionEnv env_f_ff;
86 FunctionEnv env_d_dd;
87
88 static void init_env(FunctionEnv* env, FunctionSig* sig) {
89 env->module = nullptr;
90 env->sig = sig;
91 env->local_i32_count = 0;
92 env->local_i64_count = 0;
93 env->local_f32_count = 0;
94 env->local_f64_count = 0;
95 env->SumLocals();
96 }
97
98 // A wrapper around VerifyWasmCode() that renders a nice failure message.
99 void Verify(ErrorCode expected, FunctionEnv* env, const byte* start,
100 const byte* end) {
101 TreeResult result = VerifyWasmCode(env, start, end);
102 if (result.error_code != expected) { 85 if (result.error_code != expected) {
103 ptrdiff_t pc = result.error_pc - result.start; 86 ptrdiff_t pc = result.error_pc - result.start;
104 ptrdiff_t pt = result.error_pt - result.start; 87 ptrdiff_t pt = result.error_pt - result.start;
105 std::ostringstream str; 88 std::ostringstream str;
106 if (expected == kSuccess) { 89 if (expected == kSuccess) {
107 str << "Verification failed: " << result.error_code << " pc = +" << pc; 90 str << "Verification failed: " << result.error_code << " pc = +" << pc;
108 if (result.error_pt) str << ", pt = +" << pt; 91 if (result.error_pt) str << ", pt = +" << pt;
109 str << ", msg = " << result.error_msg.get(); 92 str << ", msg = " << result.error_msg.get();
110 } else { 93 } else {
111 str << "Verification expected: " << expected << ", but got " 94 str << "Verification expected: " << expected << ", but got "
112 << result.error_code; 95 << result.error_code;
113 if (result.error_code != kSuccess) { 96 if (result.error_code != kSuccess) {
114 str << " pc = +" << pc; 97 str << " pc = +" << pc;
115 if (result.error_pt) str << ", pt = +" << pt; 98 if (result.error_pt) str << ", pt = +" << pt;
116 } 99 }
117 } 100 }
118 FATAL(str.str().c_str()); 101 FATAL(str.str().c_str());
119 } 102 }
103
104 delete[] start; // local_decls.Prepend() allocated a new buffer.
120 } 105 }
121 106
122 void TestBinop(WasmOpcode opcode, FunctionSig* success) { 107 void TestBinop(WasmOpcode opcode, FunctionSig* success) {
123 // op(local[0], local[1]) 108 // op(local[0], local[1])
124 byte code[] = {static_cast<byte>(opcode), kExprGetLocal, 0, kExprGetLocal, 109 byte code[] = {static_cast<byte>(opcode), kExprGetLocal, 0, kExprGetLocal,
125 1}; 110 1};
126 FunctionEnv env; 111 EXPECT_VERIFIES(success, code);
127 init_env(&env, success);
128 EXPECT_VERIFIES(&env, code);
129 112
130 // Try all combinations of return and parameter types. 113 // Try all combinations of return and parameter types.
131 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 114 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
132 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 115 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
133 for (size_t k = 0; k < arraysize(kLocalTypes); k++) { 116 for (size_t k = 0; k < arraysize(kLocalTypes); k++) {
134 LocalType types[] = {kLocalTypes[i], kLocalTypes[j], kLocalTypes[k]}; 117 LocalType types[] = {kLocalTypes[i], kLocalTypes[j], kLocalTypes[k]};
135 if (types[0] != success->GetReturn(0) || 118 if (types[0] != success->GetReturn(0) ||
136 types[1] != success->GetParam(0) || 119 types[1] != success->GetParam(0) ||
137 types[2] != success->GetParam(1)) { 120 types[2] != success->GetParam(1)) {
138 // Test signature mismatch. 121 // Test signature mismatch.
139 FunctionSig sig(1, 2, types); 122 FunctionSig sig(1, 2, types);
140 init_env(&env, &sig); 123 EXPECT_FAILURE(&sig, code);
141 EXPECT_FAILURE(&env, code);
142 } 124 }
143 } 125 }
144 } 126 }
145 } 127 }
146 } 128 }
147 129
148 void TestUnop(WasmOpcode opcode, FunctionSig* success) { 130 void TestUnop(WasmOpcode opcode, FunctionSig* success) {
149 TestUnop(opcode, success->GetReturn(), success->GetParam(0)); 131 TestUnop(opcode, success->GetReturn(), success->GetParam(0));
150 } 132 }
151 133
152 void TestUnop(WasmOpcode opcode, LocalType ret_type, LocalType param_type) { 134 void TestUnop(WasmOpcode opcode, LocalType ret_type, LocalType param_type) {
153 // Return(op(local[0])) 135 // Return(op(local[0]))
154 byte code[] = {static_cast<byte>(opcode), kExprGetLocal, 0}; 136 byte code[] = {static_cast<byte>(opcode), kExprGetLocal, 0};
155 FunctionEnv env;
156 { 137 {
157 LocalType types[] = {ret_type, param_type}; 138 LocalType types[] = {ret_type, param_type};
158 FunctionSig sig(1, 1, types); 139 FunctionSig sig(1, 1, types);
159 init_env(&env, &sig); 140 EXPECT_VERIFIES(&sig, code);
160 EXPECT_VERIFIES(&env, code);
161 } 141 }
162 142
163 // Try all combinations of return and parameter types. 143 // Try all combinations of return and parameter types.
164 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 144 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
165 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 145 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
166 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]}; 146 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]};
167 if (types[0] != ret_type || types[1] != param_type) { 147 if (types[0] != ret_type || types[1] != param_type) {
168 // Test signature mismatch. 148 // Test signature mismatch.
169 FunctionSig sig(1, 1, types); 149 FunctionSig sig(1, 1, types);
170 init_env(&env, &sig); 150 EXPECT_FAILURE(&sig, code);
171 EXPECT_FAILURE(&env, code);
172 } 151 }
173 } 152 }
174 } 153 }
175 } 154 }
176 }; 155 };
177 156
178 157
179 static FunctionEnv CreateInt32FunctionEnv(FunctionSig* sig, int count) {
180 FunctionEnv env;
181 env.module = nullptr;
182 env.sig = sig;
183 env.local_i32_count = count;
184 env.local_f64_count = 0;
185 env.local_f32_count = 0;
186 env.total_locals = static_cast<unsigned>(count + sig->parameter_count());
187 return env;
188 }
189
190 TEST_F(AstDecoderTest, Int8Const) { 158 TEST_F(AstDecoderTest, Int8Const) {
191 byte code[] = {kExprI8Const, 0}; 159 byte code[] = {kExprI8Const, 0};
192 for (int i = -128; i < 128; i++) { 160 for (int i = -128; i < 128; i++) {
193 code[1] = static_cast<byte>(i); 161 code[1] = static_cast<byte>(i);
194 EXPECT_VERIFIES(&env_i_i, code); 162 EXPECT_VERIFIES(sigs.i_i(), code);
195 } 163 }
196 } 164 }
197 165
198 TEST_F(AstDecoderTest, EmptyFunction) { 166 TEST_F(AstDecoderTest, EmptyFunction) {
199 byte code[] = {0}; 167 byte code[] = {0};
200 Verify(kSuccess, &env_v_v, code, code); 168 Verify(kSuccess, sigs.v_v(), code, code);
201 Verify(kError, &env_i_i, code, code); 169 Verify(kError, sigs.i_i(), code, code);
202 } 170 }
203 171
204 TEST_F(AstDecoderTest, IncompleteIf1) { 172 TEST_F(AstDecoderTest, IncompleteIf1) {
205 byte code[] = {kExprIf}; 173 byte code[] = {kExprIf};
206 EXPECT_FAILURE(&env_v_v, code); 174 EXPECT_FAILURE(sigs.v_v(), code);
207 EXPECT_FAILURE(&env_i_i, code); 175 EXPECT_FAILURE(sigs.i_i(), code);
208 } 176 }
209 177
210 TEST_F(AstDecoderTest, IncompleteIf2) { 178 TEST_F(AstDecoderTest, IncompleteIf2) {
211 byte code[] = {kExprIf, kExprI8Const, 0}; 179 byte code[] = {kExprIf, kExprI8Const, 0};
212 EXPECT_FAILURE(&env_v_v, code); 180 EXPECT_FAILURE(sigs.v_v(), code);
213 EXPECT_FAILURE(&env_i_i, code); 181 EXPECT_FAILURE(sigs.i_i(), code);
214 } 182 }
215 183
216 TEST_F(AstDecoderTest, Int8Const_fallthru) { 184 TEST_F(AstDecoderTest, Int8Const_fallthru) {
217 byte code[] = {kExprI8Const, 0, kExprI8Const, 1}; 185 byte code[] = {kExprI8Const, 0, kExprI8Const, 1};
218 EXPECT_VERIFIES(&env_i_i, code); 186 EXPECT_VERIFIES(sigs.i_i(), code);
219 } 187 }
220 188
221 TEST_F(AstDecoderTest, Int32Const) { 189 TEST_F(AstDecoderTest, Int32Const) {
222 byte code[] = {kExprI32Const, 0, 0, 0, 0}; 190 byte code[] = {kExprI32Const, 0, 0, 0, 0};
223 int32_t* ptr = reinterpret_cast<int32_t*>(code + 1); 191 int32_t* ptr = reinterpret_cast<int32_t*>(code + 1);
224 const int kInc = 4498211; 192 const int kInc = 4498211;
225 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) { 193 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
226 *ptr = i; 194 *ptr = i;
227 EXPECT_VERIFIES(&env_i_i, code); 195 EXPECT_VERIFIES(sigs.i_i(), code);
228 } 196 }
229 } 197 }
230 198
231 TEST_F(AstDecoderTest, Int8Const_fallthru2) { 199 TEST_F(AstDecoderTest, Int8Const_fallthru2) {
232 byte code[] = {kExprI8Const, 0, kExprI32Const, 1, 2, 3, 4}; 200 byte code[] = {kExprI8Const, 0, kExprI32Const, 1, 2, 3, 4};
233 EXPECT_VERIFIES(&env_i_i, code); 201 EXPECT_VERIFIES(sigs.i_i(), code);
234 } 202 }
235 203
236 TEST_F(AstDecoderTest, Int64Const) { 204 TEST_F(AstDecoderTest, Int64Const) {
237 byte code[] = {kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0}; 205 byte code[] = {kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0};
238 int64_t* ptr = reinterpret_cast<int64_t*>(code + 1); 206 int64_t* ptr = reinterpret_cast<int64_t*>(code + 1);
239 const int kInc = 4498211; 207 const int kInc = 4498211;
240 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) { 208 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
241 *ptr = (static_cast<int64_t>(i) << 32) | i; 209 *ptr = (static_cast<int64_t>(i) << 32) | i;
242 EXPECT_VERIFIES(&env_l_l, code); 210 EXPECT_VERIFIES(sigs.l_l(), code);
243 } 211 }
244 } 212 }
245 213
246 TEST_F(AstDecoderTest, Float32Const) { 214 TEST_F(AstDecoderTest, Float32Const) {
247 byte code[] = {kExprF32Const, 0, 0, 0, 0}; 215 byte code[] = {kExprF32Const, 0, 0, 0, 0};
248 float* ptr = reinterpret_cast<float*>(code + 1); 216 float* ptr = reinterpret_cast<float*>(code + 1);
249 for (int i = 0; i < 30; i++) { 217 for (int i = 0; i < 30; i++) {
250 *ptr = i * -7.75f; 218 *ptr = i * -7.75f;
251 EXPECT_VERIFIES(&env_f_ff, code); 219 EXPECT_VERIFIES(sigs.f_ff(), code);
252 } 220 }
253 } 221 }
254 222
255 TEST_F(AstDecoderTest, Float64Const) { 223 TEST_F(AstDecoderTest, Float64Const) {
256 byte code[] = {kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0}; 224 byte code[] = {kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0};
257 double* ptr = reinterpret_cast<double*>(code + 1); 225 double* ptr = reinterpret_cast<double*>(code + 1);
258 for (int i = 0; i < 30; i++) { 226 for (int i = 0; i < 30; i++) {
259 *ptr = i * 33.45; 227 *ptr = i * 33.45;
260 EXPECT_VERIFIES(&env_d_dd, code); 228 EXPECT_VERIFIES(sigs.d_dd(), code);
261 } 229 }
262 } 230 }
263 231
264 TEST_F(AstDecoderTest, Int32Const_off_end) { 232 TEST_F(AstDecoderTest, Int32Const_off_end) {
265 byte code[] = {kExprI32Const, 0xaa, 0xbb, 0xcc, 0x44}; 233 byte code[] = {kExprI32Const, 0xaa, 0xbb, 0xcc, 0x44};
266 234
267 for (int size = 1; size <= 4; size++) { 235 for (int size = 1; size <= 4; size++) {
268 Verify(kError, &env_i_i, code, code + size); 236 Verify(kError, sigs.i_i(), code, code + size);
269 } 237 }
270 } 238 }
271 239
272 TEST_F(AstDecoderTest, GetLocal0_param) { 240 TEST_F(AstDecoderTest, GetLocal0_param) {
273 EXPECT_VERIFIES(&env_i_i, kCodeGetLocal0); 241 EXPECT_VERIFIES(sigs.i_i(), kCodeGetLocal0);
274 } 242 }
275 243
276 TEST_F(AstDecoderTest, GetLocal0_local) { 244 TEST_F(AstDecoderTest, GetLocal0_local) {
277 FunctionEnv env; 245 AddLocals(kAstI32, 1);
278 init_env(&env, sigs.i_v()); 246 EXPECT_VERIFIES(sigs.i_v(), kCodeGetLocal0);
279 env.AddLocals(kAstI32, 1);
280 EXPECT_VERIFIES(&env, kCodeGetLocal0);
281 } 247 }
282 248
283 TEST_F(AstDecoderTest, GetLocal0_param_n) { 249 TEST_F(AstDecoderTest, GetLocal0_param_n) {
284 FunctionSig* array[] = {sigs.i_i(), sigs.i_ii(), sigs.i_iii()}; 250 FunctionSig* array[] = {sigs.i_i(), sigs.i_ii(), sigs.i_iii()};
285 251
286 for (size_t i = 0; i < arraysize(array); i++) { 252 for (size_t i = 0; i < arraysize(array); i++) {
287 FunctionEnv env = CreateInt32FunctionEnv(array[i], 0); 253 EXPECT_VERIFIES(array[i], kCodeGetLocal0);
288 EXPECT_VERIFIES(&env, kCodeGetLocal0);
289 } 254 }
290 } 255 }
291 256
292 TEST_F(AstDecoderTest, GetLocalN_local) { 257 TEST_F(AstDecoderTest, GetLocalN_local) {
293 for (byte i = 1; i < 8; i++) { 258 for (byte i = 1; i < 8; i++) {
294 FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), i); 259 AddLocals(kAstI32, 1);
295 for (byte j = 0; j < i; j++) { 260 for (byte j = 0; j < i; j++) {
296 byte code[] = {kExprGetLocal, j}; 261 byte code[] = {kExprGetLocal, j};
297 EXPECT_VERIFIES(&env, code); 262 EXPECT_VERIFIES(sigs.i_v(), code);
298 } 263 }
299 } 264 }
300 } 265 }
301 266
302 TEST_F(AstDecoderTest, GetLocal0_fail_no_params) { 267 TEST_F(AstDecoderTest, GetLocal0_fail_no_params) {
303 FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), 0); 268 EXPECT_FAILURE(sigs.i_v(), kCodeGetLocal0);
304
305 EXPECT_FAILURE(&env, kCodeGetLocal0);
306 } 269 }
307 270
308 TEST_F(AstDecoderTest, GetLocal1_fail_no_locals) { 271 TEST_F(AstDecoderTest, GetLocal1_fail_no_locals) {
309 EXPECT_FAILURE(&env_i_i, kCodeGetLocal1); 272 EXPECT_FAILURE(sigs.i_i(), kCodeGetLocal1);
310 } 273 }
311 274
312 TEST_F(AstDecoderTest, GetLocal_off_end) { 275 TEST_F(AstDecoderTest, GetLocal_off_end) {
313 static const byte code[] = {kExprGetLocal}; 276 static const byte code[] = {kExprGetLocal};
314 EXPECT_FAILURE(&env_i_i, code); 277 EXPECT_FAILURE(sigs.i_i(), code);
315 } 278 }
316 279
317 TEST_F(AstDecoderTest, GetLocal_varint) { 280 TEST_F(AstDecoderTest, GetLocal_varint) {
318 env_i_i.local_i32_count = 1000000000; 281 const int kMaxLocals = 8000000;
319 env_i_i.total_locals += 1000000000; 282 AddLocals(kAstI32, kMaxLocals);
320 283
321 { 284 for (int index = 0; index < kMaxLocals; index = index * 11 + 5) {
322 static const byte code[] = {kExprGetLocal, 0xFF, 0x01}; 285 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_1(index));
323 EXPECT_VERIFIES(&env_i_i, code); 286 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_2(index));
324 EXPECT_FAILURE(&env_i_f, code); 287 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_3(index));
288 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(index));
325 } 289 }
326 290
327 { 291 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_5(kMaxLocals - 1));
328 static const byte code[] = {kExprGetLocal, 0xF0, 0x80, 0x01};
329 EXPECT_VERIFIES(&env_i_i, code);
330 EXPECT_FAILURE(&env_i_f, code);
331 }
332 292
333 { 293 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals - 1));
334 static const byte code[] = {kExprGetLocal, 0xF2, 0x81, 0x82, 0x01}; 294 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals));
335 EXPECT_VERIFIES(&env_i_i, code); 295 EXPECT_FAILURE_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals + 1));
336 EXPECT_FAILURE(&env_i_f, code);
337 }
338 296
339 { 297 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals));
340 static const byte code[] = {kExprGetLocal, 0xF3, 0xA1, 0xB1, 0xC1, 0x01}; 298 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals + 1));
341 EXPECT_VERIFIES(&env_i_i, code);
342 EXPECT_FAILURE(&env_i_f, code);
343 }
344 } 299 }
345 300
346 TEST_F(AstDecoderTest, Binops_off_end) { 301 TEST_F(AstDecoderTest, Binops_off_end) {
347 byte code1[] = {0}; // [opcode] 302 byte code1[] = {0}; // [opcode]
348 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 303 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
349 code1[0] = kInt32BinopOpcodes[i]; 304 code1[0] = kInt32BinopOpcodes[i];
350 EXPECT_FAILURE(&env_i_i, code1); 305 EXPECT_FAILURE(sigs.i_i(), code1);
351 } 306 }
352 307
353 byte code3[] = {0, kExprGetLocal, 0}; // [opcode] [expr] 308 byte code3[] = {0, kExprGetLocal, 0}; // [opcode] [expr]
354 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 309 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
355 code3[0] = kInt32BinopOpcodes[i]; 310 code3[0] = kInt32BinopOpcodes[i];
356 EXPECT_FAILURE(&env_i_i, code3); 311 EXPECT_FAILURE(sigs.i_i(), code3);
357 } 312 }
358 313
359 byte code4[] = {0, kExprGetLocal, 0, 0}; // [opcode] [expr] [opcode] 314 byte code4[] = {0, kExprGetLocal, 0, 0}; // [opcode] [expr] [opcode]
360 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 315 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
361 code4[0] = kInt32BinopOpcodes[i]; 316 code4[0] = kInt32BinopOpcodes[i];
362 code4[3] = kInt32BinopOpcodes[i]; 317 code4[3] = kInt32BinopOpcodes[i];
363 EXPECT_FAILURE(&env_i_i, code4); 318 EXPECT_FAILURE(sigs.i_i(), code4);
364 } 319 }
365 } 320 }
366 321
367 322
368 //=================================================================== 323 //===================================================================
369 //== Statements 324 //== Statements
370 //=================================================================== 325 //===================================================================
371 TEST_F(AstDecoderTest, Nop) { 326 TEST_F(AstDecoderTest, Nop) {
372 static const byte code[] = {kExprNop}; 327 static const byte code[] = {kExprNop};
373 EXPECT_VERIFIES(&env_v_v, code); 328 EXPECT_VERIFIES(sigs.v_v(), code);
374 } 329 }
375 330
376 TEST_F(AstDecoderTest, SetLocal0_param) { 331 TEST_F(AstDecoderTest, SetLocal0_param) {
377 static const byte code[] = {kExprSetLocal, 0, kExprI8Const, 0}; 332 static const byte code[] = {kExprSetLocal, 0, kExprI8Const, 0};
378 EXPECT_VERIFIES(&env_i_i, code); 333 EXPECT_VERIFIES(sigs.i_i(), code);
379 } 334 }
380 335
381 TEST_F(AstDecoderTest, SetLocal0_local) { 336 TEST_F(AstDecoderTest, SetLocal0_local) {
382 byte code[] = {kExprSetLocal, 0, kExprI8Const, 0}; 337 byte code[] = {kExprSetLocal, 0, kExprI8Const, 0};
383 FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), 1); 338 AddLocals(kAstI32, 1);
384 339 EXPECT_VERIFIES(sigs.i_v(), code);
385 EXPECT_VERIFIES(&env, code);
386 } 340 }
387 341
388 TEST_F(AstDecoderTest, SetLocalN_local) { 342 TEST_F(AstDecoderTest, SetLocalN_local) {
389 for (byte i = 1; i < 8; i++) { 343 for (byte i = 1; i < 8; i++) {
390 FunctionEnv env = CreateInt32FunctionEnv(sigs.i_v(), i); 344 AddLocals(kAstI32, 1);
391 for (byte j = 0; j < i; j++) { 345 for (byte j = 0; j < i; j++) {
392 byte code[] = {kExprSetLocal, j, kExprI8Const, i}; 346 byte code[] = {kExprSetLocal, j, kExprI8Const, i};
393 EXPECT_VERIFIES(&env, code); 347 EXPECT_VERIFIES(sigs.v_v(), code);
394 } 348 }
395 } 349 }
396 } 350 }
397 351
398 TEST_F(AstDecoderTest, Block0) { 352 TEST_F(AstDecoderTest, Block0) {
399 static const byte code[] = {kExprBlock, 0}; 353 static const byte code[] = {kExprBlock, 0};
400 EXPECT_VERIFIES(&env_v_v, code); 354 EXPECT_VERIFIES(sigs.v_v(), code);
401 } 355 }
402 356
403 TEST_F(AstDecoderTest, Block0_fallthru1) { 357 TEST_F(AstDecoderTest, Block0_fallthru1) {
404 static const byte code[] = {kExprBlock, 0, kExprBlock, 0}; 358 static const byte code[] = {kExprBlock, 0, kExprBlock, 0};
405 EXPECT_VERIFIES(&env_v_v, code); 359 EXPECT_VERIFIES(sigs.v_v(), code);
406 } 360 }
407 361
408 TEST_F(AstDecoderTest, Block1) { 362 TEST_F(AstDecoderTest, Block1) {
409 static const byte code[] = {kExprBlock, 1, kExprSetLocal, 0, kExprI8Const, 0}; 363 static const byte code[] = {kExprBlock, 1, kExprSetLocal, 0, kExprI8Const, 0};
410 EXPECT_VERIFIES(&env_i_i, code); 364 EXPECT_VERIFIES(sigs.i_i(), code);
411 } 365 }
412 366
413 TEST_F(AstDecoderTest, Block0_fallthru2) { 367 TEST_F(AstDecoderTest, Block0_fallthru2) {
414 static const byte code[] = {kExprBlock, 0, kExprSetLocal, 0, kExprI8Const, 0}; 368 static const byte code[] = {kExprBlock, 0, kExprSetLocal, 0, kExprI8Const, 0};
415 EXPECT_VERIFIES(&env_i_i, code); 369 EXPECT_VERIFIES(sigs.i_i(), code);
416 } 370 }
417 371
418 TEST_F(AstDecoderTest, Block2) { 372 TEST_F(AstDecoderTest, Block2) {
419 static const byte code[] = {kExprBlock, 2, // -- 373 static const byte code[] = {kExprBlock, 2, // --
420 kExprSetLocal, 0, kExprI8Const, 0, // -- 374 kExprSetLocal, 0, kExprI8Const, 0, // --
421 kExprSetLocal, 0, kExprI8Const, 0}; // -- 375 kExprSetLocal, 0, kExprI8Const, 0}; // --
422 EXPECT_VERIFIES(&env_i_i, code); 376 EXPECT_VERIFIES(sigs.i_i(), code);
423 } 377 }
424 378
425 TEST_F(AstDecoderTest, Block2_fallthru) { 379 TEST_F(AstDecoderTest, Block2_fallthru) {
426 static const byte code[] = {kExprBlock, 2, // -- 380 static const byte code[] = {kExprBlock, 2, // --
427 kExprSetLocal, 0, kExprI8Const, 0, // -- 381 kExprSetLocal, 0, kExprI8Const, 0, // --
428 kExprSetLocal, 0, kExprI8Const, 0, // -- 382 kExprSetLocal, 0, kExprI8Const, 0, // --
429 kExprI8Const, 11}; // -- 383 kExprI8Const, 11}; // --
430 EXPECT_VERIFIES(&env_i_i, code); 384 EXPECT_VERIFIES(sigs.i_i(), code);
431 } 385 }
432 386
433 TEST_F(AstDecoderTest, BlockN) { 387 TEST_F(AstDecoderTest, BlockN) {
434 byte block[] = {kExprBlock, 2}; 388 byte block[] = {kExprBlock, 2};
435 389
436 for (size_t i = 0; i < 10; i++) { 390 for (size_t i = 0; i < 10; i++) {
437 size_t total = sizeof(block) + sizeof(kCodeSetLocal0) * i; 391 size_t total = sizeof(block) + sizeof(kCodeSetLocal0) * i;
438 byte* code = reinterpret_cast<byte*>(malloc(total)); 392 byte* code = reinterpret_cast<byte*>(malloc(total));
439 memcpy(code, block, sizeof(block)); 393 memcpy(code, block, sizeof(block));
440 code[1] = static_cast<byte>(i); 394 code[1] = static_cast<byte>(i);
441 for (size_t j = 0; j < i; j++) { 395 for (size_t j = 0; j < i; j++) {
442 memcpy(code + sizeof(block) + j * sizeof(kCodeSetLocal0), kCodeSetLocal0, 396 memcpy(code + sizeof(block) + j * sizeof(kCodeSetLocal0), kCodeSetLocal0,
443 sizeof(kCodeSetLocal0)); 397 sizeof(kCodeSetLocal0));
444 } 398 }
445 Verify(kSuccess, &env_v_i, code, code + total); 399 Verify(kSuccess, sigs.v_i(), code, code + total);
446 free(code); 400 free(code);
447 } 401 }
448 } 402 }
449 403
450 TEST_F(AstDecoderTest, BlockN_off_end) { 404 TEST_F(AstDecoderTest, BlockN_off_end) {
451 for (byte i = 2; i < 10; i++) { 405 for (byte i = 2; i < 10; i++) {
452 byte code[] = {kExprBlock, i, kExprNop}; 406 byte code[] = {kExprBlock, i, kExprNop};
453 EXPECT_FAILURE(&env_v_v, code); 407 EXPECT_FAILURE(sigs.v_v(), code);
454 } 408 }
455 } 409 }
456 410
457 TEST_F(AstDecoderTest, Block1_break) { 411 TEST_F(AstDecoderTest, Block1_break) {
458 static const byte code[] = {kExprBlock, 1, kExprBr, 0, kExprNop}; 412 static const byte code[] = {kExprBlock, 1, kExprBr, 0, kExprNop};
459 EXPECT_VERIFIES(&env_v_v, code); 413 EXPECT_VERIFIES(sigs.v_v(), code);
460 } 414 }
461 415
462 TEST_F(AstDecoderTest, Block2_break) { 416 TEST_F(AstDecoderTest, Block2_break) {
463 static const byte code[] = {kExprBlock, 2, kExprNop, kExprBr, 0, kExprNop}; 417 static const byte code[] = {kExprBlock, 2, kExprNop, kExprBr, 0, kExprNop};
464 EXPECT_VERIFIES(&env_v_v, code); 418 EXPECT_VERIFIES(sigs.v_v(), code);
465 } 419 }
466 420
467 TEST_F(AstDecoderTest, Block1_continue) { 421 TEST_F(AstDecoderTest, Block1_continue) {
468 static const byte code[] = {kExprBlock, 1, kExprBr, 1, kExprNop}; 422 static const byte code[] = {kExprBlock, 1, kExprBr, 1, kExprNop};
469 EXPECT_FAILURE(&env_v_v, code); 423 EXPECT_FAILURE(sigs.v_v(), code);
470 } 424 }
471 425
472 TEST_F(AstDecoderTest, Block2_continue) { 426 TEST_F(AstDecoderTest, Block2_continue) {
473 static const byte code[] = {kExprBlock, 2, kExprNop, kExprBr, 1, kExprNop}; 427 static const byte code[] = {kExprBlock, 2, kExprNop, kExprBr, 1, kExprNop};
474 EXPECT_FAILURE(&env_v_v, code); 428 EXPECT_FAILURE(sigs.v_v(), code);
475 } 429 }
476 430
477 TEST_F(AstDecoderTest, ExprBlock0) { 431 TEST_F(AstDecoderTest, ExprBlock0) {
478 static const byte code[] = {kExprBlock, 0}; 432 static const byte code[] = {kExprBlock, 0};
479 EXPECT_VERIFIES(&env_v_v, code); 433 EXPECT_VERIFIES(sigs.v_v(), code);
480 } 434 }
481 435
482 TEST_F(AstDecoderTest, ExprBlock1a) { 436 TEST_F(AstDecoderTest, ExprBlock1a) {
483 static const byte code[] = {kExprBlock, 1, kExprI8Const, 0}; 437 static const byte code[] = {kExprBlock, 1, kExprI8Const, 0};
484 EXPECT_VERIFIES(&env_i_i, code); 438 EXPECT_VERIFIES(sigs.i_i(), code);
485 } 439 }
486 440
487 TEST_F(AstDecoderTest, ExprBlock1b) { 441 TEST_F(AstDecoderTest, ExprBlock1b) {
488 static const byte code[] = {kExprBlock, 1, kExprI8Const, 0}; 442 static const byte code[] = {kExprBlock, 1, kExprI8Const, 0};
489 EXPECT_FAILURE(&env_f_ff, code); 443 EXPECT_FAILURE(sigs.f_ff(), code);
490 } 444 }
491 445
492 TEST_F(AstDecoderTest, ExprBlock1c) { 446 TEST_F(AstDecoderTest, ExprBlock1c) {
493 static const byte code[] = {kExprBlock, 1, kExprF32Const, 0, 0, 0, 0}; 447 static const byte code[] = {kExprBlock, 1, kExprF32Const, 0, 0, 0, 0};
494 EXPECT_VERIFIES(&env_f_ff, code); 448 EXPECT_VERIFIES(sigs.f_ff(), code);
495 } 449 }
496 450
497 TEST_F(AstDecoderTest, IfEmpty) { 451 TEST_F(AstDecoderTest, IfEmpty) {
498 static const byte code[] = {kExprIf, kExprGetLocal, 0, kExprNop}; 452 static const byte code[] = {kExprIf, kExprGetLocal, 0, kExprNop};
499 EXPECT_VERIFIES(&env_v_i, code); 453 EXPECT_VERIFIES(sigs.v_i(), code);
500 } 454 }
501 455
502 TEST_F(AstDecoderTest, IfSet) { 456 TEST_F(AstDecoderTest, IfSet) {
503 static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprSetLocal, 457 static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprSetLocal,
504 0, kExprI8Const, 0, kExprNop}; 458 0, kExprI8Const, 0, kExprNop};
505 EXPECT_VERIFIES(&env_v_i, code); 459 EXPECT_VERIFIES(sigs.v_i(), code);
506 } 460 }
507 461
508 TEST_F(AstDecoderTest, IfBlock1) { 462 TEST_F(AstDecoderTest, IfBlock1) {
509 static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprBlock, 463 static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprBlock,
510 1, kExprSetLocal, 0, kExprI8Const, 464 1, kExprSetLocal, 0, kExprI8Const,
511 0, kExprNop}; 465 0, kExprNop};
512 EXPECT_VERIFIES(&env_v_i, code); 466 EXPECT_VERIFIES(sigs.v_i(), code);
513 } 467 }
514 468
515 TEST_F(AstDecoderTest, IfBlock2) { 469 TEST_F(AstDecoderTest, IfBlock2) {
516 static const byte code[] = {kExprIf, kExprGetLocal, 0, kExprBlock, 470 static const byte code[] = {kExprIf, kExprGetLocal, 0, kExprBlock,
517 2, kExprSetLocal, 0, kExprI8Const, 471 2, kExprSetLocal, 0, kExprI8Const,
518 0, kExprSetLocal, 0, kExprI8Const, 472 0, kExprSetLocal, 0, kExprI8Const,
519 0}; 473 0};
520 EXPECT_VERIFIES(&env_v_i, code); 474 EXPECT_VERIFIES(sigs.v_i(), code);
521 } 475 }
522 476
523 TEST_F(AstDecoderTest, IfElseEmpty) { 477 TEST_F(AstDecoderTest, IfElseEmpty) {
524 static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprNop, 478 static const byte code[] = {kExprIfElse, kExprGetLocal, 0, kExprNop,
525 kExprNop}; 479 kExprNop};
526 EXPECT_VERIFIES(&env_v_i, code); 480 EXPECT_VERIFIES(sigs.v_i(), code);
527 } 481 }
528 482
529 TEST_F(AstDecoderTest, IfElseSet) { 483 TEST_F(AstDecoderTest, IfElseSet) {
530 static const byte code[] = {kExprIfElse, 484 static const byte code[] = {kExprIfElse,
531 kExprGetLocal, 485 kExprGetLocal,
532 0, // -- 486 0, // --
533 kExprSetLocal, 487 kExprSetLocal,
534 0, 488 0,
535 kExprI8Const, 489 kExprI8Const,
536 0, // -- 490 0, // --
537 kExprSetLocal, 491 kExprSetLocal,
538 0, 492 0,
539 kExprI8Const, 493 kExprI8Const,
540 1}; // -- 494 1}; // --
541 EXPECT_VERIFIES(&env_v_i, code); 495 EXPECT_VERIFIES(sigs.v_i(), code);
542 } 496 }
543 497
544 TEST_F(AstDecoderTest, IfElseUnreachable) { 498 TEST_F(AstDecoderTest, IfElseUnreachable) {
545 static const byte code[] = {kExprIfElse, kExprI8Const, 0, 499 static const byte code[] = {kExprIfElse, kExprI8Const, 0,
546 kExprUnreachable, kExprGetLocal, 0}; 500 kExprUnreachable, kExprGetLocal, 0};
547 501
548 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 502 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
549 LocalType types[] = {kAstI32, kLocalTypes[i]}; 503 LocalType types[] = {kAstI32, kLocalTypes[i]};
550 FunctionEnv env;
551 FunctionSig sig(1, 1, types); 504 FunctionSig sig(1, 1, types);
552 init_env(&env, &sig);
553 505
554 if (kLocalTypes[i] == kAstI32) { 506 if (kLocalTypes[i] == kAstI32) {
555 EXPECT_VERIFIES(&env, code); 507 EXPECT_VERIFIES(&sig, code);
556 } else { 508 } else {
557 EXPECT_FAILURE(&env, code); 509 EXPECT_FAILURE(&sig, code);
558 } 510 }
559 } 511 }
560 } 512 }
561 513
562 TEST_F(AstDecoderTest, Loop0) { 514 TEST_F(AstDecoderTest, Loop0) {
563 static const byte code[] = {kExprLoop, 0}; 515 static const byte code[] = {kExprLoop, 0};
564 EXPECT_VERIFIES(&env_v_v, code); 516 EXPECT_VERIFIES(sigs.v_v(), code);
565 } 517 }
566 518
567 TEST_F(AstDecoderTest, Loop1) { 519 TEST_F(AstDecoderTest, Loop1) {
568 static const byte code[] = {kExprLoop, 1, kExprSetLocal, 0, kExprI8Const, 0}; 520 static const byte code[] = {kExprLoop, 1, kExprSetLocal, 0, kExprI8Const, 0};
569 EXPECT_VERIFIES(&env_v_i, code); 521 EXPECT_VERIFIES(sigs.v_i(), code);
570 } 522 }
571 523
572 TEST_F(AstDecoderTest, Loop2) { 524 TEST_F(AstDecoderTest, Loop2) {
573 static const byte code[] = {kExprLoop, 2, // -- 525 static const byte code[] = {kExprLoop, 2, // --
574 kExprSetLocal, 0, kExprI8Const, 0, // -- 526 kExprSetLocal, 0, kExprI8Const, 0, // --
575 kExprSetLocal, 0, kExprI8Const, 0}; // -- 527 kExprSetLocal, 0, kExprI8Const, 0}; // --
576 EXPECT_VERIFIES(&env_v_i, code); 528 EXPECT_VERIFIES(sigs.v_i(), code);
577 } 529 }
578 530
579 TEST_F(AstDecoderTest, Loop1_continue) { 531 TEST_F(AstDecoderTest, Loop1_continue) {
580 static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprNop}; 532 static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprNop};
581 EXPECT_VERIFIES(&env_v_v, code); 533 EXPECT_VERIFIES(sigs.v_v(), code);
582 } 534 }
583 535
584 TEST_F(AstDecoderTest, Loop1_break) { 536 TEST_F(AstDecoderTest, Loop1_break) {
585 static const byte code[] = {kExprLoop, 1, kExprBr, 1, kExprNop}; 537 static const byte code[] = {kExprLoop, 1, kExprBr, 1, kExprNop};
586 EXPECT_VERIFIES(&env_v_v, code); 538 EXPECT_VERIFIES(sigs.v_v(), code);
587 } 539 }
588 540
589 TEST_F(AstDecoderTest, Loop2_continue) { 541 TEST_F(AstDecoderTest, Loop2_continue) {
590 static const byte code[] = {kExprLoop, 2, // -- 542 static const byte code[] = {kExprLoop, 2, // --
591 kExprSetLocal, 0, kExprI8Const, 0, // -- 543 kExprSetLocal, 0, kExprI8Const, 0, // --
592 kExprBr, 0, kExprNop}; // -- 544 kExprBr, 0, kExprNop}; // --
593 EXPECT_VERIFIES(&env_v_i, code); 545 EXPECT_VERIFIES(sigs.v_i(), code);
594 } 546 }
595 547
596 TEST_F(AstDecoderTest, Loop2_break) { 548 TEST_F(AstDecoderTest, Loop2_break) {
597 static const byte code[] = {kExprLoop, 2, // -- 549 static const byte code[] = {kExprLoop, 2, // --
598 kExprSetLocal, 0, kExprI8Const, 0, // -- 550 kExprSetLocal, 0, kExprI8Const, 0, // --
599 kExprBr, 1, kExprNop}; // -- 551 kExprBr, 1, kExprNop}; // --
600 EXPECT_VERIFIES(&env_v_i, code); 552 EXPECT_VERIFIES(sigs.v_i(), code);
601 } 553 }
602 554
603 TEST_F(AstDecoderTest, ExprLoop0) { 555 TEST_F(AstDecoderTest, ExprLoop0) {
604 static const byte code[] = {kExprLoop, 0}; 556 static const byte code[] = {kExprLoop, 0};
605 EXPECT_VERIFIES(&env_v_v, code); 557 EXPECT_VERIFIES(sigs.v_v(), code);
606 } 558 }
607 559
608 TEST_F(AstDecoderTest, ExprLoop1a) { 560 TEST_F(AstDecoderTest, ExprLoop1a) {
609 static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprI8Const, 0}; 561 static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprI8Const, 0};
610 EXPECT_VERIFIES(&env_i_i, code); 562 EXPECT_VERIFIES(sigs.i_i(), code);
611 } 563 }
612 564
613 TEST_F(AstDecoderTest, ExprLoop1b) { 565 TEST_F(AstDecoderTest, ExprLoop1b) {
614 static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprI8Const, 0}; 566 static const byte code[] = {kExprLoop, 1, kExprBr, 0, kExprI8Const, 0};
615 EXPECT_VERIFIES(&env_i_i, code); 567 EXPECT_VERIFIES(sigs.i_i(), code);
616 } 568 }
617 569
618 TEST_F(AstDecoderTest, ExprLoop2_unreachable) { 570 TEST_F(AstDecoderTest, ExprLoop2_unreachable) {
619 static const byte code[] = {kExprLoop, 2, kExprBr, 0, 571 static const byte code[] = {kExprLoop, 2, kExprBr, 0,
620 kExprI8Const, 0, kExprNop}; 572 kExprI8Const, 0, kExprNop};
621 EXPECT_VERIFIES(&env_i_i, code); 573 EXPECT_VERIFIES(sigs.i_i(), code);
622 } 574 }
623 575
624 TEST_F(AstDecoderTest, ReturnVoid1) { 576 TEST_F(AstDecoderTest, ReturnVoid1) {
625 static const byte code[] = {kExprNop}; 577 static const byte code[] = {kExprNop};
626 EXPECT_VERIFIES(&env_v_v, code); 578 EXPECT_VERIFIES(sigs.v_v(), code);
627 EXPECT_FAILURE(&env_i_i, code); 579 EXPECT_FAILURE(sigs.i_i(), code);
628 EXPECT_FAILURE(&env_i_f, code); 580 EXPECT_FAILURE(sigs.i_f(), code);
629 } 581 }
630 582
631 TEST_F(AstDecoderTest, ReturnVoid2) { 583 TEST_F(AstDecoderTest, ReturnVoid2) {
632 static const byte code[] = {kExprBlock, 1, kExprBr, 0, kExprNop}; 584 static const byte code[] = {kExprBlock, 1, kExprBr, 0, kExprNop};
633 EXPECT_VERIFIES(&env_v_v, code); 585 EXPECT_VERIFIES(sigs.v_v(), code);
634 EXPECT_FAILURE(&env_i_i, code); 586 EXPECT_FAILURE(sigs.i_i(), code);
635 EXPECT_FAILURE(&env_i_f, code); 587 EXPECT_FAILURE(sigs.i_f(), code);
636 } 588 }
637 589
638 TEST_F(AstDecoderTest, ReturnVoid3) { 590 TEST_F(AstDecoderTest, ReturnVoid3) {
639 EXPECT_VERIFIES_INLINE(&env_v_v, kExprI8Const, 0); 591 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI8Const, 0);
640 EXPECT_VERIFIES_INLINE(&env_v_v, kExprI32Const, 0, 0, 0, 0); 592 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI32Const, 0, 0, 0, 0);
641 EXPECT_VERIFIES_INLINE(&env_v_v, kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0); 593 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0);
642 EXPECT_VERIFIES_INLINE(&env_v_v, kExprF32Const, 0, 0, 0, 0); 594 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF32Const, 0, 0, 0, 0);
643 EXPECT_VERIFIES_INLINE(&env_v_v, kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0); 595 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0);
644 596
645 EXPECT_VERIFIES_INLINE(&env_v_i, kExprGetLocal, 0); 597 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0);
646 } 598 }
647 599
648 TEST_F(AstDecoderTest, Unreachable1) { 600 TEST_F(AstDecoderTest, Unreachable1) {
649 EXPECT_VERIFIES_INLINE(&env_v_v, kExprUnreachable); 601 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable);
650 EXPECT_VERIFIES_INLINE(&env_v_v, kExprUnreachable, kExprUnreachable); 602 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable, kExprUnreachable);
651 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(2, WASM_UNREACHABLE, WASM_ZERO)); 603 EXPECT_VERIFIES_INLINE(sigs.v_v(),
652 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(2, WASM_BR(0), WASM_ZERO)); 604 WASM_BLOCK(2, WASM_UNREACHABLE, WASM_ZERO));
653 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(2, WASM_UNREACHABLE, WASM_ZERO)); 605 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_BLOCK(2, WASM_BR(0), WASM_ZERO));
654 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(2, WASM_BR(0), WASM_ZERO)); 606 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(2, WASM_UNREACHABLE, WASM_ZERO));
607 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(2, WASM_BR(0), WASM_ZERO));
655 } 608 }
656 609
657 TEST_F(AstDecoderTest, Codeiness) { 610 TEST_F(AstDecoderTest, Codeiness) {
658 VERIFY(kExprLoop, 2, // -- 611 VERIFY(kExprLoop, 2, // --
659 kExprSetLocal, 0, kExprI8Const, 0, // -- 612 kExprSetLocal, 0, kExprI8Const, 0, // --
660 kExprBr, 0, kExprNop); // -- 613 kExprBr, 0, kExprNop); // --
661 } 614 }
662 615
663 TEST_F(AstDecoderTest, ExprIf1) { 616 TEST_F(AstDecoderTest, ExprIf1) {
664 VERIFY(kExprIf, kExprGetLocal, 0, kExprI8Const, 0, kExprI8Const, 1); 617 VERIFY(kExprIf, kExprGetLocal, 0, kExprI8Const, 0, kExprI8Const, 1);
665 VERIFY(kExprIf, kExprGetLocal, 0, kExprGetLocal, 0, kExprGetLocal, 0); 618 VERIFY(kExprIf, kExprGetLocal, 0, kExprGetLocal, 0, kExprGetLocal, 0);
666 VERIFY(kExprIf, kExprGetLocal, 0, kExprI32Add, kExprGetLocal, 0, 619 VERIFY(kExprIf, kExprGetLocal, 0, kExprI32Add, kExprGetLocal, 0,
667 kExprGetLocal, 0, kExprI8Const, 1); 620 kExprGetLocal, 0, kExprI8Const, 1);
668 } 621 }
669 622
670 TEST_F(AstDecoderTest, ExprIf_off_end) { 623 TEST_F(AstDecoderTest, ExprIf_off_end) {
671 static const byte kCode[] = {kExprIf, kExprGetLocal, 0, kExprGetLocal, 624 static const byte kCode[] = {kExprIf, kExprGetLocal, 0, kExprGetLocal,
672 0, kExprGetLocal, 0}; 625 0, kExprGetLocal, 0};
673 for (size_t len = 1; len < arraysize(kCode); len++) { 626 for (size_t len = 1; len < arraysize(kCode); len++) {
674 Verify(kError, &env_i_i, kCode, kCode + len); 627 Verify(kError, sigs.i_i(), kCode, kCode + len);
675 } 628 }
676 } 629 }
677 630
678 TEST_F(AstDecoderTest, ExprIf_type) { 631 TEST_F(AstDecoderTest, ExprIf_type) {
679 { 632 {
680 // float|double ? 1 : 2 633 // float|double ? 1 : 2
681 static const byte kCode[] = {kExprIfElse, kExprGetLocal, 0, kExprI8Const, 634 static const byte kCode[] = {kExprIfElse, kExprGetLocal, 0, kExprI8Const,
682 1, kExprI8Const, 2}; 635 1, kExprI8Const, 2};
683 EXPECT_FAILURE(&env_i_f, kCode); 636 EXPECT_FAILURE(sigs.i_f(), kCode);
684 EXPECT_FAILURE(&env_i_d, kCode); 637 EXPECT_FAILURE(sigs.i_d(), kCode);
685 } 638 }
686 { 639 {
687 // 1 ? float|double : 2 640 // 1 ? float|double : 2
688 static const byte kCode[] = {kExprIfElse, kExprI8Const, 1, kExprGetLocal, 641 static const byte kCode[] = {kExprIfElse, kExprI8Const, 1, kExprGetLocal,
689 0, kExprI8Const, 2}; 642 0, kExprI8Const, 2};
690 EXPECT_FAILURE(&env_i_f, kCode); 643 EXPECT_FAILURE(sigs.i_f(), kCode);
691 EXPECT_FAILURE(&env_i_d, kCode); 644 EXPECT_FAILURE(sigs.i_d(), kCode);
692 } 645 }
693 { 646 {
694 // stmt ? 0 : 1 647 // stmt ? 0 : 1
695 static const byte kCode[] = {kExprIfElse, kExprNop, kExprI8Const, 648 static const byte kCode[] = {kExprIfElse, kExprNop, kExprI8Const,
696 0, kExprI8Const, 1}; 649 0, kExprI8Const, 1};
697 EXPECT_FAILURE(&env_i_i, kCode); 650 EXPECT_FAILURE(sigs.i_i(), kCode);
698 } 651 }
699 { 652 {
700 // 0 ? stmt : 1 653 // 0 ? stmt : 1
701 static const byte kCode[] = {kExprIfElse, kExprI8Const, 0, 654 static const byte kCode[] = {kExprIfElse, kExprI8Const, 0,
702 kExprNop, kExprI8Const, 1}; 655 kExprNop, kExprI8Const, 1};
703 EXPECT_FAILURE(&env_i_i, kCode); 656 EXPECT_FAILURE(sigs.i_i(), kCode);
704 } 657 }
705 { 658 {
706 // 0 ? 1 : stmt 659 // 0 ? 1 : stmt
707 static const byte kCode[] = {kExprIfElse, kExprI8Const, 0, kExprI8Const, 1, 660 static const byte kCode[] = {kExprIfElse, kExprI8Const, 0, kExprI8Const, 1,
708 0, kExprBlock}; 661 0, kExprBlock};
709 EXPECT_FAILURE(&env_i_i, kCode); 662 EXPECT_FAILURE(sigs.i_i(), kCode);
710 } 663 }
711 } 664 }
712 665
713 TEST_F(AstDecoderTest, Int64Local_param) { 666 TEST_F(AstDecoderTest, Int64Local_param) {
714 EXPECT_VERIFIES(&env_l_l, kCodeGetLocal0); 667 EXPECT_VERIFIES(sigs.l_l(), kCodeGetLocal0);
715 } 668 }
716 669
717 TEST_F(AstDecoderTest, Int64Locals) { 670 TEST_F(AstDecoderTest, Int64Locals) {
718 for (byte i = 1; i < 8; i++) { 671 for (byte i = 1; i < 8; i++) {
719 FunctionEnv env; 672 AddLocals(kAstI64, 1);
720 init_env(&env, sigs.l_v());
721 env.AddLocals(kAstI64, i);
722 for (byte j = 0; j < i; j++) { 673 for (byte j = 0; j < i; j++) {
723 byte code[] = {kExprGetLocal, j}; 674 byte code[] = {kExprGetLocal, j};
724 EXPECT_VERIFIES(&env, code); 675 EXPECT_VERIFIES(sigs.l_v(), code);
725 } 676 }
726 } 677 }
727 } 678 }
728 679
729 TEST_F(AstDecoderTest, Int32Binops) { 680 TEST_F(AstDecoderTest, Int32Binops) {
730 TestBinop(kExprI32Add, sigs.i_ii()); 681 TestBinop(kExprI32Add, sigs.i_ii());
731 TestBinop(kExprI32Sub, sigs.i_ii()); 682 TestBinop(kExprI32Sub, sigs.i_ii());
732 TestBinop(kExprI32Mul, sigs.i_ii()); 683 TestBinop(kExprI32Mul, sigs.i_ii());
733 TestBinop(kExprI32DivS, sigs.i_ii()); 684 TestBinop(kExprI32DivS, sigs.i_ii());
734 TestBinop(kExprI32DivU, sigs.i_ii()); 685 TestBinop(kExprI32DivU, sigs.i_ii());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); 739 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
789 VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP)); 740 VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
790 VERIFY(WASM_NOP); 741 VERIFY(WASM_NOP);
791 VERIFY(WASM_BLOCK(1, WASM_NOP)); 742 VERIFY(WASM_BLOCK(1, WASM_NOP));
792 VERIFY(WASM_LOOP(1, WASM_NOP)); 743 VERIFY(WASM_LOOP(1, WASM_NOP));
793 VERIFY(WASM_LOOP(1, WASM_BREAK(0))); 744 VERIFY(WASM_LOOP(1, WASM_BREAK(0)));
794 VERIFY(WASM_LOOP(1, WASM_CONTINUE(0))); 745 VERIFY(WASM_LOOP(1, WASM_CONTINUE(0)));
795 } 746 }
796 747
797 TEST_F(AstDecoderTest, MacrosBreak) { 748 TEST_F(AstDecoderTest, MacrosBreak) {
798 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BREAK(0))); 749 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BREAK(0)));
799 750
800 EXPECT_VERIFIES_INLINE(&env_i_i, WASM_LOOP(1, WASM_BREAKV(0, WASM_ZERO))); 751 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BREAKV(0, WASM_ZERO)));
801 EXPECT_VERIFIES_INLINE(&env_l_l, WASM_LOOP(1, WASM_BREAKV(0, WASM_I64(0)))); 752 EXPECT_VERIFIES_INLINE(sigs.l_l(), WASM_LOOP(1, WASM_BREAKV(0, WASM_I64(0))));
802 EXPECT_VERIFIES_INLINE(&env_f_ff, 753 EXPECT_VERIFIES_INLINE(sigs.f_ff(),
803 WASM_LOOP(1, WASM_BREAKV(0, WASM_F32(0.0)))); 754 WASM_LOOP(1, WASM_BREAKV(0, WASM_F32(0.0))));
804 EXPECT_VERIFIES_INLINE(&env_d_dd, 755 EXPECT_VERIFIES_INLINE(sigs.d_dd(),
805 WASM_LOOP(1, WASM_BREAKV(0, WASM_F64(0.0)))); 756 WASM_LOOP(1, WASM_BREAKV(0, WASM_F64(0.0))));
806 } 757 }
807 758
808 TEST_F(AstDecoderTest, MacrosContinue) { 759 TEST_F(AstDecoderTest, MacrosContinue) {
809 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_CONTINUE(0))); 760 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_CONTINUE(0)));
810 } 761 }
811 762
812 TEST_F(AstDecoderTest, MacrosVariadic) { 763 TEST_F(AstDecoderTest, MacrosVariadic) {
813 VERIFY(WASM_BLOCK(2, WASM_NOP, WASM_NOP)); 764 VERIFY(WASM_BLOCK(2, WASM_NOP, WASM_NOP));
814 VERIFY(WASM_BLOCK(3, WASM_NOP, WASM_NOP, WASM_NOP)); 765 VERIFY(WASM_BLOCK(3, WASM_NOP, WASM_NOP, WASM_NOP));
815 VERIFY(WASM_LOOP(2, WASM_NOP, WASM_NOP)); 766 VERIFY(WASM_LOOP(2, WASM_NOP, WASM_NOP));
816 VERIFY(WASM_LOOP(3, WASM_NOP, WASM_NOP, WASM_NOP)); 767 VERIFY(WASM_LOOP(3, WASM_NOP, WASM_NOP, WASM_NOP));
817 } 768 }
818 769
819 TEST_F(AstDecoderTest, MacrosNestedBlocks) { 770 TEST_F(AstDecoderTest, MacrosNestedBlocks) {
820 VERIFY(WASM_BLOCK(2, WASM_NOP, WASM_BLOCK(2, WASM_NOP, WASM_NOP))); 771 VERIFY(WASM_BLOCK(2, WASM_NOP, WASM_BLOCK(2, WASM_NOP, WASM_NOP)));
821 VERIFY(WASM_BLOCK(3, WASM_NOP, // -- 772 VERIFY(WASM_BLOCK(3, WASM_NOP, // --
822 WASM_BLOCK(2, WASM_NOP, WASM_NOP), // -- 773 WASM_BLOCK(2, WASM_NOP, WASM_NOP), // --
823 WASM_BLOCK(2, WASM_NOP, WASM_NOP))); // -- 774 WASM_BLOCK(2, WASM_NOP, WASM_NOP))); // --
824 VERIFY(WASM_BLOCK(1, WASM_BLOCK(1, WASM_BLOCK(2, WASM_NOP, WASM_NOP)))); 775 VERIFY(WASM_BLOCK(1, WASM_BLOCK(1, WASM_BLOCK(2, WASM_NOP, WASM_NOP))));
825 } 776 }
826 777
827 TEST_F(AstDecoderTest, MultipleReturn) { 778 TEST_F(AstDecoderTest, MultipleReturn) {
828 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32}; 779 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
829 FunctionSig sig_ii_v(2, 0, kIntTypes5); 780 FunctionSig sig_ii_v(2, 0, kIntTypes5);
830 FunctionEnv env_ii_v; 781 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_RETURN(WASM_ZERO, WASM_ONE));
831 init_env(&env_ii_v, &sig_ii_v); 782 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_RETURN(WASM_ZERO));
832 EXPECT_VERIFIES_INLINE(&env_ii_v, WASM_RETURN(WASM_ZERO, WASM_ONE));
833 EXPECT_FAILURE_INLINE(&env_ii_v, WASM_RETURN(WASM_ZERO));
834 783
835 FunctionSig sig_iii_v(3, 0, kIntTypes5); 784 FunctionSig sig_iii_v(3, 0, kIntTypes5);
836 FunctionEnv env_iii_v; 785 EXPECT_VERIFIES_INLINE(&sig_iii_v,
837 init_env(&env_iii_v, &sig_iii_v);
838 EXPECT_VERIFIES_INLINE(&env_iii_v,
839 WASM_RETURN(WASM_ZERO, WASM_ONE, WASM_I8(44))); 786 WASM_RETURN(WASM_ZERO, WASM_ONE, WASM_I8(44)));
840 EXPECT_FAILURE_INLINE(&env_iii_v, WASM_RETURN(WASM_ZERO, WASM_ONE)); 787 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_RETURN(WASM_ZERO, WASM_ONE));
841 } 788 }
842 789
843 TEST_F(AstDecoderTest, MultipleReturn_fallthru) { 790 TEST_F(AstDecoderTest, MultipleReturn_fallthru) {
844 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32}; 791 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
845 FunctionSig sig_ii_v(2, 0, kIntTypes5); 792 FunctionSig sig_ii_v(2, 0, kIntTypes5);
846 FunctionEnv env_ii_v;
847 init_env(&env_ii_v, &sig_ii_v);
848 793
849 EXPECT_VERIFIES_INLINE(&env_ii_v, WASM_ZERO, WASM_ONE); 794 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_ZERO, WASM_ONE);
850 EXPECT_FAILURE_INLINE(&env_ii_v, WASM_ZERO); 795 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_ZERO);
851 796
852 FunctionSig sig_iii_v(3, 0, kIntTypes5); 797 FunctionSig sig_iii_v(3, 0, kIntTypes5);
853 FunctionEnv env_iii_v; 798 EXPECT_VERIFIES_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44));
854 init_env(&env_iii_v, &sig_iii_v); 799 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE);
855 EXPECT_VERIFIES_INLINE(&env_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44));
856 EXPECT_FAILURE_INLINE(&env_iii_v, WASM_ZERO, WASM_ONE);
857 } 800 }
858 801
859 TEST_F(AstDecoderTest, MacrosInt32) { 802 TEST_F(AstDecoderTest, MacrosInt32) {
860 VERIFY(WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12))); 803 VERIFY(WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12)));
861 VERIFY(WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(13))); 804 VERIFY(WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(13)));
862 VERIFY(WASM_I32_MUL(WASM_GET_LOCAL(0), WASM_I8(14))); 805 VERIFY(WASM_I32_MUL(WASM_GET_LOCAL(0), WASM_I8(14)));
863 VERIFY(WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(15))); 806 VERIFY(WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(15)));
864 VERIFY(WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I8(16))); 807 VERIFY(WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I8(16)));
865 VERIFY(WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_I8(17))); 808 VERIFY(WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_I8(17)));
866 VERIFY(WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_I8(18))); 809 VERIFY(WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_I8(18)));
(...skipping 11 matching lines...) Expand all
878 VERIFY(WASM_I32_LTU(WASM_GET_LOCAL(0), WASM_I8(28))); 821 VERIFY(WASM_I32_LTU(WASM_GET_LOCAL(0), WASM_I8(28)));
879 VERIFY(WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29))); 822 VERIFY(WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29)));
880 823
881 VERIFY(WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26))); 824 VERIFY(WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26)));
882 VERIFY(WASM_I32_GES(WASM_GET_LOCAL(0), WASM_I8(27))); 825 VERIFY(WASM_I32_GES(WASM_GET_LOCAL(0), WASM_I8(27)));
883 VERIFY(WASM_I32_GTU(WASM_GET_LOCAL(0), WASM_I8(28))); 826 VERIFY(WASM_I32_GTU(WASM_GET_LOCAL(0), WASM_I8(28)));
884 VERIFY(WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29))); 827 VERIFY(WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29)));
885 } 828 }
886 829
887 TEST_F(AstDecoderTest, MacrosInt64) { 830 TEST_F(AstDecoderTest, MacrosInt64) {
888 FunctionEnv env_i_ll; 831 #define VERIFY_L_LL(...) EXPECT_VERIFIES_INLINE(sigs.l_ll(), __VA_ARGS__)
889 FunctionEnv env_l_ll; 832 #define VERIFY_I_LL(...) EXPECT_VERIFIES_INLINE(sigs.i_ll(), __VA_ARGS__)
890 init_env(&env_i_ll, sigs.i_ll());
891 init_env(&env_l_ll, sigs.l_ll());
892
893 #define VERIFY_L_LL(...) EXPECT_VERIFIES_INLINE(&env_l_ll, __VA_ARGS__)
894 #define VERIFY_I_LL(...) EXPECT_VERIFIES_INLINE(&env_i_ll, __VA_ARGS__)
895 833
896 VERIFY_L_LL(WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64(12))); 834 VERIFY_L_LL(WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64(12)));
897 VERIFY_L_LL(WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64(13))); 835 VERIFY_L_LL(WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64(13)));
898 VERIFY_L_LL(WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64(14))); 836 VERIFY_L_LL(WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64(14)));
899 VERIFY_L_LL(WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64(15))); 837 VERIFY_L_LL(WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64(15)));
900 VERIFY_L_LL(WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64(16))); 838 VERIFY_L_LL(WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64(16)));
901 VERIFY_L_LL(WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64(17))); 839 VERIFY_L_LL(WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64(17)));
902 VERIFY_L_LL(WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64(18))); 840 VERIFY_L_LL(WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64(18)));
903 VERIFY_L_LL(WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64(19))); 841 VERIFY_L_LL(WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64(19)));
904 VERIFY_L_LL(WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64(20))); 842 VERIFY_L_LL(WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64(20)));
(...skipping 29 matching lines...) Expand all
934 } \ 872 } \
935 } 873 }
936 874
937 FOREACH_SIMPLE_OPCODE(DECODE_TEST); 875 FOREACH_SIMPLE_OPCODE(DECODE_TEST);
938 876
939 #undef DECODE_TEST 877 #undef DECODE_TEST
940 } 878 }
941 879
942 TEST_F(AstDecoderTest, MemorySize) { 880 TEST_F(AstDecoderTest, MemorySize) {
943 byte code[] = {kExprMemorySize}; 881 byte code[] = {kExprMemorySize};
944 EXPECT_VERIFIES(&env_i_i, code); 882 EXPECT_VERIFIES(sigs.i_i(), code);
945 EXPECT_FAILURE(&env_f_ff, code); 883 EXPECT_FAILURE(sigs.f_ff(), code);
946 } 884 }
947 885
948 TEST_F(AstDecoderTest, GrowMemory) { 886 TEST_F(AstDecoderTest, GrowMemory) {
949 byte code[] = {kExprGrowMemory, kExprGetLocal, 0}; 887 byte code[] = {kExprGrowMemory, kExprGetLocal, 0};
950 EXPECT_VERIFIES(&env_i_i, code); 888 EXPECT_VERIFIES(sigs.i_i(), code);
951 EXPECT_FAILURE(&env_i_d, code); 889 EXPECT_FAILURE(sigs.i_d(), code);
952 } 890 }
953 891
954 TEST_F(AstDecoderTest, LoadMemOffset) { 892 TEST_F(AstDecoderTest, LoadMemOffset) {
955 for (int offset = 0; offset < 128; offset += 7) { 893 for (int offset = 0; offset < 128; offset += 7) {
956 byte code[] = {kExprI32LoadMem, WasmOpcodes::LoadStoreAccessOf(true), 894 byte code[] = {kExprI32LoadMem, WasmOpcodes::LoadStoreAccessOf(true),
957 static_cast<byte>(offset), kExprI8Const, 0}; 895 static_cast<byte>(offset), kExprI8Const, 0};
958 EXPECT_VERIFIES(&env_i_i, code); 896 EXPECT_VERIFIES(sigs.i_i(), code);
959 } 897 }
960 } 898 }
961 899
962 TEST_F(AstDecoderTest, StoreMemOffset) { 900 TEST_F(AstDecoderTest, StoreMemOffset) {
963 for (int offset = 0; offset < 128; offset += 7) { 901 for (int offset = 0; offset < 128; offset += 7) {
964 byte code[] = {kExprI32StoreMem, 902 byte code[] = {kExprI32StoreMem,
965 WasmOpcodes::LoadStoreAccessOf(true), 903 WasmOpcodes::LoadStoreAccessOf(true),
966 static_cast<byte>(offset), 904 static_cast<byte>(offset),
967 kExprI8Const, 905 kExprI8Const,
968 0, 906 0,
969 kExprI8Const, 907 kExprI8Const,
970 0}; 908 0};
971 EXPECT_VERIFIES(&env_i_i, code); 909 EXPECT_VERIFIES(sigs.i_i(), code);
972 } 910 }
973 } 911 }
974 912
975 TEST_F(AstDecoderTest, LoadMemOffset_varint) { 913 TEST_F(AstDecoderTest, LoadMemOffset_varint) {
976 byte code1[] = {kExprI32LoadMem, WasmOpcodes::LoadStoreAccessOf(true), 0, 914 byte code1[] = {kExprI32LoadMem, WasmOpcodes::LoadStoreAccessOf(true), 0,
977 kExprI8Const, 0}; 915 kExprI8Const, 0};
978 byte code2[] = {kExprI32LoadMem, 916 byte code2[] = {kExprI32LoadMem,
979 WasmOpcodes::LoadStoreAccessOf(true), 917 WasmOpcodes::LoadStoreAccessOf(true),
980 0x80, 918 0x80,
981 1, 919 1,
982 kExprI8Const, 920 kExprI8Const,
983 0}; 921 0};
984 byte code3[] = {kExprI32LoadMem, 922 byte code3[] = {kExprI32LoadMem,
985 WasmOpcodes::LoadStoreAccessOf(true), 923 WasmOpcodes::LoadStoreAccessOf(true),
986 0x81, 924 0x81,
987 0x82, 925 0x82,
988 5, 926 5,
989 kExprI8Const, 927 kExprI8Const,
990 0}; 928 0};
991 byte code4[] = {kExprI32LoadMem, 929 byte code4[] = {kExprI32LoadMem,
992 WasmOpcodes::LoadStoreAccessOf(true), 930 WasmOpcodes::LoadStoreAccessOf(true),
993 0x83, 931 0x83,
994 0x84, 932 0x84,
995 0x85, 933 0x85,
996 7, 934 7,
997 kExprI8Const, 935 kExprI8Const,
998 0}; 936 0};
999 937
1000 EXPECT_VERIFIES(&env_i_i, code1); 938 EXPECT_VERIFIES(sigs.i_i(), code1);
1001 EXPECT_VERIFIES(&env_i_i, code2); 939 EXPECT_VERIFIES(sigs.i_i(), code2);
1002 EXPECT_VERIFIES(&env_i_i, code3); 940 EXPECT_VERIFIES(sigs.i_i(), code3);
1003 EXPECT_VERIFIES(&env_i_i, code4); 941 EXPECT_VERIFIES(sigs.i_i(), code4);
1004 } 942 }
1005 943
1006 TEST_F(AstDecoderTest, StoreMemOffset_varint) { 944 TEST_F(AstDecoderTest, StoreMemOffset_varint) {
1007 byte code1[] = {kExprI32StoreMem, 945 byte code1[] = {kExprI32StoreMem,
1008 WasmOpcodes::LoadStoreAccessOf(true), 946 WasmOpcodes::LoadStoreAccessOf(true),
1009 0, 947 0,
1010 kExprI8Const, 948 kExprI8Const,
1011 0, 949 0,
1012 kExprI8Const, 950 kExprI8Const,
1013 0}; 951 0};
(...skipping 18 matching lines...) Expand all
1032 WasmOpcodes::LoadStoreAccessOf(true), 970 WasmOpcodes::LoadStoreAccessOf(true),
1033 0x83, 971 0x83,
1034 0x84, 972 0x84,
1035 0x85, 973 0x85,
1036 7, 974 7,
1037 kExprI8Const, 975 kExprI8Const,
1038 0, 976 0,
1039 kExprI8Const, 977 kExprI8Const,
1040 0}; 978 0};
1041 979
1042 EXPECT_VERIFIES(&env_i_i, code1); 980 EXPECT_VERIFIES(sigs.i_i(), code1);
1043 EXPECT_VERIFIES(&env_i_i, code2); 981 EXPECT_VERIFIES(sigs.i_i(), code2);
1044 EXPECT_VERIFIES(&env_i_i, code3); 982 EXPECT_VERIFIES(sigs.i_i(), code3);
1045 EXPECT_VERIFIES(&env_i_i, code4); 983 EXPECT_VERIFIES(sigs.i_i(), code4);
1046 } 984 }
1047 985
1048 TEST_F(AstDecoderTest, AllLoadMemCombinations) { 986 TEST_F(AstDecoderTest, AllLoadMemCombinations) {
1049 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 987 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1050 LocalType local_type = kLocalTypes[i]; 988 LocalType local_type = kLocalTypes[i];
1051 for (size_t j = 0; j < arraysize(machineTypes); j++) { 989 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1052 MachineType mem_type = machineTypes[j]; 990 MachineType mem_type = machineTypes[j];
1053 byte code[] = { 991 byte code[] = {
1054 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(mem_type, false)), 992 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(mem_type, false)),
1055 WasmOpcodes::LoadStoreAccessOf(false), kExprI8Const, 0}; 993 WasmOpcodes::LoadStoreAccessOf(false), kExprI8Const, 0};
1056 FunctionEnv env;
1057 FunctionSig sig(1, 0, &local_type); 994 FunctionSig sig(1, 0, &local_type);
1058 init_env(&env, &sig);
1059 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 995 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1060 EXPECT_VERIFIES(&env, code); 996 EXPECT_VERIFIES(&sig, code);
1061 } else { 997 } else {
1062 EXPECT_FAILURE(&env, code); 998 EXPECT_FAILURE(&sig, code);
1063 } 999 }
1064 } 1000 }
1065 } 1001 }
1066 } 1002 }
1067 1003
1068 TEST_F(AstDecoderTest, AllStoreMemCombinations) { 1004 TEST_F(AstDecoderTest, AllStoreMemCombinations) {
1069 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1005 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1070 LocalType local_type = kLocalTypes[i]; 1006 LocalType local_type = kLocalTypes[i];
1071 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1007 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1072 MachineType mem_type = machineTypes[j]; 1008 MachineType mem_type = machineTypes[j];
1073 byte code[] = { 1009 byte code[] = {
1074 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(mem_type, true)), 1010 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(mem_type, true)),
1075 WasmOpcodes::LoadStoreAccessOf(false), 1011 WasmOpcodes::LoadStoreAccessOf(false),
1076 kExprI8Const, 1012 kExprI8Const,
1077 0, 1013 0,
1078 kExprGetLocal, 1014 kExprGetLocal,
1079 0}; 1015 0};
1080 FunctionEnv env;
1081 FunctionSig sig(0, 1, &local_type); 1016 FunctionSig sig(0, 1, &local_type);
1082 init_env(&env, &sig);
1083 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1017 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1084 EXPECT_VERIFIES(&env, code); 1018 EXPECT_VERIFIES(&sig, code);
1085 } else { 1019 } else {
1086 EXPECT_FAILURE(&env, code); 1020 EXPECT_FAILURE(&sig, code);
1087 } 1021 }
1088 } 1022 }
1089 } 1023 }
1090 } 1024 }
1091 1025
1092 1026
1093 namespace { 1027 namespace {
1094 // A helper for tests that require a module environment for functions and 1028 // A helper for tests that require a module environment for functions and
1095 // globals. 1029 // globals.
1096 class TestModuleEnv : public ModuleEnv { 1030 class TestModuleEnv : public ModuleEnv {
(...skipping 23 matching lines...) Expand all
1120 CHECK(mod.import_table.size() <= 127); 1054 CHECK(mod.import_table.size() <= 127);
1121 return static_cast<byte>(mod.import_table.size() - 1); 1055 return static_cast<byte>(mod.import_table.size() - 1);
1122 } 1056 }
1123 1057
1124 private: 1058 private:
1125 WasmModule mod; 1059 WasmModule mod;
1126 }; 1060 };
1127 } // namespace 1061 } // namespace
1128 1062
1129 TEST_F(AstDecoderTest, SimpleCalls) { 1063 TEST_F(AstDecoderTest, SimpleCalls) {
1130 FunctionEnv* env = &env_i_i; 1064 FunctionSig* sig = sigs.i_i();
1131 TestModuleEnv module_env; 1065 TestModuleEnv module_env;
1132 env->module = &module_env; 1066 module = &module_env;
1133 1067
1134 module_env.AddFunction(sigs.i_v()); 1068 module_env.AddFunction(sigs.i_v());
1135 module_env.AddFunction(sigs.i_i()); 1069 module_env.AddFunction(sigs.i_i());
1136 module_env.AddFunction(sigs.i_ii()); 1070 module_env.AddFunction(sigs.i_ii());
1137 1071
1138 EXPECT_VERIFIES_INLINE(env, WASM_CALL_FUNCTION(0)); 1072 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION(0));
1139 EXPECT_VERIFIES_INLINE(env, WASM_CALL_FUNCTION(1, WASM_I8(27))); 1073 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION(1, WASM_I8(27)));
1140 EXPECT_VERIFIES_INLINE(env, WASM_CALL_FUNCTION(2, WASM_I8(37), WASM_I8(77))); 1074 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION(2, WASM_I8(37), WASM_I8(77)));
1141 } 1075 }
1142 1076
1143 TEST_F(AstDecoderTest, CallsWithTooFewArguments) { 1077 TEST_F(AstDecoderTest, CallsWithTooFewArguments) {
1144 FunctionEnv* env = &env_i_i; 1078 FunctionSig* sig = sigs.i_i();
1145 TestModuleEnv module_env; 1079 TestModuleEnv module_env;
1146 env->module = &module_env; 1080 module = &module_env;
1147 1081
1148 module_env.AddFunction(sigs.i_i()); 1082 module_env.AddFunction(sigs.i_i());
1149 module_env.AddFunction(sigs.i_ii()); 1083 module_env.AddFunction(sigs.i_ii());
1150 module_env.AddFunction(sigs.f_ff()); 1084 module_env.AddFunction(sigs.f_ff());
1151 1085
1152 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION0(0)); 1086 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION0(0));
1153 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_ZERO)); 1087 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(1, WASM_ZERO));
1154 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(2, WASM_GET_LOCAL(0))); 1088 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(2, WASM_GET_LOCAL(0)));
1155 } 1089 }
1156 1090
1157 TEST_F(AstDecoderTest, CallsWithSpilloverArgs) { 1091 TEST_F(AstDecoderTest, CallsWithSpilloverArgs) {
1158 static LocalType a_i_ff[] = {kAstI32, kAstF32, kAstF32}; 1092 static LocalType a_i_ff[] = {kAstI32, kAstF32, kAstF32};
1159 FunctionSig sig_i_ff(1, 2, a_i_ff); 1093 FunctionSig sig_i_ff(1, 2, a_i_ff);
1160 FunctionEnv env_i_ff;
1161 init_env(&env_i_ff, &sig_i_ff);
1162 1094
1163 TestModuleEnv module_env; 1095 TestModuleEnv module_env;
1164 env_i_ff.module = &module_env; 1096 module = &module_env;
1165 env_i_i.module = &module_env;
1166 env_f_ff.module = &module_env;
1167 1097
1168 module_env.AddFunction(&sig_i_ff); 1098 module_env.AddFunction(&sig_i_ff);
1169 1099
1170 EXPECT_VERIFIES_INLINE(&env_i_i, 1100 EXPECT_VERIFIES_INLINE(sigs.i_i(),
1171 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1))); 1101 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1)));
1172 1102
1173 EXPECT_VERIFIES_INLINE(&env_i_ff, 1103 EXPECT_VERIFIES_INLINE(sigs.i_ff(),
1174 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1))); 1104 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1)));
1175 1105
1176 EXPECT_FAILURE_INLINE(&env_f_ff, 1106 EXPECT_FAILURE_INLINE(sigs.f_ff(),
1177 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1))); 1107 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1)));
1178 1108
1179 EXPECT_FAILURE_INLINE( 1109 EXPECT_FAILURE_INLINE(
1180 &env_i_i, 1110 sigs.i_i(),
1181 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1), WASM_F32(0.2))); 1111 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1), WASM_F32(0.2)));
1182 1112
1183 EXPECT_VERIFIES_INLINE( 1113 EXPECT_VERIFIES_INLINE(
1184 &env_f_ff, 1114 sigs.f_ff(),
1185 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1), WASM_F32(11))); 1115 WASM_CALL_FUNCTION(0, WASM_F32(0.1), WASM_F32(0.1), WASM_F32(11)));
1186 } 1116 }
1187 1117
1188 TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) { 1118 TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) {
1189 FunctionEnv* env = &env_i_i; 1119 FunctionSig* sig = sigs.i_i();
1190 TestModuleEnv module_env; 1120 TestModuleEnv module_env;
1191 env->module = &module_env; 1121 module = &module_env;
1192 1122
1193 module_env.AddFunction(sigs.i_i()); 1123 module_env.AddFunction(sigs.i_i());
1194 1124
1195 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_I64(17))); 1125 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(0, WASM_I64(17)));
1196 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_F32(17.1))); 1126 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(0, WASM_F32(17.1)));
1197 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_F64(17.1))); 1127 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(0, WASM_F64(17.1)));
1198 } 1128 }
1199 1129
1200 TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) { 1130 TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) {
1201 FunctionEnv* env = &env_i_i; 1131 FunctionSig* sig = sigs.i_i();
1202 TestModuleEnv module_env; 1132 TestModuleEnv module_env;
1203 env->module = &module_env; 1133 module = &module_env;
1204 1134
1205 module_env.AddFunction(sigs.i_f()); 1135 module_env.AddFunction(sigs.i_f());
1206 1136
1207 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_I8(17))); 1137 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(0, WASM_I8(17)));
1208 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_I64(27))); 1138 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(0, WASM_I64(27)));
1209 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(0, WASM_F64(37.2))); 1139 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(0, WASM_F64(37.2)));
1210 1140
1211 module_env.AddFunction(sigs.i_d()); 1141 module_env.AddFunction(sigs.i_d());
1212 1142
1213 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_I8(16))); 1143 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(1, WASM_I8(16)));
1214 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_I64(16))); 1144 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(1, WASM_I64(16)));
1215 EXPECT_FAILURE_INLINE(env, WASM_CALL_FUNCTION(1, WASM_F32(17.6))); 1145 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION(1, WASM_F32(17.6)));
1216 } 1146 }
1217 1147
1218 TEST_F(AstDecoderTest, SimpleIndirectCalls) { 1148 TEST_F(AstDecoderTest, SimpleIndirectCalls) {
1219 FunctionEnv* env = &env_i_i; 1149 FunctionSig* sig = sigs.i_i();
1220 TestModuleEnv module_env; 1150 TestModuleEnv module_env;
1221 env->module = &module_env; 1151 module = &module_env;
1222 1152
1223 byte f0 = module_env.AddSignature(sigs.i_v()); 1153 byte f0 = module_env.AddSignature(sigs.i_v());
1224 byte f1 = module_env.AddSignature(sigs.i_i()); 1154 byte f1 = module_env.AddSignature(sigs.i_i());
1225 byte f2 = module_env.AddSignature(sigs.i_ii()); 1155 byte f2 = module_env.AddSignature(sigs.i_ii());
1226 1156
1227 EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_ZERO)); 1157 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO));
1228 EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I8(22))); 1158 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I8(22)));
1229 EXPECT_VERIFIES_INLINE( 1159 EXPECT_VERIFIES_INLINE(
1230 env, WASM_CALL_INDIRECT(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72))); 1160 sig, WASM_CALL_INDIRECT(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72)));
1231 } 1161 }
1232 1162
1233 TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) { 1163 TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) {
1234 FunctionEnv* env = &env_i_i; 1164 FunctionSig* sig = sigs.i_i();
1235 TestModuleEnv module_env; 1165 TestModuleEnv module_env;
1236 env->module = &module_env; 1166 module = &module_env;
1237 1167
1238 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(0, WASM_ZERO)); 1168 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1239 module_env.AddSignature(sigs.i_v()); 1169 module_env.AddSignature(sigs.i_v());
1240 EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT0(0, WASM_ZERO)); 1170 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1241 1171
1242 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(1, WASM_ZERO, WASM_I8(22))); 1172 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(1, WASM_ZERO, WASM_I8(22)));
1243 module_env.AddSignature(sigs.i_i()); 1173 module_env.AddSignature(sigs.i_i());
1244 EXPECT_VERIFIES_INLINE(env, WASM_CALL_INDIRECT(1, WASM_ZERO, WASM_I8(27))); 1174 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT(1, WASM_ZERO, WASM_I8(27)));
1245 1175
1246 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(2, WASM_ZERO, WASM_I8(27))); 1176 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(2, WASM_ZERO, WASM_I8(27)));
1247 } 1177 }
1248 1178
1249 TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) { 1179 TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) {
1250 FunctionEnv* env = &env_i_i; 1180 FunctionSig* sig = sigs.i_i();
1251 TestModuleEnv module_env; 1181 TestModuleEnv module_env;
1252 env->module = &module_env; 1182 module = &module_env;
1253 1183
1254 byte f0 = module_env.AddFunction(sigs.i_f()); 1184 byte f0 = module_env.AddFunction(sigs.i_f());
1255 1185
1256 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_I8(17))); 1186 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_I8(17)));
1257 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_I64(27))); 1187 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_I64(27)));
1258 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_F64(37.2))); 1188 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(f0, WASM_ZERO, WASM_F64(37.2)));
1259 1189
1260 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_I8(17))); 1190 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I8(17)));
1261 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_I64(27))); 1191 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I64(27)));
1262 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2))); 1192 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2)));
1263 1193
1264 byte f1 = module_env.AddFunction(sigs.i_d()); 1194 byte f1 = module_env.AddFunction(sigs.i_d());
1265 1195
1266 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I8(16))); 1196 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I8(16)));
1267 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I64(16))); 1197 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_I64(16)));
1268 EXPECT_FAILURE_INLINE(env, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_F32(17.6))); 1198 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT(f1, WASM_ZERO, WASM_F32(17.6)));
1269 } 1199 }
1270 1200
1271 TEST_F(AstDecoderTest, SimpleImportCalls) { 1201 TEST_F(AstDecoderTest, SimpleImportCalls) {
1272 FunctionEnv* env = &env_i_i; 1202 FunctionSig* sig = sigs.i_i();
1273 TestModuleEnv module_env; 1203 TestModuleEnv module_env;
1274 env->module = &module_env; 1204 module = &module_env;
1275 1205
1276 byte f0 = module_env.AddImport(sigs.i_v()); 1206 byte f0 = module_env.AddImport(sigs.i_v());
1277 byte f1 = module_env.AddImport(sigs.i_i()); 1207 byte f1 = module_env.AddImport(sigs.i_i());
1278 byte f2 = module_env.AddImport(sigs.i_ii()); 1208 byte f2 = module_env.AddImport(sigs.i_ii());
1279 1209
1280 EXPECT_VERIFIES_INLINE(env, WASM_CALL_IMPORT0(f0)); 1210 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT0(f0));
1281 EXPECT_VERIFIES_INLINE(env, WASM_CALL_IMPORT(f1, WASM_I8(22))); 1211 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT(f1, WASM_I8(22)));
1282 EXPECT_VERIFIES_INLINE(env, WASM_CALL_IMPORT(f2, WASM_I8(32), WASM_I8(72))); 1212 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT(f2, WASM_I8(32), WASM_I8(72)));
1283 } 1213 }
1284 1214
1285 TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) { 1215 TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) {
1286 FunctionEnv* env = &env_i_i; 1216 FunctionSig* sig = sigs.i_i();
1287 TestModuleEnv module_env; 1217 TestModuleEnv module_env;
1288 env->module = &module_env; 1218 module = &module_env;
1289 1219
1290 byte f0 = module_env.AddImport(sigs.i_f()); 1220 byte f0 = module_env.AddImport(sigs.i_f());
1291 1221
1292 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT0(f0)); 1222 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f0));
1293 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f0, WASM_I8(17))); 1223 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT(f0, WASM_I8(17)));
1294 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f0, WASM_I64(27))); 1224 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT(f0, WASM_I64(27)));
1295 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f0, WASM_F64(37.2))); 1225 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT(f0, WASM_F64(37.2)));
1296 1226
1297 byte f1 = module_env.AddImport(sigs.i_d()); 1227 byte f1 = module_env.AddImport(sigs.i_d());
1298 1228
1299 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT0(f1)); 1229 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f1));
1300 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f1, WASM_I8(16))); 1230 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT(f1, WASM_I8(16)));
1301 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f1, WASM_I64(16))); 1231 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT(f1, WASM_I64(16)));
1302 EXPECT_FAILURE_INLINE(env, WASM_CALL_IMPORT(f1, WASM_F32(17.6))); 1232 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT(f1, WASM_F32(17.6)));
1303 } 1233 }
1304 1234
1305 TEST_F(AstDecoderTest, Int32Globals) { 1235 TEST_F(AstDecoderTest, Int32Globals) {
1306 FunctionEnv* env = &env_i_i; 1236 FunctionSig* sig = sigs.i_i();
1307 TestModuleEnv module_env; 1237 TestModuleEnv module_env;
1308 env->module = &module_env; 1238 module = &module_env;
1309 1239
1310 module_env.AddGlobal(MachineType::Int8()); 1240 module_env.AddGlobal(MachineType::Int8());
1311 module_env.AddGlobal(MachineType::Uint8()); 1241 module_env.AddGlobal(MachineType::Uint8());
1312 module_env.AddGlobal(MachineType::Int16()); 1242 module_env.AddGlobal(MachineType::Int16());
1313 module_env.AddGlobal(MachineType::Uint16()); 1243 module_env.AddGlobal(MachineType::Uint16());
1314 module_env.AddGlobal(MachineType::Int32()); 1244 module_env.AddGlobal(MachineType::Int32());
1315 module_env.AddGlobal(MachineType::Uint32()); 1245 module_env.AddGlobal(MachineType::Uint32());
1316 1246
1317 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0)); 1247 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1318 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(1)); 1248 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(1));
1319 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(2)); 1249 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(2));
1320 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(3)); 1250 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(3));
1321 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(4)); 1251 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(4));
1322 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(5)); 1252 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(5));
1323 1253
1324 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1254 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1325 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0))); 1255 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1326 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0))); 1256 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0)));
1327 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0))); 1257 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0)));
1328 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(4, WASM_GET_LOCAL(0))); 1258 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(4, WASM_GET_LOCAL(0)));
1329 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(5, WASM_GET_LOCAL(0))); 1259 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(5, WASM_GET_LOCAL(0)));
1330 } 1260 }
1331 1261
1332 TEST_F(AstDecoderTest, Int32Globals_fail) { 1262 TEST_F(AstDecoderTest, Int32Globals_fail) {
1333 FunctionEnv* env = &env_i_i; 1263 FunctionSig* sig = sigs.i_i();
1334 TestModuleEnv module_env; 1264 TestModuleEnv module_env;
1335 env->module = &module_env; 1265 module = &module_env;
1336 1266
1337 module_env.AddGlobal(MachineType::Int64()); 1267 module_env.AddGlobal(MachineType::Int64());
1338 module_env.AddGlobal(MachineType::Uint64()); 1268 module_env.AddGlobal(MachineType::Uint64());
1339 module_env.AddGlobal(MachineType::Float32()); 1269 module_env.AddGlobal(MachineType::Float32());
1340 module_env.AddGlobal(MachineType::Float64()); 1270 module_env.AddGlobal(MachineType::Float64());
1341 1271
1342 EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(0)); 1272 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(0));
1343 EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(1)); 1273 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(1));
1344 EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(2)); 1274 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(2));
1345 EXPECT_FAILURE_INLINE(env, WASM_LOAD_GLOBAL(3)); 1275 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(3));
1346 1276
1347 EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1277 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1348 EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0))); 1278 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1349 EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0))); 1279 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0)));
1350 EXPECT_FAILURE_INLINE(env, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0))); 1280 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0)));
1351 } 1281 }
1352 1282
1353 TEST_F(AstDecoderTest, Int64Globals) { 1283 TEST_F(AstDecoderTest, Int64Globals) {
1354 FunctionEnv* env = &env_l_l; 1284 FunctionSig* sig = sigs.l_l();
1355 TestModuleEnv module_env; 1285 TestModuleEnv module_env;
1356 env->module = &module_env; 1286 module = &module_env;
1357 1287
1358 module_env.AddGlobal(MachineType::Int64()); 1288 module_env.AddGlobal(MachineType::Int64());
1359 module_env.AddGlobal(MachineType::Uint64()); 1289 module_env.AddGlobal(MachineType::Uint64());
1360 1290
1361 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0)); 1291 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1362 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(1)); 1292 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(1));
1363 1293
1364 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1294 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1365 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0))); 1295 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1366 } 1296 }
1367 1297
1368 TEST_F(AstDecoderTest, Float32Globals) { 1298 TEST_F(AstDecoderTest, Float32Globals) {
1369 FunctionEnv env_f_ff; 1299 FunctionSig* sig = sigs.f_ff();
1370 FunctionEnv* env = &env_f_ff;
1371 init_env(env, sigs.f_ff());
1372 TestModuleEnv module_env; 1300 TestModuleEnv module_env;
1373 env->module = &module_env; 1301 module = &module_env;
1374 1302
1375 module_env.AddGlobal(MachineType::Float32()); 1303 module_env.AddGlobal(MachineType::Float32());
1376 1304
1377 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0)); 1305 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1378 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1306 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1379 } 1307 }
1380 1308
1381 TEST_F(AstDecoderTest, Float64Globals) { 1309 TEST_F(AstDecoderTest, Float64Globals) {
1382 FunctionEnv env_d_dd; 1310 FunctionSig* sig = sigs.d_dd();
1383 FunctionEnv* env = &env_d_dd;
1384 init_env(env, sigs.d_dd());
1385 TestModuleEnv module_env; 1311 TestModuleEnv module_env;
1386 env->module = &module_env; 1312 module = &module_env;
1387 1313
1388 module_env.AddGlobal(MachineType::Float64()); 1314 module_env.AddGlobal(MachineType::Float64());
1389 1315
1390 EXPECT_VERIFIES_INLINE(env, WASM_LOAD_GLOBAL(0)); 1316 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1391 EXPECT_VERIFIES_INLINE(env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1317 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1392 } 1318 }
1393 1319
1394 TEST_F(AstDecoderTest, AllLoadGlobalCombinations) { 1320 TEST_F(AstDecoderTest, AllLoadGlobalCombinations) {
1395 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1321 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1396 LocalType local_type = kLocalTypes[i]; 1322 LocalType local_type = kLocalTypes[i];
1397 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1323 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1398 MachineType mem_type = machineTypes[j]; 1324 MachineType mem_type = machineTypes[j];
1399 FunctionEnv env;
1400 FunctionSig sig(1, 0, &local_type); 1325 FunctionSig sig(1, 0, &local_type);
1401 TestModuleEnv module_env; 1326 TestModuleEnv module_env;
1402 init_env(&env, &sig); 1327 module = &module_env;
1403 env.module = &module_env;
1404 module_env.AddGlobal(mem_type); 1328 module_env.AddGlobal(mem_type);
1405 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1329 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1406 EXPECT_VERIFIES_INLINE(&env, WASM_LOAD_GLOBAL(0)); 1330 EXPECT_VERIFIES_INLINE(&sig, WASM_LOAD_GLOBAL(0));
1407 } else { 1331 } else {
1408 EXPECT_FAILURE_INLINE(&env, WASM_LOAD_GLOBAL(0)); 1332 EXPECT_FAILURE_INLINE(&sig, WASM_LOAD_GLOBAL(0));
1409 } 1333 }
1410 } 1334 }
1411 } 1335 }
1412 } 1336 }
1413 1337
1414 TEST_F(AstDecoderTest, AllStoreGlobalCombinations) { 1338 TEST_F(AstDecoderTest, AllStoreGlobalCombinations) {
1415 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1339 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1416 LocalType local_type = kLocalTypes[i]; 1340 LocalType local_type = kLocalTypes[i];
1417 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1341 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1418 MachineType mem_type = machineTypes[j]; 1342 MachineType mem_type = machineTypes[j];
1419 FunctionEnv env;
1420 FunctionSig sig(0, 1, &local_type); 1343 FunctionSig sig(0, 1, &local_type);
1421 TestModuleEnv module_env; 1344 TestModuleEnv module_env;
1422 init_env(&env, &sig); 1345 module = &module_env;
1423 env.module = &module_env;
1424 module_env.AddGlobal(mem_type); 1346 module_env.AddGlobal(mem_type);
1425 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1347 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1426 EXPECT_VERIFIES_INLINE(&env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1348 EXPECT_VERIFIES_INLINE(&sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1427 } else { 1349 } else {
1428 EXPECT_FAILURE_INLINE(&env, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0))); 1350 EXPECT_FAILURE_INLINE(&sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1429 } 1351 }
1430 } 1352 }
1431 } 1353 }
1432 } 1354 }
1433 1355
1434 TEST_F(AstDecoderTest, BreakNesting1) { 1356 TEST_F(AstDecoderTest, BreakNesting1) {
1435 for (int i = 0; i < 5; i++) { 1357 for (int i = 0; i < 5; i++) {
1436 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p) 1358 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p)
1437 byte code[] = {WASM_BLOCK( 1359 byte code[] = {WASM_BLOCK(
1438 2, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i, WASM_ZERO)), 1360 2, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i, WASM_ZERO)),
1439 WASM_SET_LOCAL(0, WASM_I8(1))), 1361 WASM_SET_LOCAL(0, WASM_I8(1))),
1440 WASM_GET_LOCAL(0))}; 1362 WASM_GET_LOCAL(0))};
1441 if (i < 3) { 1363 if (i < 3) {
1442 EXPECT_VERIFIES(&env_i_i, code); 1364 EXPECT_VERIFIES(sigs.i_i(), code);
1443 } else { 1365 } else {
1444 EXPECT_FAILURE(&env_i_i, code); 1366 EXPECT_FAILURE(sigs.i_i(), code);
1445 } 1367 }
1446 } 1368 }
1447 } 1369 }
1448 1370
1449 TEST_F(AstDecoderTest, BreakNesting2) { 1371 TEST_F(AstDecoderTest, BreakNesting2) {
1450 env_v_v.AddLocals(kAstI32, 1); 1372 AddLocals(kAstI32, 1);
1451 for (int i = 0; i < 5; i++) { 1373 for (int i = 0; i < 5; i++) {
1452 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) (return p)) (11) 1374 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) (return p)) (11)
binji 2016/03/02 22:51:38 (get p) => 0
titzer 2016/03/02 23:03:28 Done.
1453 byte code[] = { 1375 byte code[] = {WASM_BLOCK(1, WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BREAK(i)),
1454 WASM_BLOCK(1, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(i)), 1376 WASM_SET_LOCAL(0, WASM_I8(1)))),
1455 WASM_SET_LOCAL(0, WASM_I8(1)))), 1377 WASM_I8(11)};
1456 WASM_I8(11)};
1457 if (i < 2) { 1378 if (i < 2) {
1458 EXPECT_VERIFIES(&env_v_v, code); 1379 EXPECT_VERIFIES(sigs.v_v(), code);
1459 } else { 1380 } else {
1460 EXPECT_FAILURE(&env_v_v, code); 1381 EXPECT_FAILURE(sigs.v_v(), code);
1461 } 1382 }
1462 } 1383 }
1463 } 1384 }
1464 1385
1465 TEST_F(AstDecoderTest, BreakNesting3) { 1386 TEST_F(AstDecoderTest, BreakNesting3) {
1466 env_v_v.AddLocals(kAstI32, 1);
1467 for (int i = 0; i < 5; i++) { 1387 for (int i = 0; i < 5; i++) {
1468 // (block[1] (loop[1] (block[1] (if (get p) break[N]) 1388 // (block[1] (loop[1] (block[1] (if (get p) break[N])
binji 2016/03/02 22:51:38 here too
titzer 2016/03/02 23:03:28 Done.
1469 byte code[] = {WASM_BLOCK( 1389 byte code[] = {WASM_BLOCK(
1470 1, WASM_LOOP( 1390 1, WASM_LOOP(1, WASM_BLOCK(1, WASM_IF(WASM_ZERO, WASM_BREAK(i)))))};
1471 1, WASM_BLOCK(1, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(i)))))};
1472 if (i < 3) { 1391 if (i < 3) {
1473 EXPECT_VERIFIES(&env_v_v, code); 1392 EXPECT_VERIFIES(sigs.v_v(), code);
1474 } else { 1393 } else {
1475 EXPECT_FAILURE(&env_v_v, code); 1394 EXPECT_FAILURE(sigs.v_v(), code);
1476 } 1395 }
1477 } 1396 }
1478 } 1397 }
1479 1398
1480 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) { 1399 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) {
1481 EXPECT_FAILURE_INLINE( 1400 EXPECT_FAILURE_INLINE(
1482 &env_i_i, WASM_BLOCK(2, WASM_BRV_IF_ZERO(0, WASM_I8(7)), WASM_F32(7.7))); 1401 sigs.i_i(),
1402 WASM_BLOCK(2, WASM_BRV_IF_ZERO(0, WASM_I8(7)), WASM_F32(7.7)));
1483 1403
1484 EXPECT_FAILURE_INLINE(&env_i_i, 1404 EXPECT_FAILURE_INLINE(sigs.i_i(),
1485 WASM_BLOCK(2, WASM_BRV_IF_ZERO(0, WASM_I8(7)), 1405 WASM_BLOCK(2, WASM_BRV_IF_ZERO(0, WASM_I8(7)),
1486 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)))); 1406 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1487 EXPECT_FAILURE_INLINE(&env_i_i, 1407 EXPECT_FAILURE_INLINE(sigs.i_i(),
1488 WASM_BLOCK(3, WASM_BRV_IF_ZERO(0, WASM_I8(8)), 1408 WASM_BLOCK(3, WASM_BRV_IF_ZERO(0, WASM_I8(8)),
1489 WASM_BRV_IF_ZERO(0, WASM_I8(0)), 1409 WASM_BRV_IF_ZERO(0, WASM_I8(0)),
1490 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)))); 1410 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1491 EXPECT_FAILURE_INLINE(&env_i_i, WASM_BLOCK(3, WASM_BRV_IF_ZERO(0, WASM_I8(9)), 1411 EXPECT_FAILURE_INLINE(sigs.i_i(),
1492 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)), 1412 WASM_BLOCK(3, WASM_BRV_IF_ZERO(0, WASM_I8(9)),
1493 WASM_BRV_IF_ZERO(0, WASM_I8(11)))); 1413 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)),
1414 WASM_BRV_IF_ZERO(0, WASM_I8(11))));
1494 } 1415 }
1495 1416
1496 TEST_F(AstDecoderTest, BreakNesting_6_levels) { 1417 TEST_F(AstDecoderTest, BreakNesting_6_levels) {
1497 for (int mask = 0; mask < 64; mask++) { 1418 for (int mask = 0; mask < 64; mask++) {
1498 for (int i = 0; i < 14; i++) { 1419 for (int i = 0; i < 14; i++) {
1499 byte code[] = { 1420 byte code[] = {
1500 kExprBlock, 1, // -- 1421 kExprBlock, 1, // --
1501 kExprBlock, 1, // -- 1422 kExprBlock, 1, // --
1502 kExprBlock, 1, // -- 1423 kExprBlock, 1, // --
1503 kExprBlock, 1, // -- 1424 kExprBlock, 1, // --
1504 kExprBlock, 1, // -- 1425 kExprBlock, 1, // --
1505 kExprBlock, 1, // -- 1426 kExprBlock, 1, // --
1506 kExprBr, static_cast<byte>(i), 1427 kExprBr, static_cast<byte>(i),
1507 kExprNop // -- 1428 kExprNop // --
1508 }; 1429 };
1509 1430
1510 int depth = 6; 1431 int depth = 6;
1511 for (int l = 0; l < 6; l++) { 1432 for (int l = 0; l < 6; l++) {
1512 if (mask & (1 << l)) { 1433 if (mask & (1 << l)) {
1513 code[l * 2] = kExprLoop; 1434 code[l * 2] = kExprLoop;
1514 depth++; 1435 depth++;
1515 } 1436 }
1516 } 1437 }
1517 1438
1518 if (i < depth) { 1439 if (i < depth) {
1519 EXPECT_VERIFIES(&env_v_v, code); 1440 EXPECT_VERIFIES(sigs.v_v(), code);
1520 } else { 1441 } else {
1521 EXPECT_FAILURE(&env_v_v, code); 1442 EXPECT_FAILURE(sigs.v_v(), code);
1522 } 1443 }
1523 } 1444 }
1524 } 1445 }
1525 } 1446 }
1526 1447
1527 TEST_F(AstDecoderTest, ExprBreak_TypeCheck) { 1448 TEST_F(AstDecoderTest, ExprBreak_TypeCheck) {
1528 FunctionEnv* envs[] = {&env_i_i, &env_l_l, &env_f_ff, &env_d_dd}; 1449 FunctionSig* sigarray[] = {sigs.i_i(), sigs.l_l(), sigs.f_ff(), sigs.d_dd()};
1529 for (size_t i = 0; i < arraysize(envs); i++) { 1450 for (size_t i = 0; i < arraysize(sigarray); i++) {
1530 FunctionEnv* env = envs[i]; 1451 FunctionSig* sig = sigarray[i];
1531 // unify X and X => OK 1452 // unify X and X => OK
1532 EXPECT_VERIFIES_INLINE( 1453 EXPECT_VERIFIES_INLINE(
1533 env, WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), 1454 sig, WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1534 WASM_GET_LOCAL(0))); 1455 WASM_GET_LOCAL(0)));
1535 } 1456 }
1536 1457
1537 // unify i32 and f32 => fail 1458 // unify i32 and f32 => fail
1538 EXPECT_FAILURE_INLINE( 1459 EXPECT_FAILURE_INLINE(
1539 &env_i_i, 1460 sigs.i_i(),
1540 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2))); 1461 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2)));
1541 1462
1542 // unify f64 and f64 => OK 1463 // unify f64 and f64 => OK
1543 EXPECT_VERIFIES_INLINE( 1464 EXPECT_VERIFIES_INLINE(
1544 &env_d_dd, 1465 sigs.d_dd(),
1545 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), 1466 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1546 WASM_F64(1.2))); 1467 WASM_F64(1.2)));
1547 } 1468 }
1548 1469
1549 TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) { 1470 TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) {
1550 byte code1[] = {WASM_BLOCK(2, 1471 byte code1[] = {WASM_BLOCK(2,
1551 WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), 1472 WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1552 WASM_GET_LOCAL(1))}; 1473 WASM_GET_LOCAL(1))};
1553 byte code2[] = { 1474 byte code2[] = {
1554 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))), 1475 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))),
1555 WASM_GET_LOCAL(1))}; 1476 WASM_GET_LOCAL(1))};
1556 1477
1557 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1478 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1558 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1479 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1559 FunctionEnv env;
1560 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]}; 1480 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1561 FunctionSig sig(1, 2, storage); 1481 FunctionSig sig(1, 2, storage);
1562 init_env(&env, &sig);
1563 1482
1564 if (i == j) { 1483 if (i == j) {
1565 EXPECT_VERIFIES(&env, code1); 1484 EXPECT_VERIFIES(&sig, code1);
1566 EXPECT_VERIFIES(&env, code2); 1485 EXPECT_VERIFIES(&sig, code2);
1567 } else { 1486 } else {
1568 EXPECT_FAILURE(&env, code1); 1487 EXPECT_FAILURE(&sig, code1);
1569 EXPECT_FAILURE(&env, code2); 1488 EXPECT_FAILURE(&sig, code2);
1570 } 1489 }
1571 } 1490 }
1572 } 1491 }
1573 } 1492 }
1574 1493
1575 TEST_F(AstDecoderTest, ExprBr_Unify) { 1494 TEST_F(AstDecoderTest, ExprBr_Unify) {
1576 FunctionEnv env;
1577
1578 for (int which = 0; which < 2; which++) { 1495 for (int which = 0; which < 2; which++) {
1579 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1496 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1580 LocalType type = kLocalTypes[i]; 1497 LocalType type = kLocalTypes[i];
1581 LocalType storage[] = {kAstI32, kAstI32, type}; 1498 LocalType storage[] = {kAstI32, kAstI32, type};
1582 FunctionSig sig(1, 2, storage); 1499 FunctionSig sig(1, 2, storage);
1583 init_env(&env, &sig); // (i32, X) -> i32
1584 1500
1585 byte code1[] = { 1501 byte code1[] = {
1586 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(which))), 1502 WASM_BLOCK(2, WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(which))),
1587 WASM_GET_LOCAL(which ^ 1))}; 1503 WASM_GET_LOCAL(which ^ 1))};
1588 byte code2[] = { 1504 byte code2[] = {
1589 WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))), 1505 WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))),
1590 WASM_GET_LOCAL(which ^ 1))}; 1506 WASM_GET_LOCAL(which ^ 1))};
1591 1507
1592 1508
1593 if (type == kAstI32) { 1509 if (type == kAstI32) {
1594 EXPECT_VERIFIES(&env, code1); 1510 EXPECT_VERIFIES(&sig, code1);
1595 EXPECT_VERIFIES(&env, code2); 1511 EXPECT_VERIFIES(&sig, code2);
1596 } else { 1512 } else {
1597 EXPECT_FAILURE(&env, code1); 1513 EXPECT_FAILURE(&sig, code1);
1598 EXPECT_FAILURE(&env, code2); 1514 EXPECT_FAILURE(&sig, code2);
1599 } 1515 }
1600 } 1516 }
1601 } 1517 }
1602 } 1518 }
1603 1519
1604 TEST_F(AstDecoderTest, ExprBrIf_cond_type) { 1520 TEST_F(AstDecoderTest, ExprBrIf_cond_type) {
1605 FunctionEnv env;
1606 byte code[] = { 1521 byte code[] = {
1607 WASM_BLOCK(1, WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))}; 1522 WASM_BLOCK(1, WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))};
1608 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1523 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1609 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1524 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1610 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]}; 1525 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]};
1611 FunctionSig sig(0, 2, types); 1526 FunctionSig sig(0, 2, types);
1612 init_env(&env, &sig);
1613 1527
1614 if (types[1] == kAstI32) { 1528 if (types[1] == kAstI32) {
1615 EXPECT_VERIFIES(&env, code); 1529 EXPECT_VERIFIES(&sig, code);
1616 } else { 1530 } else {
1617 EXPECT_FAILURE(&env, code); 1531 EXPECT_FAILURE(&sig, code);
1618 } 1532 }
1619 } 1533 }
1620 } 1534 }
1621 } 1535 }
1622 1536
1623 TEST_F(AstDecoderTest, ExprBrIf_val_type) { 1537 TEST_F(AstDecoderTest, ExprBrIf_val_type) {
1624 FunctionEnv env;
1625 byte code[] = { 1538 byte code[] = {
1626 WASM_BLOCK(2, WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)), 1539 WASM_BLOCK(2, WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)),
1627 WASM_GET_LOCAL(0))}; 1540 WASM_GET_LOCAL(0))};
1628 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1541 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1629 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1542 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1630 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j], 1543 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j],
1631 kAstI32}; 1544 kAstI32};
1632 FunctionSig sig(1, 3, types); 1545 FunctionSig sig(1, 3, types);
1633 init_env(&env, &sig);
1634 1546
1635 if (i == j) { 1547 if (i == j) {
1636 EXPECT_VERIFIES(&env, code); 1548 EXPECT_VERIFIES(&sig, code);
1637 } else { 1549 } else {
1638 EXPECT_FAILURE(&env, code); 1550 EXPECT_FAILURE(&sig, code);
1639 } 1551 }
1640 } 1552 }
1641 } 1553 }
1642 } 1554 }
1643 1555
1644 TEST_F(AstDecoderTest, ExprBrIf_Unify) { 1556 TEST_F(AstDecoderTest, ExprBrIf_Unify) {
1645 FunctionEnv env;
1646
1647 for (int which = 0; which < 2; which++) { 1557 for (int which = 0; which < 2; which++) {
1648 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1558 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1649 LocalType type = kLocalTypes[i]; 1559 LocalType type = kLocalTypes[i];
1650 LocalType storage[] = {kAstI32, kAstI32, type}; 1560 LocalType storage[] = {kAstI32, kAstI32, type};
1651 FunctionSig sig(1, 2, storage); 1561 FunctionSig sig(1, 2, storage);
1652 init_env(&env, &sig); // (i32, X) -> i32
1653 1562
1654 byte code1[] = {WASM_BLOCK(2, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)), 1563 byte code1[] = {WASM_BLOCK(2, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)),
1655 WASM_GET_LOCAL(which ^ 1))}; 1564 WASM_GET_LOCAL(which ^ 1))};
1656 byte code2[] = {WASM_LOOP(2, WASM_BRV_IF_ZERO(1, WASM_GET_LOCAL(which)), 1565 byte code2[] = {WASM_LOOP(2, WASM_BRV_IF_ZERO(1, WASM_GET_LOCAL(which)),
1657 WASM_GET_LOCAL(which ^ 1))}; 1566 WASM_GET_LOCAL(which ^ 1))};
1658 1567
1659 if (type == kAstI32) { 1568 if (type == kAstI32) {
1660 EXPECT_VERIFIES(&env, code1); 1569 EXPECT_VERIFIES(&sig, code1);
1661 EXPECT_VERIFIES(&env, code2); 1570 EXPECT_VERIFIES(&sig, code2);
1662 } else { 1571 } else {
1663 EXPECT_FAILURE(&env, code1); 1572 EXPECT_FAILURE(&sig, code1);
1664 EXPECT_FAILURE(&env, code2); 1573 EXPECT_FAILURE(&sig, code2);
1665 } 1574 }
1666 } 1575 }
1667 } 1576 }
1668 } 1577 }
1669 1578
1670 TEST_F(AstDecoderTest, TableSwitch0) { 1579 TEST_F(AstDecoderTest, TableSwitch0) {
1671 static byte code[] = {kExprTableSwitch, 0, 0, 0, 0}; 1580 static byte code[] = {kExprTableSwitch, 0, 0, 0, 0};
1672 EXPECT_FAILURE(&env_v_v, code); 1581 EXPECT_FAILURE(sigs.v_v(), code);
1673 } 1582 }
1674 1583
1675 TEST_F(AstDecoderTest, TableSwitch0b) { 1584 TEST_F(AstDecoderTest, TableSwitch0b) {
1676 static byte code[] = {kExprTableSwitch, 0, 0, 0, 0, kExprI8Const, 11}; 1585 static byte code[] = {kExprTableSwitch, 0, 0, 0, 0, kExprI8Const, 11};
1677 EXPECT_FAILURE(&env_v_v, code); 1586 EXPECT_FAILURE(sigs.v_v(), code);
1678 EXPECT_FAILURE(&env_i_i, code); 1587 EXPECT_FAILURE(sigs.i_i(), code);
1679 } 1588 }
1680 1589
1681 TEST_F(AstDecoderTest, TableSwitch0c) { 1590 TEST_F(AstDecoderTest, TableSwitch0c) {
1682 static byte code[] = { 1591 static byte code[] = {
1683 WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(0)), WASM_I8(67))}; 1592 WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(0)), WASM_I8(67))};
1684 EXPECT_VERIFIES(&env_v_v, code); 1593 EXPECT_VERIFIES(sigs.v_v(), code);
1685 } 1594 }
1686 1595
1687 TEST_F(AstDecoderTest, TableSwitch0d) { 1596 TEST_F(AstDecoderTest, TableSwitch0d) {
1688 static byte code[] = { 1597 static byte code[] = {
1689 WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 2, WASM_CASE_BR(0), WASM_CASE_BR(1)), 1598 WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 2, WASM_CASE_BR(0), WASM_CASE_BR(1)),
1690 WASM_I8(67))}; 1599 WASM_I8(67))};
1691 EXPECT_VERIFIES(&env_v_v, code); 1600 EXPECT_VERIFIES(sigs.v_v(), code);
1692 } 1601 }
1693 1602
1694 TEST_F(AstDecoderTest, TableSwitch1) { 1603 TEST_F(AstDecoderTest, TableSwitch1) {
1695 static byte code[] = {WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), 1604 static byte code[] = {WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1696 WASM_TABLESWITCH_BODY(WASM_I8(0), WASM_I8(9))}; 1605 WASM_TABLESWITCH_BODY(WASM_I8(0), WASM_I8(9))};
1697 EXPECT_VERIFIES(&env_i_i, code); 1606 EXPECT_VERIFIES(sigs.i_i(), code);
1698 EXPECT_VERIFIES(&env_v_v, code); 1607 EXPECT_VERIFIES(sigs.v_v(), code);
1699 EXPECT_FAILURE(&env_f_ff, code); 1608 EXPECT_FAILURE(sigs.f_ff(), code);
1700 EXPECT_FAILURE(&env_d_dd, code); 1609 EXPECT_FAILURE(sigs.d_dd(), code);
1701 } 1610 }
1702 1611
1703 TEST_F(AstDecoderTest, TableSwitch_off_end) { 1612 TEST_F(AstDecoderTest, TableSwitch_off_end) {
1704 static byte code[] = {WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), 1613 static byte code[] = {WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1705 WASM_TABLESWITCH_BODY(WASM_I8(0), WASM_I8(9))}; 1614 WASM_TABLESWITCH_BODY(WASM_I8(0), WASM_I8(9))};
1706 for (size_t len = arraysize(code) - 1; len > 0; len--) { 1615 for (size_t len = arraysize(code) - 1; len > 0; len--) {
1707 Verify(kError, &env_v_v, code, code + len); 1616 Verify(kError, sigs.v_v(), code, code + len);
1708 } 1617 }
1709 } 1618 }
1710 1619
1711 TEST_F(AstDecoderTest, TableSwitch2) { 1620 TEST_F(AstDecoderTest, TableSwitch2) {
1712 static byte code[] = { 1621 static byte code[] = {
1713 WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)), 1622 WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)),
1714 WASM_TABLESWITCH_BODY(WASM_I8(3), WASM_I8(10), WASM_I8(11))}; 1623 WASM_TABLESWITCH_BODY(WASM_I8(3), WASM_I8(10), WASM_I8(11))};
1715 EXPECT_VERIFIES(&env_i_i, code); 1624 EXPECT_VERIFIES(sigs.i_i(), code);
1716 EXPECT_VERIFIES(&env_v_v, code); 1625 EXPECT_VERIFIES(sigs.v_v(), code);
1717 EXPECT_FAILURE(&env_f_ff, code); 1626 EXPECT_FAILURE(sigs.f_ff(), code);
1718 EXPECT_FAILURE(&env_d_dd, code); 1627 EXPECT_FAILURE(sigs.d_dd(), code);
1719 } 1628 }
1720 1629
1721 TEST_F(AstDecoderTest, TableSwitch1b) { 1630 TEST_F(AstDecoderTest, TableSwitch1b) {
1722 EXPECT_VERIFIES_INLINE(&env_i_i, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), 1631 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1723 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_ZERO)); 1632 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_ZERO));
1724 1633
1725 EXPECT_VERIFIES_INLINE(&env_f_ff, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), 1634 EXPECT_VERIFIES_INLINE(sigs.f_ff(), WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1726 WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_F32(0.0))); 1635 WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_F32(0.0)));
1727 1636
1728 EXPECT_VERIFIES_INLINE(&env_d_dd, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), 1637 EXPECT_VERIFIES_INLINE(sigs.d_dd(), WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1729 WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_F64(0.0))); 1638 WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_F64(0.0)));
1730 } 1639 }
1731 1640
1732 TEST_F(AstDecoderTest, TableSwitch_br1) { 1641 TEST_F(AstDecoderTest, TableSwitch_br1) {
1733 for (int depth = 0; depth < 2; depth++) { 1642 for (int depth = 0; depth < 2; depth++) {
1734 byte code[] = {WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth)), 1643 byte code[] = {WASM_BLOCK(1, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth)),
1735 WASM_GET_LOCAL(0))}; 1644 WASM_GET_LOCAL(0))};
1736 EXPECT_VERIFIES(&env_v_i, code); 1645 EXPECT_VERIFIES(sigs.v_i(), code);
1737 EXPECT_FAILURE(&env_i_i, code); 1646 EXPECT_FAILURE(sigs.i_i(), code);
1738 } 1647 }
1739 } 1648 }
1740 1649
1741 TEST_F(AstDecoderTest, TableSwitch_invalid_br) { 1650 TEST_F(AstDecoderTest, TableSwitch_invalid_br) {
1742 for (int depth = 1; depth < 4; depth++) { 1651 for (int depth = 1; depth < 4; depth++) {
1743 EXPECT_FAILURE_INLINE(&env_v_i, 1652 EXPECT_FAILURE_INLINE(sigs.v_i(),
1744 WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth)), 1653 WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(depth)),
1745 WASM_GET_LOCAL(0)); 1654 WASM_GET_LOCAL(0));
1746 EXPECT_FAILURE_INLINE( 1655 EXPECT_FAILURE_INLINE(
1747 &env_v_i, 1656 sigs.v_i(),
1748 WASM_TABLESWITCH_OP(0, 2, WASM_CASE_BR(depth), WASM_CASE_BR(depth)), 1657 WASM_TABLESWITCH_OP(0, 2, WASM_CASE_BR(depth), WASM_CASE_BR(depth)),
1749 WASM_GET_LOCAL(0)); 1658 WASM_GET_LOCAL(0));
1750 } 1659 }
1751 } 1660 }
1752 1661
1753 TEST_F(AstDecoderTest, TableSwitch_invalid_case_ref) { 1662 TEST_F(AstDecoderTest, TableSwitch_invalid_case_ref) {
1754 EXPECT_FAILURE_INLINE(&env_i_i, WASM_TABLESWITCH_OP(0, 1, WASM_CASE(0)), 1663 EXPECT_FAILURE_INLINE(sigs.i_i(), WASM_TABLESWITCH_OP(0, 1, WASM_CASE(0)),
1755 WASM_GET_LOCAL(0)); 1664 WASM_GET_LOCAL(0));
1756 EXPECT_FAILURE_INLINE(&env_i_i, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(1)), 1665 EXPECT_FAILURE_INLINE(sigs.i_i(), WASM_TABLESWITCH_OP(1, 1, WASM_CASE(1)),
1757 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_ZERO)); 1666 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_ZERO));
1758 } 1667 }
1759 1668
1760 TEST_F(AstDecoderTest, TableSwitch1_br) { 1669 TEST_F(AstDecoderTest, TableSwitch1_br) {
1761 EXPECT_VERIFIES_INLINE( 1670 EXPECT_VERIFIES_INLINE(
1762 &env_i_i, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), 1671 sigs.i_i(), WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)),
1763 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_ZERO))); 1672 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_ZERO)));
1764 } 1673 }
1765 1674
1766 TEST_F(AstDecoderTest, TableSwitch2_br) { 1675 TEST_F(AstDecoderTest, TableSwitch2_br) {
1767 EXPECT_VERIFIES_INLINE( 1676 EXPECT_VERIFIES_INLINE(
1768 &env_i_i, WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)), 1677 sigs.i_i(), WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)),
1769 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(0)), 1678 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(0)),
1770 WASM_BRV(0, WASM_I8(1)))); 1679 WASM_BRV(0, WASM_I8(1))));
1771 1680
1772 EXPECT_FAILURE_INLINE( 1681 EXPECT_FAILURE_INLINE(
1773 &env_f_ff, WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)), 1682 sigs.f_ff(), WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)),
1774 WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_BRV(0, WASM_I8(3)), 1683 WASM_TABLESWITCH_BODY(WASM_ZERO, WASM_BRV(0, WASM_I8(3)),
1775 WASM_BRV(0, WASM_I8(4)))); 1684 WASM_BRV(0, WASM_I8(4))));
1776 } 1685 }
1777 1686
1778 TEST_F(AstDecoderTest, TableSwitch2x2) { 1687 TEST_F(AstDecoderTest, TableSwitch2x2) {
1779 EXPECT_VERIFIES_INLINE( 1688 EXPECT_VERIFIES_INLINE(
1780 &env_i_i, WASM_TABLESWITCH_OP(2, 4, WASM_CASE(0), WASM_CASE(1), 1689 sigs.i_i(), WASM_TABLESWITCH_OP(2, 4, WASM_CASE(0), WASM_CASE(1),
1781 WASM_CASE(0), WASM_CASE(1)), 1690 WASM_CASE(0), WASM_CASE(1)),
1782 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(3)), 1691 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(3)),
1783 WASM_BRV(0, WASM_I8(4)))); 1692 WASM_BRV(0, WASM_I8(4))));
1784 } 1693 }
1785 1694
1786 TEST_F(AstDecoderTest, ExprBreakNesting1) { 1695 TEST_F(AstDecoderTest, ExprBreakNesting1) {
1787 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(1, WASM_BRV(0, WASM_ZERO))); 1696 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_BLOCK(1, WASM_BRV(0, WASM_ZERO)));
1788 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(1, WASM_BR(0))); 1697 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_BLOCK(1, WASM_BR(0)));
1789 EXPECT_VERIFIES_INLINE(&env_v_v, 1698 EXPECT_VERIFIES_INLINE(sigs.v_v(),
1790 WASM_BLOCK(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); 1699 WASM_BLOCK(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)));
1791 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_BLOCK(1, WASM_BR_IF(0, WASM_ZERO))); 1700 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_BLOCK(1, WASM_BR_IF(0, WASM_ZERO)));
1792 1701
1793 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BRV(0, WASM_ZERO))); 1702 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BRV(0, WASM_ZERO)));
1794 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BR(0))); 1703 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(0)));
1795 EXPECT_VERIFIES_INLINE(&env_v_v, 1704 EXPECT_VERIFIES_INLINE(sigs.v_v(),
1796 WASM_LOOP(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); 1705 WASM_LOOP(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)));
1797 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BR_IF(0, WASM_ZERO))); 1706 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR_IF(0, WASM_ZERO)));
1798 1707
1799 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BRV(1, WASM_ZERO))); 1708 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO)));
1800 EXPECT_VERIFIES_INLINE(&env_v_v, WASM_LOOP(1, WASM_BR(1))); 1709 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(1)));
1801 } 1710 }
1802 1711
1803 TEST_F(AstDecoderTest, Select) { 1712 TEST_F(AstDecoderTest, Select) {
1804 EXPECT_VERIFIES_INLINE( 1713 EXPECT_VERIFIES_INLINE(
1805 &env_i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO)); 1714 sigs.i_i(), WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO));
1806 EXPECT_VERIFIES_INLINE(&env_f_ff, 1715 EXPECT_VERIFIES_INLINE(sigs.f_ff(),
1807 WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO)); 1716 WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO));
1808 EXPECT_VERIFIES_INLINE(&env_d_dd, 1717 EXPECT_VERIFIES_INLINE(sigs.d_dd(),
1809 WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO)); 1718 WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO));
1810 EXPECT_VERIFIES_INLINE(&env_l_l, 1719 EXPECT_VERIFIES_INLINE(sigs.l_l(),
1811 WASM_SELECT(WASM_I64(0), WASM_I64(0), WASM_ZERO)); 1720 WASM_SELECT(WASM_I64(0), WASM_I64(0), WASM_ZERO));
1812 } 1721 }
1813 1722
1814 TEST_F(AstDecoderTest, Select_fail1) { 1723 TEST_F(AstDecoderTest, Select_fail1) {
1815 EXPECT_FAILURE_INLINE(&env_i_i, WASM_SELECT(WASM_F32(0.0), WASM_GET_LOCAL(0),
1816 WASM_GET_LOCAL(0)));
1817 EXPECT_FAILURE_INLINE(&env_i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0),
1818 WASM_GET_LOCAL(0)));
1819 EXPECT_FAILURE_INLINE( 1724 EXPECT_FAILURE_INLINE(
1820 &env_i_i, 1725 sigs.i_i(),
1726 WASM_SELECT(WASM_F32(0.0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1727 EXPECT_FAILURE_INLINE(
1728 sigs.i_i(),
1729 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0), WASM_GET_LOCAL(0)));
1730 EXPECT_FAILURE_INLINE(
1731 sigs.i_i(),
1821 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_F32(0.0))); 1732 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_F32(0.0)));
1822 } 1733 }
1823 1734
1824 TEST_F(AstDecoderTest, Select_fail2) { 1735 TEST_F(AstDecoderTest, Select_fail2) {
1825 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1736 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1826 LocalType type = kLocalTypes[i]; 1737 LocalType type = kLocalTypes[i];
1827 if (type == kAstI32) continue; 1738 if (type == kAstI32) continue;
1828 1739
1829 LocalType types[] = {type, kAstI32, type}; 1740 LocalType types[] = {type, kAstI32, type};
1830 FunctionSig sig(1, 2, types); 1741 FunctionSig sig(1, 2, types);
1831 FunctionEnv env;
1832 init_env(&env, &sig);
1833 1742
1834 EXPECT_VERIFIES_INLINE( 1743 EXPECT_VERIFIES_INLINE(
1835 &env, 1744 &sig,
1836 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0))); 1745 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1837 1746
1838 EXPECT_FAILURE_INLINE( 1747 EXPECT_FAILURE_INLINE(
1839 &env, 1748 &sig,
1840 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 1749 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1841 1750
1842 EXPECT_FAILURE_INLINE( 1751 EXPECT_FAILURE_INLINE(
1843 &env, 1752 &sig,
1844 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0))); 1753 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1845 1754
1846 EXPECT_FAILURE_INLINE( 1755 EXPECT_FAILURE_INLINE(
1847 &env, 1756 &sig,
1848 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1757 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1849 } 1758 }
1850 } 1759 }
1851 1760
1852 TEST_F(AstDecoderTest, Select_TypeCheck) { 1761 TEST_F(AstDecoderTest, Select_TypeCheck) {
1853 EXPECT_FAILURE_INLINE(&env_i_i, WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), 1762 EXPECT_FAILURE_INLINE(
1854 WASM_GET_LOCAL(0))); 1763 sigs.i_i(),
1855 1764 WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1856 EXPECT_FAILURE_INLINE(&env_i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_F64(0.25),
1857 WASM_GET_LOCAL(0)));
1858 1765
1859 EXPECT_FAILURE_INLINE( 1766 EXPECT_FAILURE_INLINE(
1860 &env_i_i, WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_I64(0))); 1767 sigs.i_i(),
1768 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F64(0.25), WASM_GET_LOCAL(0)));
1769
1770 EXPECT_FAILURE_INLINE(
1771 sigs.i_i(), WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_I64(0)));
1861 } 1772 }
1862 1773
1863 1774
1864 class WasmOpcodeLengthTest : public TestWithZone { 1775 class WasmOpcodeLengthTest : public TestWithZone {
1865 public: 1776 public:
1866 WasmOpcodeLengthTest() : TestWithZone() {} 1777 WasmOpcodeLengthTest() : TestWithZone() {}
1867 }; 1778 };
1868 1779
1869 #define EXPECT_LENGTH(expected, opcode) \ 1780 #define EXPECT_LENGTH(expected, opcode) \
1870 { \ 1781 { \
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
2073 EXPECT_LENGTH(1, kExprF64ConvertF32); 1984 EXPECT_LENGTH(1, kExprF64ConvertF32);
2074 EXPECT_LENGTH(1, kExprF64ReinterpretI64); 1985 EXPECT_LENGTH(1, kExprF64ReinterpretI64);
2075 EXPECT_LENGTH(1, kExprI32ReinterpretF32); 1986 EXPECT_LENGTH(1, kExprI32ReinterpretF32);
2076 EXPECT_LENGTH(1, kExprI64ReinterpretF64); 1987 EXPECT_LENGTH(1, kExprI64ReinterpretF64);
2077 } 1988 }
2078 1989
2079 1990
2080 class WasmOpcodeArityTest : public TestWithZone { 1991 class WasmOpcodeArityTest : public TestWithZone {
2081 public: 1992 public:
2082 WasmOpcodeArityTest() : TestWithZone() {} 1993 WasmOpcodeArityTest() : TestWithZone() {}
1994 TestModuleEnv module;
1995 TestSignatures sigs;
2083 }; 1996 };
2084 1997
2085 #define EXPECT_ARITY(expected, ...) \ 1998 #define EXPECT_ARITY(expected, ...) \
2086 { \ 1999 { \
2087 static const byte code[] = {__VA_ARGS__}; \ 2000 static const byte code[] = {__VA_ARGS__}; \
2088 EXPECT_EQ(expected, OpcodeArity(&env, code, code + sizeof(code))); \ 2001 EXPECT_EQ(expected, OpcodeArity(&module, sig, code, code + sizeof(code))); \
2089 } 2002 }
2090 2003
2091 TEST_F(WasmOpcodeArityTest, Control) { 2004 TEST_F(WasmOpcodeArityTest, Control) {
2092 FunctionEnv env; 2005 FunctionSig* sig = sigs.v_v();
2093 EXPECT_ARITY(0, kExprNop); 2006 EXPECT_ARITY(0, kExprNop);
2094 2007
2095 EXPECT_ARITY(0, kExprBlock, 0); 2008 EXPECT_ARITY(0, kExprBlock, 0);
2096 EXPECT_ARITY(1, kExprBlock, 1); 2009 EXPECT_ARITY(1, kExprBlock, 1);
2097 EXPECT_ARITY(2, kExprBlock, 2); 2010 EXPECT_ARITY(2, kExprBlock, 2);
2098 EXPECT_ARITY(5, kExprBlock, 5); 2011 EXPECT_ARITY(5, kExprBlock, 5);
2099 EXPECT_ARITY(10, kExprBlock, 10); 2012 EXPECT_ARITY(10, kExprBlock, 10);
2100 2013
2101 EXPECT_ARITY(0, kExprLoop, 0); 2014 EXPECT_ARITY(0, kExprLoop, 0);
2102 EXPECT_ARITY(1, kExprLoop, 1); 2015 EXPECT_ARITY(1, kExprLoop, 1);
2103 EXPECT_ARITY(2, kExprLoop, 2); 2016 EXPECT_ARITY(2, kExprLoop, 2);
2104 EXPECT_ARITY(7, kExprLoop, 7); 2017 EXPECT_ARITY(7, kExprLoop, 7);
2105 EXPECT_ARITY(11, kExprLoop, 11); 2018 EXPECT_ARITY(11, kExprLoop, 11);
2106 2019
2107 EXPECT_ARITY(2, kExprIf); 2020 EXPECT_ARITY(2, kExprIf);
2108 EXPECT_ARITY(3, kExprIfElse); 2021 EXPECT_ARITY(3, kExprIfElse);
2109 EXPECT_ARITY(3, kExprSelect); 2022 EXPECT_ARITY(3, kExprSelect);
2110 2023
2111 EXPECT_ARITY(1, kExprBr); 2024 EXPECT_ARITY(1, kExprBr);
2112 EXPECT_ARITY(2, kExprBrIf); 2025 EXPECT_ARITY(2, kExprBrIf);
2113 2026
2114 { 2027 {
2115 TestSignatures sigs; 2028 sig = sigs.v_v();
2116 FunctionEnv env;
2117 AstDecoderTest::init_env(&env, sigs.v_v());
2118 EXPECT_ARITY(0, kExprReturn); 2029 EXPECT_ARITY(0, kExprReturn);
2119 AstDecoderTest::init_env(&env, sigs.i_i()); 2030 sig = sigs.i_i();
2120 EXPECT_ARITY(1, kExprReturn); 2031 EXPECT_ARITY(1, kExprReturn);
2121 } 2032 }
2122 } 2033 }
2123 2034
2124 2035
2125 TEST_F(WasmOpcodeArityTest, Misc) { 2036 TEST_F(WasmOpcodeArityTest, Misc) {
2126 FunctionEnv env; 2037 FunctionSig* sig = sigs.v_v();
2127
2128 EXPECT_ARITY(0, kExprI8Const); 2038 EXPECT_ARITY(0, kExprI8Const);
2129 EXPECT_ARITY(0, kExprI32Const); 2039 EXPECT_ARITY(0, kExprI32Const);
2130 EXPECT_ARITY(0, kExprF32Const); 2040 EXPECT_ARITY(0, kExprF32Const);
2131 EXPECT_ARITY(0, kExprI64Const); 2041 EXPECT_ARITY(0, kExprI64Const);
2132 EXPECT_ARITY(0, kExprF64Const); 2042 EXPECT_ARITY(0, kExprF64Const);
2133 EXPECT_ARITY(0, kExprGetLocal); 2043 EXPECT_ARITY(0, kExprGetLocal);
2134 EXPECT_ARITY(1, kExprSetLocal); 2044 EXPECT_ARITY(1, kExprSetLocal);
2135 EXPECT_ARITY(0, kExprLoadGlobal); 2045 EXPECT_ARITY(0, kExprLoadGlobal);
2136 EXPECT_ARITY(1, kExprStoreGlobal); 2046 EXPECT_ARITY(1, kExprStoreGlobal);
2137 } 2047 }
2138 2048
2139 2049
2140 TEST_F(WasmOpcodeArityTest, Calls) { 2050 TEST_F(WasmOpcodeArityTest, Calls) {
2141 TestSignatures sigs;
2142 TestModuleEnv module;
2143 module.AddFunction(sigs.i_ii()); 2051 module.AddFunction(sigs.i_ii());
2144 module.AddFunction(sigs.i_i()); 2052 module.AddFunction(sigs.i_i());
2145 2053
2146 module.AddSignature(sigs.f_ff()); 2054 module.AddSignature(sigs.f_ff());
2147 module.AddSignature(sigs.i_d()); 2055 module.AddSignature(sigs.i_d());
2148 2056
2149 module.AddImport(sigs.f_ff()); 2057 module.AddImport(sigs.f_ff());
2150 module.AddImport(sigs.i_d()); 2058 module.AddImport(sigs.i_d());
2151 2059
2152 { 2060 {
2153 FunctionEnv env; 2061 FunctionSig* sig = sigs.i_ii();
2154 AstDecoderTest::init_env(&env, sigs.i_ii());
2155 env.module = &module;
2156 2062
2157 EXPECT_ARITY(2, kExprCallFunction, 0); 2063 EXPECT_ARITY(2, kExprCallFunction, 0);
2158 EXPECT_ARITY(2, kExprCallImport, 0); 2064 EXPECT_ARITY(2, kExprCallImport, 0);
2159 EXPECT_ARITY(3, kExprCallIndirect, 0); 2065 EXPECT_ARITY(3, kExprCallIndirect, 0);
2160 EXPECT_ARITY(1, kExprBr); 2066 EXPECT_ARITY(1, kExprBr);
2161 EXPECT_ARITY(2, kExprBrIf); 2067 EXPECT_ARITY(2, kExprBrIf);
2162 } 2068 }
2163 2069
2164 { 2070 {
2165 FunctionEnv env; 2071 FunctionSig* sig = sigs.v_v();
2166 AstDecoderTest::init_env(&env, sigs.v_v());
2167 env.module = &module;
2168 2072
2169 EXPECT_ARITY(1, kExprCallFunction, 1); 2073 EXPECT_ARITY(1, kExprCallFunction, 1);
2170 EXPECT_ARITY(1, kExprCallImport, 1); 2074 EXPECT_ARITY(1, kExprCallImport, 1);
2171 EXPECT_ARITY(2, kExprCallIndirect, 1); 2075 EXPECT_ARITY(2, kExprCallIndirect, 1);
2172 EXPECT_ARITY(1, kExprBr); 2076 EXPECT_ARITY(1, kExprBr);
2173 EXPECT_ARITY(2, kExprBrIf); 2077 EXPECT_ARITY(2, kExprBrIf);
2174 } 2078 }
2175 } 2079 }
2176 2080
2177 2081
2178 TEST_F(WasmOpcodeArityTest, LoadsAndStores) { 2082 TEST_F(WasmOpcodeArityTest, LoadsAndStores) {
2179 FunctionEnv env; 2083 FunctionSig* sig = sigs.v_v();
2180
2181 EXPECT_ARITY(1, kExprI32LoadMem8S); 2084 EXPECT_ARITY(1, kExprI32LoadMem8S);
2182 EXPECT_ARITY(1, kExprI32LoadMem8U); 2085 EXPECT_ARITY(1, kExprI32LoadMem8U);
2183 EXPECT_ARITY(1, kExprI32LoadMem16S); 2086 EXPECT_ARITY(1, kExprI32LoadMem16S);
2184 EXPECT_ARITY(1, kExprI32LoadMem16U); 2087 EXPECT_ARITY(1, kExprI32LoadMem16U);
2185 EXPECT_ARITY(1, kExprI32LoadMem); 2088 EXPECT_ARITY(1, kExprI32LoadMem);
2186 2089
2187 EXPECT_ARITY(1, kExprI64LoadMem8S); 2090 EXPECT_ARITY(1, kExprI64LoadMem8S);
2188 EXPECT_ARITY(1, kExprI64LoadMem8U); 2091 EXPECT_ARITY(1, kExprI64LoadMem8U);
2189 EXPECT_ARITY(1, kExprI64LoadMem16S); 2092 EXPECT_ARITY(1, kExprI64LoadMem16S);
2190 EXPECT_ARITY(1, kExprI64LoadMem16U); 2093 EXPECT_ARITY(1, kExprI64LoadMem16U);
2191 EXPECT_ARITY(1, kExprI64LoadMem32S); 2094 EXPECT_ARITY(1, kExprI64LoadMem32S);
2192 EXPECT_ARITY(1, kExprI64LoadMem32U); 2095 EXPECT_ARITY(1, kExprI64LoadMem32U);
2193 EXPECT_ARITY(1, kExprI64LoadMem); 2096 EXPECT_ARITY(1, kExprI64LoadMem);
2194 EXPECT_ARITY(1, kExprF32LoadMem); 2097 EXPECT_ARITY(1, kExprF32LoadMem);
2195 EXPECT_ARITY(1, kExprF64LoadMem); 2098 EXPECT_ARITY(1, kExprF64LoadMem);
2196 2099
2197 EXPECT_ARITY(2, kExprI32StoreMem8); 2100 EXPECT_ARITY(2, kExprI32StoreMem8);
2198 EXPECT_ARITY(2, kExprI32StoreMem16); 2101 EXPECT_ARITY(2, kExprI32StoreMem16);
2199 EXPECT_ARITY(2, kExprI32StoreMem); 2102 EXPECT_ARITY(2, kExprI32StoreMem);
2200 EXPECT_ARITY(2, kExprI64StoreMem8); 2103 EXPECT_ARITY(2, kExprI64StoreMem8);
2201 EXPECT_ARITY(2, kExprI64StoreMem16); 2104 EXPECT_ARITY(2, kExprI64StoreMem16);
2202 EXPECT_ARITY(2, kExprI64StoreMem32); 2105 EXPECT_ARITY(2, kExprI64StoreMem32);
2203 EXPECT_ARITY(2, kExprI64StoreMem); 2106 EXPECT_ARITY(2, kExprI64StoreMem);
2204 EXPECT_ARITY(2, kExprF32StoreMem); 2107 EXPECT_ARITY(2, kExprF32StoreMem);
2205 EXPECT_ARITY(2, kExprF64StoreMem); 2108 EXPECT_ARITY(2, kExprF64StoreMem);
2206 } 2109 }
2207 2110
2208 2111
2209 TEST_F(WasmOpcodeArityTest, MiscMemExpressions) { 2112 TEST_F(WasmOpcodeArityTest, MiscMemExpressions) {
2210 FunctionEnv env; 2113 FunctionSig* sig = sigs.v_v();
2211
2212 EXPECT_ARITY(0, kExprMemorySize); 2114 EXPECT_ARITY(0, kExprMemorySize);
2213 EXPECT_ARITY(1, kExprGrowMemory); 2115 EXPECT_ARITY(1, kExprGrowMemory);
2214 } 2116 }
2215 2117
2216 2118
2217 TEST_F(WasmOpcodeArityTest, SimpleExpressions) { 2119 TEST_F(WasmOpcodeArityTest, SimpleExpressions) {
2218 FunctionEnv env; 2120 FunctionSig* sig = sigs.v_v();
2219
2220 EXPECT_ARITY(2, kExprI32Add); 2121 EXPECT_ARITY(2, kExprI32Add);
2221 EXPECT_ARITY(2, kExprI32Sub); 2122 EXPECT_ARITY(2, kExprI32Sub);
2222 EXPECT_ARITY(2, kExprI32Mul); 2123 EXPECT_ARITY(2, kExprI32Mul);
2223 EXPECT_ARITY(2, kExprI32DivS); 2124 EXPECT_ARITY(2, kExprI32DivS);
2224 EXPECT_ARITY(2, kExprI32DivU); 2125 EXPECT_ARITY(2, kExprI32DivU);
2225 EXPECT_ARITY(2, kExprI32RemS); 2126 EXPECT_ARITY(2, kExprI32RemS);
2226 EXPECT_ARITY(2, kExprI32RemU); 2127 EXPECT_ARITY(2, kExprI32RemU);
2227 EXPECT_ARITY(2, kExprI32And); 2128 EXPECT_ARITY(2, kExprI32And);
2228 EXPECT_ARITY(2, kExprI32Ior); 2129 EXPECT_ARITY(2, kExprI32Ior);
2229 EXPECT_ARITY(2, kExprI32Xor); 2130 EXPECT_ARITY(2, kExprI32Xor);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
2329 EXPECT_ARITY(1, kExprF32ReinterpretI32); 2230 EXPECT_ARITY(1, kExprF32ReinterpretI32);
2330 EXPECT_ARITY(1, kExprF64SConvertI32); 2231 EXPECT_ARITY(1, kExprF64SConvertI32);
2331 EXPECT_ARITY(1, kExprF64UConvertI32); 2232 EXPECT_ARITY(1, kExprF64UConvertI32);
2332 EXPECT_ARITY(1, kExprF64SConvertI64); 2233 EXPECT_ARITY(1, kExprF64SConvertI64);
2333 EXPECT_ARITY(1, kExprF64UConvertI64); 2234 EXPECT_ARITY(1, kExprF64UConvertI64);
2334 EXPECT_ARITY(1, kExprF64ConvertF32); 2235 EXPECT_ARITY(1, kExprF64ConvertF32);
2335 EXPECT_ARITY(1, kExprF64ReinterpretI64); 2236 EXPECT_ARITY(1, kExprF64ReinterpretI64);
2336 EXPECT_ARITY(1, kExprI32ReinterpretF32); 2237 EXPECT_ARITY(1, kExprI32ReinterpretF32);
2337 EXPECT_ARITY(1, kExprI64ReinterpretF64); 2238 EXPECT_ARITY(1, kExprI64ReinterpretF64);
2338 } 2239 }
2240
2241 typedef std::vector<LocalType>* LocalTypeMap;
2242
2243 class LocalDeclDecoderTest : public TestWithZone {
2244 public:
2245 size_t ExpectRun(LocalTypeMap map, size_t pos, LocalType expected,
2246 size_t count) {
2247 for (size_t i = 0; i < count; i++) {
2248 EXPECT_EQ(expected, map->at(pos++));
2249 }
2250 return pos;
2251 }
2252 };
2253
2254 TEST_F(LocalDeclDecoderTest, NoLocals) {
2255 static const byte data[] = {0};
2256 LocalTypeMap map = DecodeLocalDeclsForTesting(data, data + sizeof(data));
2257 EXPECT_EQ(0, map->size());
2258 if (map) delete map;
2259 }
2260
2261 TEST_F(LocalDeclDecoderTest, OneLocal) {
2262 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
2263 LocalType type = kLocalTypes[i];
2264 const byte data[] = {
2265 1, 1, static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(type))};
2266 LocalTypeMap map = DecodeLocalDeclsForTesting(data, data + sizeof(data));
2267 EXPECT_EQ(1, map->size());
2268 EXPECT_EQ(type, map->at(0));
2269 if (map) delete map;
2270 }
2271 }
2272
2273 TEST_F(LocalDeclDecoderTest, FiveLocals) {
2274 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
2275 LocalType type = kLocalTypes[i];
2276 const byte data[] = {
2277 1, 5, static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(type))};
2278 LocalTypeMap map = DecodeLocalDeclsForTesting(data, data + sizeof(data));
2279 EXPECT_EQ(5, map->size());
2280 ExpectRun(map, 0, type, 5);
2281 if (map) delete map;
2282 }
2283 }
2284
2285 TEST_F(LocalDeclDecoderTest, MixedLocals) {
2286 for (byte a = 0; a < 3; a++) {
2287 for (byte b = 0; b < 3; b++) {
2288 for (byte c = 0; c < 3; c++) {
2289 for (byte d = 0; d < 3; d++) {
2290 const byte data[] = {4, a, kLocalI32, b, kLocalI64,
2291 c, kLocalF32, d, kLocalF64};
2292 LocalTypeMap map =
2293 DecodeLocalDeclsForTesting(data, data + sizeof(data));
2294 EXPECT_EQ(a + b + c + d, map->size());
2295
2296 size_t pos = 0;
2297 pos = ExpectRun(map, pos, kAstI32, a);
2298 pos = ExpectRun(map, pos, kAstI32, b);
2299 pos = ExpectRun(map, pos, kAstI32, c);
2300 pos = ExpectRun(map, pos, kAstI32, d);
2301
2302 if (map) delete map;
2303 }
2304 }
2305 }
2306 }
2307 }
2308
2309 TEST_F(LocalDeclDecoderTest, UseEncoder) {
2310 const byte* data = nullptr;
2311 const byte* end = nullptr;
2312 LocalDeclEncoder local_decls;
2313
2314 local_decls.AddLocals(5, kAstF32);
2315 local_decls.AddLocals(1337, kAstI32);
2316 local_decls.AddLocals(212, kAstI64);
2317 local_decls.Prepend(&data, &end);
2318
2319 LocalTypeMap map = DecodeLocalDeclsForTesting(data, end);
2320 size_t pos = 0;
2321 pos = ExpectRun(map, pos, kAstF32, 5);
2322 pos = ExpectRun(map, pos, kAstI32, 1337);
2323 pos = ExpectRun(map, pos, kAstI64, 212);
2324
2325 if (map) delete map;
2326 delete[] data;
2327 }
2328
2339 } // namespace wasm 2329 } // namespace wasm
2340 } // namespace internal 2330 } // namespace internal
2341 } // namespace v8 2331 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698