| 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 2023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2034 preciselyCollectGarbage(); | 2034 preciselyCollectGarbage(); |
| 2035 size_t afterAddAndGC = heap.objectPayloadSizeForTesting(); | 2035 size_t afterAddAndGC = heap.objectPayloadSizeForTesting(); |
| 2036 EXPECT_TRUE(afterAddAndGC >= afterOneAdd); | 2036 EXPECT_TRUE(afterAddAndGC >= afterOneAdd); |
| 2037 | 2037 |
| 2038 EXPECT_EQ(map->size(), 2u); // Two different wrappings of '1' are distinct. | 2038 EXPECT_EQ(map->size(), 2u); // Two different wrappings of '1' are distinct. |
| 2039 | 2039 |
| 2040 preciselyCollectGarbage(); | 2040 preciselyCollectGarbage(); |
| 2041 EXPECT_TRUE(map->contains(one)); | 2041 EXPECT_TRUE(map->contains(one)); |
| 2042 EXPECT_TRUE(map->contains(anotherOne)); | 2042 EXPECT_TRUE(map->contains(anotherOne)); |
| 2043 | 2043 |
| 2044 IntWrapper* gotten(map->get(one)); | 2044 IntWrapper* gotten(map->at(one)); |
| 2045 EXPECT_EQ(gotten->value(), one->value()); | 2045 EXPECT_EQ(gotten->value(), one->value()); |
| 2046 EXPECT_EQ(gotten, one); | 2046 EXPECT_EQ(gotten, one); |
| 2047 | 2047 |
| 2048 size_t afterGC2 = heap.objectPayloadSizeForTesting(); | 2048 size_t afterGC2 = heap.objectPayloadSizeForTesting(); |
| 2049 EXPECT_EQ(afterGC2, afterAddAndGC); | 2049 EXPECT_EQ(afterGC2, afterAddAndGC); |
| 2050 | 2050 |
| 2051 IntWrapper* dozen = 0; | 2051 IntWrapper* dozen = 0; |
| 2052 | 2052 |
| 2053 for (int i = 1; i < 1000; i++) { // 999 iterations. | 2053 for (int i = 1; i < 1000; i++) { // 999 iterations. |
| 2054 IntWrapper* iWrapper(IntWrapper::create(i)); | 2054 IntWrapper* iWrapper(IntWrapper::create(i)); |
| 2055 IntWrapper* iSquared(IntWrapper::create(i * i)); | 2055 IntWrapper* iSquared(IntWrapper::create(i * i)); |
| 2056 map->insert(iWrapper, iSquared); | 2056 map->insert(iWrapper, iSquared); |
| 2057 if (i == 12) | 2057 if (i == 12) |
| 2058 dozen = iWrapper; | 2058 dozen = iWrapper; |
| 2059 } | 2059 } |
| 2060 size_t afterAdding1000 = heap.objectPayloadSizeForTesting(); | 2060 size_t afterAdding1000 = heap.objectPayloadSizeForTesting(); |
| 2061 EXPECT_TRUE(afterAdding1000 > afterGC2); | 2061 EXPECT_TRUE(afterAdding1000 > afterGC2); |
| 2062 | 2062 |
| 2063 IntWrapper* gross(map->get(dozen)); | 2063 IntWrapper* gross(map->at(dozen)); |
| 2064 EXPECT_EQ(gross->value(), 144); | 2064 EXPECT_EQ(gross->value(), 144); |
| 2065 | 2065 |
| 2066 // This should clear out any junk backings created by all the adds. | 2066 // This should clear out any junk backings created by all the adds. |
| 2067 preciselyCollectGarbage(); | 2067 preciselyCollectGarbage(); |
| 2068 size_t afterGC3 = heap.objectPayloadSizeForTesting(); | 2068 size_t afterGC3 = heap.objectPayloadSizeForTesting(); |
| 2069 EXPECT_TRUE(afterGC3 <= afterAdding1000); | 2069 EXPECT_TRUE(afterGC3 <= afterAdding1000); |
| 2070 } | 2070 } |
| 2071 | 2071 |
| 2072 preciselyCollectGarbage(); | 2072 preciselyCollectGarbage(); |
| 2073 // The objects 'one', anotherOne, and the 999 other pairs. | 2073 // The objects 'one', anotherOne, and the 999 other pairs. |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2519 set3->swap(cCountedSet); | 2519 set3->swap(cCountedSet); |
| 2520 EXPECT_EQ(0u, set3->size()); | 2520 EXPECT_EQ(0u, set3->size()); |
| 2521 set3->swap(cCountedSet); | 2521 set3->swap(cCountedSet); |
| 2522 | 2522 |
| 2523 // Triple swap. | 2523 // Triple swap. |
| 2524 container->map.swap(*memberMember2); | 2524 container->map.swap(*memberMember2); |
| 2525 MemberMember& containedMap = container->map; | 2525 MemberMember& containedMap = container->map; |
| 2526 memberMember3->swap(containedMap); | 2526 memberMember3->swap(containedMap); |
| 2527 memberMember3->swap(*memberMember); | 2527 memberMember3->swap(*memberMember); |
| 2528 | 2528 |
| 2529 EXPECT_TRUE(memberMember->get(one) == two); | 2529 EXPECT_TRUE(memberMember->at(one) == two); |
| 2530 EXPECT_TRUE(memberMember->get(two) == three); | 2530 EXPECT_TRUE(memberMember->at(two) == three); |
| 2531 EXPECT_TRUE(memberMember->get(three) == four); | 2531 EXPECT_TRUE(memberMember->at(three) == four); |
| 2532 EXPECT_TRUE(memberMember->get(four) == one); | 2532 EXPECT_TRUE(memberMember->at(four) == one); |
| 2533 EXPECT_TRUE(primitiveMember->get(1) == two); | 2533 EXPECT_TRUE(primitiveMember->at(1) == two); |
| 2534 EXPECT_TRUE(primitiveMember->get(2) == three); | 2534 EXPECT_TRUE(primitiveMember->at(2) == three); |
| 2535 EXPECT_TRUE(primitiveMember->get(3) == four); | 2535 EXPECT_TRUE(primitiveMember->at(3) == four); |
| 2536 EXPECT_TRUE(primitiveMember->get(4) == one); | 2536 EXPECT_TRUE(primitiveMember->at(4) == one); |
| 2537 EXPECT_EQ(1, memberPrimitive->get(four)); | 2537 EXPECT_EQ(1, memberPrimitive->at(four)); |
| 2538 EXPECT_EQ(2, memberPrimitive->get(one)); | 2538 EXPECT_EQ(2, memberPrimitive->at(one)); |
| 2539 EXPECT_EQ(3, memberPrimitive->get(two)); | 2539 EXPECT_EQ(3, memberPrimitive->at(two)); |
| 2540 EXPECT_EQ(4, memberPrimitive->get(three)); | 2540 EXPECT_EQ(4, memberPrimitive->at(three)); |
| 2541 EXPECT_TRUE(set->contains(one)); | 2541 EXPECT_TRUE(set->contains(one)); |
| 2542 EXPECT_TRUE(set->contains(two)); | 2542 EXPECT_TRUE(set->contains(two)); |
| 2543 EXPECT_TRUE(set->contains(three)); | 2543 EXPECT_TRUE(set->contains(three)); |
| 2544 EXPECT_TRUE(set->contains(four)); | 2544 EXPECT_TRUE(set->contains(four)); |
| 2545 EXPECT_TRUE(set2->contains(oneB)); | 2545 EXPECT_TRUE(set2->contains(oneB)); |
| 2546 EXPECT_TRUE(set3->contains(oneB)); | 2546 EXPECT_TRUE(set3->contains(oneB)); |
| 2547 EXPECT_TRUE(vector->contains(threeB)); | 2547 EXPECT_TRUE(vector->contains(threeB)); |
| 2548 EXPECT_TRUE(vector->contains(fourB)); | 2548 EXPECT_TRUE(vector->contains(fourB)); |
| 2549 EXPECT_TRUE(dequeContains(*deque, threeE)); | 2549 EXPECT_TRUE(dequeContains(*deque, threeE)); |
| 2550 EXPECT_TRUE(dequeContains(*deque, fourE)); | 2550 EXPECT_TRUE(dequeContains(*deque, fourE)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2587 EXPECT_EQ(1u, set3->size()); | 2587 EXPECT_EQ(1u, set3->size()); |
| 2588 EXPECT_EQ(2u, vector->size()); | 2588 EXPECT_EQ(2u, vector->size()); |
| 2589 EXPECT_EQ(1u, vector2->size()); | 2589 EXPECT_EQ(1u, vector2->size()); |
| 2590 EXPECT_EQ(3u, vectorUW->size()); | 2590 EXPECT_EQ(3u, vectorUW->size()); |
| 2591 EXPECT_EQ(1u, vector2->size()); | 2591 EXPECT_EQ(1u, vector2->size()); |
| 2592 EXPECT_EQ(2u, deque->size()); | 2592 EXPECT_EQ(2u, deque->size()); |
| 2593 EXPECT_EQ(1u, deque2->size()); | 2593 EXPECT_EQ(1u, deque2->size()); |
| 2594 EXPECT_EQ(3u, dequeUW->size()); | 2594 EXPECT_EQ(3u, dequeUW->size()); |
| 2595 EXPECT_EQ(1u, deque2->size()); | 2595 EXPECT_EQ(1u, deque2->size()); |
| 2596 | 2596 |
| 2597 EXPECT_TRUE(memberMember->get(one) == two); | 2597 EXPECT_TRUE(memberMember->at(one) == two); |
| 2598 EXPECT_TRUE(primitiveMember->get(1) == two); | 2598 EXPECT_TRUE(primitiveMember->at(1) == two); |
| 2599 EXPECT_TRUE(primitiveMember->get(4) == one); | 2599 EXPECT_TRUE(primitiveMember->at(4) == one); |
| 2600 EXPECT_EQ(2, memberPrimitive->get(one)); | 2600 EXPECT_EQ(2, memberPrimitive->at(one)); |
| 2601 EXPECT_EQ(3, memberPrimitive->get(two)); | 2601 EXPECT_EQ(3, memberPrimitive->at(two)); |
| 2602 EXPECT_TRUE(set->contains(one)); | 2602 EXPECT_TRUE(set->contains(one)); |
| 2603 EXPECT_TRUE(set->contains(two)); | 2603 EXPECT_TRUE(set->contains(two)); |
| 2604 EXPECT_FALSE(set->contains(oneB)); | 2604 EXPECT_FALSE(set->contains(oneB)); |
| 2605 EXPECT_TRUE(set2->contains(oneB)); | 2605 EXPECT_TRUE(set2->contains(oneB)); |
| 2606 EXPECT_TRUE(set3->contains(oneB)); | 2606 EXPECT_TRUE(set3->contains(oneB)); |
| 2607 EXPECT_EQ(2u, set3->find(oneB)->value); | 2607 EXPECT_EQ(2u, set3->find(oneB)->value); |
| 2608 EXPECT_EQ(3, vector->at(0)->value()); | 2608 EXPECT_EQ(3, vector->at(0)->value()); |
| 2609 EXPECT_EQ(4, vector->at(1)->value()); | 2609 EXPECT_EQ(4, vector->at(1)->value()); |
| 2610 EXPECT_EQ(3, deque->begin()->get()->value()); | 2610 EXPECT_EQ(3, deque->begin()->get()->value()); |
| 2611 } | 2611 } |
| (...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3408 | 3408 |
| 3409 EXPECT_EQ(64u, weakStrong->size()); | 3409 EXPECT_EQ(64u, weakStrong->size()); |
| 3410 EXPECT_EQ(64u, strongWeak->size()); | 3410 EXPECT_EQ(64u, strongWeak->size()); |
| 3411 EXPECT_EQ(64u, weakWeak->size()); | 3411 EXPECT_EQ(64u, weakWeak->size()); |
| 3412 EXPECT_EQ(64u, weakSet->size()); | 3412 EXPECT_EQ(64u, weakSet->size()); |
| 3413 EXPECT_EQ(64u, weakOrderedSet->size()); | 3413 EXPECT_EQ(64u, weakOrderedSet->size()); |
| 3414 | 3414 |
| 3415 for (int i = 0; i < 128; i += 2) { | 3415 for (int i = 0; i < 128; i += 2) { |
| 3416 IntWrapper* wrapped = keepNumbersAlive[i]; | 3416 IntWrapper* wrapped = keepNumbersAlive[i]; |
| 3417 IntWrapper* wrapped2 = keepNumbersAlive[i + 1]; | 3417 IntWrapper* wrapped2 = keepNumbersAlive[i + 1]; |
| 3418 EXPECT_EQ(wrapped2, weakStrong->get(wrapped)); | 3418 EXPECT_EQ(wrapped2, weakStrong->at(wrapped)); |
| 3419 EXPECT_EQ(wrapped, strongWeak->get(wrapped2)); | 3419 EXPECT_EQ(wrapped, strongWeak->at(wrapped2)); |
| 3420 EXPECT_EQ(wrapped2, weakWeak->get(wrapped)); | 3420 EXPECT_EQ(wrapped2, weakWeak->at(wrapped)); |
| 3421 EXPECT_TRUE(weakSet->contains(wrapped)); | 3421 EXPECT_TRUE(weakSet->contains(wrapped)); |
| 3422 EXPECT_TRUE(weakOrderedSet->contains(wrapped)); | 3422 EXPECT_TRUE(weakOrderedSet->contains(wrapped)); |
| 3423 } | 3423 } |
| 3424 | 3424 |
| 3425 for (int i = 0; i < 128; i += 3) | 3425 for (int i = 0; i < 128; i += 3) |
| 3426 keepNumbersAlive[i] = nullptr; | 3426 keepNumbersAlive[i] = nullptr; |
| 3427 | 3427 |
| 3428 if (collectionNumber != weakStrongIndex) | 3428 if (collectionNumber != weakStrongIndex) |
| 3429 weakStrong->clear(); | 3429 weakStrong->clear(); |
| 3430 if (collectionNumber != strongWeakIndex) | 3430 if (collectionNumber != strongWeakIndex) |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3888 EXPECT_EQ(1u, pSet.size()); | 3888 EXPECT_EQ(1u, pSet.size()); |
| 3889 EXPECT_TRUE(pSet.contains(four)); | 3889 EXPECT_TRUE(pSet.contains(four)); |
| 3890 | 3890 |
| 3891 EXPECT_EQ(1u, pListSet.size()); | 3891 EXPECT_EQ(1u, pListSet.size()); |
| 3892 EXPECT_TRUE(pListSet.contains(eight)); | 3892 EXPECT_TRUE(pListSet.contains(eight)); |
| 3893 | 3893 |
| 3894 EXPECT_EQ(1u, pLinkedSet.size()); | 3894 EXPECT_EQ(1u, pLinkedSet.size()); |
| 3895 EXPECT_TRUE(pLinkedSet.contains(nine)); | 3895 EXPECT_TRUE(pLinkedSet.contains(nine)); |
| 3896 | 3896 |
| 3897 EXPECT_EQ(1u, pMap.size()); | 3897 EXPECT_EQ(1u, pMap.size()); |
| 3898 EXPECT_EQ(six, pMap.get(five)); | 3898 EXPECT_EQ(six, pMap.at(five)); |
| 3899 | 3899 |
| 3900 EXPECT_EQ(1u, wpMap.size()); | 3900 EXPECT_EQ(1u, wpMap.size()); |
| 3901 EXPECT_EQ(eleven, wpMap.get(ten)); | 3901 EXPECT_EQ(eleven, wpMap.at(ten)); |
| 3902 ten.clear(); | 3902 ten.clear(); |
| 3903 preciselyCollectGarbage(); | 3903 preciselyCollectGarbage(); |
| 3904 EXPECT_EQ(0u, wpMap.size()); | 3904 EXPECT_EQ(0u, wpMap.size()); |
| 3905 } | 3905 } |
| 3906 | 3906 |
| 3907 // Collect previous roots. | 3907 // Collect previous roots. |
| 3908 preciselyCollectGarbage(); | 3908 preciselyCollectGarbage(); |
| 3909 EXPECT_EQ(11, IntWrapper::s_destructorCalls); | 3909 EXPECT_EQ(11, IntWrapper::s_destructorCalls); |
| 3910 } | 3910 } |
| 3911 | 3911 |
| 3912 TEST(HeapTest, CollectionNesting) { | 3912 TEST(HeapTest, CollectionNesting) { |
| 3913 clearOutOldGarbage(); | 3913 clearOutOldGarbage(); |
| 3914 int* key = &IntWrapper::s_destructorCalls; | 3914 int* key = &IntWrapper::s_destructorCalls; |
| 3915 IntWrapper::s_destructorCalls = 0; | 3915 IntWrapper::s_destructorCalls = 0; |
| 3916 typedef HeapVector<Member<IntWrapper>> IntVector; | 3916 typedef HeapVector<Member<IntWrapper>> IntVector; |
| 3917 typedef HeapDeque<Member<IntWrapper>> IntDeque; | 3917 typedef HeapDeque<Member<IntWrapper>> IntDeque; |
| 3918 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>(); | 3918 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>(); |
| 3919 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>(); | 3919 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>(); |
| 3920 static_assert(WTF::IsTraceable<IntVector>::value, | 3920 static_assert(WTF::IsTraceable<IntVector>::value, |
| 3921 "Failed to recognize HeapVector as traceable"); | 3921 "Failed to recognize HeapVector as traceable"); |
| 3922 static_assert(WTF::IsTraceable<IntDeque>::value, | 3922 static_assert(WTF::IsTraceable<IntDeque>::value, |
| 3923 "Failed to recognize HeapDeque as traceable"); | 3923 "Failed to recognize HeapDeque as traceable"); |
| 3924 | 3924 |
| 3925 map->insert(key, IntVector()); | 3925 map->insert(key, IntVector()); |
| 3926 map2->insert(key, IntDeque()); | 3926 map2->insert(key, IntDeque()); |
| 3927 | 3927 |
| 3928 HeapHashMap<void*, IntVector>::iterator it = map->find(key); | 3928 HeapHashMap<void*, IntVector>::iterator it = map->find(key); |
| 3929 EXPECT_EQ(0u, map->get(key).size()); | 3929 EXPECT_EQ(0u, map->at(key).size()); |
| 3930 | 3930 |
| 3931 HeapHashMap<void*, IntDeque>::iterator it2 = map2->find(key); | 3931 HeapHashMap<void*, IntDeque>::iterator it2 = map2->find(key); |
| 3932 EXPECT_EQ(0u, map2->get(key).size()); | 3932 EXPECT_EQ(0u, map2->at(key).size()); |
| 3933 | 3933 |
| 3934 it->value.push_back(IntWrapper::create(42)); | 3934 it->value.push_back(IntWrapper::create(42)); |
| 3935 EXPECT_EQ(1u, map->get(key).size()); | 3935 EXPECT_EQ(1u, map->at(key).size()); |
| 3936 | 3936 |
| 3937 it2->value.append(IntWrapper::create(42)); | 3937 it2->value.append(IntWrapper::create(42)); |
| 3938 EXPECT_EQ(1u, map2->get(key).size()); | 3938 EXPECT_EQ(1u, map2->at(key).size()); |
| 3939 | 3939 |
| 3940 Persistent<HeapHashMap<void*, IntVector>> keepAlive(map); | 3940 Persistent<HeapHashMap<void*, IntVector>> keepAlive(map); |
| 3941 Persistent<HeapHashMap<void*, IntDeque>> keepAlive2(map2); | 3941 Persistent<HeapHashMap<void*, IntDeque>> keepAlive2(map2); |
| 3942 | 3942 |
| 3943 for (int i = 0; i < 100; i++) { | 3943 for (int i = 0; i < 100; i++) { |
| 3944 map->insert(key + 1 + i, IntVector()); | 3944 map->insert(key + 1 + i, IntVector()); |
| 3945 map2->insert(key + 1 + i, IntDeque()); | 3945 map2->insert(key + 1 + i, IntDeque()); |
| 3946 } | 3946 } |
| 3947 | 3947 |
| 3948 preciselyCollectGarbage(); | 3948 preciselyCollectGarbage(); |
| 3949 | 3949 |
| 3950 EXPECT_EQ(1u, map->get(key).size()); | 3950 EXPECT_EQ(1u, map->at(key).size()); |
| 3951 EXPECT_EQ(1u, map2->get(key).size()); | 3951 EXPECT_EQ(1u, map2->at(key).size()); |
| 3952 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3952 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3953 | 3953 |
| 3954 keepAlive = nullptr; | 3954 keepAlive = nullptr; |
| 3955 preciselyCollectGarbage(); | 3955 preciselyCollectGarbage(); |
| 3956 EXPECT_EQ(1, IntWrapper::s_destructorCalls); | 3956 EXPECT_EQ(1, IntWrapper::s_destructorCalls); |
| 3957 } | 3957 } |
| 3958 | 3958 |
| 3959 TEST(HeapTest, GarbageCollectedMixin) { | 3959 TEST(HeapTest, GarbageCollectedMixin) { |
| 3960 clearOutOldGarbage(); | 3960 clearOutOldGarbage(); |
| 3961 | 3961 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3978 TEST(HeapTest, CollectionNesting2) { | 3978 TEST(HeapTest, CollectionNesting2) { |
| 3979 clearOutOldGarbage(); | 3979 clearOutOldGarbage(); |
| 3980 void* key = &IntWrapper::s_destructorCalls; | 3980 void* key = &IntWrapper::s_destructorCalls; |
| 3981 IntWrapper::s_destructorCalls = 0; | 3981 IntWrapper::s_destructorCalls = 0; |
| 3982 typedef HeapHashSet<Member<IntWrapper>> IntSet; | 3982 typedef HeapHashSet<Member<IntWrapper>> IntSet; |
| 3983 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); | 3983 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); |
| 3984 | 3984 |
| 3985 map->insert(key, IntSet()); | 3985 map->insert(key, IntSet()); |
| 3986 | 3986 |
| 3987 HeapHashMap<void*, IntSet>::iterator it = map->find(key); | 3987 HeapHashMap<void*, IntSet>::iterator it = map->find(key); |
| 3988 EXPECT_EQ(0u, map->get(key).size()); | 3988 EXPECT_EQ(0u, map->at(key).size()); |
| 3989 | 3989 |
| 3990 it->value.insert(IntWrapper::create(42)); | 3990 it->value.insert(IntWrapper::create(42)); |
| 3991 EXPECT_EQ(1u, map->get(key).size()); | 3991 EXPECT_EQ(1u, map->at(key).size()); |
| 3992 | 3992 |
| 3993 Persistent<HeapHashMap<void*, IntSet>> keepAlive(map); | 3993 Persistent<HeapHashMap<void*, IntSet>> keepAlive(map); |
| 3994 preciselyCollectGarbage(); | 3994 preciselyCollectGarbage(); |
| 3995 EXPECT_EQ(1u, map->get(key).size()); | 3995 EXPECT_EQ(1u, map->at(key).size()); |
| 3996 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3996 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3997 } | 3997 } |
| 3998 | 3998 |
| 3999 TEST(HeapTest, CollectionNesting3) { | 3999 TEST(HeapTest, CollectionNesting3) { |
| 4000 clearOutOldGarbage(); | 4000 clearOutOldGarbage(); |
| 4001 IntWrapper::s_destructorCalls = 0; | 4001 IntWrapper::s_destructorCalls = 0; |
| 4002 typedef HeapVector<Member<IntWrapper>> IntVector; | 4002 typedef HeapVector<Member<IntWrapper>> IntVector; |
| 4003 typedef HeapDeque<Member<IntWrapper>> IntDeque; | 4003 typedef HeapDeque<Member<IntWrapper>> IntDeque; |
| 4004 HeapVector<IntVector>* vector = new HeapVector<IntVector>(); | 4004 HeapVector<IntVector>* vector = new HeapVector<IntVector>(); |
| 4005 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>(); | 4005 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>(); |
| (...skipping 966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4972 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper>> InnerMap; | 4972 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper>> InnerMap; |
| 4973 typedef HeapHashMap<WeakMember<IntWrapper>, InnerMap> OuterMap; | 4973 typedef HeapHashMap<WeakMember<IntWrapper>, InnerMap> OuterMap; |
| 4974 | 4974 |
| 4975 for (int keepOuterAlive = 0; keepOuterAlive <= 1; keepOuterAlive++) { | 4975 for (int keepOuterAlive = 0; keepOuterAlive <= 1; keepOuterAlive++) { |
| 4976 for (int keepInnerAlive = 0; keepInnerAlive <= 1; keepInnerAlive++) { | 4976 for (int keepInnerAlive = 0; keepInnerAlive <= 1; keepInnerAlive++) { |
| 4977 Persistent<OuterMap> outer = new OuterMap(); | 4977 Persistent<OuterMap> outer = new OuterMap(); |
| 4978 Persistent<IntWrapper> one = IntWrapper::create(1); | 4978 Persistent<IntWrapper> one = IntWrapper::create(1); |
| 4979 Persistent<IntWrapper> two = IntWrapper::create(2); | 4979 Persistent<IntWrapper> two = IntWrapper::create(2); |
| 4980 outer->insert(one, InnerMap()); | 4980 outer->insert(one, InnerMap()); |
| 4981 outer->begin()->value.insert(two, IntWrapper::create(3)); | 4981 outer->begin()->value.insert(two, IntWrapper::create(3)); |
| 4982 EXPECT_EQ(1u, outer->get(one).size()); | 4982 EXPECT_EQ(1u, outer->at(one).size()); |
| 4983 if (!keepOuterAlive) | 4983 if (!keepOuterAlive) |
| 4984 one.clear(); | 4984 one.clear(); |
| 4985 if (!keepInnerAlive) | 4985 if (!keepInnerAlive) |
| 4986 two.clear(); | 4986 two.clear(); |
| 4987 preciselyCollectGarbage(); | 4987 preciselyCollectGarbage(); |
| 4988 if (keepOuterAlive) { | 4988 if (keepOuterAlive) { |
| 4989 const InnerMap& inner = outer->get(one); | 4989 const InnerMap& inner = outer->at(one); |
| 4990 if (keepInnerAlive) { | 4990 if (keepInnerAlive) { |
| 4991 EXPECT_EQ(1u, inner.size()); | 4991 EXPECT_EQ(1u, inner.size()); |
| 4992 IntWrapper* three = inner.get(two); | 4992 IntWrapper* three = inner.at(two); |
| 4993 EXPECT_EQ(3, three->value()); | 4993 EXPECT_EQ(3, three->value()); |
| 4994 } else { | 4994 } else { |
| 4995 EXPECT_EQ(0u, inner.size()); | 4995 EXPECT_EQ(0u, inner.size()); |
| 4996 } | 4996 } |
| 4997 } else { | 4997 } else { |
| 4998 EXPECT_EQ(0u, outer->size()); | 4998 EXPECT_EQ(0u, outer->size()); |
| 4999 } | 4999 } |
| 5000 outer->clear(); | 5000 outer->clear(); |
| 5001 Persistent<IntWrapper> deep = IntWrapper::create(42); | 5001 Persistent<IntWrapper> deep = IntWrapper::create(42); |
| 5002 Persistent<IntWrapper> home = IntWrapper::create(103); | 5002 Persistent<IntWrapper> home = IntWrapper::create(103); |
| 5003 Persistent<IntWrapper> composite = IntWrapper::create(91); | 5003 Persistent<IntWrapper> composite = IntWrapper::create(91); |
| 5004 Persistent<HeapVector<Member<IntWrapper>>> keepAlive = | 5004 Persistent<HeapVector<Member<IntWrapper>>> keepAlive = |
| 5005 new HeapVector<Member<IntWrapper>>(); | 5005 new HeapVector<Member<IntWrapper>>(); |
| 5006 for (int i = 0; i < 10000; i++) { | 5006 for (int i = 0; i < 10000; i++) { |
| 5007 IntWrapper* value = IntWrapper::create(i); | 5007 IntWrapper* value = IntWrapper::create(i); |
| 5008 keepAlive->push_back(value); | 5008 keepAlive->push_back(value); |
| 5009 OuterMap::AddResult newEntry = outer->insert(value, InnerMap()); | 5009 OuterMap::AddResult newEntry = outer->insert(value, InnerMap()); |
| 5010 newEntry.storedValue->value.insert(deep, home); | 5010 newEntry.storedValue->value.insert(deep, home); |
| 5011 newEntry.storedValue->value.insert(composite, home); | 5011 newEntry.storedValue->value.insert(composite, home); |
| 5012 } | 5012 } |
| 5013 composite.clear(); | 5013 composite.clear(); |
| 5014 preciselyCollectGarbage(); | 5014 preciselyCollectGarbage(); |
| 5015 EXPECT_EQ(10000u, outer->size()); | 5015 EXPECT_EQ(10000u, outer->size()); |
| 5016 for (int i = 0; i < 10000; i++) { | 5016 for (int i = 0; i < 10000; i++) { |
| 5017 IntWrapper* value = keepAlive->at(i); | 5017 IntWrapper* value = keepAlive->at(i); |
| 5018 EXPECT_EQ(1u, outer->get(value) | 5018 EXPECT_EQ(1u, |
| 5019 .size()); // Other one was deleted by weak handling. | 5019 outer->at(value) |
| 5020 .size()); // Other one was deleted by weak handling. |
| 5020 if (i & 1) | 5021 if (i & 1) |
| 5021 keepAlive->at(i) = nullptr; | 5022 keepAlive->at(i) = nullptr; |
| 5022 } | 5023 } |
| 5023 preciselyCollectGarbage(); | 5024 preciselyCollectGarbage(); |
| 5024 EXPECT_EQ(5000u, outer->size()); | 5025 EXPECT_EQ(5000u, outer->size()); |
| 5025 } | 5026 } |
| 5026 } | 5027 } |
| 5027 } | 5028 } |
| 5028 | 5029 |
| 5029 class EphemeronWrapper : public GarbageCollected<EphemeronWrapper> { | 5030 class EphemeronWrapper : public GarbageCollected<EphemeronWrapper> { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 5051 chain->getMap().insert(key, oldHead); | 5052 chain->getMap().insert(key, oldHead); |
| 5052 chain->getMap().insert(IntWrapper::create(103), new EphemeronWrapper()); | 5053 chain->getMap().insert(IntWrapper::create(103), new EphemeronWrapper()); |
| 5053 } | 5054 } |
| 5054 | 5055 |
| 5055 preciselyCollectGarbage(); | 5056 preciselyCollectGarbage(); |
| 5056 | 5057 |
| 5057 EphemeronWrapper* wrapper = chain; | 5058 EphemeronWrapper* wrapper = chain; |
| 5058 for (int i = 0; i < 100; i++) { | 5059 for (int i = 0; i < 100; i++) { |
| 5059 EXPECT_EQ(1u, wrapper->getMap().size()); | 5060 EXPECT_EQ(1u, wrapper->getMap().size()); |
| 5060 if (i == 49) | 5061 if (i == 49) |
| 5061 wrapper = wrapper->getMap().get(key2); | 5062 wrapper = wrapper->getMap().at(key2); |
| 5062 else | 5063 else |
| 5063 wrapper = wrapper->getMap().get(key); | 5064 wrapper = wrapper->getMap().at(key); |
| 5064 } | 5065 } |
| 5065 EXPECT_EQ(nullptr, wrapper); | 5066 EXPECT_EQ(nullptr, wrapper); |
| 5066 | 5067 |
| 5067 key2.clear(); | 5068 key2.clear(); |
| 5068 preciselyCollectGarbage(); | 5069 preciselyCollectGarbage(); |
| 5069 | 5070 |
| 5070 wrapper = chain; | 5071 wrapper = chain; |
| 5071 for (int i = 0; i < 50; i++) { | 5072 for (int i = 0; i < 50; i++) { |
| 5072 EXPECT_EQ(i == 49 ? 0u : 1u, wrapper->getMap().size()); | 5073 EXPECT_EQ(i == 49 ? 0u : 1u, wrapper->getMap().size()); |
| 5073 wrapper = wrapper->getMap().get(key); | 5074 wrapper = wrapper->getMap().at(key); |
| 5074 } | 5075 } |
| 5075 EXPECT_EQ(nullptr, wrapper); | 5076 EXPECT_EQ(nullptr, wrapper); |
| 5076 | 5077 |
| 5077 key.clear(); | 5078 key.clear(); |
| 5078 preciselyCollectGarbage(); | 5079 preciselyCollectGarbage(); |
| 5079 EXPECT_EQ(0u, chain->getMap().size()); | 5080 EXPECT_EQ(0u, chain->getMap().size()); |
| 5080 } | 5081 } |
| 5081 | 5082 |
| 5082 TEST(HeapTest, Ephemeron) { | 5083 TEST(HeapTest, Ephemeron) { |
| 5083 typedef HeapHashMap<WeakMember<IntWrapper>, PairWithWeakHandling> WeakPairMap; | 5084 typedef HeapHashMap<WeakMember<IntWrapper>, PairWithWeakHandling> WeakPairMap; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5177 typedef HeapHashMap<WeakMember<IntWrapper>, Member<Link1>> Map; | 5178 typedef HeapHashMap<WeakMember<IntWrapper>, Member<Link1>> Map; |
| 5178 Persistent<Map> map = new Map(); | 5179 Persistent<Map> map = new Map(); |
| 5179 Persistent<IntWrapper> deadObject = | 5180 Persistent<IntWrapper> deadObject = |
| 5180 IntWrapper::create(100); // Named for "Drowning by Numbers" (1988). | 5181 IntWrapper::create(100); // Named for "Drowning by Numbers" (1988). |
| 5181 Persistent<IntWrapper> lifeObject = IntWrapper::create(42); | 5182 Persistent<IntWrapper> lifeObject = IntWrapper::create(42); |
| 5182 map->insert(deadObject, new Link1(deadObject)); | 5183 map->insert(deadObject, new Link1(deadObject)); |
| 5183 map->insert(lifeObject, new Link1(lifeObject)); | 5184 map->insert(lifeObject, new Link1(lifeObject)); |
| 5184 EXPECT_EQ(2u, map->size()); | 5185 EXPECT_EQ(2u, map->size()); |
| 5185 preciselyCollectGarbage(); | 5186 preciselyCollectGarbage(); |
| 5186 EXPECT_EQ(2u, map->size()); | 5187 EXPECT_EQ(2u, map->size()); |
| 5187 EXPECT_EQ(deadObject, map->get(deadObject)->link()); | 5188 EXPECT_EQ(deadObject, map->at(deadObject)->link()); |
| 5188 EXPECT_EQ(lifeObject, map->get(lifeObject)->link()); | 5189 EXPECT_EQ(lifeObject, map->at(lifeObject)->link()); |
| 5189 deadObject.clear(); // Now it can live up to its name. | 5190 deadObject.clear(); // Now it can live up to its name. |
| 5190 preciselyCollectGarbage(); | 5191 preciselyCollectGarbage(); |
| 5191 EXPECT_EQ(1u, map->size()); | 5192 EXPECT_EQ(1u, map->size()); |
| 5192 EXPECT_EQ(lifeObject, map->get(lifeObject)->link()); | 5193 EXPECT_EQ(lifeObject, map->at(lifeObject)->link()); |
| 5193 lifeObject.clear(); // Despite its name. | 5194 lifeObject.clear(); // Despite its name. |
| 5194 preciselyCollectGarbage(); | 5195 preciselyCollectGarbage(); |
| 5195 EXPECT_EQ(0u, map->size()); | 5196 EXPECT_EQ(0u, map->size()); |
| 5196 } | 5197 } |
| 5197 | 5198 |
| 5198 static Mutex& mainThreadMutex() { | 5199 static Mutex& mainThreadMutex() { |
| 5199 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mainMutex, new Mutex); | 5200 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mainMutex, new Mutex); |
| 5200 return mainMutex; | 5201 return mainMutex; |
| 5201 } | 5202 } |
| 5202 | 5203 |
| (...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6344 "HeapVector"); | 6345 "HeapVector"); |
| 6345 static_assert( | 6346 static_assert( |
| 6346 WTF::IsGarbageCollectedType<HeapDeque<Member<IntWrapper>>>::value, | 6347 WTF::IsGarbageCollectedType<HeapDeque<Member<IntWrapper>>>::value, |
| 6347 "HeapDeque"); | 6348 "HeapDeque"); |
| 6348 static_assert(WTF::IsGarbageCollectedType< | 6349 static_assert(WTF::IsGarbageCollectedType< |
| 6349 HeapTerminatedArray<Member<IntWrapper>>>::value, | 6350 HeapTerminatedArray<Member<IntWrapper>>>::value, |
| 6350 "HeapTerminatedArray"); | 6351 "HeapTerminatedArray"); |
| 6351 } | 6352 } |
| 6352 | 6353 |
| 6353 } // namespace blink | 6354 } // namespace blink |
| OLD | NEW |