OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 | 455 |
456 THREADED_TEST(ScriptMakingExternalString) { | 456 THREADED_TEST(ScriptMakingExternalString) { |
457 int dispose_count = 0; | 457 int dispose_count = 0; |
458 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); | 458 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
459 { | 459 { |
460 LocalContext env; | 460 LocalContext env; |
461 v8::HandleScope scope(env->GetIsolate()); | 461 v8::HandleScope scope(env->GetIsolate()); |
462 Local<String> source = | 462 Local<String> source = |
463 String::NewFromTwoByte(env->GetIsolate(), two_byte_source); | 463 String::NewFromTwoByte(env->GetIsolate(), two_byte_source); |
464 // Trigger GCs so that the newly allocated string moves to old gen. | 464 // Trigger GCs so that the newly allocated string moves to old gen. |
465 CcTest::heap()->CollectGarbageNewSpace(); // in survivor space now | 465 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
466 CcTest::heap()->CollectGarbageNewSpace(); // in old gen now | 466 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
467 CHECK_EQ(source->IsExternal(), false); | 467 CHECK_EQ(source->IsExternal(), false); |
468 CHECK_EQ(source->IsExternalOneByte(), false); | 468 CHECK_EQ(source->IsExternalOneByte(), false); |
469 String::Encoding encoding = String::UNKNOWN_ENCODING; | 469 String::Encoding encoding = String::UNKNOWN_ENCODING; |
470 CHECK(!source->GetExternalStringResourceBase(&encoding)); | 470 CHECK(!source->GetExternalStringResourceBase(&encoding)); |
471 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); | 471 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); |
472 bool success = source->MakeExternal(new TestResource(two_byte_source, | 472 bool success = source->MakeExternal(new TestResource(two_byte_source, |
473 &dispose_count)); | 473 &dispose_count)); |
474 CHECK(success); | 474 CHECK(success); |
475 Local<Script> script = v8_compile(source); | 475 Local<Script> script = v8_compile(source); |
476 Local<Value> value = script->Run(); | 476 Local<Value> value = script->Run(); |
477 CHECK(value->IsNumber()); | 477 CHECK(value->IsNumber()); |
478 CHECK_EQ(7, value->Int32Value()); | 478 CHECK_EQ(7, value->Int32Value()); |
479 CcTest::heap()->CollectAllGarbage(); | 479 CcTest::heap()->CollectAllGarbage(); |
480 CHECK_EQ(0, dispose_count); | 480 CHECK_EQ(0, dispose_count); |
481 } | 481 } |
482 CcTest::i_isolate()->compilation_cache()->Clear(); | 482 CcTest::i_isolate()->compilation_cache()->Clear(); |
483 CcTest::heap()->CollectAllGarbage(); | 483 CcTest::heap()->CollectAllGarbage(); |
484 CHECK_EQ(1, dispose_count); | 484 CHECK_EQ(1, dispose_count); |
485 } | 485 } |
486 | 486 |
487 | 487 |
488 THREADED_TEST(ScriptMakingExternalOneByteString) { | 488 THREADED_TEST(ScriptMakingExternalOneByteString) { |
489 int dispose_count = 0; | 489 int dispose_count = 0; |
490 const char* c_source = "1 + 2 * 3"; | 490 const char* c_source = "1 + 2 * 3"; |
491 { | 491 { |
492 LocalContext env; | 492 LocalContext env; |
493 v8::HandleScope scope(env->GetIsolate()); | 493 v8::HandleScope scope(env->GetIsolate()); |
494 Local<String> source = v8_str(c_source); | 494 Local<String> source = v8_str(c_source); |
495 // Trigger GCs so that the newly allocated string moves to old gen. | 495 // Trigger GCs so that the newly allocated string moves to old gen. |
496 CcTest::heap()->CollectGarbageNewSpace(); // in survivor space now | 496 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
497 CcTest::heap()->CollectGarbageNewSpace(); // in old gen now | 497 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
498 bool success = source->MakeExternal( | 498 bool success = source->MakeExternal( |
499 new TestOneByteResource(i::StrDup(c_source), &dispose_count)); | 499 new TestOneByteResource(i::StrDup(c_source), &dispose_count)); |
500 CHECK(success); | 500 CHECK(success); |
501 Local<Script> script = v8_compile(source); | 501 Local<Script> script = v8_compile(source); |
502 Local<Value> value = script->Run(); | 502 Local<Value> value = script->Run(); |
503 CHECK(value->IsNumber()); | 503 CHECK(value->IsNumber()); |
504 CHECK_EQ(7, value->Int32Value()); | 504 CHECK_EQ(7, value->Int32Value()); |
505 CcTest::heap()->CollectAllGarbage(); | 505 CcTest::heap()->CollectAllGarbage(); |
506 CHECK_EQ(0, dispose_count); | 506 CHECK_EQ(0, dispose_count); |
507 } | 507 } |
508 CcTest::i_isolate()->compilation_cache()->Clear(); | 508 CcTest::i_isolate()->compilation_cache()->Clear(); |
509 CcTest::heap()->CollectAllGarbage(); | 509 CcTest::heap()->CollectAllGarbage(); |
510 CHECK_EQ(1, dispose_count); | 510 CHECK_EQ(1, dispose_count); |
511 } | 511 } |
512 | 512 |
513 | 513 |
514 TEST(MakingExternalStringConditions) { | 514 TEST(MakingExternalStringConditions) { |
515 LocalContext env; | 515 LocalContext env; |
516 v8::HandleScope scope(env->GetIsolate()); | 516 v8::HandleScope scope(env->GetIsolate()); |
517 | 517 |
518 // Free some space in the new space so that we can check freshness. | 518 // Free some space in the new space so that we can check freshness. |
519 CcTest::heap()->CollectGarbageNewSpace(); | 519 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
520 CcTest::heap()->CollectGarbageNewSpace(); | 520 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
521 | 521 |
522 uint16_t* two_byte_string = AsciiToTwoByteString("s1"); | 522 uint16_t* two_byte_string = AsciiToTwoByteString("s1"); |
523 Local<String> small_string = | 523 Local<String> small_string = |
524 String::NewFromTwoByte(env->GetIsolate(), two_byte_string); | 524 String::NewFromTwoByte(env->GetIsolate(), two_byte_string); |
525 i::DeleteArray(two_byte_string); | 525 i::DeleteArray(two_byte_string); |
526 | 526 |
527 // We should refuse to externalize small strings. | 527 // We should refuse to externalize small strings. |
528 CHECK(!small_string->CanMakeExternal()); | 528 CHECK(!small_string->CanMakeExternal()); |
529 // Trigger GCs so that the newly allocated string moves to old gen. | 529 // Trigger GCs so that the newly allocated string moves to old gen. |
530 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 530 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
(...skipping 18 matching lines...) Expand all Loading... |
549 // Large strings should be immediately accepted. | 549 // Large strings should be immediately accepted. |
550 CHECK(large_string->CanMakeExternal()); | 550 CHECK(large_string->CanMakeExternal()); |
551 } | 551 } |
552 | 552 |
553 | 553 |
554 TEST(MakingExternalOneByteStringConditions) { | 554 TEST(MakingExternalOneByteStringConditions) { |
555 LocalContext env; | 555 LocalContext env; |
556 v8::HandleScope scope(env->GetIsolate()); | 556 v8::HandleScope scope(env->GetIsolate()); |
557 | 557 |
558 // Free some space in the new space so that we can check freshness. | 558 // Free some space in the new space so that we can check freshness. |
559 CcTest::heap()->CollectGarbageNewSpace(); | 559 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
560 CcTest::heap()->CollectGarbageNewSpace(); | 560 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
561 | 561 |
562 Local<String> small_string = String::NewFromUtf8(env->GetIsolate(), "s1"); | 562 Local<String> small_string = String::NewFromUtf8(env->GetIsolate(), "s1"); |
563 // We should refuse to externalize small strings. | 563 // We should refuse to externalize small strings. |
564 CHECK(!small_string->CanMakeExternal()); | 564 CHECK(!small_string->CanMakeExternal()); |
565 // Trigger GCs so that the newly allocated string moves to old gen. | 565 // Trigger GCs so that the newly allocated string moves to old gen. |
566 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 566 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
567 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 567 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
568 // Old space strings should be accepted. | 568 // Old space strings should be accepted. |
569 CHECK(small_string->CanMakeExternal()); | 569 CHECK(small_string->CanMakeExternal()); |
570 | 570 |
(...skipping 16 matching lines...) Expand all Loading... |
587 "function slice(a) { return a.substring(1); }"); | 587 "function slice(a) { return a.substring(1); }"); |
588 // Create a cons string that will land in old pointer space. | 588 // Create a cons string that will land in old pointer space. |
589 Local<String> cons = Local<String>::Cast(CompileRun( | 589 Local<String> cons = Local<String>::Cast(CompileRun( |
590 "cons('abcdefghijklm', 'nopqrstuvwxyz');")); | 590 "cons('abcdefghijklm', 'nopqrstuvwxyz');")); |
591 // Create a sliced string that will land in old pointer space. | 591 // Create a sliced string that will land in old pointer space. |
592 Local<String> slice = Local<String>::Cast(CompileRun( | 592 Local<String> slice = Local<String>::Cast(CompileRun( |
593 "slice('abcdefghijklmnopqrstuvwxyz');")); | 593 "slice('abcdefghijklmnopqrstuvwxyz');")); |
594 | 594 |
595 // Trigger GCs so that the newly allocated string moves to old gen. | 595 // Trigger GCs so that the newly allocated string moves to old gen. |
596 SimulateFullSpace(CcTest::heap()->old_space()); | 596 SimulateFullSpace(CcTest::heap()->old_space()); |
597 CcTest::heap()->CollectGarbageNewSpace(); // in survivor space now | 597 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
598 CcTest::heap()->CollectGarbageNewSpace(); // in old gen now | 598 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
599 | 599 |
600 // Turn into external string with unaligned resource data. | 600 // Turn into external string with unaligned resource data. |
601 const char* c_cons = "_abcdefghijklmnopqrstuvwxyz"; | 601 const char* c_cons = "_abcdefghijklmnopqrstuvwxyz"; |
602 bool success = | 602 bool success = |
603 cons->MakeExternal(new TestOneByteResource(i::StrDup(c_cons), NULL, 1)); | 603 cons->MakeExternal(new TestOneByteResource(i::StrDup(c_cons), NULL, 1)); |
604 CHECK(success); | 604 CHECK(success); |
605 const char* c_slice = "_bcdefghijklmnopqrstuvwxyz"; | 605 const char* c_slice = "_bcdefghijklmnopqrstuvwxyz"; |
606 success = | 606 success = |
607 slice->MakeExternal(new TestOneByteResource(i::StrDup(c_slice), NULL, 1)); | 607 slice->MakeExternal(new TestOneByteResource(i::StrDup(c_slice), NULL, 1)); |
608 CHECK(success); | 608 CHECK(success); |
609 | 609 |
610 // Trigger GCs and force evacuation. | 610 // Trigger GCs and force evacuation. |
611 CcTest::heap()->CollectAllGarbage(); | 611 CcTest::heap()->CollectAllGarbage(); |
612 CcTest::heap()->CollectAllGarbage("MakingExternalUnalignedOneByteString", | 612 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); |
613 i::Heap::kReduceMemoryFootprintMask); | |
614 } | 613 } |
615 | 614 |
616 | 615 |
617 THREADED_TEST(UsingExternalString) { | 616 THREADED_TEST(UsingExternalString) { |
618 i::Factory* factory = CcTest::i_isolate()->factory(); | 617 i::Factory* factory = CcTest::i_isolate()->factory(); |
619 { | 618 { |
620 v8::HandleScope scope(CcTest::isolate()); | 619 v8::HandleScope scope(CcTest::isolate()); |
621 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 620 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
622 Local<String> string = String::NewExternal( | 621 Local<String> string = String::NewExternal( |
623 CcTest::isolate(), new TestResource(two_byte_string)); | 622 CcTest::isolate(), new TestResource(two_byte_string)); |
624 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 623 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
625 // Trigger GCs so that the newly allocated string moves to old gen. | 624 // Trigger GCs so that the newly allocated string moves to old gen. |
626 CcTest::heap()->CollectGarbageNewSpace(); // in survivor space now | 625 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
627 CcTest::heap()->CollectGarbageNewSpace(); // in old gen now | 626 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
628 i::Handle<i::String> isymbol = | 627 i::Handle<i::String> isymbol = |
629 factory->InternalizeString(istring); | 628 factory->InternalizeString(istring); |
630 CHECK(isymbol->IsInternalizedString()); | 629 CHECK(isymbol->IsInternalizedString()); |
631 } | 630 } |
632 CcTest::heap()->CollectAllGarbage(); | 631 CcTest::heap()->CollectAllGarbage(); |
633 CcTest::heap()->CollectAllGarbage(); | 632 CcTest::heap()->CollectAllGarbage(); |
634 } | 633 } |
635 | 634 |
636 | 635 |
637 THREADED_TEST(UsingExternalOneByteString) { | 636 THREADED_TEST(UsingExternalOneByteString) { |
638 i::Factory* factory = CcTest::i_isolate()->factory(); | 637 i::Factory* factory = CcTest::i_isolate()->factory(); |
639 { | 638 { |
640 v8::HandleScope scope(CcTest::isolate()); | 639 v8::HandleScope scope(CcTest::isolate()); |
641 const char* one_byte_string = "test string"; | 640 const char* one_byte_string = "test string"; |
642 Local<String> string = String::NewExternal( | 641 Local<String> string = String::NewExternal( |
643 CcTest::isolate(), new TestOneByteResource(i::StrDup(one_byte_string))); | 642 CcTest::isolate(), new TestOneByteResource(i::StrDup(one_byte_string))); |
644 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 643 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
645 // Trigger GCs so that the newly allocated string moves to old gen. | 644 // Trigger GCs so that the newly allocated string moves to old gen. |
646 CcTest::heap()->CollectGarbageNewSpace(); // in survivor space now | 645 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
647 CcTest::heap()->CollectGarbageNewSpace(); // in old gen now | 646 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
648 i::Handle<i::String> isymbol = | 647 i::Handle<i::String> isymbol = |
649 factory->InternalizeString(istring); | 648 factory->InternalizeString(istring); |
650 CHECK(isymbol->IsInternalizedString()); | 649 CHECK(isymbol->IsInternalizedString()); |
651 } | 650 } |
652 CcTest::heap()->CollectAllGarbage(); | 651 CcTest::heap()->CollectAllGarbage(); |
653 CcTest::heap()->CollectAllGarbage(); | 652 CcTest::heap()->CollectAllGarbage(); |
654 } | 653 } |
655 | 654 |
656 | 655 |
657 class RandomLengthResource : public v8::String::ExternalStringResource { | 656 class RandomLengthResource : public v8::String::ExternalStringResource { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 i::FLAG_stress_compaction = false; | 704 i::FLAG_stress_compaction = false; |
706 i::FLAG_gc_global = false; | 705 i::FLAG_gc_global = false; |
707 int dispose_count = 0; | 706 int dispose_count = 0; |
708 bool in_new_space = false; | 707 bool in_new_space = false; |
709 { | 708 { |
710 v8::HandleScope scope(CcTest::isolate()); | 709 v8::HandleScope scope(CcTest::isolate()); |
711 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 710 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
712 Local<String> string = String::NewExternal( | 711 Local<String> string = String::NewExternal( |
713 CcTest::isolate(), new TestResource(two_byte_string, &dispose_count)); | 712 CcTest::isolate(), new TestResource(two_byte_string, &dispose_count)); |
714 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 713 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
715 CcTest::heap()->CollectGarbageNewSpace(); | 714 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
716 in_new_space = CcTest::heap()->InNewSpace(*istring); | 715 in_new_space = CcTest::heap()->InNewSpace(*istring); |
717 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); | 716 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); |
718 CHECK_EQ(0, dispose_count); | 717 CHECK_EQ(0, dispose_count); |
719 } | 718 } |
720 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); | 719 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); |
721 CHECK_EQ(1, dispose_count); | 720 CHECK_EQ(1, dispose_count); |
722 } | 721 } |
723 | 722 |
724 | 723 |
725 THREADED_TEST(ScavengeExternalOneByteString) { | 724 THREADED_TEST(ScavengeExternalOneByteString) { |
726 i::FLAG_stress_compaction = false; | 725 i::FLAG_stress_compaction = false; |
727 i::FLAG_gc_global = false; | 726 i::FLAG_gc_global = false; |
728 int dispose_count = 0; | 727 int dispose_count = 0; |
729 bool in_new_space = false; | 728 bool in_new_space = false; |
730 { | 729 { |
731 v8::HandleScope scope(CcTest::isolate()); | 730 v8::HandleScope scope(CcTest::isolate()); |
732 const char* one_byte_string = "test string"; | 731 const char* one_byte_string = "test string"; |
733 Local<String> string = String::NewExternal( | 732 Local<String> string = String::NewExternal( |
734 CcTest::isolate(), | 733 CcTest::isolate(), |
735 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)); | 734 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)); |
736 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 735 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
737 CcTest::heap()->CollectGarbageNewSpace(); | 736 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
738 in_new_space = CcTest::heap()->InNewSpace(*istring); | 737 in_new_space = CcTest::heap()->InNewSpace(*istring); |
739 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); | 738 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); |
740 CHECK_EQ(0, dispose_count); | 739 CHECK_EQ(0, dispose_count); |
741 } | 740 } |
742 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); | 741 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); |
743 CHECK_EQ(1, dispose_count); | 742 CHECK_EQ(1, dispose_count); |
744 } | 743 } |
745 | 744 |
746 | 745 |
747 class TestOneByteResourceWithDisposeControl : public TestOneByteResource { | 746 class TestOneByteResourceWithDisposeControl : public TestOneByteResource { |
(...skipping 2636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3384 Local<v8::Object> expected2 = NewObjectForIntKey(isolate, templ, 8); | 3383 Local<v8::Object> expected2 = NewObjectForIntKey(isolate, templ, 8); |
3385 removed = map.Set(8, v8::Global<v8::Object>(isolate, expected2), &ref); | 3384 removed = map.Set(8, v8::Global<v8::Object>(isolate, expected2), &ref); |
3386 CHECK_EQ(1, static_cast<int>(map.Size())); | 3385 CHECK_EQ(1, static_cast<int>(map.Size())); |
3387 CHECK(expected == removed); | 3386 CHECK(expected == removed); |
3388 CHECK(expected2->Equals(ref.NewLocal(isolate))); | 3387 CHECK(expected2->Equals(ref.NewLocal(isolate))); |
3389 } | 3388 } |
3390 } | 3389 } |
3391 CHECK_EQ(initial_handle_count + 1, global_handles->global_handles_count()); | 3390 CHECK_EQ(initial_handle_count + 1, global_handles->global_handles_count()); |
3392 if (map.IsWeak()) { | 3391 if (map.IsWeak()) { |
3393 CcTest::i_isolate()->heap()->CollectAllGarbage( | 3392 CcTest::i_isolate()->heap()->CollectAllGarbage( |
3394 "TestGlobalValueMap", i::Heap::kAbortIncrementalMarkingMask); | 3393 i::Heap::kAbortIncrementalMarkingMask); |
3395 } else { | 3394 } else { |
3396 map.Clear(); | 3395 map.Clear(); |
3397 } | 3396 } |
3398 CHECK_EQ(0, static_cast<int>(map.Size())); | 3397 CHECK_EQ(0, static_cast<int>(map.Size())); |
3399 CHECK_EQ(initial_handle_count, global_handles->global_handles_count()); | 3398 CHECK_EQ(initial_handle_count, global_handles->global_handles_count()); |
3400 { | 3399 { |
3401 HandleScope scope(isolate); | 3400 HandleScope scope(isolate); |
3402 Local<v8::Object> value = NewObjectForIntKey(isolate, templ, 9); | 3401 Local<v8::Object> value = NewObjectForIntKey(isolate, templ, 9); |
3403 map.Set(9, value); | 3402 map.Set(9, value); |
3404 map.Clear(); | 3403 map.Clear(); |
(...skipping 3132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6537 Local<Object> b(v8::Object::New(iso)); | 6536 Local<Object> b(v8::Object::New(iso)); |
6538 object_a.handle.Reset(iso, a); | 6537 object_a.handle.Reset(iso, a); |
6539 object_b.handle.Reset(iso, b); | 6538 object_b.handle.Reset(iso, b); |
6540 if (interlinked) { | 6539 if (interlinked) { |
6541 a->Set(v8_str("x"), b); | 6540 a->Set(v8_str("x"), b); |
6542 b->Set(v8_str("x"), a); | 6541 b->Set(v8_str("x"), a); |
6543 } | 6542 } |
6544 if (global_gc) { | 6543 if (global_gc) { |
6545 CcTest::heap()->CollectAllGarbage(); | 6544 CcTest::heap()->CollectAllGarbage(); |
6546 } else { | 6545 } else { |
6547 CcTest::heap()->CollectGarbageNewSpace(); | 6546 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
6548 } | 6547 } |
6549 // We are relying on this creating a big flag array and reserving the space | 6548 // We are relying on this creating a big flag array and reserving the space |
6550 // up front. | 6549 // up front. |
6551 v8::Handle<Value> big_array = CompileRun("new Array(50000)"); | 6550 v8::Handle<Value> big_array = CompileRun("new Array(50000)"); |
6552 a->Set(v8_str("y"), big_array); | 6551 a->Set(v8_str("y"), big_array); |
6553 big_heap_size = CcTest::heap()->SizeOfObjects(); | 6552 big_heap_size = CcTest::heap()->SizeOfObjects(); |
6554 } | 6553 } |
6555 | 6554 |
6556 object_a.flag = false; | 6555 object_a.flag = false; |
6557 object_b.flag = false; | 6556 object_b.flag = false; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6655 | 6654 |
6656 handle.SetWeak<v8::Persistent<v8::Object>>( | 6655 handle.SetWeak<v8::Persistent<v8::Object>>( |
6657 &handle, CheckInternalFields, v8::WeakCallbackType::kInternalFields); | 6656 &handle, CheckInternalFields, v8::WeakCallbackType::kInternalFields); |
6658 if (!global_gc) { | 6657 if (!global_gc) { |
6659 handle.MarkIndependent(); | 6658 handle.MarkIndependent(); |
6660 } | 6659 } |
6661 } | 6660 } |
6662 if (global_gc) { | 6661 if (global_gc) { |
6663 CcTest::heap()->CollectAllGarbage(); | 6662 CcTest::heap()->CollectAllGarbage(); |
6664 } else { | 6663 } else { |
6665 CcTest::heap()->CollectGarbageNewSpace(); | 6664 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
6666 } | 6665 } |
6667 | 6666 |
6668 CHECK_EQ(1729, t1->x()); | 6667 CHECK_EQ(1729, t1->x()); |
6669 CHECK_EQ(33550336, t2->x()); | 6668 CHECK_EQ(33550336, t2->x()); |
6670 | 6669 |
6671 delete t1; | 6670 delete t1; |
6672 delete t2; | 6671 delete t2; |
6673 } | 6672 } |
6674 | 6673 |
6675 | 6674 |
(...skipping 24 matching lines...) Expand all Loading... |
6700 | 6699 |
6701 FlagAndPersistent object_a, object_b; | 6700 FlagAndPersistent object_a, object_b; |
6702 | 6701 |
6703 { | 6702 { |
6704 v8::HandleScope handle_scope(iso); | 6703 v8::HandleScope handle_scope(iso); |
6705 Local<Object> a(v8::Object::New(iso)); | 6704 Local<Object> a(v8::Object::New(iso)); |
6706 Local<Object> b(v8::Object::New(iso)); | 6705 Local<Object> b(v8::Object::New(iso)); |
6707 object_a.handle.Reset(iso, a); | 6706 object_a.handle.Reset(iso, a); |
6708 object_b.handle.Reset(iso, b); | 6707 object_b.handle.Reset(iso, b); |
6709 if (global_gc) { | 6708 if (global_gc) { |
6710 CcTest::heap()->CollectAllGarbage("ResetWeakHandle", | 6709 CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
6711 Heap::kAbortIncrementalMarkingMask); | |
6712 } else { | 6710 } else { |
6713 CcTest::heap()->CollectGarbageNewSpace(); | 6711 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
6714 } | 6712 } |
6715 } | 6713 } |
6716 | 6714 |
6717 object_a.flag = false; | 6715 object_a.flag = false; |
6718 object_b.flag = false; | 6716 object_b.flag = false; |
6719 object_a.handle.SetWeak(&object_a, &ResetUseValueAndSetFlag, | 6717 object_a.handle.SetWeak(&object_a, &ResetUseValueAndSetFlag, |
6720 v8::WeakCallbackType::kParameter); | 6718 v8::WeakCallbackType::kParameter); |
6721 object_b.handle.SetWeak(&object_b, &ResetUseValueAndSetFlag, | 6719 object_b.handle.SetWeak(&object_b, &ResetUseValueAndSetFlag, |
6722 v8::WeakCallbackType::kParameter); | 6720 v8::WeakCallbackType::kParameter); |
6723 if (!global_gc) { | 6721 if (!global_gc) { |
6724 object_a.handle.MarkIndependent(); | 6722 object_a.handle.MarkIndependent(); |
6725 object_b.handle.MarkIndependent(); | 6723 object_b.handle.MarkIndependent(); |
6726 CHECK(object_b.handle.IsIndependent()); | 6724 CHECK(object_b.handle.IsIndependent()); |
6727 } | 6725 } |
6728 if (global_gc) { | 6726 if (global_gc) { |
6729 CcTest::heap()->CollectAllGarbage("ResetWeakHandle", | 6727 CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
6730 Heap::kAbortIncrementalMarkingMask); | |
6731 } else { | 6728 } else { |
6732 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 6729 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
6733 } | 6730 } |
6734 CHECK(object_a.flag); | 6731 CHECK(object_a.flag); |
6735 CHECK(object_b.flag); | 6732 CHECK(object_b.flag); |
6736 } | 6733 } |
6737 | 6734 |
6738 | 6735 |
6739 THREADED_HEAP_TEST(ResetWeakHandle) { | 6736 THREADED_HEAP_TEST(ResetWeakHandle) { |
6740 v8::internal::HeapTester::ResetWeakHandle(false); | 6737 v8::internal::HeapTester::ResetWeakHandle(false); |
6741 v8::internal::HeapTester::ResetWeakHandle(true); | 6738 v8::internal::HeapTester::ResetWeakHandle(true); |
6742 } | 6739 } |
6743 | 6740 |
6744 | 6741 |
6745 static void InvokeScavenge() { CcTest::heap()->CollectGarbageNewSpace(); } | 6742 static void InvokeScavenge() { CcTest::heap()->CollectGarbage(i::NEW_SPACE); } |
6746 | 6743 |
6747 | 6744 |
6748 static void InvokeMarkSweep() { CcTest::heap()->CollectAllGarbage(); } | 6745 static void InvokeMarkSweep() { CcTest::heap()->CollectAllGarbage(); } |
6749 | 6746 |
6750 | 6747 |
6751 static void ForceScavenge2( | 6748 static void ForceScavenge2( |
6752 const v8::WeakCallbackInfo<FlagAndPersistent>& data) { | 6749 const v8::WeakCallbackInfo<FlagAndPersistent>& data) { |
6753 data.GetParameter()->flag = true; | 6750 data.GetParameter()->flag = true; |
6754 InvokeScavenge(); | 6751 InvokeScavenge(); |
6755 } | 6752 } |
(...skipping 4952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11708 } | 11705 } |
11709 | 11706 |
11710 | 11707 |
11711 static void CheckSurvivingGlobalObjectsCount(int expected) { | 11708 static void CheckSurvivingGlobalObjectsCount(int expected) { |
11712 // We need to collect all garbage twice to be sure that everything | 11709 // We need to collect all garbage twice to be sure that everything |
11713 // has been collected. This is because inline caches are cleared in | 11710 // has been collected. This is because inline caches are cleared in |
11714 // the first garbage collection but some of the maps have already | 11711 // the first garbage collection but some of the maps have already |
11715 // been marked at that point. Therefore some of the maps are not | 11712 // been marked at that point. Therefore some of the maps are not |
11716 // collected until the second garbage collection. | 11713 // collected until the second garbage collection. |
11717 CcTest::heap()->CollectAllGarbage(); | 11714 CcTest::heap()->CollectAllGarbage(); |
11718 CcTest::heap()->CollectAllGarbage("CheckSurvivingGlobalObjectsCount", | 11715 CcTest::heap()->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); |
11719 i::Heap::kMakeHeapIterableMask); | |
11720 int count = GetGlobalObjectsCount(); | 11716 int count = GetGlobalObjectsCount(); |
11721 #ifdef DEBUG | 11717 #ifdef DEBUG |
11722 if (count != expected) CcTest::heap()->TracePathToGlobal(); | 11718 if (count != expected) CcTest::heap()->TracePathToGlobal(); |
11723 #endif | 11719 #endif |
11724 CHECK_EQ(expected, count); | 11720 CHECK_EQ(expected, count); |
11725 } | 11721 } |
11726 | 11722 |
11727 | 11723 |
11728 TEST(DontLeakGlobalObjects) { | 11724 TEST(DontLeakGlobalObjects) { |
11729 // Regression test for issues 1139850 and 1174891. | 11725 // Regression test for issues 1139850 and 1174891. |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11808 { | 11804 { |
11809 v8::HandleScope scope(isolate); | 11805 v8::HandleScope scope(isolate); |
11810 v8::Local<v8::Object> obj = v8::Object::New(isolate); | 11806 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
11811 obj->Set(v8_str("key"), v8::Integer::New(isolate, 231)); | 11807 obj->Set(v8_str("key"), v8::Integer::New(isolate, 231)); |
11812 v8::Persistent<v8::Object>* handle = | 11808 v8::Persistent<v8::Object>* handle = |
11813 new v8::Persistent<v8::Object>(isolate, obj); | 11809 new v8::Persistent<v8::Object>(isolate, obj); |
11814 handle->SetWeak<v8::Persistent<v8::Object>>( | 11810 handle->SetWeak<v8::Persistent<v8::Object>>( |
11815 handle, WeakApiCallback, v8::WeakCallbackType::kParameter); | 11811 handle, WeakApiCallback, v8::WeakCallbackType::kParameter); |
11816 } | 11812 } |
11817 reinterpret_cast<i::Isolate*>(isolate)->heap()->CollectAllGarbage( | 11813 reinterpret_cast<i::Isolate*>(isolate)->heap()->CollectAllGarbage( |
11818 "WeakCallbackApi", i::Heap::kAbortIncrementalMarkingMask); | 11814 i::Heap::kAbortIncrementalMarkingMask); |
11819 // Verify disposed. | 11815 // Verify disposed. |
11820 CHECK_EQ(initial_handles, globals->global_handles_count()); | 11816 CHECK_EQ(initial_handles, globals->global_handles_count()); |
11821 } | 11817 } |
11822 | 11818 |
11823 | 11819 |
11824 v8::Persistent<v8::Object> some_object; | 11820 v8::Persistent<v8::Object> some_object; |
11825 v8::Persistent<v8::Object> bad_handle; | 11821 v8::Persistent<v8::Object> bad_handle; |
11826 | 11822 |
11827 | 11823 |
11828 void NewPersistentHandleCallback2( | 11824 void NewPersistentHandleCallback2( |
(...skipping 3614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15443 } | 15439 } |
15444 intptr_t final_size = CcTest::heap()->SizeOfObjects(); | 15440 intptr_t final_size = CcTest::heap()->SizeOfObjects(); |
15445 CHECK(finished); | 15441 CHECK(finished); |
15446 CHECK_LT(final_size, initial_size + 1); | 15442 CHECK_LT(final_size, initial_size + 1); |
15447 } | 15443 } |
15448 | 15444 |
15449 | 15445 |
15450 TEST(Regress2333) { | 15446 TEST(Regress2333) { |
15451 LocalContext env; | 15447 LocalContext env; |
15452 for (int i = 0; i < 3; i++) { | 15448 for (int i = 0; i < 3; i++) { |
15453 CcTest::heap()->CollectGarbageNewSpace(); | 15449 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
15454 } | 15450 } |
15455 } | 15451 } |
15456 | 15452 |
15457 static uint32_t* stack_limit; | 15453 static uint32_t* stack_limit; |
15458 | 15454 |
15459 static void GetStackLimitCallback( | 15455 static void GetStackLimitCallback( |
15460 const v8::FunctionCallbackInfo<v8::Value>& args) { | 15456 const v8::FunctionCallbackInfo<v8::Value>& args) { |
15461 stack_limit = reinterpret_cast<uint32_t*>( | 15457 stack_limit = reinterpret_cast<uint32_t*>( |
15462 CcTest::i_isolate()->stack_guard()->real_climit()); | 15458 CcTest::i_isolate()->stack_guard()->real_climit()); |
15463 } | 15459 } |
(...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16456 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | 16452 CHECK_EQ(flags, v8::kNoGCCallbackFlags); |
16457 CHECK_EQ(gc_callbacks_isolate, isolate); | 16453 CHECK_EQ(gc_callbacks_isolate, isolate); |
16458 ++prologue_call_count_alloc; | 16454 ++prologue_call_count_alloc; |
16459 | 16455 |
16460 // Simulate full heap to see if we will reenter this callback | 16456 // Simulate full heap to see if we will reenter this callback |
16461 SimulateFullSpace(CcTest::heap()->new_space()); | 16457 SimulateFullSpace(CcTest::heap()->new_space()); |
16462 | 16458 |
16463 Local<Object> obj = Object::New(isolate); | 16459 Local<Object> obj = Object::New(isolate); |
16464 CHECK(!obj.IsEmpty()); | 16460 CHECK(!obj.IsEmpty()); |
16465 | 16461 |
16466 CcTest::heap()->CollectAllGarbage("PrologueCallbackAlloc", | 16462 CcTest::heap()->CollectAllGarbage( |
16467 i::Heap::kAbortIncrementalMarkingMask); | 16463 i::Heap::kAbortIncrementalMarkingMask); |
16468 } | 16464 } |
16469 | 16465 |
16470 | 16466 |
16471 void EpilogueCallbackAlloc(v8::Isolate* isolate, | 16467 void EpilogueCallbackAlloc(v8::Isolate* isolate, |
16472 v8::GCType, | 16468 v8::GCType, |
16473 v8::GCCallbackFlags flags) { | 16469 v8::GCCallbackFlags flags) { |
16474 v8::HandleScope scope(isolate); | 16470 v8::HandleScope scope(isolate); |
16475 | 16471 |
16476 CHECK_EQ(flags, v8::kNoGCCallbackFlags); | 16472 CHECK_EQ(flags, v8::kNoGCCallbackFlags); |
16477 CHECK_EQ(gc_callbacks_isolate, isolate); | 16473 CHECK_EQ(gc_callbacks_isolate, isolate); |
16478 ++epilogue_call_count_alloc; | 16474 ++epilogue_call_count_alloc; |
16479 | 16475 |
16480 // Simulate full heap to see if we will reenter this callback | 16476 // Simulate full heap to see if we will reenter this callback |
16481 SimulateFullSpace(CcTest::heap()->new_space()); | 16477 SimulateFullSpace(CcTest::heap()->new_space()); |
16482 | 16478 |
16483 Local<Object> obj = Object::New(isolate); | 16479 Local<Object> obj = Object::New(isolate); |
16484 CHECK(!obj.IsEmpty()); | 16480 CHECK(!obj.IsEmpty()); |
16485 | 16481 |
16486 CcTest::heap()->CollectAllGarbage("EpilogueCallbackAlloc", | 16482 CcTest::heap()->CollectAllGarbage( |
16487 i::Heap::kAbortIncrementalMarkingMask); | 16483 i::Heap::kAbortIncrementalMarkingMask); |
16488 } | 16484 } |
16489 | 16485 |
16490 | 16486 |
16491 TEST(GCCallbacksOld) { | 16487 TEST(GCCallbacksOld) { |
16492 LocalContext context; | 16488 LocalContext context; |
16493 | 16489 |
16494 v8::V8::AddGCPrologueCallback(PrologueCallback); | 16490 v8::V8::AddGCPrologueCallback(PrologueCallback); |
16495 v8::V8::AddGCEpilogueCallback(EpilogueCallback); | 16491 v8::V8::AddGCEpilogueCallback(EpilogueCallback); |
16496 CHECK_EQ(0, prologue_call_count); | 16492 CHECK_EQ(0, prologue_call_count); |
16497 CHECK_EQ(0, epilogue_call_count); | 16493 CHECK_EQ(0, epilogue_call_count); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16552 CcTest::heap()->CollectAllGarbage(); | 16548 CcTest::heap()->CollectAllGarbage(); |
16553 CHECK_EQ(2, prologue_call_count); | 16549 CHECK_EQ(2, prologue_call_count); |
16554 CHECK_EQ(2, epilogue_call_count); | 16550 CHECK_EQ(2, epilogue_call_count); |
16555 CHECK_EQ(2, prologue_call_count_second); | 16551 CHECK_EQ(2, prologue_call_count_second); |
16556 CHECK_EQ(2, epilogue_call_count_second); | 16552 CHECK_EQ(2, epilogue_call_count_second); |
16557 | 16553 |
16558 CHECK_EQ(0, prologue_call_count_alloc); | 16554 CHECK_EQ(0, prologue_call_count_alloc); |
16559 CHECK_EQ(0, epilogue_call_count_alloc); | 16555 CHECK_EQ(0, epilogue_call_count_alloc); |
16560 isolate->AddGCPrologueCallback(PrologueCallbackAlloc); | 16556 isolate->AddGCPrologueCallback(PrologueCallbackAlloc); |
16561 isolate->AddGCEpilogueCallback(EpilogueCallbackAlloc); | 16557 isolate->AddGCEpilogueCallback(EpilogueCallbackAlloc); |
16562 CcTest::heap()->CollectAllGarbage("GCCallbacks", | 16558 CcTest::heap()->CollectAllGarbage( |
16563 i::Heap::kAbortIncrementalMarkingMask); | 16559 i::Heap::kAbortIncrementalMarkingMask); |
16564 CHECK_EQ(1, prologue_call_count_alloc); | 16560 CHECK_EQ(1, prologue_call_count_alloc); |
16565 CHECK_EQ(1, epilogue_call_count_alloc); | 16561 CHECK_EQ(1, epilogue_call_count_alloc); |
16566 isolate->RemoveGCPrologueCallback(PrologueCallbackAlloc); | 16562 isolate->RemoveGCPrologueCallback(PrologueCallbackAlloc); |
16567 isolate->RemoveGCEpilogueCallback(EpilogueCallbackAlloc); | 16563 isolate->RemoveGCEpilogueCallback(EpilogueCallbackAlloc); |
16568 } | 16564 } |
16569 | 16565 |
16570 | 16566 |
16571 THREADED_TEST(TwoByteStringInOneByteCons) { | 16567 THREADED_TEST(TwoByteStringInOneByteCons) { |
16572 // See Chromium issue 47824. | 16568 // See Chromium issue 47824. |
16573 LocalContext context; | 16569 LocalContext context; |
(...skipping 5281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21855 timeout_thread.Join(); | 21851 timeout_thread.Join(); |
21856 } | 21852 } |
21857 | 21853 |
21858 | 21854 |
21859 TEST(EstimatedContextSize) { | 21855 TEST(EstimatedContextSize) { |
21860 v8::Isolate* isolate = CcTest::isolate(); | 21856 v8::Isolate* isolate = CcTest::isolate(); |
21861 v8::HandleScope scope(isolate); | 21857 v8::HandleScope scope(isolate); |
21862 LocalContext env; | 21858 LocalContext env; |
21863 CHECK(50000 < env->EstimatedSize()); | 21859 CHECK(50000 < env->EstimatedSize()); |
21864 } | 21860 } |
OLD | NEW |