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

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

Issue 228403002: Deque: Add HeapDeque and prevent buggy use of swap and operator= (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix whitespace Created 6 years, 8 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 | Annotate | Revision Log
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 1844 matching lines...) Expand 10 before | Expand all | Expand 10 after
1855 1855
1856 class Container : public GarbageCollected<Container> { 1856 class Container : public GarbageCollected<Container> {
1857 public: 1857 public:
1858 static Container* create() { return new Container(); } 1858 static Container* create() { return new Container(); }
1859 HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map; 1859 HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map;
1860 HeapHashSet<Member<IntWrapper> > set; 1860 HeapHashSet<Member<IntWrapper> > set;
1861 HeapHashSet<Member<IntWrapper> > set2; 1861 HeapHashSet<Member<IntWrapper> > set2;
1862 HeapVector<Member<IntWrapper>, 2> vector; 1862 HeapVector<Member<IntWrapper>, 2> vector;
1863 HeapVector<PairWrappedUnwrapped, 2> vectorWU; 1863 HeapVector<PairWrappedUnwrapped, 2> vectorWU;
1864 HeapVector<PairUnwrappedWrapped, 2> vectorUW; 1864 HeapVector<PairUnwrappedWrapped, 2> vectorUW;
1865 HeapDeque<Member<IntWrapper>, 0> deque;
1866 HeapDeque<PairWrappedUnwrapped, 0> dequeWU;
1867 HeapDeque<PairUnwrappedWrapped, 0> dequeUW;
1865 void trace(Visitor* visitor) 1868 void trace(Visitor* visitor)
1866 { 1869 {
1867 visitor->trace(map); 1870 visitor->trace(map);
1868 visitor->trace(set); 1871 visitor->trace(set);
1869 visitor->trace(set2); 1872 visitor->trace(set2);
1870 visitor->trace(vector); 1873 visitor->trace(vector);
1874 visitor->trace(vectorWU);
1875 visitor->trace(vectorUW);
1876 visitor->trace(deque);
1877 visitor->trace(dequeWU);
1878 visitor->trace(dequeUW);
1871 } 1879 }
1872 }; 1880 };
1873 1881
1874 struct ShouldBeTraced { 1882 struct ShouldBeTraced {
1875 explicit ShouldBeTraced(IntWrapper* wrapper) : m_wrapper(wrapper) { } 1883 explicit ShouldBeTraced(IntWrapper* wrapper) : m_wrapper(wrapper) { }
1876 void trace(Visitor* visitor) { visitor->trace(m_wrapper); } 1884 void trace(Visitor* visitor) { visitor->trace(m_wrapper); }
1877 Member<IntWrapper> m_wrapper; 1885 Member<IntWrapper> m_wrapper;
1878 }; 1886 };
1879 1887
1880 class OffHeapContainer : public GarbageCollectedFinalized<OffHeapContainer> { 1888 class OffHeapContainer : public GarbageCollectedFinalized<OffHeapContainer> {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 Heap::collectGarbage(ThreadState::HeapPointersOnStack); 1998 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1991 EXPECT_TRUE(vector1.contains(three)); 1999 EXPECT_TRUE(vector1.contains(three));
1992 EXPECT_TRUE(vector1.contains(four)); 2000 EXPECT_TRUE(vector1.contains(four));
1993 EXPECT_TRUE(vector1.contains(five)); 2001 EXPECT_TRUE(vector1.contains(five));
1994 EXPECT_TRUE(vector1.contains(six)); 2002 EXPECT_TRUE(vector1.contains(six));
1995 EXPECT_TRUE(vector2.contains(one)); 2003 EXPECT_TRUE(vector2.contains(one));
1996 EXPECT_TRUE(vector2.contains(two)); 2004 EXPECT_TRUE(vector2.contains(two));
1997 } 2005 }
1998 } 2006 }
1999 2007
2008 template<typename T, size_t inlineCapacity, typename U>
2009 bool dequeContains(HeapDeque<T, inlineCapacity>& deque, U u)
2010 {
2011 typedef typename HeapDeque<T, inlineCapacity>::iterator iterator;
2012 for (iterator it = deque.begin(); it != deque.end(); ++it) {
2013 if (*it == u)
2014 return true;
2015 }
2016 return false;
2017 }
2018
2000 TEST(HeapTest, HeapCollectionTypes) 2019 TEST(HeapTest, HeapCollectionTypes)
2001 { 2020 {
2002 HeapStats initialHeapSize; 2021 HeapStats initialHeapSize;
2003 IntWrapper::s_destructorCalls = 0; 2022 IntWrapper::s_destructorCalls = 0;
2004 2023
2005 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember; 2024 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember;
2006 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive; 2025 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive;
2007 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember; 2026 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember;
2008 2027
2009 typedef HeapHashSet<Member<IntWrapper> > MemberSet; 2028 typedef HeapHashSet<Member<IntWrapper> > MemberSet;
2010 2029
2011 typedef HeapVector<Member<IntWrapper>, 2> MemberVector; 2030 typedef HeapVector<Member<IntWrapper>, 2> MemberVector;
2031 typedef HeapDeque<Member<IntWrapper>, 0> MemberDeque;
2012 2032
2013 typedef HeapVector<PairWrappedUnwrapped, 2> VectorWU; 2033 typedef HeapVector<PairWrappedUnwrapped, 2> VectorWU;
2014 typedef HeapVector<PairUnwrappedWrapped, 2> VectorUW; 2034 typedef HeapVector<PairUnwrappedWrapped, 2> VectorUW;
2035 typedef HeapDeque<PairWrappedUnwrapped, 0> DequeWU;
2036 typedef HeapDeque<PairUnwrappedWrapped, 0> DequeUW;
2015 2037
2016 Persistent<MemberMember> memberMember = new MemberMember(); 2038 Persistent<MemberMember> memberMember = new MemberMember();
2017 Persistent<MemberMember> memberMember2 = new MemberMember(); 2039 Persistent<MemberMember> memberMember2 = new MemberMember();
2018 Persistent<MemberMember> memberMember3 = new MemberMember(); 2040 Persistent<MemberMember> memberMember3 = new MemberMember();
2019 Persistent<MemberPrimitive> memberPrimitive = new MemberPrimitive(); 2041 Persistent<MemberPrimitive> memberPrimitive = new MemberPrimitive();
2020 Persistent<PrimitiveMember> primitiveMember = new PrimitiveMember(); 2042 Persistent<PrimitiveMember> primitiveMember = new PrimitiveMember();
2021 Persistent<MemberSet> set = new MemberSet(); 2043 Persistent<MemberSet> set = new MemberSet();
2022 Persistent<MemberSet> set2 = new MemberSet(); 2044 Persistent<MemberSet> set2 = new MemberSet();
2023 Persistent<MemberVector> vector = new MemberVector(); 2045 Persistent<MemberVector> vector = new MemberVector();
2024 Persistent<MemberVector> vector2 = new MemberVector(); 2046 Persistent<MemberVector> vector2 = new MemberVector();
2025 Persistent<VectorWU> vectorWU = new VectorWU(); 2047 Persistent<VectorWU> vectorWU = new VectorWU();
2026 Persistent<VectorWU> vectorWU2 = new VectorWU(); 2048 Persistent<VectorWU> vectorWU2 = new VectorWU();
2027 Persistent<VectorUW> vectorUW = new VectorUW(); 2049 Persistent<VectorUW> vectorUW = new VectorUW();
2028 Persistent<VectorUW> vectorUW2 = new VectorUW(); 2050 Persistent<VectorUW> vectorUW2 = new VectorUW();
2051 Persistent<MemberDeque> deque = new MemberDeque();
2052 Persistent<MemberDeque> deque2 = new MemberDeque();
2053 Persistent<DequeWU> dequeWU = new DequeWU();
2054 Persistent<DequeWU> dequeWU2 = new DequeWU();
2055 Persistent<DequeUW> dequeUW = new DequeUW();
2056 Persistent<DequeUW> dequeUW2 = new DequeUW();
2029 Persistent<Container> container = Container::create(); 2057 Persistent<Container> container = Container::create();
2030 2058
2031 clearOutOldGarbage(&initialHeapSize); 2059 clearOutOldGarbage(&initialHeapSize);
2032 { 2060 {
2033 Persistent<IntWrapper> one(IntWrapper::create(1)); 2061 Persistent<IntWrapper> one(IntWrapper::create(1));
2034 Persistent<IntWrapper> two(IntWrapper::create(2)); 2062 Persistent<IntWrapper> two(IntWrapper::create(2));
2035 Persistent<IntWrapper> oneB(IntWrapper::create(1)); 2063 Persistent<IntWrapper> oneB(IntWrapper::create(1));
2036 Persistent<IntWrapper> twoB(IntWrapper::create(2)); 2064 Persistent<IntWrapper> twoB(IntWrapper::create(2));
2037 Persistent<IntWrapper> oneC(IntWrapper::create(1)); 2065 Persistent<IntWrapper> oneC(IntWrapper::create(1));
2038 Persistent<IntWrapper> oneD(IntWrapper::create(1)); 2066 Persistent<IntWrapper> oneD(IntWrapper::create(1));
2067 Persistent<IntWrapper> oneE(IntWrapper::create(1));
2068 Persistent<IntWrapper> oneF(IntWrapper::create(1));
2039 { 2069 {
2070 IntWrapper* threeB(IntWrapper::create(3));
2071 IntWrapper* threeC(IntWrapper::create(3));
2072 IntWrapper* threeD(IntWrapper::create(3));
2073 IntWrapper* threeE(IntWrapper::create(3));
2074 IntWrapper* threeF(IntWrapper::create(3));
2040 IntWrapper* three(IntWrapper::create(3)); 2075 IntWrapper* three(IntWrapper::create(3));
2076 IntWrapper* fourB(IntWrapper::create(4));
2077 IntWrapper* fourC(IntWrapper::create(4));
2078 IntWrapper* fourD(IntWrapper::create(4));
2079 IntWrapper* fourE(IntWrapper::create(4));
2080 IntWrapper* fourF(IntWrapper::create(4));
2041 IntWrapper* four(IntWrapper::create(4)); 2081 IntWrapper* four(IntWrapper::create(4));
2042 IntWrapper* threeB(IntWrapper::create(3));
2043 IntWrapper* fourB(IntWrapper::create(4));
2044 IntWrapper* threeC(IntWrapper::create(3));
2045 IntWrapper* fourC(IntWrapper::create(4));
2046 IntWrapper* fiveC(IntWrapper::create(5)); 2082 IntWrapper* fiveC(IntWrapper::create(5));
2047 IntWrapper* threeD(IntWrapper::create(3));
2048 IntWrapper* fourD(IntWrapper::create(4));
2049 IntWrapper* fiveD(IntWrapper::create(5)); 2083 IntWrapper* fiveD(IntWrapper::create(5));
2084 IntWrapper* fiveE(IntWrapper::create(5));
2085 IntWrapper* fiveF(IntWrapper::create(5));
2050 2086
2051 // Member Collections. 2087 // Member Collections.
2052 memberMember2->add(one, two); 2088 memberMember2->add(one, two);
2053 memberMember2->add(two, three); 2089 memberMember2->add(two, three);
2054 memberMember2->add(three, four); 2090 memberMember2->add(three, four);
2055 memberMember2->add(four, one); 2091 memberMember2->add(four, one);
2056 primitiveMember->add(1, two); 2092 primitiveMember->add(1, two);
2057 primitiveMember->add(2, three); 2093 primitiveMember->add(2, three);
2058 primitiveMember->add(3, four); 2094 primitiveMember->add(3, four);
2059 primitiveMember->add(4, one); 2095 primitiveMember->add(4, one);
2060 memberPrimitive->add(one, 2); 2096 memberPrimitive->add(one, 2);
2061 memberPrimitive->add(two, 3); 2097 memberPrimitive->add(two, 3);
2062 memberPrimitive->add(three, 4); 2098 memberPrimitive->add(three, 4);
2063 memberPrimitive->add(four, 1); 2099 memberPrimitive->add(four, 1);
2064 set2->add(one); 2100 set2->add(one);
2065 set2->add(two); 2101 set2->add(two);
2066 set2->add(three); 2102 set2->add(three);
2067 set2->add(four); 2103 set2->add(four);
2068 set->add(oneB); 2104 set->add(oneB);
2069 vector->append(oneB); 2105 vector->append(oneB);
2106 deque->append(oneB);
2070 vector2->append(threeB); 2107 vector2->append(threeB);
2071 vector2->append(fourB); 2108 vector2->append(fourB);
2109 deque2->append(threeE);
2110 deque2->append(fourE);
2072 vectorWU->append(PairWrappedUnwrapped(&*oneC, 42)); 2111 vectorWU->append(PairWrappedUnwrapped(&*oneC, 42));
2112 dequeWU->append(PairWrappedUnwrapped(&*oneE, 42));
2073 vectorWU2->append(PairWrappedUnwrapped(&*threeC, 43)); 2113 vectorWU2->append(PairWrappedUnwrapped(&*threeC, 43));
2074 vectorWU2->append(PairWrappedUnwrapped(&*fourC, 44)); 2114 vectorWU2->append(PairWrappedUnwrapped(&*fourC, 44));
2075 vectorWU2->append(PairWrappedUnwrapped(&*fiveC, 45)); 2115 vectorWU2->append(PairWrappedUnwrapped(&*fiveC, 45));
2116 dequeWU2->append(PairWrappedUnwrapped(&*threeE, 43));
2117 dequeWU2->append(PairWrappedUnwrapped(&*fourE, 44));
2118 dequeWU2->append(PairWrappedUnwrapped(&*fiveE, 45));
2076 vectorUW->append(PairUnwrappedWrapped(1, &*oneD)); 2119 vectorUW->append(PairUnwrappedWrapped(1, &*oneD));
2077 vectorUW2->append(PairUnwrappedWrapped(103, &*threeD)); 2120 vectorUW2->append(PairUnwrappedWrapped(103, &*threeD));
2078 vectorUW2->append(PairUnwrappedWrapped(104, &*fourD)); 2121 vectorUW2->append(PairUnwrappedWrapped(104, &*fourD));
2079 vectorUW2->append(PairUnwrappedWrapped(105, &*fiveD)); 2122 vectorUW2->append(PairUnwrappedWrapped(105, &*fiveD));
2123 dequeUW->append(PairUnwrappedWrapped(1, &*oneF));
2124 dequeUW2->append(PairUnwrappedWrapped(103, &*threeF));
2125 dequeUW2->append(PairUnwrappedWrapped(104, &*fourF));
2126 dequeUW2->append(PairUnwrappedWrapped(105, &*fiveF));
2127
2128 EXPECT_TRUE(dequeContains(*deque, oneB));
2080 2129
2081 // Collect garbage. This should change nothing since we are keeping 2130 // Collect garbage. This should change nothing since we are keeping
2082 // alive the IntWrapper objects with on-stack pointers. 2131 // alive the IntWrapper objects with on-stack pointers.
2083 Heap::collectGarbage(ThreadState::HeapPointersOnStack); 2132 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
2133
2134 EXPECT_TRUE(dequeContains(*deque, oneB));
2135
2084 EXPECT_EQ(0u, memberMember->size()); 2136 EXPECT_EQ(0u, memberMember->size());
2085 EXPECT_EQ(4u, memberMember2->size()); 2137 EXPECT_EQ(4u, memberMember2->size());
2086 EXPECT_EQ(4u, primitiveMember->size()); 2138 EXPECT_EQ(4u, primitiveMember->size());
2087 EXPECT_EQ(4u, memberPrimitive->size()); 2139 EXPECT_EQ(4u, memberPrimitive->size());
2088 EXPECT_EQ(1u, set->size()); 2140 EXPECT_EQ(1u, set->size());
2089 EXPECT_EQ(4u, set2->size()); 2141 EXPECT_EQ(4u, set2->size());
2090 EXPECT_EQ(1u, vector->size()); 2142 EXPECT_EQ(1u, vector->size());
2091 EXPECT_EQ(2u, vector2->size()); 2143 EXPECT_EQ(2u, vector2->size());
2092 EXPECT_EQ(1u, vectorWU->size()); 2144 EXPECT_EQ(1u, vectorWU->size());
2093 EXPECT_EQ(3u, vectorWU2->size()); 2145 EXPECT_EQ(3u, vectorWU2->size());
2094 EXPECT_EQ(1u, vectorUW->size()); 2146 EXPECT_EQ(1u, vectorUW->size());
2095 EXPECT_EQ(3u, vectorUW2->size()); 2147 EXPECT_EQ(3u, vectorUW2->size());
2148 EXPECT_EQ(1u, deque->size());
2149 EXPECT_EQ(2u, deque2->size());
2150 EXPECT_EQ(1u, dequeWU->size());
2151 EXPECT_EQ(3u, dequeWU2->size());
2152 EXPECT_EQ(1u, dequeUW->size());
2153 EXPECT_EQ(3u, dequeUW2->size());
2096 2154
2097 MemberVector& cvec = container->vector; 2155 MemberVector& cvec = container->vector;
2098 cvec.swap(*vector.get()); 2156 cvec.swap(*vector.get());
2099 vector2->swap(cvec); 2157 vector2->swap(cvec);
2100 vector->swap(cvec); 2158 vector->swap(cvec);
2101 2159
2102 VectorWU& cvecWU = container->vectorWU; 2160 VectorWU& cvecWU = container->vectorWU;
2103 cvecWU.swap(*vectorWU.get()); 2161 cvecWU.swap(*vectorWU.get());
2104 vectorWU2->swap(cvecWU); 2162 vectorWU2->swap(cvecWU);
2105 vectorWU->swap(cvecWU); 2163 vectorWU->swap(cvecWU);
2106 2164
2107 VectorUW& cvecUW = container->vectorUW; 2165 VectorUW& cvecUW = container->vectorUW;
2108 cvecUW.swap(*vectorUW.get()); 2166 cvecUW.swap(*vectorUW.get());
2109 vectorUW2->swap(cvecUW); 2167 vectorUW2->swap(cvecUW);
2110 vectorUW->swap(cvecUW); 2168 vectorUW->swap(cvecUW);
2111 2169
2170 MemberDeque& cDeque = container->deque;
2171 cDeque.swap(*deque.get());
2172 deque2->swap(cDeque);
2173 deque->swap(cDeque);
2174
2175 DequeWU& cDequeWU = container->dequeWU;
2176 cDequeWU.swap(*dequeWU.get());
2177 dequeWU2->swap(cDequeWU);
2178 dequeWU->swap(cDequeWU);
2179
2180 DequeUW& cDequeUW = container->dequeUW;
2181 cDequeUW.swap(*dequeUW.get());
2182 dequeUW2->swap(cDequeUW);
2183 dequeUW->swap(cDequeUW);
2184
2112 // Swap set and set2 in a roundabout way. 2185 // Swap set and set2 in a roundabout way.
2113 MemberSet& cset1 = container->set; 2186 MemberSet& cset1 = container->set;
2114 MemberSet& cset2 = container->set2; 2187 MemberSet& cset2 = container->set2;
2115 set->swap(cset1); 2188 set->swap(cset1);
2116 set2->swap(cset2); 2189 set2->swap(cset2);
2117 set->swap(cset2); 2190 set->swap(cset2);
2118 cset1.swap(cset2); 2191 cset1.swap(cset2);
2119 cset2.swap(set2); 2192 cset2.swap(set2);
2120 2193
2121 // Triple swap. 2194 // Triple swap.
(...skipping 14 matching lines...) Expand all
2136 EXPECT_EQ(2, memberPrimitive->get(one)); 2209 EXPECT_EQ(2, memberPrimitive->get(one));
2137 EXPECT_EQ(3, memberPrimitive->get(two)); 2210 EXPECT_EQ(3, memberPrimitive->get(two));
2138 EXPECT_EQ(4, memberPrimitive->get(three)); 2211 EXPECT_EQ(4, memberPrimitive->get(three));
2139 EXPECT_TRUE(set->contains(one)); 2212 EXPECT_TRUE(set->contains(one));
2140 EXPECT_TRUE(set->contains(two)); 2213 EXPECT_TRUE(set->contains(two));
2141 EXPECT_TRUE(set->contains(three)); 2214 EXPECT_TRUE(set->contains(three));
2142 EXPECT_TRUE(set->contains(four)); 2215 EXPECT_TRUE(set->contains(four));
2143 EXPECT_TRUE(set2->contains(oneB)); 2216 EXPECT_TRUE(set2->contains(oneB));
2144 EXPECT_TRUE(vector->contains(threeB)); 2217 EXPECT_TRUE(vector->contains(threeB));
2145 EXPECT_TRUE(vector->contains(fourB)); 2218 EXPECT_TRUE(vector->contains(fourB));
2219 EXPECT_TRUE(dequeContains(*deque, threeE));
2220 EXPECT_TRUE(dequeContains(*deque, fourE));
2146 EXPECT_TRUE(vector2->contains(oneB)); 2221 EXPECT_TRUE(vector2->contains(oneB));
2147 EXPECT_FALSE(vector2->contains(threeB)); 2222 EXPECT_FALSE(vector2->contains(threeB));
2223 EXPECT_TRUE(dequeContains(*deque2, oneB));
2224 EXPECT_FALSE(dequeContains(*deque2, threeE));
2148 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*threeC, 43))); 2225 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*threeC, 43)));
2149 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*fourC, 44))); 2226 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*fourC, 44)));
2150 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*fiveC, 45))); 2227 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*fiveC, 45)));
2151 EXPECT_TRUE(vectorWU2->contains(PairWrappedUnwrapped(&*oneC, 42))); 2228 EXPECT_TRUE(vectorWU2->contains(PairWrappedUnwrapped(&*oneC, 42)));
2152 EXPECT_FALSE(vectorWU2->contains(PairWrappedUnwrapped(&*threeC, 43)) ); 2229 EXPECT_FALSE(vectorWU2->contains(PairWrappedUnwrapped(&*threeC, 43)) );
2153 EXPECT_TRUE(vectorUW->contains(PairUnwrappedWrapped(103, &*threeD))) ; 2230 EXPECT_TRUE(vectorUW->contains(PairUnwrappedWrapped(103, &*threeD))) ;
2154 EXPECT_TRUE(vectorUW->contains(PairUnwrappedWrapped(104, &*fourD))); 2231 EXPECT_TRUE(vectorUW->contains(PairUnwrappedWrapped(104, &*fourD)));
2155 EXPECT_TRUE(vectorUW->contains(PairUnwrappedWrapped(105, &*fiveD))); 2232 EXPECT_TRUE(vectorUW->contains(PairUnwrappedWrapped(105, &*fiveD)));
2156 EXPECT_TRUE(vectorUW2->contains(PairUnwrappedWrapped(1, &*oneD))); 2233 EXPECT_TRUE(vectorUW2->contains(PairUnwrappedWrapped(1, &*oneD)));
2157 EXPECT_FALSE(vectorUW2->contains(PairUnwrappedWrapped(103, &*threeD) )); 2234 EXPECT_FALSE(vectorUW2->contains(PairUnwrappedWrapped(103, &*threeD) ));
2235 EXPECT_TRUE(dequeContains(*dequeWU, PairWrappedUnwrapped(&*threeE, 4 3)));
2236 EXPECT_TRUE(dequeContains(*dequeWU, PairWrappedUnwrapped(&*fourE, 44 )));
2237 EXPECT_TRUE(dequeContains(*dequeWU, PairWrappedUnwrapped(&*fiveE, 45 )));
2238 EXPECT_TRUE(dequeContains(*dequeWU2, PairWrappedUnwrapped(&*oneE, 42 )));
2239 EXPECT_FALSE(dequeContains(*dequeWU2, PairWrappedUnwrapped(&*threeE, 43)));
2240 EXPECT_TRUE(dequeContains(*dequeUW, PairUnwrappedWrapped(103, &*thre eF)));
2241 EXPECT_TRUE(dequeContains(*dequeUW, PairUnwrappedWrapped(104, &*four F)));
2242 EXPECT_TRUE(dequeContains(*dequeUW, PairUnwrappedWrapped(105, &*five F)));
2243 EXPECT_TRUE(dequeContains(*dequeUW2, PairUnwrappedWrapped(1, &*oneF) ));
2244 EXPECT_FALSE(dequeContains(*dequeUW2, PairUnwrappedWrapped(103, &*th reeF)));
2158 } 2245 }
2159 2246
2160 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 2247 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
2161 2248
2162 EXPECT_EQ(4u, memberMember->size()); 2249 EXPECT_EQ(4u, memberMember->size());
2163 EXPECT_EQ(0u, memberMember2->size()); 2250 EXPECT_EQ(0u, memberMember2->size());
2164 EXPECT_EQ(4u, primitiveMember->size()); 2251 EXPECT_EQ(4u, primitiveMember->size());
2165 EXPECT_EQ(4u, memberPrimitive->size()); 2252 EXPECT_EQ(4u, memberPrimitive->size());
2166 EXPECT_EQ(4u, set->size()); 2253 EXPECT_EQ(4u, set->size());
2167 EXPECT_EQ(1u, set2->size()); 2254 EXPECT_EQ(1u, set2->size());
2168 EXPECT_EQ(2u, vector->size()); 2255 EXPECT_EQ(2u, vector->size());
2169 EXPECT_EQ(1u, vector2->size()); 2256 EXPECT_EQ(1u, vector2->size());
2170 EXPECT_EQ(3u, vectorUW->size()); 2257 EXPECT_EQ(3u, vectorUW->size());
2171 EXPECT_EQ(1u, vector2->size()); 2258 EXPECT_EQ(1u, vector2->size());
2259 EXPECT_EQ(2u, deque->size());
2260 EXPECT_EQ(1u, deque2->size());
2261 EXPECT_EQ(3u, dequeUW->size());
2262 EXPECT_EQ(1u, deque2->size());
2172 2263
2173 EXPECT_TRUE(memberMember->get(one) == two); 2264 EXPECT_TRUE(memberMember->get(one) == two);
2174 EXPECT_TRUE(primitiveMember->get(1) == two); 2265 EXPECT_TRUE(primitiveMember->get(1) == two);
2175 EXPECT_TRUE(primitiveMember->get(4) == one); 2266 EXPECT_TRUE(primitiveMember->get(4) == one);
2176 EXPECT_EQ(2, memberPrimitive->get(one)); 2267 EXPECT_EQ(2, memberPrimitive->get(one));
2177 EXPECT_EQ(3, memberPrimitive->get(two)); 2268 EXPECT_EQ(3, memberPrimitive->get(two));
2178 EXPECT_TRUE(set->contains(one)); 2269 EXPECT_TRUE(set->contains(one));
2179 EXPECT_TRUE(set->contains(two)); 2270 EXPECT_TRUE(set->contains(two));
2180 EXPECT_FALSE(set->contains(oneB)); 2271 EXPECT_FALSE(set->contains(oneB));
2181 EXPECT_TRUE(set2->contains(oneB)); 2272 EXPECT_TRUE(set2->contains(oneB));
2182 EXPECT_EQ(3, vector->at(0)->value()); 2273 EXPECT_EQ(3, vector->at(0)->value());
2183 EXPECT_EQ(4, vector->at(1)->value()); 2274 EXPECT_EQ(4, vector->at(1)->value());
2275 EXPECT_EQ(3, deque->begin()->get()->value());
2184 } 2276 }
2185 2277
2186 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 2278 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
2187 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 2279 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
2188 2280
2189 EXPECT_EQ(4u, memberMember->size()); 2281 EXPECT_EQ(4u, memberMember->size());
2190 EXPECT_EQ(4u, primitiveMember->size()); 2282 EXPECT_EQ(4u, primitiveMember->size());
2191 EXPECT_EQ(4u, memberPrimitive->size()); 2283 EXPECT_EQ(4u, memberPrimitive->size());
2192 EXPECT_EQ(4u, set->size()); 2284 EXPECT_EQ(4u, set->size());
2193 EXPECT_EQ(1u, set2->size()); 2285 EXPECT_EQ(1u, set2->size());
2194 EXPECT_EQ(2u, vector->size()); 2286 EXPECT_EQ(2u, vector->size());
2195 EXPECT_EQ(1u, vector2->size()); 2287 EXPECT_EQ(1u, vector2->size());
2196 EXPECT_EQ(3u, vectorWU->size()); 2288 EXPECT_EQ(3u, vectorWU->size());
2197 EXPECT_EQ(1u, vectorWU2->size()); 2289 EXPECT_EQ(1u, vectorWU2->size());
2198 EXPECT_EQ(3u, vectorUW->size()); 2290 EXPECT_EQ(3u, vectorUW->size());
2199 EXPECT_EQ(1u, vectorUW2->size()); 2291 EXPECT_EQ(1u, vectorUW2->size());
2292 EXPECT_EQ(2u, deque->size());
2293 EXPECT_EQ(1u, deque2->size());
2294 EXPECT_EQ(3u, dequeWU->size());
2295 EXPECT_EQ(1u, dequeWU2->size());
2296 EXPECT_EQ(3u, dequeUW->size());
2297 EXPECT_EQ(1u, dequeUW2->size());
2200 } 2298 }
2201 2299
2202 template<typename T> 2300 template<typename T>
2203 void MapIteratorCheck(T& it, const T& end, int expected) 2301 void MapIteratorCheck(T& it, const T& end, int expected)
2204 { 2302 {
2205 int found = 0; 2303 int found = 0;
2206 while (it != end) { 2304 while (it != end) {
2207 found++; 2305 found++;
2208 int key = it->key->value(); 2306 int key = it->key->value();
2209 int value = it->value->value(); 2307 int value = it->value->value();
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
2906 3004
2907 TEST(HeapTest, PersistentHeapCollectionTypes) 3005 TEST(HeapTest, PersistentHeapCollectionTypes)
2908 { 3006 {
2909 HeapStats initialHeapSize; 3007 HeapStats initialHeapSize;
2910 IntWrapper::s_destructorCalls = 0; 3008 IntWrapper::s_destructorCalls = 0;
2911 3009
2912 typedef HeapVector<Member<IntWrapper> > Vec; 3010 typedef HeapVector<Member<IntWrapper> > Vec;
2913 typedef PersistentHeapVector<Member<IntWrapper> > PVec; 3011 typedef PersistentHeapVector<Member<IntWrapper> > PVec;
2914 typedef PersistentHeapHashSet<Member<IntWrapper> > PSet; 3012 typedef PersistentHeapHashSet<Member<IntWrapper> > PSet;
2915 typedef PersistentHeapHashMap<Member<IntWrapper>, Member<IntWrapper> > PMap; 3013 typedef PersistentHeapHashMap<Member<IntWrapper>, Member<IntWrapper> > PMap;
3014 typedef PersistentHeapDeque<Member<IntWrapper> > PDeque;
2916 3015
2917 clearOutOldGarbage(&initialHeapSize); 3016 clearOutOldGarbage(&initialHeapSize);
2918 { 3017 {
2919 PVec pVec; 3018 PVec pVec;
3019 PDeque pDeque;
2920 PSet pSet; 3020 PSet pSet;
2921 PMap pMap; 3021 PMap pMap;
2922 3022
2923 IntWrapper* one(IntWrapper::create(1)); 3023 IntWrapper* one(IntWrapper::create(1));
2924 IntWrapper* two(IntWrapper::create(2)); 3024 IntWrapper* two(IntWrapper::create(2));
2925 IntWrapper* three(IntWrapper::create(3)); 3025 IntWrapper* three(IntWrapper::create(3));
2926 IntWrapper* four(IntWrapper::create(4)); 3026 IntWrapper* four(IntWrapper::create(4));
2927 IntWrapper* five(IntWrapper::create(5)); 3027 IntWrapper* five(IntWrapper::create(5));
2928 IntWrapper* six(IntWrapper::create(6)); 3028 IntWrapper* six(IntWrapper::create(6));
3029 IntWrapper* seven(IntWrapper::create(7));
2929 3030
2930 pVec.append(one); 3031 pVec.append(one);
2931 pVec.append(two); 3032 pVec.append(two);
2932 3033
3034 pDeque.append(seven);
3035 pDeque.append(two);
3036
2933 Vec* vec = new Vec(); 3037 Vec* vec = new Vec();
2934 vec->swap(pVec); 3038 vec->swap(pVec);
2935 3039
2936 pVec.append(two); 3040 pVec.append(two);
2937 pVec.append(three); 3041 pVec.append(three);
2938 3042
2939 pSet.add(four); 3043 pSet.add(four);
2940 pMap.add(five, six); 3044 pMap.add(five, six);
2941 3045
2942 // Collect |vec| and |one|. 3046 // Collect |vec| and |one|.
2943 vec = 0; 3047 vec = 0;
2944 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3048 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
2945 EXPECT_EQ(1, IntWrapper::s_destructorCalls); 3049 EXPECT_EQ(1, IntWrapper::s_destructorCalls);
2946 3050
2947 EXPECT_EQ(2u, pVec.size()); 3051 EXPECT_EQ(2u, pVec.size());
2948 EXPECT_TRUE(pVec.at(0) == two); 3052 EXPECT_EQ(two, pVec.at(0));
2949 EXPECT_TRUE(pVec.at(1) == three); 3053 EXPECT_EQ(three, pVec.at(1));
3054
3055 EXPECT_EQ(2u, pDeque.size());
3056 EXPECT_EQ(seven, pDeque.first());
3057 EXPECT_EQ(seven, pDeque.takeFirst());
3058 EXPECT_EQ(two, pDeque.first());
3059
3060 EXPECT_EQ(1u, pDeque.size());
2950 3061
2951 EXPECT_EQ(1u, pSet.size()); 3062 EXPECT_EQ(1u, pSet.size());
2952 EXPECT_TRUE(pSet.contains(four)); 3063 EXPECT_TRUE(pSet.contains(four));
2953 3064
2954 EXPECT_EQ(1u, pMap.size()); 3065 EXPECT_EQ(1u, pMap.size());
2955 EXPECT_TRUE(pMap.get(five) == six); 3066 EXPECT_EQ(six, pMap.get(five));
2956 } 3067 }
2957 3068
2958 // Collect previous roots. 3069 // Collect previous roots.
2959 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3070 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
2960 EXPECT_EQ(6, IntWrapper::s_destructorCalls); 3071 EXPECT_EQ(7, IntWrapper::s_destructorCalls);
2961 } 3072 }
2962 3073
2963 TEST(HeapTest, CollectionNesting) 3074 TEST(HeapTest, CollectionNesting)
2964 { 3075 {
2965 HeapStats initialStats; 3076 HeapStats initialStats;
2966 clearOutOldGarbage(&initialStats); 3077 clearOutOldGarbage(&initialStats);
2967 void* key = &IntWrapper::s_destructorCalls; 3078 int* key = &IntWrapper::s_destructorCalls;
2968 IntWrapper::s_destructorCalls = 0; 3079 IntWrapper::s_destructorCalls = 0;
2969 typedef HeapVector<Member<IntWrapper> > IntVector; 3080 typedef HeapVector<Member<IntWrapper> > IntVector;
3081 typedef HeapDeque<Member<IntWrapper> > IntDeque;
2970 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>(); 3082 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>();
3083 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>();
2971 3084
2972 map->add(key, IntVector()); 3085 map->add(key, IntVector());
3086 map2->add(key, IntDeque());
2973 3087
2974 HeapHashMap<void*, IntVector>::iterator it = map->find(key); 3088 HeapHashMap<void*, IntVector>::iterator it = map->find(key);
2975 EXPECT_EQ(0u, map->get(key).size()); 3089 EXPECT_EQ(0u, map->get(key).size());
2976 3090
3091 HeapHashMap<void*, IntDeque>::iterator it2 = map2->find(key);
3092 EXPECT_EQ(0u, map2->get(key).size());
3093
2977 it->value.append(IntWrapper::create(42)); 3094 it->value.append(IntWrapper::create(42));
2978 EXPECT_EQ(1u, map->get(key).size()); 3095 EXPECT_EQ(1u, map->get(key).size());
2979 3096
3097 it2->value.append(IntWrapper::create(42));
3098 EXPECT_EQ(1u, map2->get(key).size());
3099
2980 Persistent<HeapHashMap<void*, IntVector> > keepAlive(map); 3100 Persistent<HeapHashMap<void*, IntVector> > keepAlive(map);
3101 Persistent<HeapHashMap<void*, IntDeque> > keepAlive2(map2);
3102
3103 for (int i = 0; i < 100; i++) {
3104 map->add(key + 1 + i, IntVector());
3105 map2->add(key + 1 + i, IntDeque());
3106 }
3107
2981 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3108 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3109
2982 EXPECT_EQ(1u, map->get(key).size()); 3110 EXPECT_EQ(1u, map->get(key).size());
3111 EXPECT_EQ(1u, map2->get(key).size());
2983 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3112 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
2984 3113
2985 keepAlive = nullptr; 3114 keepAlive = nullptr;
2986 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3115 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
2987 EXPECT_EQ(1, IntWrapper::s_destructorCalls); 3116 EXPECT_EQ(1, IntWrapper::s_destructorCalls);
2988 } 3117 }
2989 3118
2990 TEST(HeapTest, GarbageCollectedMixin) 3119 TEST(HeapTest, GarbageCollectedMixin)
2991 { 3120 {
2992 HeapStats initialHeapStats; 3121 HeapStats initialHeapStats;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3030 EXPECT_EQ(1u, map->get(key).size()); 3159 EXPECT_EQ(1u, map->get(key).size());
3031 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3160 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3032 } 3161 }
3033 3162
3034 TEST(HeapTest, CollectionNesting3) 3163 TEST(HeapTest, CollectionNesting3)
3035 { 3164 {
3036 HeapStats initialStats; 3165 HeapStats initialStats;
3037 clearOutOldGarbage(&initialStats); 3166 clearOutOldGarbage(&initialStats);
3038 IntWrapper::s_destructorCalls = 0; 3167 IntWrapper::s_destructorCalls = 0;
3039 typedef HeapVector<Member<IntWrapper> > IntVector; 3168 typedef HeapVector<Member<IntWrapper> > IntVector;
3169 typedef HeapDeque<Member<IntWrapper> > IntDeque;
3040 HeapVector<IntVector>* vector = new HeapVector<IntVector>(); 3170 HeapVector<IntVector>* vector = new HeapVector<IntVector>();
3171 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>();
3041 3172
3042 vector->append(IntVector()); 3173 vector->append(IntVector());
3174 deque->append(IntDeque());
3043 3175
3044 HeapVector<IntVector>::iterator it = vector->begin(); 3176 HeapVector<IntVector>::iterator it = vector->begin();
3177 HeapDeque<IntDeque>::iterator it2 = deque->begin();
3045 EXPECT_EQ(0u, it->size()); 3178 EXPECT_EQ(0u, it->size());
3179 EXPECT_EQ(0u, it2->size());
3046 3180
3047 it->append(IntWrapper::create(42)); 3181 it->append(IntWrapper::create(42));
3182 it2->append(IntWrapper::create(42));
3048 EXPECT_EQ(1u, it->size()); 3183 EXPECT_EQ(1u, it->size());
3184 EXPECT_EQ(1u, it2->size());
3049 3185
3050 Persistent<HeapVector<IntVector> > keepAlive(vector); 3186 Persistent<HeapVector<IntVector> > keepAlive(vector);
3187 Persistent<HeapDeque<IntDeque> > keepAlive2(deque);
3051 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3188 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3052 EXPECT_EQ(1u, it->size()); 3189 EXPECT_EQ(1u, it->size());
3190 EXPECT_EQ(1u, it2->size());
3053 EXPECT_EQ(0, IntWrapper::s_destructorCalls); 3191 EXPECT_EQ(0, IntWrapper::s_destructorCalls);
3054 } 3192 }
3055 3193
3056 TEST(HeapTest, EmbeddedInVector) 3194 TEST(HeapTest, EmbeddedInVector)
3057 { 3195 {
3058 HeapStats initialStats; 3196 HeapStats initialStats;
3059 clearOutOldGarbage(&initialStats); 3197 clearOutOldGarbage(&initialStats);
3060 SimpleFinalizedObject::s_destructorCalls = 0; 3198 SimpleFinalizedObject::s_destructorCalls = 0;
3061 { 3199 {
3062 PersistentHeapVector<VectorObject, 2> inlineVector; 3200 PersistentHeapVector<VectorObject, 2> inlineVector;
(...skipping 23 matching lines...) Expand all
3086 VectorObjectNoTrace n1, n2; 3224 VectorObjectNoTrace n1, n2;
3087 vectorNoTrace.append(n1); 3225 vectorNoTrace.append(n1);
3088 vectorNoTrace.append(n2); 3226 vectorNoTrace.append(n2);
3089 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3227 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3090 EXPECT_EQ(2, SimpleFinalizedObject::s_destructorCalls); 3228 EXPECT_EQ(2, SimpleFinalizedObject::s_destructorCalls);
3091 } 3229 }
3092 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 3230 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3093 EXPECT_EQ(8, SimpleFinalizedObject::s_destructorCalls); 3231 EXPECT_EQ(8, SimpleFinalizedObject::s_destructorCalls);
3094 } 3232 }
3095 3233
3234 TEST(HeapTest, EmbeddedInDeque)
3235 {
3236 HeapStats initialStats;
3237 clearOutOldGarbage(&initialStats);
3238 SimpleFinalizedObject::s_destructorCalls = 0;
3239 {
3240 PersistentHeapDeque<VectorObject, 2> inlineDeque;
3241 PersistentHeapDeque<VectorObject> outlineDeque;
3242 VectorObject i1, i2;
3243 inlineDeque.append(i1);
3244 inlineDeque.append(i2);
3245
3246 VectorObject o1, o2;
3247 outlineDeque.append(o1);
3248 outlineDeque.append(o2);
3249
3250 PersistentHeapDeque<VectorObjectInheritedTrace> dequeInheritedTrace;
3251 VectorObjectInheritedTrace it1, it2;
3252 dequeInheritedTrace.append(it1);
3253 dequeInheritedTrace.append(it2);
3254
3255 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3256 EXPECT_EQ(0, SimpleFinalizedObject::s_destructorCalls);
3257
3258 // Since VectorObjectNoTrace has no trace method it will
3259 // not be traced and hence be collected when doing GC.
3260 // We trace items in a collection braced on the item's
3261 // having a trace method. This is determined via the
3262 // NeedsTracing trait in wtf/TypeTraits.h.
3263 PersistentHeapDeque<VectorObjectNoTrace> dequeNoTrace;
3264 VectorObjectNoTrace n1, n2;
3265 dequeNoTrace.append(n1);
3266 dequeNoTrace.append(n2);
3267 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3268 EXPECT_EQ(2, SimpleFinalizedObject::s_destructorCalls);
3269 }
3270 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
3271 EXPECT_EQ(8, SimpleFinalizedObject::s_destructorCalls);
3272 }
3273
3096 TEST(HeapTest, RawPtrInHash) 3274 TEST(HeapTest, RawPtrInHash)
3097 { 3275 {
3098 HashSet<RawPtr<int> > set; 3276 HashSet<RawPtr<int> > set;
3099 set.add(new int(42)); 3277 set.add(new int(42));
3100 set.add(new int(42)); 3278 set.add(new int(42));
3101 EXPECT_EQ(2u, set.size()); 3279 EXPECT_EQ(2u, set.size());
3102 for (HashSet<RawPtr<int> >::iterator it = set.begin(); it != set.end(); ++it ) 3280 for (HashSet<RawPtr<int> >::iterator it = set.begin(); it != set.end(); ++it )
3103 EXPECT_EQ(42, **it); 3281 EXPECT_EQ(42, **it);
3104 } 3282 }
3105 3283
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
3225 { 3403 {
3226 HeapHashMap<SimpleClassWithDestructor*, OwnPtr<SimpleClassWithDestructor> > map; 3404 HeapHashMap<SimpleClassWithDestructor*, OwnPtr<SimpleClassWithDestructor> > map;
3227 SimpleClassWithDestructor* hasDestructor = new SimpleClassWithDestructor(); 3405 SimpleClassWithDestructor* hasDestructor = new SimpleClassWithDestructor();
3228 map.add(hasDestructor, adoptPtr(hasDestructor)); 3406 map.add(hasDestructor, adoptPtr(hasDestructor));
3229 SimpleClassWithDestructor::s_wasDestructed = false; 3407 SimpleClassWithDestructor::s_wasDestructed = false;
3230 map.clear(); 3408 map.clear();
3231 ASSERT(SimpleClassWithDestructor::s_wasDestructed); 3409 ASSERT(SimpleClassWithDestructor::s_wasDestructed);
3232 } 3410 }
3233 3411
3234 } // WebCore namespace 3412 } // WebCore namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698