| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 2404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2415 memberMember2->insert(three, four); | 2415 memberMember2->insert(three, four); |
| 2416 memberMember2->insert(four, one); | 2416 memberMember2->insert(four, one); |
| 2417 primitiveMember->insert(1, two); | 2417 primitiveMember->insert(1, two); |
| 2418 primitiveMember->insert(2, three); | 2418 primitiveMember->insert(2, three); |
| 2419 primitiveMember->insert(3, four); | 2419 primitiveMember->insert(3, four); |
| 2420 primitiveMember->insert(4, one); | 2420 primitiveMember->insert(4, one); |
| 2421 memberPrimitive->insert(one, 2); | 2421 memberPrimitive->insert(one, 2); |
| 2422 memberPrimitive->insert(two, 3); | 2422 memberPrimitive->insert(two, 3); |
| 2423 memberPrimitive->insert(three, 4); | 2423 memberPrimitive->insert(three, 4); |
| 2424 memberPrimitive->insert(four, 1); | 2424 memberPrimitive->insert(four, 1); |
| 2425 set2->add(one); | 2425 set2->insert(one); |
| 2426 set2->add(two); | 2426 set2->insert(two); |
| 2427 set2->add(three); | 2427 set2->insert(three); |
| 2428 set2->add(four); | 2428 set2->insert(four); |
| 2429 set->add(oneB); | 2429 set->insert(oneB); |
| 2430 set3->add(oneB); | 2430 set3->add(oneB); |
| 2431 set3->add(oneB); | 2431 set3->add(oneB); |
| 2432 vector->push_back(oneB); | 2432 vector->push_back(oneB); |
| 2433 deque->append(oneB); | 2433 deque->append(oneB); |
| 2434 vector2->push_back(threeB); | 2434 vector2->push_back(threeB); |
| 2435 vector2->push_back(fourB); | 2435 vector2->push_back(fourB); |
| 2436 deque2->append(threeE); | 2436 deque2->append(threeE); |
| 2437 deque2->append(fourE); | 2437 deque2->append(fourE); |
| 2438 vectorWU->push_back(PairWrappedUnwrapped(&*oneC, 42)); | 2438 vectorWU->push_back(PairWrappedUnwrapped(&*oneC, 42)); |
| 2439 dequeWU->append(PairWrappedUnwrapped(&*oneE, 42)); | 2439 dequeWU->append(PairWrappedUnwrapped(&*oneE, 42)); |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2776 IntWrapper* oneRaw = IntWrapper::create(1); | 2776 IntWrapper* oneRaw = IntWrapper::create(1); |
| 2777 Persistent<IntWrapper> one(oneRaw); | 2777 Persistent<IntWrapper> one(oneRaw); |
| 2778 Persistent<IntWrapper> one2(oneRaw); | 2778 Persistent<IntWrapper> one2(oneRaw); |
| 2779 Persistent<IntWrapper> two(IntWrapper::create(2)); | 2779 Persistent<IntWrapper> two(IntWrapper::create(2)); |
| 2780 Persistent<IntWrapper> three(IntWrapper::create(3)); | 2780 Persistent<IntWrapper> three(IntWrapper::create(3)); |
| 2781 Persistent<IntWrapper> four(IntWrapper::create(4)); | 2781 Persistent<IntWrapper> four(IntWrapper::create(4)); |
| 2782 Persistent<IntWrapper> five(IntWrapper::create(5)); | 2782 Persistent<IntWrapper> five(IntWrapper::create(5)); |
| 2783 Persistent<IntWrapper> six(IntWrapper::create(6)); | 2783 Persistent<IntWrapper> six(IntWrapper::create(6)); |
| 2784 { | 2784 { |
| 2785 PersistentSet set; | 2785 PersistentSet set; |
| 2786 set.add(one); | 2786 set.insert(one); |
| 2787 set.add(two); | 2787 set.insert(two); |
| 2788 conservativelyCollectGarbage(); | 2788 conservativelyCollectGarbage(); |
| 2789 EXPECT_TRUE(set.contains(one)); | 2789 EXPECT_TRUE(set.contains(one)); |
| 2790 EXPECT_TRUE(set.contains(one2)); | 2790 EXPECT_TRUE(set.contains(one2)); |
| 2791 EXPECT_TRUE(set.contains(two)); | 2791 EXPECT_TRUE(set.contains(two)); |
| 2792 | 2792 |
| 2793 set.add(three); | 2793 set.insert(three); |
| 2794 set.add(four); | 2794 set.insert(four); |
| 2795 conservativelyCollectGarbage(); | 2795 conservativelyCollectGarbage(); |
| 2796 EXPECT_TRUE(set.contains(one)); | 2796 EXPECT_TRUE(set.contains(one)); |
| 2797 EXPECT_TRUE(set.contains(two)); | 2797 EXPECT_TRUE(set.contains(two)); |
| 2798 EXPECT_TRUE(set.contains(three)); | 2798 EXPECT_TRUE(set.contains(three)); |
| 2799 EXPECT_TRUE(set.contains(four)); | 2799 EXPECT_TRUE(set.contains(four)); |
| 2800 | 2800 |
| 2801 set.clear(); | 2801 set.clear(); |
| 2802 conservativelyCollectGarbage(); | 2802 conservativelyCollectGarbage(); |
| 2803 EXPECT_FALSE(set.contains(one)); | 2803 EXPECT_FALSE(set.contains(one)); |
| 2804 EXPECT_FALSE(set.contains(two)); | 2804 EXPECT_FALSE(set.contains(two)); |
| 2805 EXPECT_FALSE(set.contains(three)); | 2805 EXPECT_FALSE(set.contains(three)); |
| 2806 EXPECT_FALSE(set.contains(four)); | 2806 EXPECT_FALSE(set.contains(four)); |
| 2807 } | 2807 } |
| 2808 { | 2808 { |
| 2809 PersistentSet set1; | 2809 PersistentSet set1; |
| 2810 PersistentSet set2; | 2810 PersistentSet set2; |
| 2811 | 2811 |
| 2812 set1.add(one); | 2812 set1.insert(one); |
| 2813 set2.add(two); | 2813 set2.insert(two); |
| 2814 set1.swap(set2); | 2814 set1.swap(set2); |
| 2815 conservativelyCollectGarbage(); | 2815 conservativelyCollectGarbage(); |
| 2816 EXPECT_TRUE(set1.contains(two)); | 2816 EXPECT_TRUE(set1.contains(two)); |
| 2817 EXPECT_TRUE(set2.contains(one)); | 2817 EXPECT_TRUE(set2.contains(one)); |
| 2818 EXPECT_TRUE(set2.contains(one2)); | 2818 EXPECT_TRUE(set2.contains(one2)); |
| 2819 } | 2819 } |
| 2820 } | 2820 } |
| 2821 | 2821 |
| 2822 TEST(HeapTest, CrossThreadPersistentSet) { | 2822 TEST(HeapTest, CrossThreadPersistentSet) { |
| 2823 IntWrapper::s_destructorCalls = 0; | 2823 IntWrapper::s_destructorCalls = 0; |
| 2824 | 2824 |
| 2825 typedef HashSet<CrossThreadPersistent<IntWrapper>> CrossThreadPersistentSet; | 2825 typedef HashSet<CrossThreadPersistent<IntWrapper>> CrossThreadPersistentSet; |
| 2826 | 2826 |
| 2827 IntWrapper* oneRaw = IntWrapper::create(1); | 2827 IntWrapper* oneRaw = IntWrapper::create(1); |
| 2828 CrossThreadPersistent<IntWrapper> one(oneRaw); | 2828 CrossThreadPersistent<IntWrapper> one(oneRaw); |
| 2829 CrossThreadPersistent<IntWrapper> one2(oneRaw); | 2829 CrossThreadPersistent<IntWrapper> one2(oneRaw); |
| 2830 CrossThreadPersistent<IntWrapper> two(IntWrapper::create(2)); | 2830 CrossThreadPersistent<IntWrapper> two(IntWrapper::create(2)); |
| 2831 CrossThreadPersistent<IntWrapper> three(IntWrapper::create(3)); | 2831 CrossThreadPersistent<IntWrapper> three(IntWrapper::create(3)); |
| 2832 CrossThreadPersistent<IntWrapper> four(IntWrapper::create(4)); | 2832 CrossThreadPersistent<IntWrapper> four(IntWrapper::create(4)); |
| 2833 CrossThreadPersistent<IntWrapper> five(IntWrapper::create(5)); | 2833 CrossThreadPersistent<IntWrapper> five(IntWrapper::create(5)); |
| 2834 CrossThreadPersistent<IntWrapper> six(IntWrapper::create(6)); | 2834 CrossThreadPersistent<IntWrapper> six(IntWrapper::create(6)); |
| 2835 { | 2835 { |
| 2836 CrossThreadPersistentSet set; | 2836 CrossThreadPersistentSet set; |
| 2837 set.add(one); | 2837 set.insert(one); |
| 2838 set.add(two); | 2838 set.insert(two); |
| 2839 conservativelyCollectGarbage(); | 2839 conservativelyCollectGarbage(); |
| 2840 EXPECT_TRUE(set.contains(one)); | 2840 EXPECT_TRUE(set.contains(one)); |
| 2841 EXPECT_TRUE(set.contains(one2)); | 2841 EXPECT_TRUE(set.contains(one2)); |
| 2842 EXPECT_TRUE(set.contains(two)); | 2842 EXPECT_TRUE(set.contains(two)); |
| 2843 | 2843 |
| 2844 set.add(three); | 2844 set.insert(three); |
| 2845 set.add(four); | 2845 set.insert(four); |
| 2846 conservativelyCollectGarbage(); | 2846 conservativelyCollectGarbage(); |
| 2847 EXPECT_TRUE(set.contains(one)); | 2847 EXPECT_TRUE(set.contains(one)); |
| 2848 EXPECT_TRUE(set.contains(two)); | 2848 EXPECT_TRUE(set.contains(two)); |
| 2849 EXPECT_TRUE(set.contains(three)); | 2849 EXPECT_TRUE(set.contains(three)); |
| 2850 EXPECT_TRUE(set.contains(four)); | 2850 EXPECT_TRUE(set.contains(four)); |
| 2851 | 2851 |
| 2852 set.clear(); | 2852 set.clear(); |
| 2853 conservativelyCollectGarbage(); | 2853 conservativelyCollectGarbage(); |
| 2854 EXPECT_FALSE(set.contains(one)); | 2854 EXPECT_FALSE(set.contains(one)); |
| 2855 EXPECT_FALSE(set.contains(two)); | 2855 EXPECT_FALSE(set.contains(two)); |
| 2856 EXPECT_FALSE(set.contains(three)); | 2856 EXPECT_FALSE(set.contains(three)); |
| 2857 EXPECT_FALSE(set.contains(four)); | 2857 EXPECT_FALSE(set.contains(four)); |
| 2858 } | 2858 } |
| 2859 { | 2859 { |
| 2860 CrossThreadPersistentSet set1; | 2860 CrossThreadPersistentSet set1; |
| 2861 CrossThreadPersistentSet set2; | 2861 CrossThreadPersistentSet set2; |
| 2862 | 2862 |
| 2863 set1.add(one); | 2863 set1.insert(one); |
| 2864 set2.add(two); | 2864 set2.insert(two); |
| 2865 set1.swap(set2); | 2865 set1.swap(set2); |
| 2866 conservativelyCollectGarbage(); | 2866 conservativelyCollectGarbage(); |
| 2867 EXPECT_TRUE(set1.contains(two)); | 2867 EXPECT_TRUE(set1.contains(two)); |
| 2868 EXPECT_TRUE(set2.contains(one)); | 2868 EXPECT_TRUE(set2.contains(one)); |
| 2869 EXPECT_TRUE(set2.contains(one2)); | 2869 EXPECT_TRUE(set2.contains(one2)); |
| 2870 } | 2870 } |
| 2871 } | 2871 } |
| 2872 | 2872 |
| 2873 class NonTrivialObject final { | 2873 class NonTrivialObject final { |
| 2874 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); | 2874 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2944 Persistent<IntWrapper> two = IntWrapper::create(2); | 2944 Persistent<IntWrapper> two = IntWrapper::create(2); |
| 2945 | 2945 |
| 2946 keepNumbersAlive.push_back(IntWrapper::create(103)); | 2946 keepNumbersAlive.push_back(IntWrapper::create(103)); |
| 2947 keepNumbersAlive.push_back(IntWrapper::create(10)); | 2947 keepNumbersAlive.push_back(IntWrapper::create(10)); |
| 2948 | 2948 |
| 2949 { | 2949 { |
| 2950 weakStrong->insert(IntWrapper::create(1), two); | 2950 weakStrong->insert(IntWrapper::create(1), two); |
| 2951 strongWeak->insert(two, IntWrapper::create(1)); | 2951 strongWeak->insert(two, IntWrapper::create(1)); |
| 2952 weakWeak->insert(two, IntWrapper::create(42)); | 2952 weakWeak->insert(two, IntWrapper::create(42)); |
| 2953 weakWeak->insert(IntWrapper::create(42), two); | 2953 weakWeak->insert(IntWrapper::create(42), two); |
| 2954 weakSet->add(IntWrapper::create(0)); | 2954 weakSet->insert(IntWrapper::create(0)); |
| 2955 weakSet->add(two); | 2955 weakSet->insert(two); |
| 2956 weakSet->add(keepNumbersAlive[0]); | 2956 weakSet->insert(keepNumbersAlive[0]); |
| 2957 weakSet->add(keepNumbersAlive[1]); | 2957 weakSet->insert(keepNumbersAlive[1]); |
| 2958 weakCountedSet->add(IntWrapper::create(0)); | 2958 weakCountedSet->add(IntWrapper::create(0)); |
| 2959 weakCountedSet->add(two); | 2959 weakCountedSet->add(two); |
| 2960 weakCountedSet->add(two); | 2960 weakCountedSet->add(two); |
| 2961 weakCountedSet->add(two); | 2961 weakCountedSet->add(two); |
| 2962 weakCountedSet->add(keepNumbersAlive[0]); | 2962 weakCountedSet->add(keepNumbersAlive[0]); |
| 2963 weakCountedSet->add(keepNumbersAlive[1]); | 2963 weakCountedSet->add(keepNumbersAlive[1]); |
| 2964 EXPECT_EQ(1u, weakStrong->size()); | 2964 EXPECT_EQ(1u, weakStrong->size()); |
| 2965 EXPECT_EQ(1u, strongWeak->size()); | 2965 EXPECT_EQ(1u, strongWeak->size()); |
| 2966 EXPECT_EQ(2u, weakWeak->size()); | 2966 EXPECT_EQ(2u, weakWeak->size()); |
| 2967 EXPECT_EQ(4u, weakSet->size()); | 2967 EXPECT_EQ(4u, weakSet->size()); |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3294 | 3294 |
| 3295 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; | 3295 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; |
| 3296 | 3296 |
| 3297 Persistent<WSSet> weakStrong = new WSSet(); | 3297 Persistent<WSSet> weakStrong = new WSSet(); |
| 3298 Persistent<SWSet> strongWeak = new SWSet(); | 3298 Persistent<SWSet> strongWeak = new SWSet(); |
| 3299 Persistent<WUSet> weakUnwrapped = new WUSet(); | 3299 Persistent<WUSet> weakUnwrapped = new WUSet(); |
| 3300 Persistent<UWSet> unwrappedWeak = new UWSet(); | 3300 Persistent<UWSet> unwrappedWeak = new UWSet(); |
| 3301 | 3301 |
| 3302 Persistent<IntWrapper> two = IntWrapper::create(2); | 3302 Persistent<IntWrapper> two = IntWrapper::create(2); |
| 3303 | 3303 |
| 3304 weakStrong->add(PairWeakStrong(IntWrapper::create(1), &*two)); | 3304 weakStrong->insert(PairWeakStrong(IntWrapper::create(1), &*two)); |
| 3305 weakStrong->add(PairWeakStrong(&*two, &*two)); | 3305 weakStrong->insert(PairWeakStrong(&*two, &*two)); |
| 3306 strongWeak->add(PairStrongWeak(&*two, IntWrapper::create(1))); | 3306 strongWeak->insert(PairStrongWeak(&*two, IntWrapper::create(1))); |
| 3307 strongWeak->add(PairStrongWeak(&*two, &*two)); | 3307 strongWeak->insert(PairStrongWeak(&*two, &*two)); |
| 3308 weakUnwrapped->add(PairWeakUnwrapped(IntWrapper::create(1), 2)); | 3308 weakUnwrapped->insert(PairWeakUnwrapped(IntWrapper::create(1), 2)); |
| 3309 weakUnwrapped->add(PairWeakUnwrapped(&*two, 2)); | 3309 weakUnwrapped->insert(PairWeakUnwrapped(&*two, 2)); |
| 3310 unwrappedWeak->add(PairUnwrappedWeak(2, IntWrapper::create(1))); | 3310 unwrappedWeak->insert(PairUnwrappedWeak(2, IntWrapper::create(1))); |
| 3311 unwrappedWeak->add(PairUnwrappedWeak(2, &*two)); | 3311 unwrappedWeak->insert(PairUnwrappedWeak(2, &*two)); |
| 3312 | 3312 |
| 3313 checkPairSets<WSSet, SWSet, WUSet, UWSet>( | 3313 checkPairSets<WSSet, SWSet, WUSet, UWSet>( |
| 3314 weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, true, two); | 3314 weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, true, two); |
| 3315 | 3315 |
| 3316 preciselyCollectGarbage(); | 3316 preciselyCollectGarbage(); |
| 3317 checkPairSets<WSSet, SWSet, WUSet, UWSet>( | 3317 checkPairSets<WSSet, SWSet, WUSet, UWSet>( |
| 3318 weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, false, two); | 3318 weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, false, two); |
| 3319 } | 3319 } |
| 3320 | 3320 |
| 3321 TEST(HeapTest, HeapWeakPairs) { | 3321 TEST(HeapTest, HeapWeakPairs) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3389 | 3389 |
| 3390 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; | 3390 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; |
| 3391 for (int i = 0; i < 128; i += 2) { | 3391 for (int i = 0; i < 128; i += 2) { |
| 3392 IntWrapper* wrapped = IntWrapper::create(i); | 3392 IntWrapper* wrapped = IntWrapper::create(i); |
| 3393 IntWrapper* wrapped2 = IntWrapper::create(i + 1); | 3393 IntWrapper* wrapped2 = IntWrapper::create(i + 1); |
| 3394 keepNumbersAlive.push_back(wrapped); | 3394 keepNumbersAlive.push_back(wrapped); |
| 3395 keepNumbersAlive.push_back(wrapped2); | 3395 keepNumbersAlive.push_back(wrapped2); |
| 3396 weakStrong->insert(wrapped, wrapped2); | 3396 weakStrong->insert(wrapped, wrapped2); |
| 3397 strongWeak->insert(wrapped2, wrapped); | 3397 strongWeak->insert(wrapped2, wrapped); |
| 3398 weakWeak->insert(wrapped, wrapped2); | 3398 weakWeak->insert(wrapped, wrapped2); |
| 3399 weakSet->add(wrapped); | 3399 weakSet->insert(wrapped); |
| 3400 weakOrderedSet->add(wrapped); | 3400 weakOrderedSet->add(wrapped); |
| 3401 } | 3401 } |
| 3402 | 3402 |
| 3403 EXPECT_EQ(64u, weakStrong->size()); | 3403 EXPECT_EQ(64u, weakStrong->size()); |
| 3404 EXPECT_EQ(64u, strongWeak->size()); | 3404 EXPECT_EQ(64u, strongWeak->size()); |
| 3405 EXPECT_EQ(64u, weakWeak->size()); | 3405 EXPECT_EQ(64u, weakWeak->size()); |
| 3406 EXPECT_EQ(64u, weakSet->size()); | 3406 EXPECT_EQ(64u, weakSet->size()); |
| 3407 EXPECT_EQ(64u, weakOrderedSet->size()); | 3407 EXPECT_EQ(64u, weakOrderedSet->size()); |
| 3408 | 3408 |
| 3409 // Collect garbage. This should change nothing since we are keeping | 3409 // Collect garbage. This should change nothing since we are keeping |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3506 count++; | 3506 count++; |
| 3507 } | 3507 } |
| 3508 } | 3508 } |
| 3509 if (addAfterwards) { | 3509 if (addAfterwards) { |
| 3510 for (int i = 1000; i < 1100; i++) { | 3510 for (int i = 1000; i < 1100; i++) { |
| 3511 IntWrapper* wrapped = IntWrapper::create(i); | 3511 IntWrapper* wrapped = IntWrapper::create(i); |
| 3512 keepNumbersAlive.push_back(wrapped); | 3512 keepNumbersAlive.push_back(wrapped); |
| 3513 weakStrong->insert(wrapped, wrapped); | 3513 weakStrong->insert(wrapped, wrapped); |
| 3514 strongWeak->insert(wrapped, wrapped); | 3514 strongWeak->insert(wrapped, wrapped); |
| 3515 weakWeak->insert(wrapped, wrapped); | 3515 weakWeak->insert(wrapped, wrapped); |
| 3516 weakSet->add(wrapped); | 3516 weakSet->insert(wrapped); |
| 3517 weakOrderedSet->add(wrapped); | 3517 weakOrderedSet->add(wrapped); |
| 3518 } | 3518 } |
| 3519 } | 3519 } |
| 3520 if (collectionNumber == weakStrongIndex) | 3520 if (collectionNumber == weakStrongIndex) |
| 3521 EXPECT_EQ(count + added, weakStrong->size()); | 3521 EXPECT_EQ(count + added, weakStrong->size()); |
| 3522 else if (collectionNumber == strongWeakIndex) | 3522 else if (collectionNumber == strongWeakIndex) |
| 3523 EXPECT_EQ(count + added, strongWeak->size()); | 3523 EXPECT_EQ(count + added, strongWeak->size()); |
| 3524 else if (collectionNumber == weakWeakIndex) | 3524 else if (collectionNumber == weakWeakIndex) |
| 3525 EXPECT_EQ(count + added, weakWeak->size()); | 3525 EXPECT_EQ(count + added, weakWeak->size()); |
| 3526 else if (collectionNumber == weakSetIndex) | 3526 else if (collectionNumber == weakSetIndex) |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3860 | 3860 |
| 3861 pDeque.append(seven); | 3861 pDeque.append(seven); |
| 3862 pDeque.append(two); | 3862 pDeque.append(two); |
| 3863 | 3863 |
| 3864 Vec* vec = new Vec(); | 3864 Vec* vec = new Vec(); |
| 3865 vec->swap(pVec); | 3865 vec->swap(pVec); |
| 3866 | 3866 |
| 3867 pVec.push_back(two); | 3867 pVec.push_back(two); |
| 3868 pVec.push_back(three); | 3868 pVec.push_back(three); |
| 3869 | 3869 |
| 3870 pSet.add(four); | 3870 pSet.insert(four); |
| 3871 pListSet.add(eight); | 3871 pListSet.add(eight); |
| 3872 pLinkedSet.add(nine); | 3872 pLinkedSet.add(nine); |
| 3873 pMap.insert(five, six); | 3873 pMap.insert(five, six); |
| 3874 wpMap.insert(ten, eleven); | 3874 wpMap.insert(ten, eleven); |
| 3875 | 3875 |
| 3876 // Collect |vec| and |one|. | 3876 // Collect |vec| and |one|. |
| 3877 vec = 0; | 3877 vec = 0; |
| 3878 preciselyCollectGarbage(); | 3878 preciselyCollectGarbage(); |
| 3879 EXPECT_EQ(1, IntWrapper::s_destructorCalls); | 3879 EXPECT_EQ(1, IntWrapper::s_destructorCalls); |
| 3880 | 3880 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3967 EXPECT_EQ(0, UseMixin::s_traceCount); | 3967 EXPECT_EQ(0, UseMixin::s_traceCount); |
| 3968 preciselyCollectGarbage(); | 3968 preciselyCollectGarbage(); |
| 3969 EXPECT_EQ(1, UseMixin::s_traceCount); | 3969 EXPECT_EQ(1, UseMixin::s_traceCount); |
| 3970 | 3970 |
| 3971 Persistent<Mixin> mixin = usemixin; | 3971 Persistent<Mixin> mixin = usemixin; |
| 3972 usemixin = nullptr; | 3972 usemixin = nullptr; |
| 3973 preciselyCollectGarbage(); | 3973 preciselyCollectGarbage(); |
| 3974 EXPECT_EQ(2, UseMixin::s_traceCount); | 3974 EXPECT_EQ(2, UseMixin::s_traceCount); |
| 3975 | 3975 |
| 3976 PersistentHeapHashSet<WeakMember<Mixin>> weakMap; | 3976 PersistentHeapHashSet<WeakMember<Mixin>> weakMap; |
| 3977 weakMap.add(UseMixin::create()); | 3977 weakMap.insert(UseMixin::create()); |
| 3978 preciselyCollectGarbage(); | 3978 preciselyCollectGarbage(); |
| 3979 EXPECT_EQ(0u, weakMap.size()); | 3979 EXPECT_EQ(0u, weakMap.size()); |
| 3980 } | 3980 } |
| 3981 | 3981 |
| 3982 TEST(HeapTest, CollectionNesting2) { | 3982 TEST(HeapTest, CollectionNesting2) { |
| 3983 clearOutOldGarbage(); | 3983 clearOutOldGarbage(); |
| 3984 void* key = &IntWrapper::s_destructorCalls; | 3984 void* key = &IntWrapper::s_destructorCalls; |
| 3985 IntWrapper::s_destructorCalls = 0; | 3985 IntWrapper::s_destructorCalls = 0; |
| 3986 typedef HeapHashSet<Member<IntWrapper>> IntSet; | 3986 typedef HeapHashSet<Member<IntWrapper>> IntSet; |
| 3987 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); | 3987 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); |
| 3988 | 3988 |
| 3989 map->insert(key, IntSet()); | 3989 map->insert(key, IntSet()); |
| 3990 | 3990 |
| 3991 HeapHashMap<void*, IntSet>::iterator it = map->find(key); | 3991 HeapHashMap<void*, IntSet>::iterator it = map->find(key); |
| 3992 EXPECT_EQ(0u, map->get(key).size()); | 3992 EXPECT_EQ(0u, map->get(key).size()); |
| 3993 | 3993 |
| 3994 it->value.add(IntWrapper::create(42)); | 3994 it->value.insert(IntWrapper::create(42)); |
| 3995 EXPECT_EQ(1u, map->get(key).size()); | 3995 EXPECT_EQ(1u, map->get(key).size()); |
| 3996 | 3996 |
| 3997 Persistent<HeapHashMap<void*, IntSet>> keepAlive(map); | 3997 Persistent<HeapHashMap<void*, IntSet>> keepAlive(map); |
| 3998 preciselyCollectGarbage(); | 3998 preciselyCollectGarbage(); |
| 3999 EXPECT_EQ(1u, map->get(key).size()); | 3999 EXPECT_EQ(1u, map->get(key).size()); |
| 4000 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 4000 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 4001 } | 4001 } |
| 4002 | 4002 |
| 4003 TEST(HeapTest, CollectionNesting3) { | 4003 TEST(HeapTest, CollectionNesting3) { |
| 4004 clearOutOldGarbage(); | 4004 clearOutOldGarbage(); |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4630 } | 4630 } |
| 4631 | 4631 |
| 4632 template <typename Set> | 4632 template <typename Set> |
| 4633 void setWithCustomWeaknessHandling() { | 4633 void setWithCustomWeaknessHandling() { |
| 4634 typedef typename Set::iterator Iterator; | 4634 typedef typename Set::iterator Iterator; |
| 4635 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); | 4635 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); |
| 4636 Persistent<Set> set1(new Set()); | 4636 Persistent<Set> set1(new Set()); |
| 4637 { | 4637 { |
| 4638 Set set2; | 4638 Set set2; |
| 4639 Set* set3 = new Set(); | 4639 Set* set3 = new Set(); |
| 4640 set2.add( | 4640 set2.insert( |
| 4641 PairWithWeakHandling(IntWrapper::create(0), IntWrapper::create(1))); | 4641 PairWithWeakHandling(IntWrapper::create(0), IntWrapper::create(1))); |
| 4642 set3->add( | 4642 set3->insert( |
| 4643 PairWithWeakHandling(IntWrapper::create(2), IntWrapper::create(3))); | 4643 PairWithWeakHandling(IntWrapper::create(2), IntWrapper::create(3))); |
| 4644 set1->add( | 4644 set1->insert( |
| 4645 PairWithWeakHandling(IntWrapper::create(4), IntWrapper::create(5))); | 4645 PairWithWeakHandling(IntWrapper::create(4), IntWrapper::create(5))); |
| 4646 conservativelyCollectGarbage(); | 4646 conservativelyCollectGarbage(); |
| 4647 // The first set is pointed to from a persistent, so it's referenced, but | 4647 // The first set is pointed to from a persistent, so it's referenced, but |
| 4648 // the weak processing may have taken place. | 4648 // the weak processing may have taken place. |
| 4649 if (set1->size()) { | 4649 if (set1->size()) { |
| 4650 Iterator i1 = set1->begin(); | 4650 Iterator i1 = set1->begin(); |
| 4651 EXPECT_EQ(4, i1->first->value()); | 4651 EXPECT_EQ(4, i1->first->value()); |
| 4652 EXPECT_EQ(5, i1->second->value()); | 4652 EXPECT_EQ(5, i1->second->value()); |
| 4653 } | 4653 } |
| 4654 // The second set is on-stack, so its backing store must be referenced from | 4654 // The second set is on-stack, so its backing store must be referenced from |
| 4655 // the stack. That makes the weak references strong. | 4655 // the stack. That makes the weak references strong. |
| 4656 Iterator i2 = set2.begin(); | 4656 Iterator i2 = set2.begin(); |
| 4657 EXPECT_EQ(0, i2->first->value()); | 4657 EXPECT_EQ(0, i2->first->value()); |
| 4658 EXPECT_EQ(1, i2->second->value()); | 4658 EXPECT_EQ(1, i2->second->value()); |
| 4659 // The third set is pointed to from the stack, so it's referenced, but the | 4659 // The third set is pointed to from the stack, so it's referenced, but the |
| 4660 // weak processing may have taken place. | 4660 // weak processing may have taken place. |
| 4661 if (set3->size()) { | 4661 if (set3->size()) { |
| 4662 Iterator i3 = set3->begin(); | 4662 Iterator i3 = set3->begin(); |
| 4663 EXPECT_EQ(2, i3->first->value()); | 4663 EXPECT_EQ(2, i3->first->value()); |
| 4664 EXPECT_EQ(3, i3->second->value()); | 4664 EXPECT_EQ(3, i3->second->value()); |
| 4665 } | 4665 } |
| 4666 } | 4666 } |
| 4667 preciselyCollectGarbage(); | 4667 preciselyCollectGarbage(); |
| 4668 EXPECT_EQ(0u, set1->size()); | 4668 EXPECT_EQ(0u, set1->size()); |
| 4669 set1->add(PairWithWeakHandling(IntWrapper::create(103), livingInt)); | 4669 set1->insert(PairWithWeakHandling(IntWrapper::create(103), livingInt)); |
| 4670 // This one gets zapped at GC time because nothing holds the 103 alive. | 4670 // This one gets zapped at GC time because nothing holds the 103 alive. |
| 4671 set1->add(PairWithWeakHandling(livingInt, IntWrapper::create(103))); | 4671 set1->insert(PairWithWeakHandling(livingInt, IntWrapper::create(103))); |
| 4672 set1->add(PairWithWeakHandling( | 4672 set1->insert(PairWithWeakHandling( |
| 4673 IntWrapper::create(103), | 4673 IntWrapper::create(103), |
| 4674 IntWrapper::create(103))); // This one gets zapped too. | 4674 IntWrapper::create(103))); // This one gets zapped too. |
| 4675 set1->add(PairWithWeakHandling(livingInt, livingInt)); | 4675 set1->insert(PairWithWeakHandling(livingInt, livingInt)); |
| 4676 // This one is identical to the previous and doesn't add anything. | 4676 // This one is identical to the previous and doesn't add anything. |
| 4677 set1->add(PairWithWeakHandling(livingInt, livingInt)); | 4677 set1->insert(PairWithWeakHandling(livingInt, livingInt)); |
| 4678 EXPECT_EQ(4u, set1->size()); | 4678 EXPECT_EQ(4u, set1->size()); |
| 4679 preciselyCollectGarbage(); | 4679 preciselyCollectGarbage(); |
| 4680 EXPECT_EQ(2u, set1->size()); | 4680 EXPECT_EQ(2u, set1->size()); |
| 4681 Iterator i1 = set1->begin(); | 4681 Iterator i1 = set1->begin(); |
| 4682 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); | 4682 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); |
| 4683 EXPECT_EQ(livingInt, i1->second); | 4683 EXPECT_EQ(livingInt, i1->second); |
| 4684 ++i1; | 4684 ++i1; |
| 4685 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); | 4685 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); |
| 4686 EXPECT_EQ(livingInt, i1->second); | 4686 EXPECT_EQ(livingInt, i1->second); |
| 4687 } | 4687 } |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4942 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); | 4942 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); |
| 4943 | 4943 |
| 4944 typedef RefPtr<OffHeapInt> Key; | 4944 typedef RefPtr<OffHeapInt> Key; |
| 4945 typedef HeapHashMap<Key, WeakSet, WTF::DefaultHash<Key>::Hash, | 4945 typedef HeapHashMap<Key, WeakSet, WTF::DefaultHash<Key>::Hash, |
| 4946 HashTraits<Key>, EmptyClearingHashSetTraits> | 4946 HashTraits<Key>, EmptyClearingHashSetTraits> |
| 4947 Map; | 4947 Map; |
| 4948 Persistent<Map> map(new Map()); | 4948 Persistent<Map> map(new Map()); |
| 4949 map->insert(OffHeapInt::create(1), WeakSet()); | 4949 map->insert(OffHeapInt::create(1), WeakSet()); |
| 4950 { | 4950 { |
| 4951 WeakSet& set = map->begin()->value; | 4951 WeakSet& set = map->begin()->value; |
| 4952 set.add(IntWrapper::create(103)); // Weak set can't hold this long. | 4952 set.insert(IntWrapper::create(103)); // Weak set can't hold this long. |
| 4953 set.add(livingInt); // This prevents the set from being emptied. | 4953 set.insert(livingInt); // This prevents the set from being emptied. |
| 4954 EXPECT_EQ(2u, set.size()); | 4954 EXPECT_EQ(2u, set.size()); |
| 4955 } | 4955 } |
| 4956 | 4956 |
| 4957 // The set we add here is empty, so the entry will be removed from the map | 4957 // The set we add here is empty, so the entry will be removed from the map |
| 4958 // at the next GC. | 4958 // at the next GC. |
| 4959 map->insert(OffHeapInt::create(2), WeakSet()); | 4959 map->insert(OffHeapInt::create(2), WeakSet()); |
| 4960 EXPECT_EQ(2u, map->size()); | 4960 EXPECT_EQ(2u, map->size()); |
| 4961 | 4961 |
| 4962 preciselyCollectGarbage(); | 4962 preciselyCollectGarbage(); |
| 4963 EXPECT_EQ(1u, map->size()); // The one with key 2 was removed. | 4963 EXPECT_EQ(1u, map->size()); // The one with key 2 was removed. |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5114 | 5114 |
| 5115 pairWeakMap->insert(PairWithWeakHandling(pw1, pw1), pw1); | 5115 pairWeakMap->insert(PairWithWeakHandling(pw1, pw1), pw1); |
| 5116 pairWeakMap->insert(PairWithWeakHandling(pw1, pw2), pw1); | 5116 pairWeakMap->insert(PairWithWeakHandling(pw1, pw2), pw1); |
| 5117 // The map from (pw2, pw1) to pw1 would make pw2 live, so we skip that. | 5117 // The map from (pw2, pw1) to pw1 would make pw2 live, so we skip that. |
| 5118 pairWeakMap->insert(PairWithWeakHandling(pw2, pw2), pw1); | 5118 pairWeakMap->insert(PairWithWeakHandling(pw2, pw2), pw1); |
| 5119 pairWeakMap2->insert(PairWithWeakHandling(pw1, pw1), pw2); | 5119 pairWeakMap2->insert(PairWithWeakHandling(pw1, pw1), pw2); |
| 5120 pairWeakMap2->insert(PairWithWeakHandling(pw1, pw2), pw2); | 5120 pairWeakMap2->insert(PairWithWeakHandling(pw1, pw2), pw2); |
| 5121 pairWeakMap2->insert(PairWithWeakHandling(pw2, pw1), pw2); | 5121 pairWeakMap2->insert(PairWithWeakHandling(pw2, pw1), pw2); |
| 5122 pairWeakMap2->insert(PairWithWeakHandling(pw2, pw2), pw2); | 5122 pairWeakMap2->insert(PairWithWeakHandling(pw2, pw2), pw2); |
| 5123 | 5123 |
| 5124 set->add(wp1); | 5124 set->insert(wp1); |
| 5125 set->add(wp2); | 5125 set->insert(wp2); |
| 5126 set->add(pw1); | 5126 set->insert(pw1); |
| 5127 set->add(pw2); | 5127 set->insert(pw2); |
| 5128 | 5128 |
| 5129 preciselyCollectGarbage(); | 5129 preciselyCollectGarbage(); |
| 5130 | 5130 |
| 5131 EXPECT_EQ(2u, weakPairMap->size()); | 5131 EXPECT_EQ(2u, weakPairMap->size()); |
| 5132 EXPECT_EQ(2u, weakPairMap2->size()); | 5132 EXPECT_EQ(2u, weakPairMap2->size()); |
| 5133 EXPECT_EQ(1u, weakPairMap3->size()); | 5133 EXPECT_EQ(1u, weakPairMap3->size()); |
| 5134 EXPECT_EQ(2u, weakPairMap4->size()); | 5134 EXPECT_EQ(2u, weakPairMap4->size()); |
| 5135 | 5135 |
| 5136 EXPECT_EQ(3u, pairWeakMap->size()); | 5136 EXPECT_EQ(3u, pairWeakMap->size()); |
| 5137 EXPECT_EQ(4u, pairWeakMap2->size()); | 5137 EXPECT_EQ(4u, pairWeakMap2->size()); |
| (...skipping 1090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6228 return; | 6228 return; |
| 6229 | 6229 |
| 6230 // Verify that the weak reference is gone. | 6230 // Verify that the weak reference is gone. |
| 6231 EXPECT_FALSE(weakHeapObjectSet().contains(this)); | 6231 EXPECT_FALSE(weakHeapObjectSet().contains(this)); |
| 6232 | 6232 |
| 6233 // Add a new member to the static singleton; this will | 6233 // Add a new member to the static singleton; this will |
| 6234 // re-initializes the persistent node of the collection | 6234 // re-initializes the persistent node of the collection |
| 6235 // object. Done while terminating the test thread, so | 6235 // object. Done while terminating the test thread, so |
| 6236 // verify that this brings about the release of the | 6236 // verify that this brings about the release of the |
| 6237 // persistent also. | 6237 // persistent also. |
| 6238 heapObjectSet().add(create(false)); | 6238 heapObjectSet().insert(create(false)); |
| 6239 } | 6239 } |
| 6240 | 6240 |
| 6241 DEFINE_INLINE_TRACE() {} | 6241 DEFINE_INLINE_TRACE() {} |
| 6242 | 6242 |
| 6243 private: | 6243 private: |
| 6244 explicit HeapObject(bool testDestructor) : m_testDestructor(testDestructor) {} | 6244 explicit HeapObject(bool testDestructor) : m_testDestructor(testDestructor) {} |
| 6245 | 6245 |
| 6246 bool m_testDestructor; | 6246 bool m_testDestructor; |
| 6247 }; | 6247 }; |
| 6248 | 6248 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 6262 new ThreadSpecific<HeapObjectSet>); | 6262 new ThreadSpecific<HeapObjectSet>); |
| 6263 if (!singleton.isSet()) | 6263 if (!singleton.isSet()) |
| 6264 singleton->registerAsStaticReference(); | 6264 singleton->registerAsStaticReference(); |
| 6265 | 6265 |
| 6266 return *singleton; | 6266 return *singleton; |
| 6267 } | 6267 } |
| 6268 | 6268 |
| 6269 void ThreadedClearOnShutdownTester::runWhileAttached() { | 6269 void ThreadedClearOnShutdownTester::runWhileAttached() { |
| 6270 EXPECT_EQ(42, threadSpecificIntWrapper().value()); | 6270 EXPECT_EQ(42, threadSpecificIntWrapper().value()); |
| 6271 // Creates a thread-specific singleton to a weakly held object. | 6271 // Creates a thread-specific singleton to a weakly held object. |
| 6272 weakHeapObjectSet().add(HeapObject::create(true)); | 6272 weakHeapObjectSet().insert(HeapObject::create(true)); |
| 6273 } | 6273 } |
| 6274 | 6274 |
| 6275 } // namespace | 6275 } // namespace |
| 6276 | 6276 |
| 6277 TEST(HeapTest, TestClearOnShutdown) { | 6277 TEST(HeapTest, TestClearOnShutdown) { |
| 6278 ThreadedClearOnShutdownTester::test(); | 6278 ThreadedClearOnShutdownTester::test(); |
| 6279 } | 6279 } |
| 6280 | 6280 |
| 6281 // Verify that WeakMember<const T> compiles and behaves as expected. | 6281 // Verify that WeakMember<const T> compiles and behaves as expected. |
| 6282 class WithWeakConstObject final : public GarbageCollected<WithWeakConstObject> { | 6282 class WithWeakConstObject final : public GarbageCollected<WithWeakConstObject> { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6359 "HeapVector"); | 6359 "HeapVector"); |
| 6360 static_assert( | 6360 static_assert( |
| 6361 WTF::IsGarbageCollectedType<HeapDeque<Member<IntWrapper>>>::value, | 6361 WTF::IsGarbageCollectedType<HeapDeque<Member<IntWrapper>>>::value, |
| 6362 "HeapDeque"); | 6362 "HeapDeque"); |
| 6363 static_assert(WTF::IsGarbageCollectedType< | 6363 static_assert(WTF::IsGarbageCollectedType< |
| 6364 HeapTerminatedArray<Member<IntWrapper>>>::value, | 6364 HeapTerminatedArray<Member<IntWrapper>>>::value, |
| 6365 "HeapTerminatedArray"); | 6365 "HeapTerminatedArray"); |
| 6366 } | 6366 } |
| 6367 | 6367 |
| 6368 } // namespace blink | 6368 } // namespace blink |
| OLD | NEW |