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