16d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 78640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org#include "src/heap/objects-visiting.h" 8ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 9ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgnamespace v8 { 10ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgnamespace internal { 11ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 12ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 13ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgStaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId( 148640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org int instance_type, int instance_size) { 15ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (instance_type < FIRST_NONSTRING_TYPE) { 16ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org switch (instance_type & kStringRepresentationMask) { 17ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case kSeqStringTag: 18e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if ((instance_type & kStringEncodingMask) == kOneByteStringTag) { 19fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return kVisitSeqOneByteString; 20ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } else { 21ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitSeqTwoByteString; 22ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 23ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 24ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case kConsStringTag: 25ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (IsShortcutCandidate(instance_type)) { 26ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitShortcutCandidate; 27ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } else { 28ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitConsString; 29ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 30ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 314668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org case kSlicedStringTag: 324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org return kVisitSlicedString; 334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 34ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case kExternalStringTag: 358640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitDataObject, kVisitDataObjectGeneric, 361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org instance_size); 37ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 38ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org UNREACHABLE(); 39ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 40ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 41ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org switch (instance_type) { 42ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case BYTE_ARRAY_TYPE: 43ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitByteArray; 44ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 45c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case FREE_SPACE_TYPE: 46c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return kVisitFreeSpace; 47c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 48ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case FIXED_ARRAY_TYPE: 49ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitFixedArray; 50ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 516d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org case FIXED_DOUBLE_ARRAY_TYPE: 526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return kVisitFixedDoubleArray; 536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 54a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org case CONSTANT_POOL_ARRAY_TYPE: 55a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org return kVisitConstantPoolArray; 56a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 57ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case ODDBALL_TYPE: 58ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitOddball; 59ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 60ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case MAP_TYPE: 61ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitMap; 62ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 63ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case CODE_TYPE: 64ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitCode; 65ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 6641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case CELL_TYPE: 6741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return kVisitCell; 6841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 6941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case PROPERTY_CELL_TYPE: 70ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitPropertyCell; 71ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 72394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com case JS_SET_TYPE: 738640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, 74394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JSSet::kSize); 75394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 76394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com case JS_MAP_TYPE: 778640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, 78394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JSMap::kSize); 79394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 807c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org case JS_WEAK_MAP_TYPE: 81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org case JS_WEAK_SET_TYPE: 82e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org return kVisitJSWeakCollection; 83ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 84ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org case JS_REGEXP_TYPE: 85ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org return kVisitJSRegExp; 86ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 87ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case SHARED_FUNCTION_INFO_TYPE: 88ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitSharedFunctionInfo; 89ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org case JS_PROXY_TYPE: 918640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, 927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org JSProxy::kSize); 937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case JS_FUNCTION_PROXY_TYPE: 958640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, 9634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org JSFunctionProxy::kSize); 9734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 98ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org case FOREIGN_TYPE: 998640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitDataObject, kVisitDataObjectGeneric, 100ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org Foreign::kSize); 101ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case SYMBOL_TYPE: 103f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return kVisitSymbol; 1044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 105ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case FILLER_TYPE: 106ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitDataObjectGeneric; 107ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1081fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org case JS_ARRAY_BUFFER_TYPE: 1091fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return kVisitJSArrayBuffer; 1101fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 1111fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org case JS_TYPED_ARRAY_TYPE: 1121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return kVisitJSTypedArray; 1131fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 1141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org case JS_DATA_VIEW_TYPE: 1151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return kVisitJSDataView; 1161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 117ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_OBJECT_TYPE: 118ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 119e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case JS_GENERATOR_OBJECT_TYPE: 120ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com case JS_MODULE_TYPE: 121ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_VALUE_TYPE: 1224efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org case JS_DATE_TYPE: 123ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_ARRAY_TYPE: 124ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_GLOBAL_PROXY_TYPE: 125ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_GLOBAL_OBJECT_TYPE: 126ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case JS_BUILTINS_OBJECT_TYPE: 12731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org case JS_MESSAGE_OBJECT_TYPE: 1284ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org case JS_SET_ITERATOR_TYPE: 1294ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org case JS_MAP_ITERATOR_TYPE: 1308640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitJSObject, kVisitJSObjectGeneric, 131ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org instance_size); 132ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1330b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org case JS_FUNCTION_TYPE: 1340b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org return kVisitJSFunction; 1350b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 136ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org case HEAP_NUMBER_TYPE: 13758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org case MUTABLE_HEAP_NUMBER_TYPE: 1388640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org#define EXTERNAL_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 1398640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org case EXTERNAL_##TYPE##_ARRAY_TYPE: 140af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 1418640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org TYPED_ARRAYS(EXTERNAL_ARRAY_CASE) 1428640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitDataObject, kVisitDataObjectGeneric, 143ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org instance_size); 144af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#undef EXTERNAL_ARRAY_CASE 145ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1465c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_UINT8_ARRAY_TYPE: 1475c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_INT8_ARRAY_TYPE: 1485c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_UINT16_ARRAY_TYPE: 1495c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_INT16_ARRAY_TYPE: 1505c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_UINT32_ARRAY_TYPE: 1515c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_INT32_ARRAY_TYPE: 1525c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_FLOAT32_ARRAY_TYPE: 1535c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_UINT8_CLAMPED_ARRAY_TYPE: 1545c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return kVisitFixedTypedArray; 1555c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 1565c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org case FIXED_FLOAT64_ARRAY_TYPE: 1575c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return kVisitFixedFloat64Array; 1585c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org 1598640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: 160ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org STRUCT_LIST(MAKE_STRUCT_CASE) 161ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org#undef MAKE_STRUCT_CASE 1628640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org if (instance_type == ALLOCATION_SITE_TYPE) { 1638640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return kVisitAllocationSite; 1648640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org } 165ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1668640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, 1678640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org instance_size); 168ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 169ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org default: 170ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org UNREACHABLE(); 171ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return kVisitorIdCount; 172ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 173ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org} 174ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 1752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 1761e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org// We don't record weak slots during marking or scavenges. Instead we do it 1771e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org// once when we complete mark-compact cycle. Note that write barrier has no 1781e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org// effect if we are already in the middle of compacting mark-sweep cycle and we 1791e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org// have to record slots manually. 1801e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.orgstatic bool MustRecordSlots(Heap* heap) { 1811e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org return heap->gc_state() == Heap::MARK_COMPACT && 1828640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org heap->mark_compact_collector()->is_compacting(); 1831e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org} 1841e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 1851e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 1862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgtemplate <class T> 1872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor; 1882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 1892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 1902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgtemplate <class T> 1918640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgObject* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer) { 1922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object* undefined = heap->undefined_value(); 1932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object* head = undefined; 1942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org T* tail = NULL; 1952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MarkCompactCollector* collector = heap->mark_compact_collector(); 1961e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org bool record_slots = MustRecordSlots(heap); 1972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org while (list != undefined) { 1982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Check whether to keep the candidate in the list. 1992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org T* candidate = reinterpret_cast<T*>(list); 2002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object* retained = retainer->RetainAs(list); 2012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (retained != NULL) { 2022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (head == undefined) { 2032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // First element in the list. 2042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org head = retained; 2052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } else { 2062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Subsequent elements in the list. 207e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(tail != NULL); 2082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org WeakListVisitor<T>::SetWeakNext(tail, retained); 2092ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (record_slots) { 2102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object** next_slot = 2118640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org HeapObject::RawField(tail, WeakListVisitor<T>::WeakNextOffset()); 2122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org collector->RecordSlot(next_slot, next_slot, retained); 2132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Retained object is new tail. 216e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!retained->IsUndefined()); 2172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org candidate = reinterpret_cast<T*>(retained); 2182ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org tail = candidate; 2192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // tail is a live object, visit it. 2221e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org WeakListVisitor<T>::VisitLiveObject(heap, tail, retainer); 2232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } else { 2242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org WeakListVisitor<T>::VisitPhantomObject(heap, candidate); 2252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Move to next element in the list. 2282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org list = WeakListVisitor<T>::WeakNext(candidate); 2292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Terminate the list if there is one or more elements. 2322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (tail != NULL) { 2332ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org WeakListVisitor<T>::SetWeakNext(tail, undefined); 2342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return head; 2362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org} 2372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgtemplate <class T> 2408640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgstatic void ClearWeakList(Heap* heap, Object* list) { 2412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object* undefined = heap->undefined_value(); 2422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org while (list != undefined) { 2432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org T* candidate = reinterpret_cast<T*>(list); 2442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org list = WeakListVisitor<T>::WeakNext(candidate); 2452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org WeakListVisitor<T>::SetWeakNext(candidate, undefined); 2462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2472ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org} 2482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2508640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate <> 2512ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor<JSFunction> { 2522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void SetWeakNext(JSFunction* function, Object* next) { 2532ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org function->set_next_function_link(next); 2542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static Object* WeakNext(JSFunction* function) { 2572ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return function->next_function_link(); 2582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2608640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static int WeakNextOffset() { return JSFunction::kNextFunctionLinkOffset; } 2612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2621e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitLiveObject(Heap*, JSFunction*, WeakObjectRetainer*) {} 2632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2641e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitPhantomObject(Heap*, JSFunction*) {} 2652ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}; 2662ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2688640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate <> 2692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor<Code> { 2702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void SetWeakNext(Code* code, Object* next) { 2712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org code->set_next_code_link(next); 2722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2748640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static Object* WeakNext(Code* code) { return code->next_code_link(); } 2752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2768640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static int WeakNextOffset() { return Code::kNextCodeLinkOffset; } 2772ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2781e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitLiveObject(Heap*, Code*, WeakObjectRetainer*) {} 2792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2801e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitPhantomObject(Heap*, Code*) {} 2812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}; 2822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2848640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate <> 2852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor<Context> { 2862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void SetWeakNext(Context* context, Object* next) { 2878640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org context->set(Context::NEXT_CONTEXT_LINK, next, UPDATE_WRITE_BARRIER); 2882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static Object* WeakNext(Context* context) { 2912ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return context->get(Context::NEXT_CONTEXT_LINK); 2922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 2932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 2941e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static int WeakNextOffset() { 2951e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org return FixedArray::SizeFor(Context::NEXT_CONTEXT_LINK); 2961e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org } 2971e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 2988640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static void VisitLiveObject(Heap* heap, Context* context, 2991e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org WeakObjectRetainer* retainer) { 3002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Process the three weak lists linked off the context. 3011e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org DoWeakList<JSFunction>(heap, context, retainer, 3028640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org Context::OPTIMIZED_FUNCTIONS_LIST); 3031e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org DoWeakList<Code>(heap, context, retainer, Context::OPTIMIZED_CODE_LIST); 3041e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org DoWeakList<Code>(heap, context, retainer, Context::DEOPTIMIZED_CODE_LIST); 3052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3078640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org template <class T> 3088640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static void DoWeakList(Heap* heap, Context* context, 3098640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org WeakObjectRetainer* retainer, int index) { 3102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Visit the weak list, removing dead intermediate elements. 3111e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org Object* list_head = VisitWeakList<T>(heap, context->get(index), retainer); 3122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Update the list head. 3142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org context->set(index, list_head, UPDATE_WRITE_BARRIER); 3152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3161e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org if (MustRecordSlots(heap)) { 3172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org // Record the updated slot if necessary. 3188640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org Object** head_slot = 3198640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org HeapObject::RawField(context, FixedArray::SizeFor(index)); 3208640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org heap->mark_compact_collector()->RecordSlot(head_slot, head_slot, 3218640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org list_head); 3222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void VisitPhantomObject(Heap* heap, Context* context) { 3262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org ClearWeakList<JSFunction>(heap, 3278640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org context->get(Context::OPTIMIZED_FUNCTIONS_LIST)); 3282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org ClearWeakList<Code>(heap, context->get(Context::OPTIMIZED_CODE_LIST)); 3292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org ClearWeakList<Code>(heap, context->get(Context::DEOPTIMIZED_CODE_LIST)); 3302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}; 3322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3332ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3348640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate <> 3352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor<JSArrayBufferView> { 3362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void SetWeakNext(JSArrayBufferView* obj, Object* next) { 3372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org obj->set_weak_next(next); 3382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3408640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static Object* WeakNext(JSArrayBufferView* obj) { return obj->weak_next(); } 3412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3428640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static int WeakNextOffset() { return JSArrayBufferView::kWeakNextOffset; } 3431e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 3441e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitLiveObject(Heap*, JSArrayBufferView*, WeakObjectRetainer*) {} 3451e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 3461e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitPhantomObject(Heap*, JSArrayBufferView*) {} 3472ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}; 3482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3508640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate <> 3512ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor<JSArrayBuffer> { 3522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void SetWeakNext(JSArrayBuffer* obj, Object* next) { 3532ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org obj->set_weak_next(next); 3542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3568640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static Object* WeakNext(JSArrayBuffer* obj) { return obj->weak_next(); } 3572ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3588640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static int WeakNextOffset() { return JSArrayBuffer::kWeakNextOffset; } 3591e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 3608640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static void VisitLiveObject(Heap* heap, JSArrayBuffer* array_buffer, 3611e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org WeakObjectRetainer* retainer) { 3628640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org Object* typed_array_obj = VisitWeakList<JSArrayBufferView>( 3638640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org heap, array_buffer->weak_first_view(), retainer); 3642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org array_buffer->set_weak_first_view(typed_array_obj); 3651e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org if (typed_array_obj != heap->undefined_value() && MustRecordSlots(heap)) { 3668640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org Object** slot = HeapObject::RawField(array_buffer, 3678640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org JSArrayBuffer::kWeakFirstViewOffset); 3682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org heap->mark_compact_collector()->RecordSlot(slot, slot, typed_array_obj); 3692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void VisitPhantomObject(Heap* heap, JSArrayBuffer* phantom) { 3732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Runtime::FreeArrayBuffer(heap->isolate(), phantom); 3742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}; 3762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3772ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3788640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate <> 3792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstruct WeakListVisitor<AllocationSite> { 3802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org static void SetWeakNext(AllocationSite* obj, Object* next) { 3812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org obj->set_weak_next(next); 3822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org } 3832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3848640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static Object* WeakNext(AllocationSite* obj) { return obj->weak_next(); } 3852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3868640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org static int WeakNextOffset() { return AllocationSite::kWeakNextOffset; } 3871e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 3881e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitLiveObject(Heap*, AllocationSite*, WeakObjectRetainer*) {} 3891e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org 3901e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org static void VisitPhantomObject(Heap*, AllocationSite*) {} 3912ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}; 3922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3948640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate Object* VisitWeakList<Code>(Heap* heap, Object* list, 3958640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org WeakObjectRetainer* retainer); 3962ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 3988640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate Object* VisitWeakList<JSFunction>(Heap* heap, Object* list, 3998640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org WeakObjectRetainer* retainer); 4002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 4012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 4028640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate Object* VisitWeakList<Context>(Heap* heap, Object* list, 4038640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org WeakObjectRetainer* retainer); 4042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 4052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 4068640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate Object* VisitWeakList<JSArrayBuffer>(Heap* heap, Object* list, 4078640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org WeakObjectRetainer* retainer); 4082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 4092ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org 4108640107360766c74218cf16d51b714b1f2138839machenbach@chromium.orgtemplate Object* VisitWeakList<AllocationSite>(Heap* heap, Object* list, 4118640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org WeakObjectRetainer* retainer); 4128640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org} 4138640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org} // namespace v8::internal 414