| 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 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 | 571 |
| 572 CHECK_EQ(*h4, *h2); | 572 CHECK_EQ(*h4, *h2); |
| 573 GlobalHandles::Destroy(h2.location()); | 573 GlobalHandles::Destroy(h2.location()); |
| 574 GlobalHandles::Destroy(h4.location()); | 574 GlobalHandles::Destroy(h4.location()); |
| 575 } | 575 } |
| 576 | 576 |
| 577 | 577 |
| 578 static bool WeakPointerCleared = false; | 578 static bool WeakPointerCleared = false; |
| 579 | 579 |
| 580 static void TestWeakGlobalHandleCallback( | 580 static void TestWeakGlobalHandleCallback( |
| 581 const v8::WeakCallbackData<v8::Value, void>& data) { | 581 const v8::WeakCallbackInfo<void>& data) { |
| 582 std::pair<v8::Persistent<v8::Value>*, int>* p = | 582 std::pair<v8::Persistent<v8::Value>*, int>* p = |
| 583 reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>( | 583 reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>( |
| 584 data.GetParameter()); | 584 data.GetParameter()); |
| 585 if (p->second == 1234) WeakPointerCleared = true; | 585 if (p->second == 1234) WeakPointerCleared = true; |
| 586 p->first->Reset(); | 586 p->first->Reset(); |
| 587 } | 587 } |
| 588 | 588 |
| 589 | 589 |
| 590 TEST(WeakGlobalHandlesScavenge) { | 590 TEST(WeakGlobalHandlesScavenge) { |
| 591 i::FLAG_stress_compaction = false; | 591 i::FLAG_stress_compaction = false; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 604 HandleScope scope(isolate); | 604 HandleScope scope(isolate); |
| 605 | 605 |
| 606 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); | 606 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); |
| 607 Handle<Object> u = factory->NewNumber(1.12344); | 607 Handle<Object> u = factory->NewNumber(1.12344); |
| 608 | 608 |
| 609 h1 = global_handles->Create(*i); | 609 h1 = global_handles->Create(*i); |
| 610 h2 = global_handles->Create(*u); | 610 h2 = global_handles->Create(*u); |
| 611 } | 611 } |
| 612 | 612 |
| 613 std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234); | 613 std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234); |
| 614 GlobalHandles::MakeWeak(h2.location(), | 614 GlobalHandles::MakeWeak( |
| 615 reinterpret_cast<void*>(&handle_and_id), | 615 h2.location(), reinterpret_cast<void*>(&handle_and_id), |
| 616 &TestWeakGlobalHandleCallback); | 616 &TestWeakGlobalHandleCallback, v8::WeakCallbackType::kParameter); |
| 617 | 617 |
| 618 // Scavenge treats weak pointers as normal roots. | 618 // Scavenge treats weak pointers as normal roots. |
| 619 heap->CollectGarbage(NEW_SPACE); | 619 heap->CollectGarbage(NEW_SPACE); |
| 620 | 620 |
| 621 CHECK((*h1)->IsString()); | 621 CHECK((*h1)->IsString()); |
| 622 CHECK((*h2)->IsHeapNumber()); | 622 CHECK((*h2)->IsHeapNumber()); |
| 623 | 623 |
| 624 CHECK(!WeakPointerCleared); | 624 CHECK(!WeakPointerCleared); |
| 625 CHECK(!global_handles->IsNearDeath(h2.location())); | 625 CHECK(!global_handles->IsNearDeath(h2.location())); |
| 626 CHECK(!global_handles->IsNearDeath(h1.location())); | 626 CHECK(!global_handles->IsNearDeath(h1.location())); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 651 h1 = global_handles->Create(*i); | 651 h1 = global_handles->Create(*i); |
| 652 h2 = global_handles->Create(*u); | 652 h2 = global_handles->Create(*u); |
| 653 } | 653 } |
| 654 | 654 |
| 655 // Make sure the objects are promoted. | 655 // Make sure the objects are promoted. |
| 656 heap->CollectGarbage(OLD_SPACE); | 656 heap->CollectGarbage(OLD_SPACE); |
| 657 heap->CollectGarbage(NEW_SPACE); | 657 heap->CollectGarbage(NEW_SPACE); |
| 658 CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2)); | 658 CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2)); |
| 659 | 659 |
| 660 std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234); | 660 std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234); |
| 661 GlobalHandles::MakeWeak(h2.location(), | 661 GlobalHandles::MakeWeak( |
| 662 reinterpret_cast<void*>(&handle_and_id), | 662 h2.location(), reinterpret_cast<void*>(&handle_and_id), |
| 663 &TestWeakGlobalHandleCallback); | 663 &TestWeakGlobalHandleCallback, v8::WeakCallbackType::kParameter); |
| 664 CHECK(!GlobalHandles::IsNearDeath(h1.location())); | 664 CHECK(!GlobalHandles::IsNearDeath(h1.location())); |
| 665 CHECK(!GlobalHandles::IsNearDeath(h2.location())); | 665 CHECK(!GlobalHandles::IsNearDeath(h2.location())); |
| 666 | 666 |
| 667 // Incremental marking potentially marked handles before they turned weak. | 667 // Incremental marking potentially marked handles before they turned weak. |
| 668 heap->CollectAllGarbage(); | 668 heap->CollectAllGarbage(); |
| 669 | 669 |
| 670 CHECK((*h1)->IsString()); | 670 CHECK((*h1)->IsString()); |
| 671 | 671 |
| 672 CHECK(WeakPointerCleared); | 672 CHECK(WeakPointerCleared); |
| 673 CHECK(!GlobalHandles::IsNearDeath(h1.location())); | 673 CHECK(!GlobalHandles::IsNearDeath(h1.location())); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 689 Handle<Object> h; | 689 Handle<Object> h; |
| 690 | 690 |
| 691 { | 691 { |
| 692 HandleScope scope(isolate); | 692 HandleScope scope(isolate); |
| 693 | 693 |
| 694 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); | 694 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); |
| 695 h = global_handles->Create(*i); | 695 h = global_handles->Create(*i); |
| 696 } | 696 } |
| 697 | 697 |
| 698 std::pair<Handle<Object>*, int> handle_and_id(&h, 1234); | 698 std::pair<Handle<Object>*, int> handle_and_id(&h, 1234); |
| 699 GlobalHandles::MakeWeak(h.location(), | 699 GlobalHandles::MakeWeak(h.location(), reinterpret_cast<void*>(&handle_and_id), |
| 700 reinterpret_cast<void*>(&handle_and_id), | 700 &TestWeakGlobalHandleCallback, |
| 701 &TestWeakGlobalHandleCallback); | 701 v8::WeakCallbackType::kParameter); |
| 702 | 702 |
| 703 // Scanvenge does not recognize weak reference. | 703 // Scanvenge does not recognize weak reference. |
| 704 heap->CollectGarbage(NEW_SPACE); | 704 heap->CollectGarbage(NEW_SPACE); |
| 705 | 705 |
| 706 CHECK(!WeakPointerCleared); | 706 CHECK(!WeakPointerCleared); |
| 707 | 707 |
| 708 // Mark-compact treats weak reference properly. | 708 // Mark-compact treats weak reference properly. |
| 709 heap->CollectGarbage(OLD_SPACE); | 709 heap->CollectGarbage(OLD_SPACE); |
| 710 | 710 |
| 711 CHECK(WeakPointerCleared); | 711 CHECK(WeakPointerCleared); |
| (...skipping 6026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6738 // All objects need to be black after marking. If a white object crossed the | 6738 // All objects need to be black after marking. If a white object crossed the |
| 6739 // progress bar, we would fail here. | 6739 // progress bar, we would fail here. |
| 6740 for (int i = 0; i < arr.get()->length(); i++) { | 6740 for (int i = 0; i < arr.get()->length(); i++) { |
| 6741 CHECK(Marking::IsBlack( | 6741 CHECK(Marking::IsBlack( |
| 6742 Marking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); | 6742 Marking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); |
| 6743 } | 6743 } |
| 6744 } | 6744 } |
| 6745 | 6745 |
| 6746 } // namespace internal | 6746 } // namespace internal |
| 6747 } // namespace v8 | 6747 } // namespace v8 |
| OLD | NEW |