OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "test/unittests/test-utils.h" | 5 #include "test/unittests/test-utils.h" |
6 | 6 |
7 #include "src/wasm/module-decoder.h" | 7 #include "src/wasm/module-decoder.h" |
8 #include "src/wasm/wasm-macro-gen.h" | 8 #include "src/wasm/wasm-macro-gen.h" |
9 #include "src/wasm/wasm-opcodes.h" | 9 #include "src/wasm/wasm-opcodes.h" |
10 | 10 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 EXPECT_EQ(MachineType::Int32(), global->type); | 162 EXPECT_EQ(MachineType::Int32(), global->type); |
163 EXPECT_EQ(0, global->offset); | 163 EXPECT_EQ(0, global->offset); |
164 EXPECT_FALSE(global->exported); | 164 EXPECT_FALSE(global->exported); |
165 | 165 |
166 if (result.val) delete result.val; | 166 if (result.val) delete result.val; |
167 } | 167 } |
168 | 168 |
169 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); | 169 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); |
170 } | 170 } |
171 | 171 |
172 | |
173 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { | 172 TEST_F(WasmModuleVerifyTest, ZeroGlobals) { |
174 static const byte data[] = { | 173 static const byte data[] = { |
175 SECTION(GLOBALS, 1), // -- | 174 SECTION(GLOBALS, 1), // -- |
176 0, // declare 0 globals | 175 0, // declare 0 globals |
177 }; | 176 }; |
178 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 177 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
179 EXPECT_OK(result); | 178 EXPECT_OK(result); |
180 if (result.val) delete result.val; | 179 if (result.val) delete result.val; |
181 } | 180 } |
182 | 181 |
183 | |
184 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { | 182 static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) { |
185 while (true) { | 183 while (true) { |
186 uint32_t next = val >> 7; | 184 uint32_t next = val >> 7; |
187 uint32_t out = val & 0x7f; | 185 uint32_t out = val & 0x7f; |
188 if (next) { | 186 if (next) { |
189 buffer.push_back(static_cast<byte>(0x80 | out)); | 187 buffer.push_back(static_cast<byte>(0x80 | out)); |
190 val = next; | 188 val = next; |
191 } else { | 189 } else { |
192 buffer.push_back(static_cast<byte>(out)); | 190 buffer.push_back(static_cast<byte>(out)); |
193 break; | 191 break; |
194 } | 192 } |
195 } | 193 } |
196 } | 194 } |
197 | 195 |
198 | |
199 TEST_F(WasmModuleVerifyTest, NGlobals) { | 196 TEST_F(WasmModuleVerifyTest, NGlobals) { |
200 static const byte data[] = { | 197 static const byte data[] = { |
201 NO_NAME, // name length | 198 NO_NAME, // name length |
202 kMemI32, // memory type | 199 kMemI32, // memory type |
203 0, // exported | 200 0, // exported |
204 }; | 201 }; |
205 | 202 |
206 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) { | 203 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) { |
207 std::vector<byte> buffer; | 204 std::vector<byte> buffer; |
208 size_t size = SizeOfVarInt(i) + i * sizeof(data); | 205 size_t size = SizeOfVarInt(i) + i * sizeof(data); |
(...skipping 29 matching lines...) Expand all Loading... |
238 SECTION(GLOBALS, 7), | 235 SECTION(GLOBALS, 7), |
239 1, // declare one global | 236 1, // declare one global |
240 NO_NAME, // name offset | 237 NO_NAME, // name offset |
241 33, // memory type | 238 33, // memory type |
242 0, // exported | 239 0, // exported |
243 }; | 240 }; |
244 | 241 |
245 EXPECT_FAILURE(data); | 242 EXPECT_FAILURE(data); |
246 } | 243 } |
247 | 244 |
248 | |
249 TEST_F(WasmModuleVerifyTest, TwoGlobals) { | 245 TEST_F(WasmModuleVerifyTest, TwoGlobals) { |
250 static const byte data[] = { | 246 static const byte data[] = { |
251 SECTION(GLOBALS, 7), | 247 SECTION(GLOBALS, 7), |
252 2, | 248 2, |
253 NO_NAME, // #0: name length | 249 NO_NAME, // #0: name length |
254 kMemF32, // memory type | 250 kMemF32, // memory type |
255 0, // exported | 251 0, // exported |
256 NO_NAME, // #1: name length | 252 NO_NAME, // #1: name length |
257 kMemF64, // memory type | 253 kMemF64, // memory type |
258 1, // exported | 254 1, // exported |
(...skipping 19 matching lines...) Expand all Loading... |
278 EXPECT_EQ(MachineType::Float64(), g1->type); | 274 EXPECT_EQ(MachineType::Float64(), g1->type); |
279 EXPECT_EQ(0, g1->offset); | 275 EXPECT_EQ(0, g1->offset); |
280 EXPECT_TRUE(g1->exported); | 276 EXPECT_TRUE(g1->exported); |
281 | 277 |
282 if (result.val) delete result.val; | 278 if (result.val) delete result.val; |
283 } | 279 } |
284 | 280 |
285 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); | 281 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); |
286 } | 282 } |
287 | 283 |
288 | |
289 TEST_F(WasmModuleVerifyTest, OneSignature) { | 284 TEST_F(WasmModuleVerifyTest, OneSignature) { |
290 { | 285 { |
291 static const byte data[] = {SIGNATURES_SECTION_VOID_VOID}; | 286 static const byte data[] = {SIGNATURES_SECTION_VOID_VOID}; |
292 EXPECT_VERIFIES(data); | 287 EXPECT_VERIFIES(data); |
293 } | 288 } |
294 | 289 |
295 { | 290 { |
296 static const byte data[] = {SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_x_x), | 291 static const byte data[] = {SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_x_x), |
297 1, SIG_ENTRY_i_i}; | 292 1, SIG_ENTRY_i_i}; |
298 EXPECT_VERIFIES(data); | 293 EXPECT_VERIFIES(data); |
299 } | 294 } |
300 } | 295 } |
301 | 296 |
302 | |
303 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { | 297 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { |
304 static const byte data[] = { | 298 static const byte data[] = { |
305 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_x_x + | 299 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_x_x + |
306 SIZEOF_SIG_ENTRY_x_xx), // -- | 300 SIZEOF_SIG_ENTRY_x_xx), // -- |
307 3, // -- | 301 3, // -- |
308 SIG_ENTRY_v_v, // void -> void | 302 SIG_ENTRY_v_v, // void -> void |
309 SIG_ENTRY_x_x(kLocalI32, kLocalF32), // f32 -> i32 | 303 SIG_ENTRY_x_x(kLocalI32, kLocalF32), // f32 -> i32 |
310 SIG_ENTRY_x_xx(kLocalI32, kLocalF64, kLocalF64), // f64,f64 -> i32 | 304 SIG_ENTRY_x_xx(kLocalI32, kLocalF64, kLocalF64), // f64,f64 -> i32 |
311 }; | 305 }; |
312 | 306 |
313 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 307 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
314 EXPECT_OK(result); | 308 EXPECT_OK(result); |
315 EXPECT_EQ(3, result.val->signatures.size()); | 309 EXPECT_EQ(3, result.val->signatures.size()); |
316 if (result.val->signatures.size() == 3) { | 310 if (result.val->signatures.size() == 3) { |
317 EXPECT_EQ(0, result.val->signatures[0]->return_count()); | 311 EXPECT_EQ(0, result.val->signatures[0]->return_count()); |
318 EXPECT_EQ(1, result.val->signatures[1]->return_count()); | 312 EXPECT_EQ(1, result.val->signatures[1]->return_count()); |
319 EXPECT_EQ(1, result.val->signatures[2]->return_count()); | 313 EXPECT_EQ(1, result.val->signatures[2]->return_count()); |
320 | 314 |
321 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); | 315 EXPECT_EQ(0, result.val->signatures[0]->parameter_count()); |
322 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); | 316 EXPECT_EQ(1, result.val->signatures[1]->parameter_count()); |
323 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); | 317 EXPECT_EQ(2, result.val->signatures[2]->parameter_count()); |
324 } | 318 } |
325 if (result.val) delete result.val; | 319 if (result.val) delete result.val; |
326 | 320 |
327 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); | 321 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data)); |
328 } | 322 } |
329 | 323 |
330 | |
331 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { | 324 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { |
332 static const byte data[] = { | 325 static const byte data[] = { |
333 SECTION(OLD_FUNCTIONS, 25), 1, | 326 SECTION(OLD_FUNCTIONS, 25), 1, |
334 // func#0 ------------------------------------------------------ | 327 // func#0 ------------------------------------------------------ |
335 SIG_INDEX(0), // signature index | 328 SIG_INDEX(0), // signature index |
336 NO_NAME, // name length | 329 NO_NAME, // name length |
337 U32_LE(0), // code start offset | 330 U32_LE(0), // code start offset |
338 U32_LE(0), // code end offset | 331 U32_LE(0), // code end offset |
339 U16_LE(899), // local int32 count | 332 U16_LE(899), // local int32 count |
340 U16_LE(799), // local int64 count | 333 U16_LE(799), // local int64 count |
341 U16_LE(699), // local float32 count | 334 U16_LE(699), // local float32 count |
342 U16_LE(599), // local float64 count | 335 U16_LE(599), // local float64 count |
343 0, // exported | 336 0, // exported |
344 1 // external | 337 1 // external |
345 }; | 338 }; |
346 | 339 |
347 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 340 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
348 EXPECT_FALSE(result.ok()); | 341 EXPECT_FALSE(result.ok()); |
349 if (result.val) delete result.val; | 342 if (result.val) delete result.val; |
350 } | 343 } |
351 | 344 |
352 | |
353 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { | 345 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
354 const int kCodeStartOffset = 49; | 346 const int kCodeStartOffset = 49; |
355 const int kCodeEndOffset = kCodeStartOffset + 1; | 347 const int kCodeEndOffset = kCodeStartOffset + 1; |
356 | 348 |
357 static const byte data[] = { | 349 static const byte data[] = { |
358 // signatures | 350 // signatures |
359 SIGNATURES_SECTION_VOID_VOID, | 351 SIGNATURES_SECTION_VOID_VOID, |
360 // func#0 ------------------------------------------------------ | 352 // func#0 ------------------------------------------------------ |
361 SECTION(OLD_FUNCTIONS, 18), 1, | 353 SECTION(OLD_FUNCTIONS, 18), 1, |
362 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, | 354 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 | 386 |
395 EXPECT_TRUE(function->exported); | 387 EXPECT_TRUE(function->exported); |
396 EXPECT_FALSE(function->external); | 388 EXPECT_FALSE(function->external); |
397 | 389 |
398 if (result.val) delete result.val; | 390 if (result.val) delete result.val; |
399 } | 391 } |
400 | 392 |
401 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); | 393 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); |
402 } | 394 } |
403 | 395 |
404 | |
405 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { | 396 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { |
406 static const byte data[] = { | 397 static const byte data[] = { |
407 // signatures | 398 // signatures |
408 SIGNATURES_SECTION_VOID_VOID, | 399 SIGNATURES_SECTION_VOID_VOID, |
409 // functions | 400 // functions |
410 SECTION(OLD_FUNCTIONS, 4), 1, | 401 SECTION(OLD_FUNCTIONS, 4), 1, |
411 // func#0 ------------------------------------------------------ | 402 // func#0 ------------------------------------------------------ |
412 kDeclFunctionImport, // no name, no locals, imported | 403 kDeclFunctionImport, // no name, no locals, imported |
413 SIG_INDEX(0), | 404 SIG_INDEX(0), |
414 }; | 405 }; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 EXPECT_EQ(0, function->local_i64_count); | 451 EXPECT_EQ(0, function->local_i64_count); |
461 EXPECT_EQ(0, function->local_f32_count); | 452 EXPECT_EQ(0, function->local_f32_count); |
462 EXPECT_EQ(0, function->local_f64_count); | 453 EXPECT_EQ(0, function->local_f64_count); |
463 | 454 |
464 EXPECT_FALSE(function->exported); | 455 EXPECT_FALSE(function->exported); |
465 EXPECT_FALSE(function->external); | 456 EXPECT_FALSE(function->external); |
466 | 457 |
467 if (result.val) delete result.val; | 458 if (result.val) delete result.val; |
468 } | 459 } |
469 | 460 |
470 | |
471 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) { | 461 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) { |
472 static const byte kCodeStartOffset = 46; | 462 static const byte kCodeStartOffset = 46; |
473 static const byte kCodeEndOffset = kCodeStartOffset + 1; | 463 static const byte kCodeEndOffset = kCodeStartOffset + 1; |
474 | 464 |
475 static const byte data[] = { | 465 static const byte data[] = { |
476 SIGNATURES_SECTION_VOID_VOID, // -- | 466 SIGNATURES_SECTION_VOID_VOID, // -- |
477 SECTION(OLD_FUNCTIONS, 15), 1, | 467 SECTION(OLD_FUNCTIONS, 15), 1, |
478 // func#0 ------------------------------------------------------ | 468 // func#0 ------------------------------------------------------ |
479 kDeclFunctionLocals, 0, 0, // signature index | 469 kDeclFunctionLocals, 0, 0, // signature index |
480 1, 2, // local int32 count | 470 1, 2, // local int32 count |
(...skipping 17 matching lines...) Expand all Loading... |
498 EXPECT_EQ(1027, function->local_i64_count); | 488 EXPECT_EQ(1027, function->local_i64_count); |
499 EXPECT_EQ(1541, function->local_f32_count); | 489 EXPECT_EQ(1541, function->local_f32_count); |
500 EXPECT_EQ(2055, function->local_f64_count); | 490 EXPECT_EQ(2055, function->local_f64_count); |
501 | 491 |
502 EXPECT_FALSE(function->exported); | 492 EXPECT_FALSE(function->exported); |
503 EXPECT_FALSE(function->external); | 493 EXPECT_FALSE(function->external); |
504 | 494 |
505 if (result.val) delete result.val; | 495 if (result.val) delete result.val; |
506 } | 496 } |
507 | 497 |
508 | |
509 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { | 498 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
510 static const byte kNameOffset = 49; | 499 static const byte kNameOffset = 49; |
511 static const byte kCodeStartOffset = 61; | 500 static const byte kCodeStartOffset = 61; |
512 static const byte kCodeEndOffset = kCodeStartOffset + 3; | 501 static const byte kCodeEndOffset = kCodeStartOffset + 3; |
513 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22; | 502 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22; |
514 | 503 |
515 static const byte data[] = { | 504 static const byte data[] = { |
516 // global#0 -------------------------------------------------- | 505 // global#0 -------------------------------------------------- |
517 SECTION(GLOBALS, 4), 1, | 506 SECTION(GLOBALS, 4), 1, |
518 0, // name length | 507 0, // name length |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 | 561 |
573 EXPECT_EQ(0x8b3ae, segment->dest_addr); | 562 EXPECT_EQ(0x8b3ae, segment->dest_addr); |
574 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); | 563 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); |
575 EXPECT_EQ(5, segment->source_size); | 564 EXPECT_EQ(5, segment->source_size); |
576 EXPECT_TRUE(segment->init); | 565 EXPECT_TRUE(segment->init); |
577 | 566 |
578 if (result.val) delete result.val; | 567 if (result.val) delete result.val; |
579 } | 568 } |
580 } | 569 } |
581 | 570 |
582 | |
583 TEST_F(WasmModuleVerifyTest, OneDataSegment) { | 571 TEST_F(WasmModuleVerifyTest, OneDataSegment) { |
584 const byte kDataSegmentSourceOffset = 30; | 572 const byte kDataSegmentSourceOffset = 30; |
585 const byte data[] = { | 573 const byte data[] = { |
586 SECTION(MEMORY, 3), | 574 SECTION(MEMORY, 3), |
587 28, | 575 28, |
588 28, | 576 28, |
589 1, | 577 1, |
590 SECTION(DATA_SEGMENTS, 8), | 578 SECTION(DATA_SEGMENTS, 8), |
591 1, | 579 1, |
592 U32V_3(0x9bbaa), // dest addr | 580 U32V_3(0x9bbaa), // dest addr |
(...skipping 17 matching lines...) Expand all Loading... |
610 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); | 598 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); |
611 EXPECT_EQ(3, segment->source_size); | 599 EXPECT_EQ(3, segment->source_size); |
612 EXPECT_TRUE(segment->init); | 600 EXPECT_TRUE(segment->init); |
613 | 601 |
614 if (result.val) delete result.val; | 602 if (result.val) delete result.val; |
615 } | 603 } |
616 | 604 |
617 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); | 605 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data)); |
618 } | 606 } |
619 | 607 |
620 | |
621 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { | 608 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { |
622 const byte kDataSegment0SourceOffset = 30; | 609 const byte kDataSegment0SourceOffset = 30; |
623 const byte kDataSegment1SourceOffset = 30 + 8; | 610 const byte kDataSegment1SourceOffset = 30 + 8; |
624 | 611 |
625 const byte data[] = { | 612 const byte data[] = { |
626 SECTION(MEMORY, 3), | 613 SECTION(MEMORY, 3), |
627 28, | 614 28, |
628 28, | 615 28, |
629 1, | 616 1, |
630 SECTION(DATA_SEGMENTS, 23), | 617 SECTION(DATA_SEGMENTS, 23), |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 | 684 |
698 if (dest_addr <= (mem_size - source_size)) { | 685 if (dest_addr <= (mem_size - source_size)) { |
699 EXPECT_VERIFIES(data); | 686 EXPECT_VERIFIES(data); |
700 } else { | 687 } else { |
701 EXPECT_FAILURE(data); | 688 EXPECT_FAILURE(data); |
702 } | 689 } |
703 } | 690 } |
704 } | 691 } |
705 } | 692 } |
706 | 693 |
707 | |
708 // To make below tests for indirect calls much shorter. | 694 // To make below tests for indirect calls much shorter. |
709 #define FUNCTION(sig_index, external) kDeclFunctionImport, SIG_INDEX(sig_index) | 695 #define FUNCTION(sig_index, external) kDeclFunctionImport, SIG_INDEX(sig_index) |
710 | 696 |
711 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { | 697 TEST_F(WasmModuleVerifyTest, OneIndirectFunction) { |
712 static const byte data[] = { | 698 static const byte data[] = { |
713 // sig#0 ------------------------------------------------------- | 699 // sig#0 ------------------------------------------------------- |
714 SIGNATURES_SECTION_VOID_VOID, | 700 SIGNATURES_SECTION_VOID_VOID, |
715 // func#0 ------------------------------------------------------ | 701 // func#0 ------------------------------------------------------ |
716 SECTION(OLD_FUNCTIONS, 4), 1, FUNCTION(0, 0), | 702 SECTION(OLD_FUNCTIONS, 4), 1, FUNCTION(0, 0), |
717 // indirect table ---------------------------------------------- | 703 // indirect table ---------------------------------------------- |
718 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; | 704 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)}; |
719 | 705 |
720 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 706 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
721 EXPECT_OK(result); | 707 EXPECT_OK(result); |
722 if (result.ok()) { | 708 if (result.ok()) { |
723 EXPECT_EQ(1, result.val->signatures.size()); | 709 EXPECT_EQ(1, result.val->signatures.size()); |
724 EXPECT_EQ(1, result.val->functions.size()); | 710 EXPECT_EQ(1, result.val->functions.size()); |
725 EXPECT_EQ(1, result.val->function_table.size()); | 711 EXPECT_EQ(1, result.val->function_table.size()); |
726 EXPECT_EQ(0, result.val->function_table[0]); | 712 EXPECT_EQ(0, result.val->function_table[0]); |
727 } | 713 } |
728 if (result.val) delete result.val; | 714 if (result.val) delete result.val; |
729 } | 715 } |
730 | 716 |
731 | |
732 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { | 717 TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) { |
733 static const byte data[] = { | 718 static const byte data[] = { |
734 // sig#0 ------------------------------------------------------- | 719 // sig#0 ------------------------------------------------------- |
735 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x), | 720 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x), |
736 2, // -- | 721 2, // -- |
737 SIG_ENTRY_v_v, // void -> void | 722 SIG_ENTRY_v_v, // void -> void |
738 SIG_ENTRY_v_x(kLocalI32), // void -> i32 | 723 SIG_ENTRY_v_x(kLocalI32), // void -> i32 |
739 // func#0 ------------------------------------------------------ | 724 // func#0 ------------------------------------------------------ |
740 SECTION(OLD_FUNCTIONS, 13), 4, FUNCTION(0, 1), // -- | 725 SECTION(OLD_FUNCTIONS, 13), 4, FUNCTION(0, 1), // -- |
741 FUNCTION(1, 1), // -- | 726 FUNCTION(1, 1), // -- |
(...skipping 17 matching lines...) Expand all Loading... |
759 EXPECT_EQ(2, result.val->signatures.size()); | 744 EXPECT_EQ(2, result.val->signatures.size()); |
760 EXPECT_EQ(4, result.val->functions.size()); | 745 EXPECT_EQ(4, result.val->functions.size()); |
761 EXPECT_EQ(8, result.val->function_table.size()); | 746 EXPECT_EQ(8, result.val->function_table.size()); |
762 for (int i = 0; i < 8; i++) { | 747 for (int i = 0; i < 8; i++) { |
763 EXPECT_EQ(i & 3, result.val->function_table[i]); | 748 EXPECT_EQ(i & 3, result.val->function_table[i]); |
764 } | 749 } |
765 } | 750 } |
766 if (result.val) delete result.val; | 751 if (result.val) delete result.val; |
767 } | 752 } |
768 | 753 |
769 | |
770 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) { | 754 TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) { |
771 static const byte data[] = { | 755 static const byte data[] = { |
772 // sig#0 ------------------------------------------------------- | 756 // sig#0 ------------------------------------------------------- |
773 SIGNATURES_SECTION_VOID_VOID, | 757 SIGNATURES_SECTION_VOID_VOID, |
774 // indirect table ---------------------------------------------- | 758 // indirect table ---------------------------------------------- |
775 SECTION(FUNCTION_TABLE, 3), 1, 0, 0, | 759 SECTION(FUNCTION_TABLE, 3), 1, 0, 0, |
776 }; | 760 }; |
777 | 761 |
778 EXPECT_FAILURE(data); | 762 EXPECT_FAILURE(data); |
779 } | 763 } |
780 | 764 |
781 | |
782 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) { | 765 TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) { |
783 static const byte data[] = { | 766 static const byte data[] = { |
784 // sig#0 ------------------------------------------------------- | 767 // sig#0 ------------------------------------------------------- |
785 SIGNATURES_SECTION_VOID_VOID, | 768 SIGNATURES_SECTION_VOID_VOID, |
786 // functions --------------------------------------------------- | 769 // functions --------------------------------------------------- |
787 SECTION(OLD_FUNCTIONS, 4), 1, FUNCTION(0, 1), | 770 SECTION(OLD_FUNCTIONS, 4), 1, FUNCTION(0, 1), |
788 // indirect table ---------------------------------------------- | 771 // indirect table ---------------------------------------------- |
789 SECTION(FUNCTION_TABLE, 3), 1, 1, 0, | 772 SECTION(FUNCTION_TABLE, 3), 1, 1, 0, |
790 }; | 773 }; |
791 | 774 |
792 EXPECT_FAILURE(data); | 775 EXPECT_FAILURE(data); |
793 } | 776 } |
794 | 777 |
795 | |
796 class WasmSignatureDecodeTest : public TestWithZone {}; | 778 class WasmSignatureDecodeTest : public TestWithZone {}; |
797 | 779 |
798 | |
799 TEST_F(WasmSignatureDecodeTest, Ok_v_v) { | 780 TEST_F(WasmSignatureDecodeTest, Ok_v_v) { |
800 static const byte data[] = {SIG_ENTRY_v_v}; | 781 static const byte data[] = {SIG_ENTRY_v_v}; |
801 base::AccountingAllocator allocator; | 782 base::AccountingAllocator allocator; |
802 Zone zone(&allocator); | 783 Zone zone(&allocator); |
803 FunctionSig* sig = | 784 FunctionSig* sig = |
804 DecodeWasmSignatureForTesting(&zone, data, data + arraysize(data)); | 785 DecodeWasmSignatureForTesting(&zone, data, data + arraysize(data)); |
805 | 786 |
806 EXPECT_TRUE(sig != nullptr); | 787 EXPECT_TRUE(sig != nullptr); |
807 EXPECT_EQ(0, sig->parameter_count()); | 788 EXPECT_EQ(0, sig->parameter_count()); |
808 EXPECT_EQ(0, sig->return_count()); | 789 EXPECT_EQ(0, sig->return_count()); |
809 } | 790 } |
810 | 791 |
811 | |
812 TEST_F(WasmSignatureDecodeTest, Ok_t_v) { | 792 TEST_F(WasmSignatureDecodeTest, Ok_t_v) { |
813 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 793 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
814 LocalTypePair ret_type = kLocalTypes[i]; | 794 LocalTypePair ret_type = kLocalTypes[i]; |
815 const byte data[] = {SIG_ENTRY_x(ret_type.code)}; | 795 const byte data[] = {SIG_ENTRY_x(ret_type.code)}; |
816 FunctionSig* sig = | 796 FunctionSig* sig = |
817 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); | 797 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); |
818 | 798 |
819 EXPECT_TRUE(sig != nullptr); | 799 EXPECT_TRUE(sig != nullptr); |
820 EXPECT_EQ(0, sig->parameter_count()); | 800 EXPECT_EQ(0, sig->parameter_count()); |
821 EXPECT_EQ(1, sig->return_count()); | 801 EXPECT_EQ(1, sig->return_count()); |
822 EXPECT_EQ(ret_type.type, sig->GetReturn()); | 802 EXPECT_EQ(ret_type.type, sig->GetReturn()); |
823 } | 803 } |
824 } | 804 } |
825 | 805 |
826 | |
827 TEST_F(WasmSignatureDecodeTest, Ok_v_t) { | 806 TEST_F(WasmSignatureDecodeTest, Ok_v_t) { |
828 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 807 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
829 LocalTypePair param_type = kLocalTypes[i]; | 808 LocalTypePair param_type = kLocalTypes[i]; |
830 const byte data[] = {SIG_ENTRY_v_x(param_type.code)}; | 809 const byte data[] = {SIG_ENTRY_v_x(param_type.code)}; |
831 FunctionSig* sig = | 810 FunctionSig* sig = |
832 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); | 811 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); |
833 | 812 |
834 EXPECT_TRUE(sig != nullptr); | 813 EXPECT_TRUE(sig != nullptr); |
835 EXPECT_EQ(1, sig->parameter_count()); | 814 EXPECT_EQ(1, sig->parameter_count()); |
836 EXPECT_EQ(0, sig->return_count()); | 815 EXPECT_EQ(0, sig->return_count()); |
837 EXPECT_EQ(param_type.type, sig->GetParam(0)); | 816 EXPECT_EQ(param_type.type, sig->GetParam(0)); |
838 } | 817 } |
839 } | 818 } |
840 | 819 |
841 | |
842 TEST_F(WasmSignatureDecodeTest, Ok_t_t) { | 820 TEST_F(WasmSignatureDecodeTest, Ok_t_t) { |
843 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 821 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
844 LocalTypePair ret_type = kLocalTypes[i]; | 822 LocalTypePair ret_type = kLocalTypes[i]; |
845 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { | 823 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { |
846 LocalTypePair param_type = kLocalTypes[j]; | 824 LocalTypePair param_type = kLocalTypes[j]; |
847 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)}; | 825 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)}; |
848 FunctionSig* sig = | 826 FunctionSig* sig = |
849 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); | 827 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); |
850 | 828 |
851 EXPECT_TRUE(sig != nullptr); | 829 EXPECT_TRUE(sig != nullptr); |
852 EXPECT_EQ(1, sig->parameter_count()); | 830 EXPECT_EQ(1, sig->parameter_count()); |
853 EXPECT_EQ(1, sig->return_count()); | 831 EXPECT_EQ(1, sig->return_count()); |
854 EXPECT_EQ(param_type.type, sig->GetParam(0)); | 832 EXPECT_EQ(param_type.type, sig->GetParam(0)); |
855 EXPECT_EQ(ret_type.type, sig->GetReturn()); | 833 EXPECT_EQ(ret_type.type, sig->GetReturn()); |
856 } | 834 } |
857 } | 835 } |
858 } | 836 } |
859 | 837 |
860 | |
861 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) { | 838 TEST_F(WasmSignatureDecodeTest, Ok_i_tt) { |
862 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 839 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
863 LocalTypePair p0_type = kLocalTypes[i]; | 840 LocalTypePair p0_type = kLocalTypes[i]; |
864 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { | 841 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { |
865 LocalTypePair p1_type = kLocalTypes[j]; | 842 LocalTypePair p1_type = kLocalTypes[j]; |
866 const byte data[] = { | 843 const byte data[] = { |
867 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)}; | 844 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)}; |
868 FunctionSig* sig = | 845 FunctionSig* sig = |
869 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); | 846 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); |
870 | 847 |
871 EXPECT_TRUE(sig != nullptr); | 848 EXPECT_TRUE(sig != nullptr); |
872 EXPECT_EQ(2, sig->parameter_count()); | 849 EXPECT_EQ(2, sig->parameter_count()); |
873 EXPECT_EQ(1, sig->return_count()); | 850 EXPECT_EQ(1, sig->return_count()); |
874 EXPECT_EQ(p0_type.type, sig->GetParam(0)); | 851 EXPECT_EQ(p0_type.type, sig->GetParam(0)); |
875 EXPECT_EQ(p1_type.type, sig->GetParam(1)); | 852 EXPECT_EQ(p1_type.type, sig->GetParam(1)); |
876 } | 853 } |
877 } | 854 } |
878 } | 855 } |
879 | 856 |
880 | |
881 TEST_F(WasmSignatureDecodeTest, Fail_off_end) { | 857 TEST_F(WasmSignatureDecodeTest, Fail_off_end) { |
882 byte data[256]; | 858 byte data[256]; |
883 for (int p = 0; p <= 255; p = p + 1 + p * 3) { | 859 for (int p = 0; p <= 255; p = p + 1 + p * 3) { |
884 for (int i = 0; i <= p; i++) data[i] = kLocalI32; | 860 for (int i = 0; i <= p; i++) data[i] = kLocalI32; |
885 data[0] = static_cast<byte>(p); | 861 data[0] = static_cast<byte>(p); |
886 | 862 |
887 for (int i = 0; i < p + 1; i++) { | 863 for (int i = 0; i < p + 1; i++) { |
888 // Should fall off the end for all signatures. | 864 // Should fall off the end for all signatures. |
889 FunctionSig* sig = DecodeWasmSignatureForTesting(zone(), data, data + i); | 865 FunctionSig* sig = DecodeWasmSignatureForTesting(zone(), data, data + i); |
890 EXPECT_EQ(nullptr, sig); | 866 EXPECT_EQ(nullptr, sig); |
891 } | 867 } |
892 } | 868 } |
893 } | 869 } |
894 | 870 |
895 | |
896 TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) { | 871 TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) { |
897 byte kInvalidType = 76; | 872 byte kInvalidType = 76; |
898 for (size_t i = 0; i < SIZEOF_SIG_ENTRY_x_xx; i++) { | 873 for (size_t i = 0; i < SIZEOF_SIG_ENTRY_x_xx; i++) { |
899 byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)}; | 874 byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)}; |
900 data[i] = kInvalidType; | 875 data[i] = kInvalidType; |
901 FunctionSig* sig = | 876 FunctionSig* sig = |
902 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); | 877 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data)); |
903 EXPECT_EQ(nullptr, sig); | 878 EXPECT_EQ(nullptr, sig); |
904 } | 879 } |
905 } | 880 } |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1430 NO_LOCAL_NAMES, // -- | 1405 NO_LOCAL_NAMES, // -- |
1431 FOO_STRING, | 1406 FOO_STRING, |
1432 NO_LOCAL_NAMES, // -- | 1407 NO_LOCAL_NAMES, // -- |
1433 }; | 1408 }; |
1434 EXPECT_VERIFIES(data); | 1409 EXPECT_VERIFIES(data); |
1435 } | 1410 } |
1436 | 1411 |
1437 } // namespace wasm | 1412 } // namespace wasm |
1438 } // namespace internal | 1413 } // namespace internal |
1439 } // namespace v8 | 1414 } // namespace v8 |
OLD | NEW |