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 1844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |