Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: third_party/WebKit/Source/platform/heap/HeapTest.cpp

Issue 2709033003: Migrate WTF::HashMap::get() to ::at() (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698