| 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 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 0, // exported | 336 0, // exported |
| 337 0 // external | 337 0 // external |
| 338 }; | 338 }; |
| 339 | 339 |
| 340 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 340 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 341 EXPECT_FALSE(result.ok()); | 341 EXPECT_FALSE(result.ok()); |
| 342 if (result.val) delete result.val; | 342 if (result.val) delete result.val; |
| 343 } | 343 } |
| 344 | 344 |
| 345 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { | 345 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
| 346 const int kCodeStartOffset = 49; | 346 const int kCodeStartOffset = 41; |
| 347 const int kCodeEndOffset = kCodeStartOffset + 1; | 347 const int kCodeEndOffset = kCodeStartOffset + 1; |
| 348 | 348 |
| 349 static const byte data[] = { | 349 static const byte data[] = { |
| 350 // signatures | 350 // signatures |
| 351 SIGNATURES_SECTION_VOID_VOID, | 351 SIGNATURES_SECTION_VOID_VOID, |
| 352 // func#0 ------------------------------------------------------ | 352 // func#0 ------------------------------------------------------ |
| 353 SECTION(OLD_FUNCTIONS, 18), 1, | 353 SECTION(OLD_FUNCTIONS, 10), 1, kDeclFunctionExport | kDeclFunctionName, |
| 354 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, | |
| 355 SIG_INDEX(0), // signature index | 354 SIG_INDEX(0), // signature index |
| 356 NAME_LENGTH(2), 'h', 'i', // name | 355 NAME_LENGTH(2), 'h', 'i', // name |
| 357 U16_LE(1466), // local int32 count | |
| 358 U16_LE(1355), // local int64 count | |
| 359 U16_LE(1244), // local float32 count | |
| 360 U16_LE(1133), // local float64 count | |
| 361 1, 0, // size | 356 1, 0, // size |
| 362 kExprNop, | 357 kExprNop, |
| 363 }; | 358 }; |
| 364 | 359 |
| 365 { | 360 { |
| 366 // Should decode to exactly one function. | 361 // Should decode to exactly one function. |
| 367 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 362 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 368 EXPECT_OK(result); | 363 EXPECT_OK(result); |
| 369 EXPECT_EQ(0, result.val->globals.size()); | 364 EXPECT_EQ(0, result.val->globals.size()); |
| 370 EXPECT_EQ(1, result.val->signatures.size()); | 365 EXPECT_EQ(1, result.val->signatures.size()); |
| 371 EXPECT_EQ(1, result.val->functions.size()); | 366 EXPECT_EQ(1, result.val->functions.size()); |
| 372 EXPECT_EQ(0, result.val->data_segments.size()); | 367 EXPECT_EQ(0, result.val->data_segments.size()); |
| 373 EXPECT_EQ(0, result.val->function_table.size()); | 368 EXPECT_EQ(0, result.val->function_table.size()); |
| 374 | 369 |
| 375 WasmFunction* function = &result.val->functions.back(); | 370 WasmFunction* function = &result.val->functions.back(); |
| 376 | 371 |
| 377 EXPECT_EQ(37, function->name_offset); | 372 EXPECT_EQ(37, function->name_offset); |
| 378 EXPECT_EQ(2, function->name_length); | 373 EXPECT_EQ(2, function->name_length); |
| 379 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 374 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 380 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 375 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 381 | 376 |
| 382 EXPECT_EQ(1466, function->local_i32_count); | |
| 383 EXPECT_EQ(1355, function->local_i64_count); | |
| 384 EXPECT_EQ(1244, function->local_f32_count); | |
| 385 EXPECT_EQ(1133, function->local_f64_count); | |
| 386 | |
| 387 EXPECT_TRUE(function->exported); | 377 EXPECT_TRUE(function->exported); |
| 388 | 378 |
| 389 if (result.val) delete result.val; | 379 if (result.val) delete result.val; |
| 390 } | 380 } |
| 391 | 381 |
| 392 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); | 382 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data)); |
| 393 } | 383 } |
| 394 | 384 |
| 395 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) { | 385 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) { |
| 396 static const byte kCodeStartOffset = 38; | 386 static const byte kCodeStartOffset = 38; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 408 | 398 |
| 409 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 399 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 410 EXPECT_OK(result); | 400 EXPECT_OK(result); |
| 411 EXPECT_EQ(1, result.val->functions.size()); | 401 EXPECT_EQ(1, result.val->functions.size()); |
| 412 WasmFunction* function = &result.val->functions.back(); | 402 WasmFunction* function = &result.val->functions.back(); |
| 413 | 403 |
| 414 EXPECT_EQ(0, function->name_length); | 404 EXPECT_EQ(0, function->name_length); |
| 415 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 405 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 416 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 406 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 417 | 407 |
| 418 EXPECT_EQ(0, function->local_i32_count); | |
| 419 EXPECT_EQ(0, function->local_i64_count); | |
| 420 EXPECT_EQ(0, function->local_f32_count); | |
| 421 EXPECT_EQ(0, function->local_f64_count); | |
| 422 | |
| 423 EXPECT_FALSE(function->exported); | 408 EXPECT_FALSE(function->exported); |
| 424 | 409 |
| 425 if (result.val) delete result.val; | 410 if (result.val) delete result.val; |
| 426 } | |
| 427 | |
| 428 TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody_WithLocals) { | |
| 429 static const byte kCodeStartOffset = 46; | |
| 430 static const byte kCodeEndOffset = kCodeStartOffset + 1; | |
| 431 | |
| 432 static const byte data[] = { | |
| 433 SIGNATURES_SECTION_VOID_VOID, // -- | |
| 434 SECTION(OLD_FUNCTIONS, 15), 1, | |
| 435 // func#0 ------------------------------------------------------ | |
| 436 kDeclFunctionLocals, 0, 0, // signature index | |
| 437 1, 2, // local int32 count | |
| 438 3, 4, // local int64 count | |
| 439 5, 6, // local float32 count | |
| 440 7, 8, // local float64 count | |
| 441 1, 0, // body size | |
| 442 kExprNop // body | |
| 443 }; | |
| 444 | |
| 445 ModuleResult result = DecodeModule(data, data + arraysize(data)); | |
| 446 EXPECT_OK(result); | |
| 447 EXPECT_EQ(1, result.val->functions.size()); | |
| 448 WasmFunction* function = &result.val->functions.back(); | |
| 449 | |
| 450 EXPECT_EQ(0, function->name_length); | |
| 451 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | |
| 452 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | |
| 453 | |
| 454 EXPECT_EQ(513, function->local_i32_count); | |
| 455 EXPECT_EQ(1027, function->local_i64_count); | |
| 456 EXPECT_EQ(1541, function->local_f32_count); | |
| 457 EXPECT_EQ(2055, function->local_f64_count); | |
| 458 | |
| 459 EXPECT_FALSE(function->exported); | |
| 460 | |
| 461 if (result.val) delete result.val; | |
| 462 } | 411 } |
| 463 | 412 |
| 464 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { | 413 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
| 465 static const byte kNameOffset = 49; | 414 static const byte kNameOffset = 49; |
| 466 static const byte kCodeStartOffset = 61; | 415 static const byte kCodeStartOffset = 53; |
| 467 static const byte kCodeEndOffset = kCodeStartOffset + 3; | 416 static const byte kCodeEndOffset = kCodeStartOffset + 3; |
| 468 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22; | 417 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22; |
| 469 | 418 |
| 470 static const byte data[] = { | 419 static const byte data[] = { |
| 471 // global#0 -------------------------------------------------- | 420 // global#0 -------------------------------------------------- |
| 472 SECTION(GLOBALS, 4), 1, | 421 SECTION(GLOBALS, 4), 1, |
| 473 0, // name length | 422 0, // name length |
| 474 kMemU8, // memory type | 423 kMemU8, // memory type |
| 475 0, // exported | 424 0, // exported |
| 476 // sig#0 ----------------------------------------------------- | 425 // sig#0 ----------------------------------------------------- |
| 477 SIGNATURES_SECTION_VOID_VOID, | 426 SIGNATURES_SECTION_VOID_VOID, |
| 478 // func#0 ---------------------------------------------------- | 427 // func#0 ---------------------------------------------------- |
| 479 SECTION(OLD_FUNCTIONS, 20), 1, | 428 SECTION(OLD_FUNCTIONS, 12), 1, |
| 480 kDeclFunctionLocals | kDeclFunctionName, // -- | 429 kDeclFunctionName, // -- |
| 481 SIG_INDEX(0), // signature index | 430 SIG_INDEX(0), // signature index |
| 482 2, 'h', 'i', // name | 431 2, 'h', 'i', // name |
| 483 1, 2, // local int32 count | 432 3, 0, // body size |
| 484 3, 4, // local int64 count | 433 kExprNop, // func#0 body |
| 485 5, 6, // local float32 count | 434 kExprNop, // func#0 body |
| 486 7, 8, // local float64 count | 435 kExprNop, // func#0 body |
| 487 3, 0, // body size | |
| 488 kExprNop, // func#0 body | |
| 489 kExprNop, // func#0 body | |
| 490 kExprNop, // func#0 body | |
| 491 // memory section -------------------------------------------- | 436 // memory section -------------------------------------------- |
| 492 SECTION(MEMORY, 3), 28, 28, 1, | 437 SECTION(MEMORY, 3), 28, 28, 1, |
| 493 // segment#0 ------------------------------------------------- | 438 // segment#0 ------------------------------------------------- |
| 494 SECTION(DATA_SEGMENTS, 10), 1, | 439 SECTION(DATA_SEGMENTS, 10), 1, |
| 495 U32V_3(0x8b3ae), // dest addr | 440 U32V_3(0x8b3ae), // dest addr |
| 496 U32V_1(5), // source size | 441 U32V_1(5), // source size |
| 497 0, 1, 2, 3, 4, // data bytes | 442 0, 1, 2, 3, 4, // data bytes |
| 498 // rest ------------------------------------------------------ | 443 // rest ------------------------------------------------------ |
| 499 SECTION(END, 0), | 444 SECTION(END, 0), |
| 500 }; | 445 }; |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1369 NO_LOCAL_NAMES, // -- | 1314 NO_LOCAL_NAMES, // -- |
| 1370 FOO_STRING, | 1315 FOO_STRING, |
| 1371 NO_LOCAL_NAMES, // -- | 1316 NO_LOCAL_NAMES, // -- |
| 1372 }; | 1317 }; |
| 1373 EXPECT_VERIFIES(data); | 1318 EXPECT_VERIFIES(data); |
| 1374 } | 1319 } |
| 1375 | 1320 |
| 1376 } // namespace wasm | 1321 } // namespace wasm |
| 1377 } // namespace internal | 1322 } // namespace internal |
| 1378 } // namespace v8 | 1323 } // namespace v8 |
| OLD | NEW |