| 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 |