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 1876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1887 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper> > PairStrongWeak; | 1887 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper> > PairStrongWeak; |
1888 typedef std::pair<WeakMember<IntWrapper>, int> PairWeakUnwrapped; | 1888 typedef std::pair<WeakMember<IntWrapper>, int> PairWeakUnwrapped; |
1889 typedef std::pair<int, WeakMember<IntWrapper> > PairUnwrappedWeak; | 1889 typedef std::pair<int, WeakMember<IntWrapper> > PairUnwrappedWeak; |
1890 | 1890 |
1891 class Container : public GarbageCollected<Container> { | 1891 class Container : public GarbageCollected<Container> { |
1892 public: | 1892 public: |
1893 static Container* create() { return new Container(); } | 1893 static Container* create() { return new Container(); } |
1894 HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map; | 1894 HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map; |
1895 HeapHashSet<Member<IntWrapper> > set; | 1895 HeapHashSet<Member<IntWrapper> > set; |
1896 HeapHashSet<Member<IntWrapper> > set2; | 1896 HeapHashSet<Member<IntWrapper> > set2; |
| 1897 HeapHashCountedSet<Member<IntWrapper> > set3; |
1897 HeapVector<Member<IntWrapper>, 2> vector; | 1898 HeapVector<Member<IntWrapper>, 2> vector; |
1898 HeapVector<PairWrappedUnwrapped, 2> vectorWU; | 1899 HeapVector<PairWrappedUnwrapped, 2> vectorWU; |
1899 HeapVector<PairUnwrappedWrapped, 2> vectorUW; | 1900 HeapVector<PairUnwrappedWrapped, 2> vectorUW; |
1900 HeapDeque<Member<IntWrapper>, 0> deque; | 1901 HeapDeque<Member<IntWrapper>, 0> deque; |
1901 HeapDeque<PairWrappedUnwrapped, 0> dequeWU; | 1902 HeapDeque<PairWrappedUnwrapped, 0> dequeWU; |
1902 HeapDeque<PairUnwrappedWrapped, 0> dequeUW; | 1903 HeapDeque<PairUnwrappedWrapped, 0> dequeUW; |
1903 void trace(Visitor* visitor) | 1904 void trace(Visitor* visitor) |
1904 { | 1905 { |
1905 visitor->trace(map); | 1906 visitor->trace(map); |
1906 visitor->trace(set); | 1907 visitor->trace(set); |
1907 visitor->trace(set2); | 1908 visitor->trace(set2); |
| 1909 visitor->trace(set3); |
1908 visitor->trace(vector); | 1910 visitor->trace(vector); |
1909 visitor->trace(vectorWU); | 1911 visitor->trace(vectorWU); |
1910 visitor->trace(vectorUW); | 1912 visitor->trace(vectorUW); |
1911 visitor->trace(deque); | 1913 visitor->trace(deque); |
1912 visitor->trace(dequeWU); | 1914 visitor->trace(dequeWU); |
1913 visitor->trace(dequeUW); | 1915 visitor->trace(dequeUW); |
1914 } | 1916 } |
1915 }; | 1917 }; |
1916 | 1918 |
1917 struct ShouldBeTraced { | 1919 struct ShouldBeTraced { |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 TEST(HeapTest, HeapCollectionTypes) | 2117 TEST(HeapTest, HeapCollectionTypes) |
2116 { | 2118 { |
2117 HeapStats initialHeapSize; | 2119 HeapStats initialHeapSize; |
2118 IntWrapper::s_destructorCalls = 0; | 2120 IntWrapper::s_destructorCalls = 0; |
2119 | 2121 |
2120 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember; | 2122 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember; |
2121 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive; | 2123 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive; |
2122 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember; | 2124 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember; |
2123 | 2125 |
2124 typedef HeapHashSet<Member<IntWrapper> > MemberSet; | 2126 typedef HeapHashSet<Member<IntWrapper> > MemberSet; |
| 2127 typedef HeapHashCountedSet<Member<IntWrapper> > MemberCountedSet; |
2125 | 2128 |
2126 typedef HeapVector<Member<IntWrapper>, 2> MemberVector; | 2129 typedef HeapVector<Member<IntWrapper>, 2> MemberVector; |
2127 typedef HeapDeque<Member<IntWrapper>, 0> MemberDeque; | 2130 typedef HeapDeque<Member<IntWrapper>, 0> MemberDeque; |
2128 | 2131 |
2129 typedef HeapVector<PairWrappedUnwrapped, 2> VectorWU; | 2132 typedef HeapVector<PairWrappedUnwrapped, 2> VectorWU; |
2130 typedef HeapVector<PairUnwrappedWrapped, 2> VectorUW; | 2133 typedef HeapVector<PairUnwrappedWrapped, 2> VectorUW; |
2131 typedef HeapDeque<PairWrappedUnwrapped, 0> DequeWU; | 2134 typedef HeapDeque<PairWrappedUnwrapped, 0> DequeWU; |
2132 typedef HeapDeque<PairUnwrappedWrapped, 0> DequeUW; | 2135 typedef HeapDeque<PairUnwrappedWrapped, 0> DequeUW; |
2133 | 2136 |
2134 Persistent<MemberMember> memberMember = new MemberMember(); | 2137 Persistent<MemberMember> memberMember = new MemberMember(); |
2135 Persistent<MemberMember> memberMember2 = new MemberMember(); | 2138 Persistent<MemberMember> memberMember2 = new MemberMember(); |
2136 Persistent<MemberMember> memberMember3 = new MemberMember(); | 2139 Persistent<MemberMember> memberMember3 = new MemberMember(); |
2137 Persistent<MemberPrimitive> memberPrimitive = new MemberPrimitive(); | 2140 Persistent<MemberPrimitive> memberPrimitive = new MemberPrimitive(); |
2138 Persistent<PrimitiveMember> primitiveMember = new PrimitiveMember(); | 2141 Persistent<PrimitiveMember> primitiveMember = new PrimitiveMember(); |
2139 Persistent<MemberSet> set = new MemberSet(); | 2142 Persistent<MemberSet> set = new MemberSet(); |
2140 Persistent<MemberSet> set2 = new MemberSet(); | 2143 Persistent<MemberSet> set2 = new MemberSet(); |
| 2144 Persistent<MemberCountedSet> set3 = new MemberCountedSet(); |
2141 Persistent<MemberVector> vector = new MemberVector(); | 2145 Persistent<MemberVector> vector = new MemberVector(); |
2142 Persistent<MemberVector> vector2 = new MemberVector(); | 2146 Persistent<MemberVector> vector2 = new MemberVector(); |
2143 Persistent<VectorWU> vectorWU = new VectorWU(); | 2147 Persistent<VectorWU> vectorWU = new VectorWU(); |
2144 Persistent<VectorWU> vectorWU2 = new VectorWU(); | 2148 Persistent<VectorWU> vectorWU2 = new VectorWU(); |
2145 Persistent<VectorUW> vectorUW = new VectorUW(); | 2149 Persistent<VectorUW> vectorUW = new VectorUW(); |
2146 Persistent<VectorUW> vectorUW2 = new VectorUW(); | 2150 Persistent<VectorUW> vectorUW2 = new VectorUW(); |
2147 Persistent<MemberDeque> deque = new MemberDeque(); | 2151 Persistent<MemberDeque> deque = new MemberDeque(); |
2148 Persistent<MemberDeque> deque2 = new MemberDeque(); | 2152 Persistent<MemberDeque> deque2 = new MemberDeque(); |
2149 Persistent<DequeWU> dequeWU = new DequeWU(); | 2153 Persistent<DequeWU> dequeWU = new DequeWU(); |
2150 Persistent<DequeWU> dequeWU2 = new DequeWU(); | 2154 Persistent<DequeWU> dequeWU2 = new DequeWU(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2191 primitiveMember->add(4, one); | 2195 primitiveMember->add(4, one); |
2192 memberPrimitive->add(one, 2); | 2196 memberPrimitive->add(one, 2); |
2193 memberPrimitive->add(two, 3); | 2197 memberPrimitive->add(two, 3); |
2194 memberPrimitive->add(three, 4); | 2198 memberPrimitive->add(three, 4); |
2195 memberPrimitive->add(four, 1); | 2199 memberPrimitive->add(four, 1); |
2196 set2->add(one); | 2200 set2->add(one); |
2197 set2->add(two); | 2201 set2->add(two); |
2198 set2->add(three); | 2202 set2->add(three); |
2199 set2->add(four); | 2203 set2->add(four); |
2200 set->add(oneB); | 2204 set->add(oneB); |
| 2205 set3->add(oneB); |
| 2206 set3->add(oneB); |
2201 vector->append(oneB); | 2207 vector->append(oneB); |
2202 deque->append(oneB); | 2208 deque->append(oneB); |
2203 vector2->append(threeB); | 2209 vector2->append(threeB); |
2204 vector2->append(fourB); | 2210 vector2->append(fourB); |
2205 deque2->append(threeE); | 2211 deque2->append(threeE); |
2206 deque2->append(fourE); | 2212 deque2->append(fourE); |
2207 vectorWU->append(PairWrappedUnwrapped(&*oneC, 42)); | 2213 vectorWU->append(PairWrappedUnwrapped(&*oneC, 42)); |
2208 dequeWU->append(PairWrappedUnwrapped(&*oneE, 42)); | 2214 dequeWU->append(PairWrappedUnwrapped(&*oneE, 42)); |
2209 vectorWU2->append(PairWrappedUnwrapped(&*threeC, 43)); | 2215 vectorWU2->append(PairWrappedUnwrapped(&*threeC, 43)); |
2210 vectorWU2->append(PairWrappedUnwrapped(&*fourC, 44)); | 2216 vectorWU2->append(PairWrappedUnwrapped(&*fourC, 44)); |
(...skipping 17 matching lines...) Expand all Loading... |
2228 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 2234 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
2229 | 2235 |
2230 EXPECT_TRUE(dequeContains(*deque, oneB)); | 2236 EXPECT_TRUE(dequeContains(*deque, oneB)); |
2231 | 2237 |
2232 EXPECT_EQ(0u, memberMember->size()); | 2238 EXPECT_EQ(0u, memberMember->size()); |
2233 EXPECT_EQ(4u, memberMember2->size()); | 2239 EXPECT_EQ(4u, memberMember2->size()); |
2234 EXPECT_EQ(4u, primitiveMember->size()); | 2240 EXPECT_EQ(4u, primitiveMember->size()); |
2235 EXPECT_EQ(4u, memberPrimitive->size()); | 2241 EXPECT_EQ(4u, memberPrimitive->size()); |
2236 EXPECT_EQ(1u, set->size()); | 2242 EXPECT_EQ(1u, set->size()); |
2237 EXPECT_EQ(4u, set2->size()); | 2243 EXPECT_EQ(4u, set2->size()); |
| 2244 EXPECT_EQ(1u, set3->size()); |
2238 EXPECT_EQ(1u, vector->size()); | 2245 EXPECT_EQ(1u, vector->size()); |
2239 EXPECT_EQ(2u, vector2->size()); | 2246 EXPECT_EQ(2u, vector2->size()); |
2240 EXPECT_EQ(1u, vectorWU->size()); | 2247 EXPECT_EQ(1u, vectorWU->size()); |
2241 EXPECT_EQ(3u, vectorWU2->size()); | 2248 EXPECT_EQ(3u, vectorWU2->size()); |
2242 EXPECT_EQ(1u, vectorUW->size()); | 2249 EXPECT_EQ(1u, vectorUW->size()); |
2243 EXPECT_EQ(3u, vectorUW2->size()); | 2250 EXPECT_EQ(3u, vectorUW2->size()); |
2244 EXPECT_EQ(1u, deque->size()); | 2251 EXPECT_EQ(1u, deque->size()); |
2245 EXPECT_EQ(2u, deque2->size()); | 2252 EXPECT_EQ(2u, deque2->size()); |
2246 EXPECT_EQ(1u, dequeWU->size()); | 2253 EXPECT_EQ(1u, dequeWU->size()); |
2247 EXPECT_EQ(3u, dequeWU2->size()); | 2254 EXPECT_EQ(3u, dequeWU2->size()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2280 | 2287 |
2281 // Swap set and set2 in a roundabout way. | 2288 // Swap set and set2 in a roundabout way. |
2282 MemberSet& cset1 = container->set; | 2289 MemberSet& cset1 = container->set; |
2283 MemberSet& cset2 = container->set2; | 2290 MemberSet& cset2 = container->set2; |
2284 set->swap(cset1); | 2291 set->swap(cset1); |
2285 set2->swap(cset2); | 2292 set2->swap(cset2); |
2286 set->swap(cset2); | 2293 set->swap(cset2); |
2287 cset1.swap(cset2); | 2294 cset1.swap(cset2); |
2288 cset2.swap(set2); | 2295 cset2.swap(set2); |
2289 | 2296 |
| 2297 MemberCountedSet& cCountedSet = container->set3; |
| 2298 set3->swap(cCountedSet); |
| 2299 EXPECT_EQ(0u, set3->size()); |
| 2300 set3->swap(cCountedSet); |
| 2301 |
2290 // Triple swap. | 2302 // Triple swap. |
2291 container->map.swap(memberMember2); | 2303 container->map.swap(memberMember2); |
2292 MemberMember& containedMap = container->map; | 2304 MemberMember& containedMap = container->map; |
2293 memberMember3->swap(containedMap); | 2305 memberMember3->swap(containedMap); |
2294 memberMember3->swap(memberMember); | 2306 memberMember3->swap(memberMember); |
2295 | 2307 |
2296 EXPECT_TRUE(memberMember->get(one) == two); | 2308 EXPECT_TRUE(memberMember->get(one) == two); |
2297 EXPECT_TRUE(memberMember->get(two) == three); | 2309 EXPECT_TRUE(memberMember->get(two) == three); |
2298 EXPECT_TRUE(memberMember->get(three) == four); | 2310 EXPECT_TRUE(memberMember->get(three) == four); |
2299 EXPECT_TRUE(memberMember->get(four) == one); | 2311 EXPECT_TRUE(memberMember->get(four) == one); |
2300 EXPECT_TRUE(primitiveMember->get(1) == two); | 2312 EXPECT_TRUE(primitiveMember->get(1) == two); |
2301 EXPECT_TRUE(primitiveMember->get(2) == three); | 2313 EXPECT_TRUE(primitiveMember->get(2) == three); |
2302 EXPECT_TRUE(primitiveMember->get(3) == four); | 2314 EXPECT_TRUE(primitiveMember->get(3) == four); |
2303 EXPECT_TRUE(primitiveMember->get(4) == one); | 2315 EXPECT_TRUE(primitiveMember->get(4) == one); |
2304 EXPECT_EQ(1, memberPrimitive->get(four)); | 2316 EXPECT_EQ(1, memberPrimitive->get(four)); |
2305 EXPECT_EQ(2, memberPrimitive->get(one)); | 2317 EXPECT_EQ(2, memberPrimitive->get(one)); |
2306 EXPECT_EQ(3, memberPrimitive->get(two)); | 2318 EXPECT_EQ(3, memberPrimitive->get(two)); |
2307 EXPECT_EQ(4, memberPrimitive->get(three)); | 2319 EXPECT_EQ(4, memberPrimitive->get(three)); |
2308 EXPECT_TRUE(set->contains(one)); | 2320 EXPECT_TRUE(set->contains(one)); |
2309 EXPECT_TRUE(set->contains(two)); | 2321 EXPECT_TRUE(set->contains(two)); |
2310 EXPECT_TRUE(set->contains(three)); | 2322 EXPECT_TRUE(set->contains(three)); |
2311 EXPECT_TRUE(set->contains(four)); | 2323 EXPECT_TRUE(set->contains(four)); |
2312 EXPECT_TRUE(set2->contains(oneB)); | 2324 EXPECT_TRUE(set2->contains(oneB)); |
| 2325 EXPECT_TRUE(set3->contains(oneB)); |
2313 EXPECT_TRUE(vector->contains(threeB)); | 2326 EXPECT_TRUE(vector->contains(threeB)); |
2314 EXPECT_TRUE(vector->contains(fourB)); | 2327 EXPECT_TRUE(vector->contains(fourB)); |
2315 EXPECT_TRUE(dequeContains(*deque, threeE)); | 2328 EXPECT_TRUE(dequeContains(*deque, threeE)); |
2316 EXPECT_TRUE(dequeContains(*deque, fourE)); | 2329 EXPECT_TRUE(dequeContains(*deque, fourE)); |
2317 EXPECT_TRUE(vector2->contains(oneB)); | 2330 EXPECT_TRUE(vector2->contains(oneB)); |
2318 EXPECT_FALSE(vector2->contains(threeB)); | 2331 EXPECT_FALSE(vector2->contains(threeB)); |
2319 EXPECT_TRUE(dequeContains(*deque2, oneB)); | 2332 EXPECT_TRUE(dequeContains(*deque2, oneB)); |
2320 EXPECT_FALSE(dequeContains(*deque2, threeE)); | 2333 EXPECT_FALSE(dequeContains(*deque2, threeE)); |
2321 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*threeC, 43))); | 2334 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*threeC, 43))); |
2322 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*fourC, 44))); | 2335 EXPECT_TRUE(vectorWU->contains(PairWrappedUnwrapped(&*fourC, 44))); |
(...skipping 18 matching lines...) Expand all Loading... |
2341 } | 2354 } |
2342 | 2355 |
2343 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 2356 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
2344 | 2357 |
2345 EXPECT_EQ(4u, memberMember->size()); | 2358 EXPECT_EQ(4u, memberMember->size()); |
2346 EXPECT_EQ(0u, memberMember2->size()); | 2359 EXPECT_EQ(0u, memberMember2->size()); |
2347 EXPECT_EQ(4u, primitiveMember->size()); | 2360 EXPECT_EQ(4u, primitiveMember->size()); |
2348 EXPECT_EQ(4u, memberPrimitive->size()); | 2361 EXPECT_EQ(4u, memberPrimitive->size()); |
2349 EXPECT_EQ(4u, set->size()); | 2362 EXPECT_EQ(4u, set->size()); |
2350 EXPECT_EQ(1u, set2->size()); | 2363 EXPECT_EQ(1u, set2->size()); |
| 2364 EXPECT_EQ(1u, set3->size()); |
2351 EXPECT_EQ(2u, vector->size()); | 2365 EXPECT_EQ(2u, vector->size()); |
2352 EXPECT_EQ(1u, vector2->size()); | 2366 EXPECT_EQ(1u, vector2->size()); |
2353 EXPECT_EQ(3u, vectorUW->size()); | 2367 EXPECT_EQ(3u, vectorUW->size()); |
2354 EXPECT_EQ(1u, vector2->size()); | 2368 EXPECT_EQ(1u, vector2->size()); |
2355 EXPECT_EQ(2u, deque->size()); | 2369 EXPECT_EQ(2u, deque->size()); |
2356 EXPECT_EQ(1u, deque2->size()); | 2370 EXPECT_EQ(1u, deque2->size()); |
2357 EXPECT_EQ(3u, dequeUW->size()); | 2371 EXPECT_EQ(3u, dequeUW->size()); |
2358 EXPECT_EQ(1u, deque2->size()); | 2372 EXPECT_EQ(1u, deque2->size()); |
2359 | 2373 |
2360 EXPECT_TRUE(memberMember->get(one) == two); | 2374 EXPECT_TRUE(memberMember->get(one) == two); |
2361 EXPECT_TRUE(primitiveMember->get(1) == two); | 2375 EXPECT_TRUE(primitiveMember->get(1) == two); |
2362 EXPECT_TRUE(primitiveMember->get(4) == one); | 2376 EXPECT_TRUE(primitiveMember->get(4) == one); |
2363 EXPECT_EQ(2, memberPrimitive->get(one)); | 2377 EXPECT_EQ(2, memberPrimitive->get(one)); |
2364 EXPECT_EQ(3, memberPrimitive->get(two)); | 2378 EXPECT_EQ(3, memberPrimitive->get(two)); |
2365 EXPECT_TRUE(set->contains(one)); | 2379 EXPECT_TRUE(set->contains(one)); |
2366 EXPECT_TRUE(set->contains(two)); | 2380 EXPECT_TRUE(set->contains(two)); |
2367 EXPECT_FALSE(set->contains(oneB)); | 2381 EXPECT_FALSE(set->contains(oneB)); |
2368 EXPECT_TRUE(set2->contains(oneB)); | 2382 EXPECT_TRUE(set2->contains(oneB)); |
| 2383 EXPECT_TRUE(set3->contains(oneB)); |
| 2384 EXPECT_EQ(2u, set3->find(oneB)->value); |
2369 EXPECT_EQ(3, vector->at(0)->value()); | 2385 EXPECT_EQ(3, vector->at(0)->value()); |
2370 EXPECT_EQ(4, vector->at(1)->value()); | 2386 EXPECT_EQ(4, vector->at(1)->value()); |
2371 EXPECT_EQ(3, deque->begin()->get()->value()); | 2387 EXPECT_EQ(3, deque->begin()->get()->value()); |
2372 } | 2388 } |
2373 | 2389 |
2374 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 2390 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
2375 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 2391 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
2376 | 2392 |
2377 EXPECT_EQ(4u, memberMember->size()); | 2393 EXPECT_EQ(4u, memberMember->size()); |
2378 EXPECT_EQ(4u, primitiveMember->size()); | 2394 EXPECT_EQ(4u, primitiveMember->size()); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2426 HeapStats initialHeapStats; | 2442 HeapStats initialHeapStats; |
2427 clearOutOldGarbage(&initialHeapStats); | 2443 clearOutOldGarbage(&initialHeapStats); |
2428 IntWrapper::s_destructorCalls = 0; | 2444 IntWrapper::s_destructorCalls = 0; |
2429 | 2445 |
2430 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 2446 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; |
2431 | 2447 |
2432 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; | 2448 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; |
2433 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; | 2449 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; |
2434 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea
k; | 2450 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea
k; |
2435 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; | 2451 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; |
| 2452 typedef HeapHashCountedSet<WeakMember<IntWrapper> > WeakCountedSet; |
2436 | 2453 |
2437 Persistent<WeakStrong> weakStrong = new WeakStrong(); | 2454 Persistent<WeakStrong> weakStrong = new WeakStrong(); |
2438 Persistent<StrongWeak> strongWeak = new StrongWeak(); | 2455 Persistent<StrongWeak> strongWeak = new StrongWeak(); |
2439 Persistent<WeakWeak> weakWeak = new WeakWeak(); | 2456 Persistent<WeakWeak> weakWeak = new WeakWeak(); |
2440 Persistent<WeakSet> weakSet = new WeakSet(); | 2457 Persistent<WeakSet> weakSet = new WeakSet(); |
| 2458 Persistent<WeakCountedSet> weakCountedSet = new WeakCountedSet(); |
2441 | 2459 |
2442 Persistent<IntWrapper> two = IntWrapper::create(2); | 2460 Persistent<IntWrapper> two = IntWrapper::create(2); |
2443 | 2461 |
2444 keepNumbersAlive.append(IntWrapper::create(103)); | 2462 keepNumbersAlive.append(IntWrapper::create(103)); |
2445 keepNumbersAlive.append(IntWrapper::create(10)); | 2463 keepNumbersAlive.append(IntWrapper::create(10)); |
2446 | 2464 |
2447 { | 2465 { |
2448 weakStrong->add(IntWrapper::create(1), two); | 2466 weakStrong->add(IntWrapper::create(1), two); |
2449 strongWeak->add(two, IntWrapper::create(1)); | 2467 strongWeak->add(two, IntWrapper::create(1)); |
2450 weakWeak->add(two, IntWrapper::create(42)); | 2468 weakWeak->add(two, IntWrapper::create(42)); |
2451 weakWeak->add(IntWrapper::create(42), two); | 2469 weakWeak->add(IntWrapper::create(42), two); |
2452 weakSet->add(IntWrapper::create(0)); | 2470 weakSet->add(IntWrapper::create(0)); |
2453 weakSet->add(two); | 2471 weakSet->add(two); |
2454 weakSet->add(keepNumbersAlive[0]); | 2472 weakSet->add(keepNumbersAlive[0]); |
2455 weakSet->add(keepNumbersAlive[1]); | 2473 weakSet->add(keepNumbersAlive[1]); |
| 2474 weakCountedSet->add(IntWrapper::create(0)); |
| 2475 weakCountedSet->add(two); |
| 2476 weakCountedSet->add(two); |
| 2477 weakCountedSet->add(two); |
| 2478 weakCountedSet->add(keepNumbersAlive[0]); |
| 2479 weakCountedSet->add(keepNumbersAlive[1]); |
2456 EXPECT_EQ(1u, weakStrong->size()); | 2480 EXPECT_EQ(1u, weakStrong->size()); |
2457 EXPECT_EQ(1u, strongWeak->size()); | 2481 EXPECT_EQ(1u, strongWeak->size()); |
2458 EXPECT_EQ(2u, weakWeak->size()); | 2482 EXPECT_EQ(2u, weakWeak->size()); |
2459 EXPECT_EQ(4u, weakSet->size()); | 2483 EXPECT_EQ(4u, weakSet->size()); |
| 2484 EXPECT_EQ(4u, weakCountedSet->size()); |
| 2485 EXPECT_EQ(3u, weakCountedSet->find(two)->value); |
| 2486 weakCountedSet->remove(two); |
| 2487 EXPECT_EQ(2u, weakCountedSet->find(two)->value); |
2460 } | 2488 } |
2461 | 2489 |
2462 keepNumbersAlive[0] = nullptr; | 2490 keepNumbersAlive[0] = nullptr; |
2463 | 2491 |
2464 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 2492 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
2465 | 2493 |
2466 EXPECT_EQ(0u, weakStrong->size()); | 2494 EXPECT_EQ(0u, weakStrong->size()); |
2467 EXPECT_EQ(0u, strongWeak->size()); | 2495 EXPECT_EQ(0u, strongWeak->size()); |
2468 EXPECT_EQ(0u, weakWeak->size()); | 2496 EXPECT_EQ(0u, weakWeak->size()); |
2469 EXPECT_EQ(2u, weakSet->size()); | 2497 EXPECT_EQ(2u, weakSet->size()); |
| 2498 EXPECT_EQ(2u, weakCountedSet->size()); |
2470 } | 2499 } |
2471 | 2500 |
2472 template<typename Set> | 2501 template<typename Set> |
2473 void linkedSetHelper(bool strong) | 2502 void linkedSetHelper(bool strong) |
2474 { | 2503 { |
2475 HeapStats initialHeapStats; | 2504 HeapStats initialHeapStats; |
2476 clearOutOldGarbage(&initialHeapStats); | 2505 clearOutOldGarbage(&initialHeapStats); |
2477 IntWrapper::s_destructorCalls = 0; | 2506 IntWrapper::s_destructorCalls = 0; |
2478 | 2507 |
2479 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 2508 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2711 TEST(HeapTest, HeapMapDestructor) | 2740 TEST(HeapTest, HeapMapDestructor) |
2712 { | 2741 { |
2713 heapMapDestructorHelper(true); | 2742 heapMapDestructorHelper(true); |
2714 heapMapDestructorHelper(false); | 2743 heapMapDestructorHelper(false); |
2715 } | 2744 } |
2716 | 2745 |
2717 typedef HeapHashSet<PairWeakStrong> WeakStrongSet; | 2746 typedef HeapHashSet<PairWeakStrong> WeakStrongSet; |
2718 typedef HeapHashSet<PairWeakUnwrapped> WeakUnwrappedSet; | 2747 typedef HeapHashSet<PairWeakUnwrapped> WeakUnwrappedSet; |
2719 typedef HeapHashSet<PairStrongWeak> StrongWeakSet; | 2748 typedef HeapHashSet<PairStrongWeak> StrongWeakSet; |
2720 typedef HeapHashSet<PairUnwrappedWeak> UnwrappedWeakSet; | 2749 typedef HeapHashSet<PairUnwrappedWeak> UnwrappedWeakSet; |
| 2750 typedef HeapLinkedHashSet<PairWeakStrong> WeakStrongLinkedSet; |
| 2751 typedef HeapLinkedHashSet<PairWeakUnwrapped> WeakUnwrappedLinkedSet; |
| 2752 typedef HeapLinkedHashSet<PairStrongWeak> StrongWeakLinkedSet; |
| 2753 typedef HeapLinkedHashSet<PairUnwrappedWeak> UnwrappedWeakLinkedSet; |
| 2754 typedef HeapHashCountedSet<PairWeakStrong> WeakStrongCountedSet; |
| 2755 typedef HeapHashCountedSet<PairWeakUnwrapped> WeakUnwrappedCountedSet; |
| 2756 typedef HeapHashCountedSet<PairStrongWeak> StrongWeakCountedSet; |
| 2757 typedef HeapHashCountedSet<PairUnwrappedWeak> UnwrappedWeakCountedSet; |
2721 | 2758 |
| 2759 template<typename T> |
| 2760 T& iteratorExtractor(WTF::KeyValuePair<T, unsigned>& pair) |
| 2761 { |
| 2762 return pair.key; |
| 2763 } |
| 2764 |
| 2765 template<typename T> |
| 2766 T& iteratorExtractor(T& notAPair) |
| 2767 { |
| 2768 return notAPair; |
| 2769 } |
| 2770 |
| 2771 template<typename WSSet, typename SWSet, typename WUSet, typename UWSet> |
2722 void checkPairSets( | 2772 void checkPairSets( |
2723 Persistent<WeakStrongSet>& weakStrong, | 2773 Persistent<WSSet>& weakStrong, |
2724 Persistent<StrongWeakSet>& strongWeak, | 2774 Persistent<SWSet>& strongWeak, |
2725 Persistent<WeakUnwrappedSet>& weakUnwrapped, | 2775 Persistent<WUSet>& weakUnwrapped, |
2726 Persistent<UnwrappedWeakSet>& unwrappedWeak, | 2776 Persistent<UWSet>& unwrappedWeak, |
2727 bool ones, | 2777 bool ones, |
2728 Persistent<IntWrapper>& two) | 2778 Persistent<IntWrapper>& two) |
2729 { | 2779 { |
2730 WeakStrongSet::iterator itWS = weakStrong->begin(); | 2780 typename WSSet::iterator itWS = weakStrong->begin(); |
2731 StrongWeakSet::iterator itSW = strongWeak->begin(); | 2781 typename SWSet::iterator itSW = strongWeak->begin(); |
2732 WeakUnwrappedSet::iterator itWU = weakUnwrapped->begin(); | 2782 typename WUSet::iterator itWU = weakUnwrapped->begin(); |
2733 UnwrappedWeakSet::iterator itUW = unwrappedWeak->begin(); | 2783 typename UWSet::iterator itUW = unwrappedWeak->begin(); |
2734 | 2784 |
2735 EXPECT_EQ(2u, weakStrong->size()); | 2785 EXPECT_EQ(2u, weakStrong->size()); |
2736 EXPECT_EQ(2u, strongWeak->size()); | 2786 EXPECT_EQ(2u, strongWeak->size()); |
2737 EXPECT_EQ(2u, weakUnwrapped->size()); | 2787 EXPECT_EQ(2u, weakUnwrapped->size()); |
2738 EXPECT_EQ(2u, unwrappedWeak->size()); | 2788 EXPECT_EQ(2u, unwrappedWeak->size()); |
2739 | 2789 |
2740 PairWeakStrong p = *itWS; | 2790 PairWeakStrong p = iteratorExtractor(*itWS); |
2741 PairStrongWeak p2 = *itSW; | 2791 PairStrongWeak p2 = iteratorExtractor(*itSW); |
2742 PairWeakUnwrapped p3 = *itWU; | 2792 PairWeakUnwrapped p3 = iteratorExtractor(*itWU); |
2743 PairUnwrappedWeak p4 = *itUW; | 2793 PairUnwrappedWeak p4 = iteratorExtractor(*itUW); |
2744 if (p.first == two && p.second == two) | 2794 if (p.first == two && p.second == two) |
2745 ++itWS; | 2795 ++itWS; |
2746 if (p2.first == two && p2.second == two) | 2796 if (p2.first == two && p2.second == two) |
2747 ++itSW; | 2797 ++itSW; |
2748 if (p3.first == two && p3.second == 2) | 2798 if (p3.first == two && p3.second == 2) |
2749 ++itWU; | 2799 ++itWU; |
2750 if (p4.first == 2 && p4.second == two) | 2800 if (p4.first == 2 && p4.second == two) |
2751 ++itUW; | 2801 ++itUW; |
2752 p = *itWS; | 2802 p = iteratorExtractor(*itWS); |
2753 p2 = *itSW; | 2803 p2 = iteratorExtractor(*itSW); |
2754 p3 = *itWU; | 2804 p3 = iteratorExtractor(*itWU); |
2755 p4 = *itUW; | 2805 p4 = iteratorExtractor(*itUW); |
2756 IntWrapper* nullWrapper = 0; | 2806 IntWrapper* nullWrapper = 0; |
2757 if (ones) { | 2807 if (ones) { |
2758 EXPECT_EQ(p.first->value(), 1); | 2808 EXPECT_EQ(p.first->value(), 1); |
2759 EXPECT_EQ(p2.second->value(), 1); | 2809 EXPECT_EQ(p2.second->value(), 1); |
2760 EXPECT_EQ(p3.first->value(), 1); | 2810 EXPECT_EQ(p3.first->value(), 1); |
2761 EXPECT_EQ(p4.second->value(), 1); | 2811 EXPECT_EQ(p4.second->value(), 1); |
2762 } else { | 2812 } else { |
2763 EXPECT_EQ(p.first, nullWrapper); | 2813 EXPECT_EQ(p.first, nullWrapper); |
2764 EXPECT_EQ(p2.second, nullWrapper); | 2814 EXPECT_EQ(p2.second, nullWrapper); |
2765 EXPECT_EQ(p3.first, nullWrapper); | 2815 EXPECT_EQ(p3.first, nullWrapper); |
2766 EXPECT_EQ(p4.second, nullWrapper); | 2816 EXPECT_EQ(p4.second, nullWrapper); |
2767 } | 2817 } |
2768 | 2818 |
2769 EXPECT_EQ(p.second->value(), 2); | 2819 EXPECT_EQ(p.second->value(), 2); |
2770 EXPECT_EQ(p2.first->value(), 2); | 2820 EXPECT_EQ(p2.first->value(), 2); |
2771 EXPECT_EQ(p3.second, 2); | 2821 EXPECT_EQ(p3.second, 2); |
2772 EXPECT_EQ(p4.first, 2); | 2822 EXPECT_EQ(p4.first, 2); |
2773 | 2823 |
2774 EXPECT_TRUE(weakStrong->contains(PairWeakStrong(&*two, &*two))); | 2824 EXPECT_TRUE(weakStrong->contains(PairWeakStrong(&*two, &*two))); |
2775 EXPECT_TRUE(strongWeak->contains(PairStrongWeak(&*two, &*two))); | 2825 EXPECT_TRUE(strongWeak->contains(PairStrongWeak(&*two, &*two))); |
2776 EXPECT_TRUE(weakUnwrapped->contains(PairWeakUnwrapped(&*two, 2))); | 2826 EXPECT_TRUE(weakUnwrapped->contains(PairWeakUnwrapped(&*two, 2))); |
2777 EXPECT_TRUE(unwrappedWeak->contains(PairUnwrappedWeak(2, &*two))); | 2827 EXPECT_TRUE(unwrappedWeak->contains(PairUnwrappedWeak(2, &*two))); |
2778 } | 2828 } |
2779 | 2829 |
2780 TEST(HeapTest, HeapWeakPairs) | 2830 template<typename WSSet, typename SWSet, typename WUSet, typename UWSet> |
| 2831 void heapWeakPairsHelper() |
2781 { | 2832 { |
2782 IntWrapper::s_destructorCalls = 0; | 2833 IntWrapper::s_destructorCalls = 0; |
2783 | 2834 |
2784 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 2835 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; |
2785 | 2836 |
2786 Persistent<WeakStrongSet> weakStrong = new WeakStrongSet(); | 2837 Persistent<WSSet> weakStrong = new WSSet(); |
2787 Persistent<StrongWeakSet> strongWeak = new StrongWeakSet(); | 2838 Persistent<SWSet> strongWeak = new SWSet(); |
2788 Persistent<WeakUnwrappedSet> weakUnwrapped = new WeakUnwrappedSet(); | 2839 Persistent<WUSet> weakUnwrapped = new WUSet(); |
2789 Persistent<UnwrappedWeakSet> unwrappedWeak = new UnwrappedWeakSet(); | 2840 Persistent<UWSet> unwrappedWeak = new UWSet(); |
2790 | 2841 |
2791 Persistent<IntWrapper> two = IntWrapper::create(2); | 2842 Persistent<IntWrapper> two = IntWrapper::create(2); |
2792 | 2843 |
2793 weakStrong->add(PairWeakStrong(IntWrapper::create(1), &*two)); | 2844 weakStrong->add(PairWeakStrong(IntWrapper::create(1), &*two)); |
2794 weakStrong->add(PairWeakStrong(&*two, &*two)); | 2845 weakStrong->add(PairWeakStrong(&*two, &*two)); |
2795 strongWeak->add(PairStrongWeak(&*two, IntWrapper::create(1))); | 2846 strongWeak->add(PairStrongWeak(&*two, IntWrapper::create(1))); |
2796 strongWeak->add(PairStrongWeak(&*two, &*two)); | 2847 strongWeak->add(PairStrongWeak(&*two, &*two)); |
2797 weakUnwrapped->add(PairWeakUnwrapped(IntWrapper::create(1), 2)); | 2848 weakUnwrapped->add(PairWeakUnwrapped(IntWrapper::create(1), 2)); |
2798 weakUnwrapped->add(PairWeakUnwrapped(&*two, 2)); | 2849 weakUnwrapped->add(PairWeakUnwrapped(&*two, 2)); |
2799 unwrappedWeak->add(PairUnwrappedWeak(2, IntWrapper::create(1))); | 2850 unwrappedWeak->add(PairUnwrappedWeak(2, IntWrapper::create(1))); |
2800 unwrappedWeak->add(PairUnwrappedWeak(2, &*two)); | 2851 unwrappedWeak->add(PairUnwrappedWeak(2, &*two)); |
2801 | 2852 |
2802 checkPairSets(weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, true, tw
o); | 2853 checkPairSets(weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, true, tw
o); |
2803 | 2854 |
2804 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 2855 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
2805 checkPairSets(weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, false, t
wo); | 2856 checkPairSets(weakStrong, strongWeak, weakUnwrapped, unwrappedWeak, false, t
wo); |
2806 } | 2857 } |
2807 | 2858 |
| 2859 TEST(HeapTest, HeapWeakPairs) |
| 2860 { |
| 2861 heapWeakPairsHelper<WeakStrongSet, StrongWeakSet, WeakUnwrappedSet, Unwrappe
dWeakSet>(); |
| 2862 heapWeakPairsHelper<WeakStrongCountedSet, StrongWeakCountedSet, WeakUnwrappe
dCountedSet, UnwrappedWeakCountedSet>(); |
| 2863 heapWeakPairsHelper<WeakStrongLinkedSet, StrongWeakLinkedSet, WeakUnwrappedL
inkedSet, UnwrappedWeakLinkedSet>(); |
| 2864 } |
| 2865 |
2808 TEST(HeapTest, HeapWeakCollectionTypes) | 2866 TEST(HeapTest, HeapWeakCollectionTypes) |
2809 { | 2867 { |
2810 HeapStats initialHeapSize; | 2868 HeapStats initialHeapSize; |
2811 IntWrapper::s_destructorCalls = 0; | 2869 IntWrapper::s_destructorCalls = 0; |
2812 | 2870 |
2813 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; | 2871 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; |
2814 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; | 2872 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; |
2815 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea
k; | 2873 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea
k; |
2816 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; | 2874 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; |
2817 | 2875 |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3676 { | 3734 { |
3677 Persistent<MixinB> b = obj; | 3735 Persistent<MixinB> b = obj; |
3678 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3736 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
3679 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3737 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
3680 } | 3738 } |
3681 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3739 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
3682 EXPECT_EQ(3, IntWrapper::s_destructorCalls); | 3740 EXPECT_EQ(3, IntWrapper::s_destructorCalls); |
3683 } | 3741 } |
3684 | 3742 |
3685 } // WebCore namespace | 3743 } // WebCore namespace |
OLD | NEW |