12efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// Copyright 2012 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.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#ifndef V8_HEAP_HEAP_H_
63e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define V8_HEAP_HEAP_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org#include <cmath>
918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assert-scope.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/counters.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/globals.h"
14a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#include "src/heap/gc-idle-time-handler.h"
153e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/gc-tracer.h"
163e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/incremental-marking.h"
173e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/mark-compact.h"
188640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org#include "src/heap/objects-visiting.h"
193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/spaces.h"
2031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org#include "src/heap/store-buffer.h"
21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/list.h"
22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/splay-tree-inl.h"
2318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
2471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
2571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Defines all the roots in Heap.
28a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org#define STRONG_ROOT_LIST(V)                                                    \
293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  V(Map, byte_array_map, ByteArrayMap)                                         \
30c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  V(Map, free_space_map, FreeSpaceMap)                                         \
313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  V(Map, one_pointer_filler_map, OnePointerFillerMap)                          \
323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  V(Map, two_pointer_filler_map, TwoPointerFillerMap)                          \
333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  /* Cluster the most popular ones in a few cache lines here at the top.    */ \
34c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  V(Smi, store_buffer_top, StoreBufferTop)                                     \
35a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(Oddball, undefined_value, UndefinedValue)                                  \
36a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(Oddball, the_hole_value, TheHoleValue)                                     \
37a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(Oddball, null_value, NullValue)                                            \
38a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(Oddball, true_value, TrueValue)                                            \
39a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(Oddball, false_value, FalseValue)                                          \
401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  V(Oddball, uninitialized_value, UninitializedValue)                          \
41a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  V(Oddball, exception, Exception)                                             \
4241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  V(Map, cell_map, CellMap)                                                    \
43394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(Map, global_property_cell_map, GlobalPropertyCellMap)                      \
44394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(Map, shared_function_info_map, SharedFunctionInfoMap)                      \
45394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(Map, meta_map, MetaMap)                                                    \
4668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(Map, heap_number_map, HeapNumberMap)                                       \
4758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  V(Map, mutable_heap_number_map, MutableHeapNumberMap)                        \
4846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  V(Map, native_context_map, NativeContextMap)                                 \
4918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  V(Map, fixed_array_map, FixedArrayMap)                                       \
50394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(Map, code_map, CodeMap)                                                    \
51c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  V(Map, scope_info_map, ScopeInfoMap)                                         \
520b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org  V(Map, fixed_cow_array_map, FixedCOWArrayMap)                                \
536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  V(Map, fixed_double_array_map, FixedDoubleArrayMap)                          \
54a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  V(Map, constant_pool_array_map, ConstantPoolArrayMap)                        \
5549ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Oddball, no_interceptor_result_sentinel, NoInterceptorResultSentinel)      \
5618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  V(Map, hash_table_map, HashTableMap)                                         \
579e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  V(Map, ordered_hash_table_map, OrderedHashTableMap)                          \
58394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(FixedArray, empty_fixed_array, EmptyFixedArray)                            \
59394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(ByteArray, empty_byte_array, EmptyByteArray)                               \
60394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(DescriptorArray, empty_descriptor_array, EmptyDescriptorArray)             \
619ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  V(ConstantPoolArray, empty_constant_pool_array, EmptyConstantPoolArray)      \
62394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  V(Oddball, arguments_marker, ArgumentsMarker)                                \
631f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  /* The roots above this line should be boring from a GC point of view.    */ \
641f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  /* This means they are never in new space and never on a page that is     */ \
651f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  /* being compacted.                                                       */ \
668f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  V(FixedArray, number_string_cache, NumberStringCache)                        \
678f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  V(Object, instanceof_cache_function, InstanceofCacheFunction)                \
688f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  V(Object, instanceof_cache_map, InstanceofCacheMap)                          \
698f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  V(Object, instanceof_cache_answer, InstanceofCacheAnswer)                    \
708f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  V(FixedArray, single_character_string_cache, SingleCharacterStringCache)     \
71486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  V(FixedArray, string_split_cache, StringSplitCache)                          \
7278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  V(FixedArray, regexp_multiple_cache, RegExpMultipleCache)                    \
7349ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Oddball, termination_exception, TerminationException)                      \
74f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  V(Smi, hash_seed, HashSeed)                                                  \
75ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  V(Map, symbol_map, SymbolMap)                                                \
764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  V(Map, string_map, StringMap)                                                \
772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, one_byte_string_map, OneByteStringMap)                                \
788f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  V(Map, cons_string_map, ConsStringMap)                                       \
792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, cons_one_byte_string_map, ConsOneByteStringMap)                       \
804668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  V(Map, sliced_string_map, SlicedStringMap)                                   \
812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, sliced_one_byte_string_map, SlicedOneByteStringMap)                   \
82ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  V(Map, external_string_map, ExternalStringMap)                               \
83dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Map, external_string_with_one_byte_data_map,                               \
84ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    ExternalStringWithOneByteDataMap)                                          \
852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, external_one_byte_string_map, ExternalOneByteStringMap)               \
861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  V(Map, short_external_string_map, ShortExternalStringMap)                    \
87dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Map, short_external_string_with_one_byte_data_map,                         \
88ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    ShortExternalStringWithOneByteDataMap)                                     \
894a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  V(Map, internalized_string_map, InternalizedStringMap)                       \
902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, one_byte_internalized_string_map, OneByteInternalizedStringMap)       \
91dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Map, external_internalized_string_map, ExternalInternalizedStringMap)      \
92dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Map, external_internalized_string_with_one_byte_data_map,                  \
93ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    ExternalInternalizedStringWithOneByteDataMap)                              \
942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, external_one_byte_internalized_string_map,                            \
952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ExternalOneByteInternalizedStringMap)                                      \
96dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Map, short_external_internalized_string_map,                               \
974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    ShortExternalInternalizedStringMap)                                        \
98dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Map, short_external_internalized_string_with_one_byte_data_map,            \
99ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    ShortExternalInternalizedStringWithOneByteDataMap)                         \
1002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, short_external_one_byte_internalized_string_map,                      \
1012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ShortExternalOneByteInternalizedStringMap)                                 \
1022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, short_external_one_byte_string_map, ShortExternalOneByteStringMap)    \
103ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  V(Map, undetectable_string_map, UndetectableStringMap)                       \
1042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  V(Map, undetectable_one_byte_string_map, UndetectableOneByteStringMap)       \
105af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_int8_array_map, ExternalInt8ArrayMap)                        \
106af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_uint8_array_map, ExternalUint8ArrayMap)                      \
107af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_int16_array_map, ExternalInt16ArrayMap)                      \
108af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_uint16_array_map, ExternalUint16ArrayMap)                    \
109af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_int32_array_map, ExternalInt32ArrayMap)                      \
110af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_uint32_array_map, ExternalUint32ArrayMap)                    \
111af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_float32_array_map, ExternalFloat32ArrayMap)                  \
112af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_float64_array_map, ExternalFloat64ArrayMap)                  \
113af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(Map, external_uint8_clamped_array_map, ExternalUint8ClampedArrayMap)       \
114dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ExternalArray, empty_external_int8_array, EmptyExternalInt8Array)          \
115dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ExternalArray, empty_external_uint8_array, EmptyExternalUint8Array)        \
116af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(ExternalArray, empty_external_int16_array, EmptyExternalInt16Array)        \
117dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ExternalArray, empty_external_uint16_array, EmptyExternalUint16Array)      \
118af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(ExternalArray, empty_external_int32_array, EmptyExternalInt32Array)        \
119dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ExternalArray, empty_external_uint32_array, EmptyExternalUint32Array)      \
120af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(ExternalArray, empty_external_float32_array, EmptyExternalFloat32Array)    \
121af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(ExternalArray, empty_external_float64_array, EmptyExternalFloat64Array)    \
122af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  V(ExternalArray, empty_external_uint8_clamped_array,                         \
123dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    EmptyExternalUint8ClampedArray)                                            \
1245c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_uint8_array_map, FixedUint8ArrayMap)                            \
1255c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_int8_array_map, FixedInt8ArrayMap)                              \
1265c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_uint16_array_map, FixedUint16ArrayMap)                          \
1275c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_int16_array_map, FixedInt16ArrayMap)                            \
1285c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_uint32_array_map, FixedUint32ArrayMap)                          \
1295c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_int32_array_map, FixedInt32ArrayMap)                            \
1305c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_float32_array_map, FixedFloat32ArrayMap)                        \
1315c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_float64_array_map, FixedFloat64ArrayMap)                        \
1325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  V(Map, fixed_uint8_clamped_array_map, FixedUint8ClampedArrayMap)             \
133895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_uint8_array, EmptyFixedUint8Array)        \
134895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_int8_array, EmptyFixedInt8Array)          \
135895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_uint16_array, EmptyFixedUint16Array)      \
136895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_int16_array, EmptyFixedInt16Array)        \
137895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_uint32_array, EmptyFixedUint32Array)      \
138895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_int32_array, EmptyFixedInt32Array)        \
139895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_float32_array, EmptyFixedFloat32Array)    \
140895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_float64_array, EmptyFixedFloat64Array)    \
141895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  V(FixedTypedArrayBase, empty_fixed_uint8_clamped_array,                      \
142dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    EmptyFixedUint8ClampedArray)                                               \
143486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  V(Map, sloppy_arguments_elements_map, SloppyArgumentsElementsMap)            \
1446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  V(Map, function_context_map, FunctionContextMap)                             \
14568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(Map, catch_context_map, CatchContextMap)                                   \
1466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  V(Map, with_context_map, WithContextMap)                                     \
1474acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  V(Map, block_context_map, BlockContextMap)                                   \
148f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  V(Map, module_context_map, ModuleContextMap)                                 \
14946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  V(Map, global_context_map, GlobalContextMap)                                 \
15049ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, undefined_map, UndefinedMap)                                          \
15149ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, the_hole_map, TheHoleMap)                                             \
15249ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, null_map, NullMap)                                                    \
15349ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, boolean_map, BooleanMap)                                              \
15449ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, uninitialized_map, UninitializedMap)                                  \
15549ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, arguments_marker_map, ArgumentsMarkerMap)                             \
15649ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, no_interceptor_result_sentinel_map, NoInterceptorResultSentinelMap)   \
157a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  V(Map, exception_map, ExceptionMap)                                          \
15849ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  V(Map, termination_exception_map, TerminationExceptionMap)                   \
15931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  V(Map, message_object_map, JSMessageObjectMap)                               \
160ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  V(Map, foreign_map, ForeignMap)                                              \
161a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(HeapNumber, nan_value, NanValue)                                           \
162a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(HeapNumber, infinity_value, InfinityValue)                                 \
163a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  V(HeapNumber, minus_zero_value, MinusZeroValue)                              \
16468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(Map, neander_map, NeanderMap)                                              \
16568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(JSObject, message_listeners, MessageListeners)                             \
166f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  V(UnseededNumberDictionary, code_stubs, CodeStubs)                           \
167f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  V(UnseededNumberDictionary, non_monomorphic_cache, NonMonomorphicCache)      \
168e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  V(PolymorphicCodeCache, polymorphic_code_cache, PolymorphicCodeCache)        \
16968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(Code, js_entry_code, JsEntryCode)                                          \
17068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(Code, js_construct_entry_code, JsConstructEntryCode)                       \
17168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  V(FixedArray, natives_source_cache, NativesSourceCache)                      \
1725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  V(Script, empty_script, EmptyScript)                                         \
173d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  V(NameDictionary, intrinsic_function_names, IntrinsicFunctionNames)          \
17426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  V(Cell, undefined_cell, UndefineCell)                                        \
175eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  V(JSObject, observation_state, ObservationState)                             \
176a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  V(Map, external_map, ExternalMap)                                            \
177a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  V(Object, symbol_registry, SymbolRegistry)                                   \
178a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  V(Symbol, frozen_symbol, FrozenSymbol)                                       \
179bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  V(Symbol, nonexistent_symbol, NonExistentSymbol)                             \
180d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  V(Symbol, elements_transition_symbol, ElementsTransitionSymbol)              \
181a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  V(SeededNumberDictionary, empty_slow_element_dictionary,                     \
182dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    EmptySlowElementDictionary)                                                \
18357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  V(Symbol, observed_symbol, ObservedSymbol)                                   \
184ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  V(Symbol, uninitialized_symbol, UninitializedSymbol)                         \
185ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  V(Symbol, megamorphic_symbol, MegamorphicSymbol)                             \
1866474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  V(Symbol, premonomorphic_symbol, PremonomorphicSymbol)                       \
1876474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  V(Symbol, generic_symbol, GenericSymbol)                                     \
188d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  V(Symbol, stack_trace_symbol, StackTraceSymbol)                              \
189d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  V(Symbol, detailed_stack_trace_symbol, DetailedStackTraceSymbol)             \
190dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Symbol, normal_ic_symbol, NormalICSymbol)                                  \
191a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  V(Symbol, home_object_symbol, HomeObjectSymbol)                              \
192bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  V(FixedArray, materialized_objects, MaterializedObjects)                     \
193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  V(FixedArray, allocation_sites_scratchpad, AllocationSitesScratchpad)        \
19454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org  V(FixedArray, microtask_queue, MicrotaskQueue)
195f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
196f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Entries in this list are limited to Smis and are not visited during GC.
1973e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define SMI_ROOT_LIST(V)                                                   \
1983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(Smi, stack_limit, StackLimit)                                          \
1993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(Smi, real_stack_limit, RealStackLimit)                                 \
2003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(Smi, last_script_id, LastScriptId)                                     \
2013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(Smi, arguments_adaptor_deopt_pc_offset, ArgumentsAdaptorDeoptPCOffset) \
2023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(Smi, construct_stub_deopt_pc_offset, ConstructStubDeoptPCOffset)       \
2033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(Smi, getter_stub_deopt_pc_offset, GetterStubDeoptPCOffset)             \
204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  V(Smi, setter_stub_deopt_pc_offset, SetterStubDeoptPCOffset)
205bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org
2063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define ROOT_LIST(V)  \
2073e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  STRONG_ROOT_LIST(V) \
2083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SMI_ROOT_LIST(V)    \
2094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  V(StringTable, string_table, StringTable)
2104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
21157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// Heap roots that are known to be immortal immovable, for which we can safely
21257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org// skip write barriers.
2133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define IMMORTAL_IMMOVABLE_ROOT_LIST(V) \
2143e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(byte_array_map)                     \
2153e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(free_space_map)                     \
2163e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(one_pointer_filler_map)             \
2173e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(two_pointer_filler_map)             \
2183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(undefined_value)                    \
2193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(the_hole_value)                     \
2203e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(null_value)                         \
2213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(true_value)                         \
2223e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(false_value)                        \
2233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(uninitialized_value)                \
2243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(cell_map)                           \
2253e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(global_property_cell_map)           \
2263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(shared_function_info_map)           \
2273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(meta_map)                           \
2283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(heap_number_map)                    \
2293e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(mutable_heap_number_map)            \
2303e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(native_context_map)                 \
2313e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(fixed_array_map)                    \
2323e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(code_map)                           \
2333e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(scope_info_map)                     \
2343e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(fixed_cow_array_map)                \
2353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(fixed_double_array_map)             \
2363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(constant_pool_array_map)            \
2373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(no_interceptor_result_sentinel)     \
2383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(hash_table_map)                     \
2393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(ordered_hash_table_map)             \
2403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(empty_fixed_array)                  \
2413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(empty_byte_array)                   \
2423e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(empty_descriptor_array)             \
2433e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(empty_constant_pool_array)          \
2443e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(arguments_marker)                   \
2453e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(symbol_map)                         \
2463e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(sloppy_arguments_elements_map)      \
2473e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(function_context_map)               \
2483e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(catch_context_map)                  \
2493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(with_context_map)                   \
2503e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(block_context_map)                  \
2513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(module_context_map)                 \
2523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(global_context_map)                 \
2533e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(undefined_map)                      \
2543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(the_hole_map)                       \
2553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(null_map)                           \
2563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(boolean_map)                        \
2573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(uninitialized_map)                  \
2583e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(message_object_map)                 \
2593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  V(foreign_map)                        \
26057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  V(neander_map)
26157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
262dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org#define INTERNALIZED_STRING_LIST(V)                                \
263dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Object_string, "Object")                                       \
264dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(proto_string, "__proto__")                                     \
265dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(arguments_string, "arguments")                                 \
266dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Arguments_string, "Arguments")                                 \
267dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(caller_string, "caller")                                       \
268dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(boolean_string, "boolean")                                     \
269dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Boolean_string, "Boolean")                                     \
270dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(callee_string, "callee")                                       \
271dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(constructor_string, "constructor")                             \
272dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(dot_result_string, ".result")                                  \
273dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(dot_for_string, ".for.")                                       \
274dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(eval_string, "eval")                                           \
275dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(empty_string, "")                                              \
276dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(function_string, "function")                                   \
2775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  V(Function_string, "Function")                                   \
278dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(length_string, "length")                                       \
279dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(name_string, "name")                                           \
280dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(null_string, "null")                                           \
281dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(number_string, "number")                                       \
282dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Number_string, "Number")                                       \
283dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(nan_string, "NaN")                                             \
284dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(source_string, "source")                                       \
285dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(source_url_string, "source_url")                               \
286dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(source_mapping_url_string, "source_mapping_url")               \
287dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(global_string, "global")                                       \
288dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ignore_case_string, "ignoreCase")                              \
289dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(multiline_string, "multiline")                                 \
290a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(sticky_string, "sticky")                                       \
291a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  V(harmony_regexps_string, "harmony_regexps")                     \
292dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(input_string, "input")                                         \
293dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(index_string, "index")                                         \
294dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(last_index_string, "lastIndex")                                \
295dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(object_string, "object")                                       \
296dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(prototype_string, "prototype")                                 \
297dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(string_string, "string")                                       \
298dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(String_string, "String")                                       \
299dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(symbol_string, "symbol")                                       \
300dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Symbol_string, "Symbol")                                       \
3016474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  V(Map_string, "Map")                                             \
3026474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  V(Set_string, "Set")                                             \
3036474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  V(WeakMap_string, "WeakMap")                                     \
3046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  V(WeakSet_string, "WeakSet")                                     \
305dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(for_string, "for")                                             \
306dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(for_api_string, "for_api")                                     \
3077dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  V(for_intern_string, "for_intern")                               \
308dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(private_api_string, "private_api")                             \
309dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(private_intern_string, "private_intern")                       \
310dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Date_string, "Date")                                           \
311dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(char_at_string, "CharAt")                                      \
312dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(undefined_string, "undefined")                                 \
313dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(value_of_string, "valueOf")                                    \
314dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(stack_string, "stack")                                         \
315dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(toJSON_string, "toJSON")                                       \
316dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(KeyedLoadMonomorphic_string, "KeyedLoadMonomorphic")           \
317dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(KeyedStoreMonomorphic_string, "KeyedStoreMonomorphic")         \
318dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(stack_overflow_string, "kStackOverflowBoilerplate")            \
319dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(illegal_access_string, "illegal access")                       \
320dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(cell_value_string, "%cell_value")                              \
321dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(illegal_argument_string, "illegal argument")                   \
322dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(identity_hash_string, "v8::IdentityHash")                      \
323dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(closure_string, "(closure)")                                   \
324dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(dot_string, ".")                                               \
325dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(compare_ic_string, "==")                                       \
326dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(strict_compare_ic_string, "===")                               \
327dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(infinity_string, "Infinity")                                   \
328dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(minus_infinity_string, "-Infinity")                            \
329dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(query_colon_string, "(?:)")                                    \
330dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Generator_string, "Generator")                                 \
331dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(throw_string, "throw")                                         \
332dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(done_string, "done")                                           \
333dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(value_string, "value")                                         \
334dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(next_string, "next")                                           \
335dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(byte_length_string, "byteLength")                              \
336dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(byte_offset_string, "byteOffset")                              \
337dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(intl_initialized_marker_string, "v8::intl_initialized_marker") \
338ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  V(intl_impl_object_string, "v8::intl_object")
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3404a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org// Forward declarations.
3416012123a2f016c2ab333c2de98d0debd3966056bager@chromium.orgclass HeapStats;
342ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Isolate;
3434a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgclass WeakObjectRetainer;
3447276f14ca716596e0a0d17539516370c1f453847kasper.lund
3457276f14ca716596e0a0d17539516370c1f453847kasper.lund
346ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgtypedef String* (*ExternalStringTableUpdaterCallback)(Heap* heap,
347ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                                      Object** pointer);
348b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass StoreBufferRebuilder {
350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public:
351c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  explicit StoreBufferRebuilder(StoreBuffer* store_buffer)
3523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      : store_buffer_(store_buffer) {}
353c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void Callback(MemoryChunk* page, StoreBufferEvent event);
355c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
356c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private:
357c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  StoreBuffer* store_buffer_;
358c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
359c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // We record in this variable how full the store buffer was when we started
360c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // iterating over the current page, finding pointers to new space.  If the
361c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // store buffer overflows again we can exempt the page from the store buffer
362c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // by rewinding to this point instead of having to search the store buffer.
363c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Object*** start_of_current_page_;
364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // The current page we are scanning in the store buffer iterator.
365c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  MemoryChunk* current_page_;
366c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com};
367c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
36830ce411529579186181838984710b0b0980857aaricow@chromium.org
369ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// A queue of objects promoted during scavenge. Each object is accompanied
370ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// by it's size to avoid dereferencing a map pointer for scanning.
371ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass PromotionQueue {
372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public:
373c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  explicit PromotionQueue(Heap* heap)
374c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org      : front_(NULL),
375c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org        rear_(NULL),
376c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org        limit_(NULL),
377c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org        emergency_stack_(0),
3783e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        heap_(heap) {}
379c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
380c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  void Initialize();
381c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
382c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  void Destroy() {
383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(is_empty());
384c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    delete emergency_stack_;
385c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    emergency_stack_ = NULL;
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
387ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
388c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  Page* GetHeadPage() {
389c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    return Page::FromAllocationTop(reinterpret_cast<Address>(rear_));
390c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
391c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
392c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  void SetNewLimit(Address limit) {
393c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    limit_ = reinterpret_cast<intptr_t*>(limit);
394c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
395c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    if (limit_ <= rear_) {
396c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org      return;
397c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    }
398c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
399c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    RelocateQueueHead();
400c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
401c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
40258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  bool IsBelowPromotionQueue(Address to_space_top) {
40358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // If the given to-space top pointer and the head of the promotion queue
40458a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // are not on the same page, then the to-space objects are below the
40558a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // promotion queue.
40658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    if (GetHeadPage() != Page::FromAddress(to_space_top)) {
40758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org      return true;
40858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    }
40958a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // If the to space top pointer is smaller or equal than the promotion
41058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    // queue head, then the to-space objects are below the promotion queue.
41158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org    return reinterpret_cast<intptr_t*>(to_space_top) <= rear_;
41258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  }
41358a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
414c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  bool is_empty() {
415c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    return (front_ == rear_) &&
4163e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org           (emergency_stack_ == NULL || emergency_stack_->length() == 0);
417c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
418ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void insert(HeapObject* target, int size);
420ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
421ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void remove(HeapObject** target, int* size) {
422e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!is_empty());
423c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    if (front_ == rear_) {
424c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org      Entry e = emergency_stack_->RemoveLast();
425c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org      *target = e.obj_;
426c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org      *size = e.size_;
427c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org      return;
428c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    }
429c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
430c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (NewSpacePage::IsAtStart(reinterpret_cast<Address>(front_))) {
431c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      NewSpacePage* front_page =
432c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com          NewSpacePage::FromAddress(reinterpret_cast<Address>(front_));
433e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(!front_page->prev_page()->is_anchor());
4343e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      front_ = reinterpret_cast<intptr_t*>(front_page->prev_page()->area_end());
435c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
436ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    *target = reinterpret_cast<HeapObject*>(*(--front_));
437ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    *size = static_cast<int>(*(--front_));
438ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Assert no underflow.
439c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    SemiSpace::AssertValidRange(reinterpret_cast<Address>(rear_),
440c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                reinterpret_cast<Address>(front_));
441ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org private:
444c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // The front of the queue is higher in the memory page chain than the rear.
445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t* front_;
446ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t* rear_;
447c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  intptr_t* limit_;
448c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
449c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  static const int kEntrySizeInWords = 2;
450c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
451c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  struct Entry {
4523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    Entry(HeapObject* obj, int size) : obj_(obj), size_(size) {}
453c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
454c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    HeapObject* obj_;
455c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    int size_;
456c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  };
457c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  List<Entry>* emergency_stack_;
458c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
459c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  Heap* heap_;
460c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
461c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  void RelocateQueueHead();
462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
463ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DISALLOW_COPY_AND_ASSIGN(PromotionQueue);
464ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org};
465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
466ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4673e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgtypedef void (*ScavengingCallback)(Map* map, HeapObject** slot,
468c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                   HeapObject* object);
469c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
470c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
471ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// External strings table is a place where all external strings are
472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// registered.  We need to keep track of such strings to properly
473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// finalize them.
474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass ExternalStringTable {
475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public:
476ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Registers an external string.
477ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void AddString(String* string);
478ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
479ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void Iterate(ObjectVisitor* v);
480ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
481ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Restores internal invariant and gets rid of collected strings.
482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Must be called after each Iterate() that modified the strings.
483ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CleanUp();
484ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
485ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Destroys all allocated memory.
486ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void TearDown();
487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org private:
4893e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  explicit ExternalStringTable(Heap* heap) : heap_(heap) {}
490ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
491ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Heap;
492ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
493ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void Verify();
494ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
495ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void AddOldString(String* string);
496ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
497ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Notifies the table that only a prefix of the new list is valid.
498ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void ShrinkNewStrings(int position);
499ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // To speed up scavenge collections new space string are kept
501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // separate from old space strings.
502ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  List<Object*> new_space_strings_;
503ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  List<Object*> old_space_strings_;
504ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
505ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Heap* heap_;
506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
507ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DISALLOW_COPY_AND_ASSIGN(ExternalStringTable);
508ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org};
509ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
510ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
511fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgenum ArrayStorageAllocationMode {
512fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  DONT_INITIALIZE_ARRAY_ELEMENTS,
513fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE
514fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org};
515fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
516d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Heap {
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
5193c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // Configure heap size in MB before setup. Return false if the heap has been
520f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // set up already.
5213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  bool ConfigureHeap(int max_semi_space_size, int max_old_space_size,
5223e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                     int max_executable_size, size_t code_range_size);
523ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool ConfigureHeapDefault();
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  // Prepares the heap, setting up memory areas that are needed in the isolate
52609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  // without actually creating any objects.
52709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  bool SetUp();
52809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org
52909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  // Bootstraps the object heap with the core set of objects required to run.
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Returns whether it succeeded.
53109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  bool CreateHeapObjects();
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Destroys all memory allocated by the heap.
534ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void TearDown();
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
536c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // Set the stack limit in the roots_ array.  Some architectures generate
537c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // code that looks here, because it is faster than loading from the static
538c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  // jslimit_/real_jslimit_ variable in the StackGuard.
539ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void SetStackLimits();
54018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
541f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Returns whether SetUp has been called.
542f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  bool HasBeenSetUp();
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5443811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // Returns the maximum amount of memory reserved for the heap.  For
5453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // the young generation, we reserve 4 times the amount needed for a
5463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // semi space.  The young generation consists of two semi spaces and
5473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // we reserve twice the amount needed for those in order to ensure
5483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // that new space can be aligned to its size.
549ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t MaxReserved() {
5503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    return 4 * reserved_semispace_size_ + max_old_generation_size_;
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
5523c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  int MaxSemiSpaceSize() { return max_semi_space_size_; }
553ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int ReservedSemiSpaceSize() { return reserved_semispace_size_; }
554ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int InitialSemiSpaceSize() { return initial_semispace_size_; }
555ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t MaxOldGenerationSize() { return max_old_generation_size_; }
556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t MaxExecutableSize() { return max_executable_size_; }
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Returns the capacity of the heap in bytes w/o growing. Heap grows when
55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // more spaces are needed until it reaches the limit.
560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t Capacity();
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // Returns the amount of memory currently committed for the heap.
563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t CommittedMemory();
5643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
56501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org  // Returns the amount of executable memory currently committed for the heap.
566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t CommittedMemoryExecutable();
56701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org
56872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  // Returns the amount of phyical memory currently committed for the heap.
56972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  size_t CommittedPhysicalMemory();
57072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org
571057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  // Returns the maximum amount of memory ever committed for the heap.
572057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  intptr_t MaximumCommittedMemory() { return maximum_committed_; }
573057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
574057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  // Updates the maximum committed memory for the heap. Should be called
575057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  // whenever a space grows.
576057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  void UpdateMaximumCommitted();
577057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Returns the available bytes in space w/o growing.
57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Heap doesn't guarantee that it can allocate an object that requires
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // all available bytes. Check MaxHeapObjectSize() instead.
581ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t Available();
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Returns of size of all objects residing in the heap.
584ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t SizeOfObjects();
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return the starting address and a mask for the new space.  And-masking an
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // address with the mask will result in the start address of the new space
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // for all addresses in either semispace.
589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address NewSpaceStart() { return new_space_.start(); }
590ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  uintptr_t NewSpaceMask() { return new_space_.mask(); }
591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address NewSpaceTop() { return new_space_.top(); }
592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
593ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  NewSpace* new_space() { return &new_space_; }
594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  OldSpace* old_pointer_space() { return old_pointer_space_; }
595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  OldSpace* old_data_space() { return old_data_space_; }
596ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  OldSpace* code_space() { return code_space_; }
597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  MapSpace* map_space() { return map_space_; }
598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CellSpace* cell_space() { return cell_space_; }
5993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  PropertyCellSpace* property_cell_space() { return property_cell_space_; }
600ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  LargeObjectSpace* lo_space() { return lo_space_; }
60156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  PagedSpace* paged_space(int idx) {
60256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    switch (idx) {
60356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case OLD_POINTER_SPACE:
60456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org        return old_pointer_space();
60556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case OLD_DATA_SPACE:
60656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org        return old_data_space();
60756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case MAP_SPACE:
60856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org        return map_space();
60956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case CELL_SPACE:
61056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org        return cell_space();
61141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      case PROPERTY_CELL_SPACE:
61241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        return property_cell_space();
61356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case CODE_SPACE:
61456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org        return code_space();
61556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case NEW_SPACE:
61656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      case LO_SPACE:
61756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org        UNREACHABLE();
61856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    }
61956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    return NULL;
62056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  }
621ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
622ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool always_allocate() { return always_allocate_scope_depth_ != 0; }
623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address always_allocate_scope_depth_address() {
6249bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org    return reinterpret_cast<Address>(&always_allocate_scope_depth_);
6259bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org  }
6269bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org
627ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address* NewSpaceAllocationTopAddress() {
6285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return new_space_.allocation_top_address();
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address* NewSpaceAllocationLimitAddress() {
6315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return new_space_.allocation_limit_address();
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Address* OldPointerSpaceAllocationTopAddress() {
6352bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    return old_pointer_space_->allocation_top_address();
6362bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  }
6372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Address* OldPointerSpaceAllocationLimitAddress() {
6382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    return old_pointer_space_->allocation_limit_address();
6392bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  }
6402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
641e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Address* OldDataSpaceAllocationTopAddress() {
642e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    return old_data_space_->allocation_top_address();
643e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
644e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Address* OldDataSpaceAllocationLimitAddress() {
645e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    return old_data_space_->allocation_limit_address();
646e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
647e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
6485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  // Returns a deep copy of the JavaScript object.
6495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  // Properties and elements are copied too.
650528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  // Optionally takes an AllocationSite to be appended in an AllocationMemento.
6513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
6523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CopyJSObject(JSObject* source, AllocationSite* site = NULL);
6535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
654720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  // Clear the Instanceof cache (used when a prototype changes).
655ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void ClearInstanceofCache();
656720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
657e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Iterates the whole code space to clear all ICs of the given kind.
658e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  void ClearAllICsByKind(Code::Kind kind);
659e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
66056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // For use during bootup.
66156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  void RepairFreeListsAfterBoot();
66256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
6633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  template <typename T>
664a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  static inline bool IsOneByte(T t, int chars);
665a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
66659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  // Move len elements within a given array from src_index index to dst_index
66759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  // index.
66859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  void MoveElements(FixedArray* array, int dst_index, int src_index, int len);
66959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
670486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  // Sloppy mode arguments object size.
671486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  static const int kSloppyArgumentsObjectSize =
672846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org      JSObject::kHeaderSize + 2 * kPointerSize;
673ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Strict mode arguments has no callee so it is smaller.
674486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  static const int kStrictArgumentsObjectSize =
675ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      JSObject::kHeaderSize + 1 * kPointerSize;
676ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Indicies for direct access into argument objects.
677ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static const int kArgumentsLengthIndex = 0;
678486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  // callee is only valid in sloppy mode.
679ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static const int kArgumentsCalleeIndex = 1;
68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  // Finalizes an external string by deleting the associated external
68213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  // data and clearing the resource pointer.
683ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void FinalizeExternalString(String* string);
68413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
6856f10e41fef1524c70846d970268de222e41c594cager@chromium.org  // Initialize a filler object to keep the ability to iterate over the heap
6863e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // when introducing gaps within pages.
687ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CreateFillerObjectAt(Address addr, int size);
6886f10e41fef1524c70846d970268de222e41c594cager@chromium.org
689b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  bool CanMoveObjectStart(HeapObject* object);
690b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org
6913e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // Indicates whether live bytes adjustment is triggered from within the GC
6923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // code or from mutator code.
6935697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  enum InvocationMode { FROM_GC, FROM_MUTATOR };
6945697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
6953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // Maintain consistency of live bytes during incremental marking.
6965697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  void AdjustLiveBytes(Address address, int by, InvocationMode mode);
6975697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
6983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // Trim the given array from the left. Note that this relocates the object
6993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // start and hence is only valid if there is only a single reference to it.
7003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  FixedArrayBase* LeftTrimFixedArray(FixedArrayBase* obj, int elements_to_trim);
7013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
7023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  // Trim the given array from the right.
7033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  template<Heap::InvocationMode mode>
7043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  void RightTrimFixedArray(FixedArrayBase* obj, int elements_to_trim);
7053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Converts the given boolean condition to JavaScript boolean value.
707ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline Object* ToBoolean(bool condition);
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
709f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  // Performs garbage collection operation.
710f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  // Returns whether there is a chance that another major GC could
711f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  // collect more garbage.
7124ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  inline bool CollectGarbage(
7133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocationSpace space, const char* gc_reason = NULL,
7144ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
716c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static const int kNoGCFlags = 0;
717a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  static const int kReduceMemoryFootprintMask = 1;
718a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  static const int kAbortIncrementalMarkingMask = 2;
719bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
720a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  // Making the heap iterable requires us to abort incremental marking.
721a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  static const int kMakeHeapIterableMask = kAbortIncrementalMarkingMask;
722c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
723c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Performs a full garbage collection.  If (flags & kMakeHeapIterableMask) is
724c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // non-zero, then the slower precise sweeper is used, which leaves the heap
725c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // in a state where we can iterate over the heap visiting all objects.
7264ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  void CollectAllGarbage(
7273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      int flags, const char* gc_reason = NULL,
7284ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
7299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
730f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  // Last hope GC, should try to squeeze as much as possible.
731994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  void CollectAllAvailableGarbage(const char* gc_reason = NULL);
732f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
733c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Check whether the heap is currently iterable.
734c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  bool IsHeapIterable();
735c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
736061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Notify the heap that a context has been disposed.
737594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int NotifyContextDisposed();
738061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
739c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline void increment_scan_on_scavenge_pages() {
740c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    scan_on_scavenge_pages_++;
741c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (FLAG_gc_verbose) {
742c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      PrintF("Scan-on-scavenge pages: %d\n", scan_on_scavenge_pages_);
743c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
744c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
745c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
746c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline void decrement_scan_on_scavenge_pages() {
747c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    scan_on_scavenge_pages_--;
748c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (FLAG_gc_verbose) {
749c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      PrintF("Scan-on-scavenge pages: %d\n", scan_on_scavenge_pages_);
750c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
751c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
752c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
753ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  PromotionQueue* promotion_queue() { return &promotion_queue_; }
75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
755528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback,
7563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                             GCType gc_type_filter, bool pass_isolate = true);
757528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback);
7582f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
759528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback,
7603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                             GCType gc_type_filter, bool pass_isolate = true);
761528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  void RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback);
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// Heap root getters.  We have versions with and without type::cast() here.
7643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// You can't use type::cast during GC because the assert fails.
7653e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// TODO(1490): Try removing the unchecked accessors, now that GC marking does
7663e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// not corrupt the map.
7673e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define ROOT_ACCESSOR(type, name, camel_name)                           \
7683e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  type* name() { return type::cast(roots_[k##camel_name##RootIndex]); } \
7693e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  type* raw_unchecked_##name() {                                        \
7703e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    return reinterpret_cast<type*>(roots_[k##camel_name##RootIndex]);   \
77168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ROOT_LIST(ROOT_ACCESSOR)
77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef ROOT_ACCESSOR
77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Utility type maps
7763e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define STRUCT_MAP_ACCESSOR(NAME, Name, name) \
7773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Map* name##_map() { return Map::cast(roots_[k##Name##MapRootIndex]); }
77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  STRUCT_LIST(STRUCT_MAP_ACCESSOR)
77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef STRUCT_MAP_ACCESSOR
78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7813e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define STRING_ACCESSOR(name, str) \
7823e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  String* name() { return String::cast(roots_[k##name##RootIndex]); }
7834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  INTERNALIZED_STRING_LIST(STRING_ACCESSOR)
7844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#undef STRING_ACCESSOR
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // The hidden_string is special because it is the empty string, but does
7873b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  // not match the empty string.
7884a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  String* hidden_string() { return hidden_string_; }
7893b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org
79046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  void set_native_contexts_list(Object* object) {
79146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    native_contexts_list_ = object;
7924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
7933c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  Object* native_contexts_list() const { return native_contexts_list_; }
7944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  void set_array_buffers_list(Object* object) { array_buffers_list_ = object; }
7963c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  Object* array_buffers_list() const { return array_buffers_list_; }
7971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
798ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  void set_allocation_sites_list(Object* object) {
799ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    allocation_sites_list_ = object;
800ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
801ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Object* allocation_sites_list() { return allocation_sites_list_; }
8023c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
8033c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // Used in CreateAllocationSiteStub and the (de)serializer.
804ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Object** allocation_sites_list_address() { return &allocation_sites_list_; }
8051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
80625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  Object* weak_object_to_code_table() { return weak_object_to_code_table_; }
80725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
808196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  void set_encountered_weak_collections(Object* weak_collection) {
809196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    encountered_weak_collections_ = weak_collection;
810196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
811196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  Object* encountered_weak_collections() const {
812196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return encountered_weak_collections_;
813196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
814196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
815b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org  // Number of mark-sweeps.
816b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org  unsigned int ms_count() { return ms_count_; }
817b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org
81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Iterates over all roots in the heap.
819ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IterateRoots(ObjectVisitor* v, VisitMode mode);
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Iterates over all strong roots in the heap.
821ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IterateStrongRoots(ObjectVisitor* v, VisitMode mode);
822f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Iterates over entries in the smi roots list.  Only interesting to the
823f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // serializer/deserializer, since GC does not care about smis.
824f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void IterateSmiRoots(ObjectVisitor* v);
825b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Iterates over all the other roots in the heap.
826ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void IterateWeakRoots(ObjectVisitor* v, VisitMode mode);
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8286a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  // Iterate pointers to from semispace of new space found in memory interval
8296a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org  // from start to end.
8303e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  void IterateAndMarkPointersToFromSpace(Address start, Address end,
831ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                         ObjectSlotCallback callback);
83230ce411529579186181838984710b0b0980857aaricow@chromium.org
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Returns whether the object resides in new space.
834ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline bool InNewSpace(Object* object);
835750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  inline bool InNewSpace(Address address);
836750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  inline bool InNewSpacePage(Address address);
837ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline bool InFromSpace(Object* object);
838ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline bool InToSpace(Object* object);
83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
840750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // Returns whether the object resides in old pointer space.
841750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  inline bool InOldPointerSpace(Address address);
842750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  inline bool InOldPointerSpace(Object* object);
843750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
844e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Returns whether the object resides in old data space.
845e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  inline bool InOldDataSpace(Address address);
846e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  inline bool InOldDataSpace(Object* object);
847e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Checks whether an address/object in the heap (including auxiliary
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // area and unused area).
850ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool Contains(Address addr);
851ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool Contains(HeapObject* value);
85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Checks whether an address/object in a space.
8543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // Currently used by tests, serialization and heap verification only.
855ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool InSpace(Address addr, AllocationSpace space);
856ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool InSpace(HeapObject* value, AllocationSpace space);
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8587276f14ca716596e0a0d17539516370c1f453847kasper.lund  // Finds out which space an object should get promoted to based on its type.
859ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline OldSpace* TargetSpace(HeapObject* object);
860d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  static inline AllocationSpace TargetSpaceId(InstanceType type);
8617276f14ca716596e0a0d17539516370c1f453847kasper.lund
862ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org  // Checks whether the given object is allowed to be migrated from it's
863ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org  // current space into the given destination space. Used for debugging.
864ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org  inline bool AllowedToBeMigrated(HeapObject* object, AllocationSpace dest);
865ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Sets the stub_cache_ (only used when expanding the dictionary).
867f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  void public_set_code_stubs(UnseededNumberDictionary* value) {
86868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    roots_[kCodeStubsRootIndex] = value;
86968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
871d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // Support for computing object sizes for old objects during GCs. Returns
872d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // a function that is guaranteed to be safe for computing object sizes in
873d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // the current GC phase.
874ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  HeapObjectCallback GcSafeSizeOfOldObjectFunction() {
875d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    return gc_safe_size_of_old_object_;
876d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  }
877d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Sets the non_monomorphic_cache_ (only used when expanding the dictionary).
879f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  void public_set_non_monomorphic_cache(UnseededNumberDictionary* value) {
88068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    roots_[kNonMonomorphicCacheRootIndex] = value;
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
883ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void public_set_empty_script(Script* script) {
8845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    roots_[kEmptyScriptRootIndex] = script;
8855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  }
8865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
887c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void public_set_store_buffer_top(Address* top) {
888c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    roots_[kStoreBufferTopRootIndex] = reinterpret_cast<Smi*>(top);
889c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
890c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
89157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  void public_set_materialized_objects(FixedArray* objects) {
89257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    roots_[kMaterializedObjectsRootIndex] = objects;
89357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
89457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
895ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org  // Generated code can embed this address to get access to the roots.
896394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  Object** roots_array_start() { return roots_; }
897ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org
898c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Address* store_buffer_top_address() {
899c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return reinterpret_cast<Address*>(&roots_[kStoreBufferTopRootIndex]);
900c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
901c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
902c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
903c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  // Verify the heap is in its normal state before or after a GC.
904c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  void Verify();
90594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
90694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
90725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  bool weak_embedded_objects_verification_enabled() {
90825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    return no_weak_object_verification_scope_depth_ == 0;
90994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  }
910c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif
911c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Print();
914ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void PrintHandles();
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
916c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void OldPointerSpaceCheckStoreBuffer();
917c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void MapSpaceCheckStoreBuffer();
918c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void LargeObjectSpaceCheckStoreBuffer();
919c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Report heap statistics.
921ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ReportHeapStatistics(const char* title);
922ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ReportCodeStatistics(const char* title);
923c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif
924c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
925c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  // Zapping is needed for verify heap, and always done in debug builds.
926c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  static inline bool ShouldZapGarbage() {
927c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef DEBUG
928c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    return true;
929c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#else
930c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
931c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    return FLAG_verify_heap;
932c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#else
933c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    return false;
934c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif
935c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif
936c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  }
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9384b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // Number of "runtime allocations" done so far.
9394b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  uint32_t allocations_count() { return allocations_count_; }
9404b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
9414b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // Returns deterministic "time" value in ms. Works only with
9424b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // FLAG_verify_predictable.
9435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  double synthetic_time() { return allocations_count_ / 2.0; }
9444b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
945e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  // Print short heap statistics.
946ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void PrintShortHeapStatistics();
947e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Write barrier support for address[offset] = o.
9492e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  INLINE(void RecordWrite(Address address, int offset));
95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
951ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Write barrier support for address[start : start + len[ = o.
9522e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  INLINE(void RecordWrites(Address address, int start, int len));
953ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  enum HeapState { NOT_IN_GC, SCAVENGE, MARK_COMPACT };
955ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline HeapState gc_state() { return gc_state_; }
95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
957d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  inline bool IsInGCPostProcessing() { return gc_post_processing_depth_ > 0; }
958d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
9603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  void set_allocation_timeout(int timeout) { allocation_timeout_ = timeout; }
961ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org
962ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  void TracePathToObjectFrom(Object* target, Object* root);
963ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void TracePathToObject(Object* target);
964ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void TracePathToGlobal();
96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9673291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Callback function passed to Heap::Iterate etc.  Copies an object if
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // necessary, the object might be promoted to an old space.  The caller must
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // ensure the precondition that the object is (a) a heap object and (b) in
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // the heap's from space.
971ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static inline void ScavengePointer(HeapObject** p);
9725a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  static inline void ScavengeObject(HeapObject** p, HeapObject* object);
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9743e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  enum ScratchpadSlotMode { IGNORE_SCRATCHPAD_SLOT, RECORD_SCRATCHPAD_SLOT };
975bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org
9762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  // If an object has an AllocationMemento trailing it, return it, otherwise
9772ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  // return NULL;
9782ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  inline AllocationMemento* FindAllocationMemento(HeapObject* object);
9792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
980c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  // An object may have an AllocationSite associated with it through a trailing
981c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  // AllocationMemento. Its feedback should be updated when objects are found
982c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  // in the heap.
9833e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static inline void UpdateAllocationSiteFeedback(HeapObject* object,
9843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                                                  ScratchpadSlotMode mode);
985c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
98656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // Support for partial snapshots.  After calling this we have a linear
98756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // space to write objects in each space.
9883e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  void ReserveSpace(int* sizes, Address* addresses);
9890c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Support for the API.
99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //
99343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9943484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  void CreateApiObjects();
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
996c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline intptr_t PromotedTotalSize() {
9977ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    int64_t total = PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize();
9987ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    if (total > kMaxInt) return static_cast<intptr_t>(kMaxInt);
9997ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    if (total < 0) return 0;
10007ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    return static_cast<intptr_t>(total);
1001c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1002c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1003c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline intptr_t OldGenerationSpaceAvailable() {
1004a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    return old_generation_allocation_limit_ - PromotedTotalSize();
10050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  }
10060c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
1007bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  inline intptr_t OldGenerationCapacityAvailable() {
1008bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    return max_old_generation_size_ - PromotedTotalSize();
1009bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
1010bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1011a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  static const intptr_t kMinimumOldGenerationAllocationLimit =
1012c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      8 * (Page::kPageSize > MB ? Page::kPageSize : MB);
1013c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
10143c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  static const int kPointerMultiplier = i::kPointerSize / 4;
10158496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org
10163c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // The new space size has to be a power of 2. Sizes are in MB.
10173e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxSemiSpaceSizeLowMemoryDevice = 1 * kPointerMultiplier;
10183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxSemiSpaceSizeMediumMemoryDevice = 4 * kPointerMultiplier;
10193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxSemiSpaceSizeHighMemoryDevice = 8 * kPointerMultiplier;
10203e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxSemiSpaceSizeHugeMemoryDevice = 8 * kPointerMultiplier;
10218496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org
10228496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  // The old space size has to be a multiple of Page::kPageSize.
10233c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // Sizes are in MB.
10243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxOldSpaceSizeLowMemoryDevice = 128 * kPointerMultiplier;
10253c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  static const int kMaxOldSpaceSizeMediumMemoryDevice =
10263c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      256 * kPointerMultiplier;
10273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxOldSpaceSizeHighMemoryDevice = 512 * kPointerMultiplier;
10283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static const int kMaxOldSpaceSizeHugeMemoryDevice = 700 * kPointerMultiplier;
10298496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org
10308496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  // The executable size has to be a multiple of Page::kPageSize.
10313c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  // Sizes are in MB.
1032dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  static const int kMaxExecutableSizeLowMemoryDevice = 96 * kPointerMultiplier;
10333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  static const int kMaxExecutableSizeMediumMemoryDevice =
1034dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      192 * kPointerMultiplier;
10353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  static const int kMaxExecutableSizeHighMemoryDevice =
1036dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      256 * kPointerMultiplier;
10373c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  static const int kMaxExecutableSizeHugeMemoryDevice =
1038dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      256 * kPointerMultiplier;
10398496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org
1040c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  intptr_t OldGenerationAllocationLimit(intptr_t old_gen_size,
1041c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org                                        int freed_global_handles);
10429bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org
1043b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // Indicates whether inline bump-pointer allocation has been disabled.
1044b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  bool inline_allocation_disabled() { return inline_allocation_disabled_; }
1045b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
1046b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // Switch whether inline bump-pointer allocation should be used.
1047b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  void EnableInlineAllocation();
1048b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  void DisableInlineAllocation();
1049b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
1050ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  // Implements the corresponding V8 API function.
1051e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org  bool IdleNotification(int idle_time_in_ms);
1052ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org
1053f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Declare all the root indices.  This defines the root list order.
1054ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org  enum RootListIndex {
1055ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org#define ROOT_INDEX_DECLARATION(type, name, camel_name) k##camel_name##RootIndex,
1056ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org    STRONG_ROOT_LIST(ROOT_INDEX_DECLARATION)
1057ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org#undef ROOT_INDEX_DECLARATION
1058ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org
10594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#define STRING_INDEX_DECLARATION(name, str) k##name##RootIndex,
10604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    INTERNALIZED_STRING_LIST(STRING_INDEX_DECLARATION)
10614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#undef STRING_DECLARATION
1062ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org
10633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// Utility type maps
106499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#define DECLARE_STRUCT_MAP(NAME, Name, name) k##Name##MapRootIndex,
106599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    STRUCT_LIST(DECLARE_STRUCT_MAP)
106699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#undef DECLARE_STRUCT_MAP
10674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    kStringTableRootIndex,
1068f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1069f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#define ROOT_INDEX_DECLARATION(type, name, camel_name) k##camel_name##RootIndex,
1070f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    SMI_ROOT_LIST(ROOT_INDEX_DECLARATION)
1071f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#undef ROOT_INDEX_DECLARATION
1072f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    kRootListLength,
10734a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    kStrongRootListLength = kStringTableRootIndex,
1074f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    kSmiRootsStart = kStringTableRootIndex + 1
1075ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org  };
1076ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org
1077d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  STATIC_ASSERT(kUndefinedValueRootIndex ==
1078d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                Internals::kUndefinedValueRootIndex);
1079d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  STATIC_ASSERT(kNullValueRootIndex == Internals::kNullValueRootIndex);
1080d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  STATIC_ASSERT(kTrueValueRootIndex == Internals::kTrueValueRootIndex);
1081d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  STATIC_ASSERT(kFalseValueRootIndex == Internals::kFalseValueRootIndex);
1082d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  STATIC_ASSERT(kempty_stringRootIndex == Internals::kEmptyStringRootIndex);
1083efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
1084e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Generated code can embed direct references to non-writable roots if
1085e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // they are in new space.
1086e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  static bool RootCanBeWrittenAfterInitialization(RootListIndex root_index);
1087594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Generated code can treat direct references to this root as constant.
1088594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool RootCanBeTreatedAsConstant(RootListIndex root_index);
1089e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
10905c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  Map* MapForFixedTypedArray(ExternalArrayType array_type);
10913e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  RootListIndex RootIndexForFixedTypedArray(ExternalArrayType array_type);
10925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
1093ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Map* MapForExternalArrayType(ExternalArrayType array_type);
10943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  RootListIndex RootIndexForExternalArrayType(ExternalArrayType array_type);
10953811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
10964e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  RootListIndex RootIndexForEmptyExternalArray(ElementsKind kind);
1097895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  RootListIndex RootIndexForEmptyFixedTypedArray(ElementsKind kind);
10984e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  ExternalArray* EmptyExternalArrayForMap(Map* map);
1099895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  FixedTypedArrayBase* EmptyFixedTypedArrayForMap(Map* map);
11004e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
1101ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void RecordStats(HeapStats* stats, bool take_snapshot = false);
11026012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org
1103b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  // Copy block of memory from src to dst. Size of block should be aligned
1104b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  // by pointer size.
110530ce411529579186181838984710b0b0980857aaricow@chromium.org  static inline void CopyBlock(Address dst, Address src, int byte_size);
110630ce411529579186181838984710b0b0980857aaricow@chromium.org
1107b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  // Optimized version of memmove for blocks with pointer size aligned sizes and
1108b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  // pointer size aligned addresses.
110930ce411529579186181838984710b0b0980857aaricow@chromium.org  static inline void MoveBlock(Address dst, Address src, int byte_size);
111030ce411529579186181838984710b0b0980857aaricow@chromium.org
1111b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  // Check new space expansion criteria and expand semispaces if it was hit.
1112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CheckNewSpaceExpansionCriteria();
1113b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
11146a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  inline void IncrementPromotedObjectsSize(int object_size) {
1115e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(object_size > 0);
11166a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    promoted_objects_size_ += object_size;
11176a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
11186a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org
11196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  inline void IncrementSemiSpaceCopiedObjectSize(int object_size) {
1120e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(object_size > 0);
11216a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    semi_space_copied_object_size_ += object_size;
11226a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  }
11236a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org
11243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  inline void IncrementNodesDiedInNewSpace() { nodes_died_in_new_space_++; }
112593720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org
11263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  inline void IncrementNodesCopiedInNewSpace() { nodes_copied_in_new_space_++; }
112793720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org
11283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  inline void IncrementNodesPromoted() { nodes_promoted_++; }
112993720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org
1130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void IncrementYoungSurvivorsCounter(int survived) {
1131e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(survived >= 0);
1132b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org    survived_since_last_expansion_ += survived;
1133b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  }
1134b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
1135c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline bool NextGCIsLikelyToBeFull() {
1136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (FLAG_gc_global) return true;
1137c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1138efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    if (FLAG_stress_compaction && (gc_count_ & 1) != 0) return true;
1139efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
1140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    intptr_t adjusted_allocation_limit =
1141a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        old_generation_allocation_limit_ - new_space_.Capacity();
1142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1143a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    if (PromotedTotalSize() >= adjusted_allocation_limit) return true;
1144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1145c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return false;
1146c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1147c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1148ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void UpdateNewSpaceReferencesInExternalStringTable(
1149b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org      ExternalStringTableUpdaterCallback updater_func);
1150b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
1151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void UpdateReferencesInExternalStringTable(
1152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      ExternalStringTableUpdaterCallback updater_func);
1153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1154ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ProcessWeakReferences(WeakObjectRetainer* retainer);
11554a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1156f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  void VisitExternalResources(v8::ExternalResourceVisitor* visitor);
1157f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1158c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  // An object should be promoted if the object has survived a
1159c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  // scavenge operation.
1160ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline bool ShouldBePromoted(Address old_address, int object_size);
1161ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1162ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearJSFunctionResultCaches();
1163ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1164ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearNormalizedMapCaches();
1165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1166474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org  GCTracer* tracer() { return &tracer_; }
1167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1168c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Returns the size of objects residing in non new spaces.
1169659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  intptr_t PromotedSpaceSizeOfObjects();
1170c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
117183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  double total_regexp_code_generated() { return total_regexp_code_generated_; }
117283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  void IncreaseTotalRegexpCodeGenerated(int size) {
117383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    total_regexp_code_generated_ += size;
117483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
117583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
1176a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  void IncrementCodeGeneratedBytes(bool is_crankshafted, int size) {
1177a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    if (is_crankshafted) {
1178a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      crankshaft_codegen_bytes_generated_ += size;
1179a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    } else {
1180a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      full_codegen_bytes_generated_ += size;
1181a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    }
1182a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
1183a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
118493720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org  // Update GC statistics that are tracked on the Heap.
1185f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  void UpdateCumulativeGCStatistics(double duration, double spent_in_mutator,
1186f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org                                    double marking_time);
118793720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org
1188ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Returns maximum GC pause.
1189c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  double get_max_gc_pause() { return max_gc_pause_; }
1190b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
1191ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Returns maximum size of objects alive after GC.
1192ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t get_max_alive_after_gc() { return max_alive_after_gc_; }
1193ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Returns minimal interval between two subsequent collections.
1195c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  double get_min_in_mutator() { return min_in_mutator_; }
1196b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1197ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  MarkCompactCollector* mark_compact_collector() {
1198ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return &mark_compact_collector_;
1199ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
1200720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
12013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  StoreBuffer* store_buffer() { return &store_buffer_; }
1202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
12033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Marking* marking() { return &marking_; }
1204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
12053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  IncrementalMarking* incremental_marking() { return &incremental_marking_; }
1206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1207ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExternalStringTable* external_string_table() {
1208ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return &external_string_table_;
1209ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
121065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
1211ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  // Returns the current sweep generation.
12123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int sweep_generation() { return sweep_generation_; }
1213ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org
1214ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline Isolate* isolate();
12159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1216ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  void CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags);
12174ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  void CallGCEpilogueCallbacks(GCType gc_type, GCCallbackFlags flags);
1218b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
1219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline bool OldGenerationAllocationLimitReached();
1220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1221c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline void DoScavengeObject(Map* map, HeapObject** slot, HeapObject* obj) {
1222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    scavenging_visitors_table_.GetVisitor(map)(map, slot, obj);
1223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1225c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void QueueMemoryChunkForFree(MemoryChunk* chunk);
1226c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void FreeQueuedChunks();
1227c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1228e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  int gc_count() const { return gc_count_; }
1229e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1230c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Completely clear the Instanceof cache (to stop it keeping objects alive
1231c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // around a GC).
1232c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  inline void CompletelyClearInstanceofCache();
1233c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1234394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // The roots that have an index less than this are always in old space.
1235394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  static const int kOldSpaceRoots = 0x20;
1236394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
1237f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  uint32_t HashSeed() {
1238f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    uint32_t seed = static_cast<uint32_t>(hash_seed()->value());
1239e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(FLAG_randomize_hashes || seed == 0);
1240fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    return seed;
1241fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  }
1242fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org
1243659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  void SetArgumentsAdaptorDeoptPCOffset(int pc_offset) {
1244e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(arguments_adaptor_deopt_pc_offset() == Smi::FromInt(0));
1245659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    set_arguments_adaptor_deopt_pc_offset(Smi::FromInt(pc_offset));
1246659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  }
1247659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
1248967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  void SetConstructStubDeoptPCOffset(int pc_offset) {
1249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(construct_stub_deopt_pc_offset() == Smi::FromInt(0));
1250967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org    set_construct_stub_deopt_pc_offset(Smi::FromInt(pc_offset));
1251967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  }
1252967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
1253de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  void SetGetterStubDeoptPCOffset(int pc_offset) {
1254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(getter_stub_deopt_pc_offset() == Smi::FromInt(0));
1255de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    set_getter_stub_deopt_pc_offset(Smi::FromInt(pc_offset));
1256de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  }
1257de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
125846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  void SetSetterStubDeoptPCOffset(int pc_offset) {
1259e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(setter_stub_deopt_pc_offset() == Smi::FromInt(0));
126046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    set_setter_stub_deopt_pc_offset(Smi::FromInt(pc_offset));
126146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
126246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
12632c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  // For post mortem debugging.
12642c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  void RememberUnmappedPage(Address page, bool compacted);
12652c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
126688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  // Global inline caching age: it is incremented on some GCs after context
126788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  // disposal. We use it to flush inline caches.
12683e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int global_ic_age() { return global_ic_age_; }
126988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org
127088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  void AgeInlineCaches() {
12717028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    global_ic_age_ = (global_ic_age_ + 1) & SharedFunctionInfo::ICAgeBits::kMax;
127288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  }
127388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org
1274c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  bool flush_monomorphic_ics() { return flush_monomorphic_ics_; }
1275c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
12767ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  int64_t amount_of_external_allocated_memory() {
1277471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    return amount_of_external_allocated_memory_;
1278471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1279471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1280f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void DeoptMarkedAllocationSites();
1281f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
12823e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  bool MaximumSizeScavenge() { return maximum_size_scavenges_ > 0; }
1283196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1284196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  bool DeoptMaybeTenuredAllocationSites() {
1285196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return new_space_.IsAtMaximumCapacity() && maximum_size_scavenges_ == 0;
1286196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
1287196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1288753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  // ObjectStats are kept in two arrays, counts and sizes. Related stats are
1289753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  // stored in a contiguous linear buffer. Stats groups are stored one after
1290753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  // another.
1291753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  enum {
1292753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org    FIRST_CODE_KIND_SUB_TYPE = LAST_TYPE + 1,
1293304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    FIRST_FIXED_ARRAY_SUB_TYPE =
12941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org        FIRST_CODE_KIND_SUB_TYPE + Code::NUMBER_OF_KINDS,
1295e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org    FIRST_CODE_AGE_SUB_TYPE =
1296e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org        FIRST_FIXED_ARRAY_SUB_TYPE + LAST_FIXED_ARRAY_SUB_TYPE + 1,
1297057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    OBJECT_STATS_COUNT = FIRST_CODE_AGE_SUB_TYPE + Code::kCodeAgeCount + 1
1298753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  };
1299753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org
1300e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  void RecordObjectStats(InstanceType type, size_t size) {
1301e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(type <= LAST_TYPE);
1302e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org    object_counts_[type]++;
1303e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org    object_sizes_[type] += size;
1304e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  }
1305e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org
1306e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  void RecordCodeSubTypeStats(int code_sub_type, int code_age, size_t size) {
1307057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    int code_sub_type_index = FIRST_CODE_KIND_SUB_TYPE + code_sub_type;
1308057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    int code_age_index =
1309057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org        FIRST_CODE_AGE_SUB_TYPE + code_age - Code::kFirstCodeAge;
1310e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(code_sub_type_index >= FIRST_CODE_KIND_SUB_TYPE &&
1311057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org           code_sub_type_index < FIRST_CODE_AGE_SUB_TYPE);
1312e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(code_age_index >= FIRST_CODE_AGE_SUB_TYPE &&
1313057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org           code_age_index < OBJECT_STATS_COUNT);
1314057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    object_counts_[code_sub_type_index]++;
1315057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    object_sizes_[code_sub_type_index] += size;
1316057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    object_counts_[code_age_index]++;
1317057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    object_sizes_[code_age_index] += size;
1318e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  }
1319e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org
1320e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org  void RecordFixedArraySubTypeStats(int array_sub_type, size_t size) {
1321e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE);
1322e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org    object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++;
1323e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org    object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size;
132428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  }
132528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org
132628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  void CheckpointObjectStats();
132728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org
1328dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org  // We don't use a LockGuard here since we want to lock the heap
13299259716434187c932704601f700375e53d865de8rossberg@chromium.org  // only when FLAG_concurrent_recompilation is true.
1330ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  class RelocationLock {
1331ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   public:
13329af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    explicit RelocationLock(Heap* heap) : heap_(heap) {
1333b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      heap_->relocation_mutex_.Lock();
13349af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    }
13359af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
1336ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
13373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    ~RelocationLock() { heap_->relocation_mutex_.Unlock(); }
1338ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1339ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org   private:
1340ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    Heap* heap_;
1341ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  };
1342ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1343865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  void AddWeakObjectToCodeDependency(Handle<Object> obj,
1344865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                     Handle<DependentCode> dep);
134525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
13463484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  DependentCode* LookupWeakObjectToCodeDependency(Handle<Object> obj);
134725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
134825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  void InitializeWeakObjectToCodeTable() {
134925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    set_weak_object_to_code_table(undefined_value());
135025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  }
135125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
135225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  void EnsureWeakObjectToCodeTable();
135325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
13545c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  static void FatalProcessOutOfMemory(const char* location,
13555c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org                                      bool take_snapshot = false);
13565c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
13574b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // This event is triggered after successful allocation of a new object made
13584b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // by runtime. Allocations of target space for object evacuation do not
13594b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // trigger the event. In order to track ALL allocations one must turn off
13604b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // FLAG_inline_new and FLAG_use_allocation_folding.
13614b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  inline void OnAllocationEvent(HeapObject* object, int size_in_bytes);
13624b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
13634b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // This event is triggered after object is moved to a new place.
13643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  inline void OnMoveEvent(HeapObject* target, HeapObject* source,
13654b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org                          int size_in_bytes);
13664b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
13673484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org protected:
13683484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Methods made available to tests.
13693484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
13703484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a JS Map in the heap.
13713e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
13723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateMap(InstanceType instance_type, int instance_size,
13733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                  ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND);
13743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
13753484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates and initializes a new JavaScript object based on a
13763484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // constructor.
13773484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // If allocation_site is non-null, then a memento is emitted after the object
13783484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // that points to the site.
13793e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
13803e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateJSObject(JSFunction* constructor,
13813e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                       PretenureFlag pretenure = NOT_TENURED,
13823e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                       AllocationSite* allocation_site = NULL);
13833484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
13843484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates and initializes a new JavaScript object based on a map.
13853484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Passing an allocation site means that a memento will be created that
13863484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // points to the site.
13873e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
13883e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure = NOT_TENURED,
13893e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                              bool alloc_props = true,
13903e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                              AllocationSite* allocation_site = NULL);
13913484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
13923484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocated a HeapNumber from value.
13933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
13943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateHeapNumber(double value, MutableMode mode = IMMUTABLE,
13953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                         PretenureFlag pretenure = NOT_TENURED);
13963484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
13973484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocate a byte array of the specified length
13983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
13993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateByteArray(int length, PretenureFlag pretenure = NOT_TENURED);
14003484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
14013484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Copy the code and scope info part of the code object, but insert
14023484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // the provided data as the relocation information.
14033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
14043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CopyCode(Code* code, Vector<byte> reloc_info);
1405a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1406a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult CopyCode(Code* code);
14073484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
1408a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Allocates a fixed array initialized with undefined values
14093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
14103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateFixedArray(int length, PretenureFlag pretenure = NOT_TENURED);
14113484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
141243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
1413ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Heap();
1414ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
14151e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // The amount of external memory registered through the API kept alive
14161e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // by global handles
14171e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  int64_t amount_of_external_allocated_memory_;
14181e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
14191e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // Caches the amount of external memory registered at the last global gc.
14201e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  int64_t amount_of_external_allocated_memory_at_last_global_gc_;
14211e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
1422ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // This can be calculated directly from a pointer to the heap; however, it is
1423ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // more expedient to get at the isolate directly from within Heap methods.
1424ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate_;
1425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1426efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  Object* roots_[kRootListLength];
1427efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
142870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  size_t code_range_size_;
1429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int reserved_semispace_size_;
14303c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  int max_semi_space_size_;
1431ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int initial_semispace_size_;
1432ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t max_old_generation_size_;
1433ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t max_executable_size_;
1434057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  intptr_t maximum_committed_;
143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1436eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // For keeping track of how much data has survived
1437eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // scavenge since last new space expansion.
1438ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int survived_since_last_expansion_;
143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1440ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  // For keeping track on when to flush RegExp code.
1441ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  int sweep_generation_;
1442ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org
1443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int always_allocate_scope_depth_;
14448b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org
14458b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org  // For keeping track of context disposals.
1446ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int contexts_disposed_;
14479bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org
144888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  int global_ic_age_;
144988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org
1450c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  bool flush_monomorphic_ics_;
1451c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1452c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int scan_on_scavenge_pages_;
1453c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1454ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  NewSpace new_space_;
1455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  OldSpace* old_pointer_space_;
1456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  OldSpace* old_data_space_;
1457ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  OldSpace* code_space_;
1458ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  MapSpace* map_space_;
1459ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CellSpace* cell_space_;
146041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  PropertyCellSpace* property_cell_space_;
1461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  LargeObjectSpace* lo_space_;
1462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  HeapState gc_state_;
1463d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  int gc_post_processing_depth_;
1464fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  Address new_space_top_after_last_gc_;
146543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14667276f14ca716596e0a0d17539516370c1f453847kasper.lund  // Returns the amount of external memory registered since last global gc.
14677ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  int64_t PromotedExternalMemorySize();
14687276f14ca716596e0a0d17539516370c1f453847kasper.lund
14694b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // How many "runtime allocations" happened.
14704b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  uint32_t allocations_count_;
14714b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
14724b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // Running hash over allocations performed.
14734b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  uint32_t raw_allocations_hash_;
14744b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
14754b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // Countdown counter, dumps allocation hash when 0.
14764b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  uint32_t dump_allocations_hash_countdown_;
14774b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
14784b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // How many mark-sweep collections happened.
14794b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  unsigned int ms_count_;
14804b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
14814b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  // How many gc happened.
14824b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  unsigned int gc_count_;
148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14842c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  // For post mortem debugging.
14852c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  static const int kRememberedUnmappedPages = 128;
14862c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  int remembered_unmapped_pages_index_;
14872c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  Address remembered_unmapped_pages_[kRememberedUnmappedPages];
14882c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
1489086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Total length of the strings we failed to flatten since the last GC.
1490ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int unflattened_strings_length_;
1491086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
14923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define ROOT_ACCESSOR(type, name, camel_name)                                 \
14933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  inline void set_##name(type* value) {                                       \
14943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    /* The deserializer makes use of the fact that these common roots are */  \
14953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    /* never in new space and never on a page that is being compacted.    */  \
14963e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    DCHECK(k##camel_name##RootIndex >= kOldSpaceRoots || !InNewSpace(value)); \
14973e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    roots_[k##camel_name##RootIndex] = value;                                 \
149868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
149968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  ROOT_LIST(ROOT_ACCESSOR)
150068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#undef ROOT_ACCESSOR
150168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
15027276f14ca716596e0a0d17539516370c1f453847kasper.lund#ifdef DEBUG
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the --gc-interval flag is set to a positive value, this
150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // variable holds the value indicating the number of allocations
150543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // remain until the next failure and garbage collection.
1506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int allocation_timeout_;
150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // DEBUG
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15099bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org  // Limit that triggers a global GC on the next (normally caused) GC.  This
15109bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org  // is checked when we have already decided to do a GC to help determine
1511a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  // which collector to invoke, before expanding a paged space in the old
1512a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  // generation and on every allocation in large object space.
1513a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  intptr_t old_generation_allocation_limit_;
151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Indicates that an allocation has failed in the old generation since the
151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // last GC.
1517a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  bool old_gen_exhausted_;
151843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1519b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // Indicates that inline bump-pointer allocation has been globally disabled
1520b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // for all spaces. This is used to disable allocations in generated code.
1521b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  bool inline_allocation_disabled_;
1522b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
1523ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  // Weak list heads, threaded through the objects.
152425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  // List heads are initilized lazily and contain the undefined_value at start.
152546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* native_contexts_list_;
15261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Object* array_buffers_list_;
1527ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Object* allocation_sites_list_;
15281fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
152925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  // WeakHashTable that maps objects embedded in optimized code to dependent
153025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  // code list. It is initilized lazily and contains the undefined_value at
153125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  // start.
153225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  Object* weak_object_to_code_table_;
153325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
1534196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // List of encountered weak collections (JSWeakMap and JSWeakSet) during
1535196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // marking. It is initialized during marking, destroyed after marking and
1536196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // contains Smi(0) while marking is not active.
1537196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  Object* encountered_weak_collections_;
1538196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1539c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  StoreBufferRebuilder store_buffer_rebuilder_;
1540c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
154168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  struct StringTypeTable {
154268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    InstanceType type;
154368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    int size;
154468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    RootListIndex index;
154568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  };
154668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
15474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  struct ConstantStringTable {
154868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    const char* contents;
154968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    RootListIndex index;
155068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  };
155168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
155268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  struct StructTable {
155368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    InstanceType type;
155468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    int size;
155568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    RootListIndex index;
155668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  };
155768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
155868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  static const StringTypeTable string_type_table[];
15594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static const ConstantStringTable constant_string_table[];
156068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  static const StructTable struct_table[];
156168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
15624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // The special hidden string which is an empty string, but does not match
15633b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org  // any string when looked up in properties.
15644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  String* hidden_string_;
15653b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org
156643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // GC callback function, called before and after mark-compact GC.
156743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Allocations in the callback function are disallowed.
15685d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  struct GCPrologueCallbackPair {
1569528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    GCPrologueCallbackPair(v8::Isolate::GCPrologueCallback callback,
15703e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                           GCType gc_type, bool pass_isolate)
15713e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        : callback(callback), gc_type(gc_type), pass_isolate_(pass_isolate) {}
15725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    bool operator==(const GCPrologueCallbackPair& pair) const {
15735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      return pair.callback == callback;
15745d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    }
1575528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    v8::Isolate::GCPrologueCallback callback;
15765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    GCType gc_type;
1577528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // TODO(dcarney): remove variable
1578528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    bool pass_isolate_;
15795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  };
1580ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  List<GCPrologueCallbackPair> gc_prologue_callbacks_;
15815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
15825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  struct GCEpilogueCallbackPair {
1583528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    GCEpilogueCallbackPair(v8::Isolate::GCPrologueCallback callback,
15843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                           GCType gc_type, bool pass_isolate)
15853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        : callback(callback), gc_type(gc_type), pass_isolate_(pass_isolate) {}
15865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    bool operator==(const GCEpilogueCallbackPair& pair) const {
15875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org      return pair.callback == callback;
15885d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    }
1589528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    v8::Isolate::GCPrologueCallback callback;
15905d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    GCType gc_type;
1591528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // TODO(dcarney): remove variable
1592528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    bool pass_isolate_;
15935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  };
1594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  List<GCEpilogueCallbackPair> gc_epilogue_callbacks_;
15955d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
1596d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // Support for computing object sizes during GC.
1597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  HeapObjectCallback gc_safe_size_of_old_object_;
1598d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  static int GcSafeSizeOfOldObject(HeapObject* object);
1599d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
1600d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // Update the GC state. Called from the mark-compact collector.
1601ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void MarkMapPointersAsEncoded(bool encoded) {
1602e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!encoded);
1603c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    gc_safe_size_of_old_object_ = &GcSafeSizeOfOldObject;
1604d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  }
1605d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
1606ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // Code that should be run before and after each GC.  Includes some
1607ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // reporting/verification activities when compiled with DEBUG set.
160870d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org  void GarbageCollectionPrologue();
1609ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  void GarbageCollectionEpilogue();
1610ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org
161171ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  // Pretenuring decisions are made based on feedback collected during new
161271ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  // space evacuation. Note that between feedback collection and calling this
161371ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  // method object in old space must not move.
1614034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // Right now we only process pretenuring feedback in high promotion mode.
161571ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  void ProcessPretenuringFeedback();
161671ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org
161743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Checks whether a global GC is necessary
1618994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  GarbageCollector SelectGarbageCollector(AllocationSpace space,
1619994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org                                          const char** reason);
162043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Make sure there is a filler value behind the top of the new space
1622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // so that the GC does not confuse some unintialized/stale memory
1623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // with the allocation memento of the object at the top
1624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void EnsureFillerObjectAtTop();
1625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
16261e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // Ensure that we have swept all spaces in such a way that we can iterate
16271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  // over all objects.  May cause a GC.
16281e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  void MakeHeapIterable();
16291e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
1630ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // Performs garbage collection operation.
1631ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // Returns whether there is a chance that another major GC could
1632ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // collect more garbage.
16334ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  bool CollectGarbage(
16343e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      GarbageCollector collector, const char* gc_reason,
16354ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      const char* collector_reason,
16364ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
1637ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org
163843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Performs garbage collection
1639f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  // Returns whether there is a chance another major GC could
1640f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  // collect more garbage.
16414ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  bool PerformGarbageCollection(
16424ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      GarbageCollector collector,
16434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
1644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  inline void UpdateOldSpaceLimits();
164643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16473d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  // Selects the proper allocation space depending on the given object
16483d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  // size, pretenuring decision, and preferred old-space.
16493d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  static AllocationSpace SelectSpace(int object_size,
16503d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org                                     AllocationSpace preferred_old_space,
16513d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org                                     PretenureFlag pretenure) {
1652e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(preferred_old_space == OLD_POINTER_SPACE ||
16533d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org           preferred_old_space == OLD_DATA_SPACE);
1654ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org    if (object_size > Page::kMaxRegularHeapObjectSize) return LO_SPACE;
16553d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    return (pretenure == TENURED) ? preferred_old_space : NEW_SPACE;
16563d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  }
16573d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org
16584ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  // Allocate an uninitialized object.  The memory is non-executable if the
16598496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  // hardware and OS allow.  This is the single choke-point for allocations
16608496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  // performed by the runtime and should not be bypassed (to extend this to
16618496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  // inlined allocations, use the Heap::DisableInlineAllocation() support).
1662a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult AllocateRaw(
16633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      int size_in_bytes, AllocationSpace space, AllocationSpace retry_space);
16648496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org
16653484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a heap object based on the map.
16663e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
16673e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      Allocate(Map* map, AllocationSpace space,
16683e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org               AllocationSite* allocation_site = NULL);
16693484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
16703484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a partial map for bootstrapping.
16713e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
16723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocatePartialMap(InstanceType instance_type, int instance_size);
16733484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
16743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Initializes a JSObject based on its map.
16753e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  void InitializeJSObjectFromMap(JSObject* obj, FixedArray* properties,
16763484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org                                 Map* map);
16773484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  void InitializeAllocationMemento(AllocationMemento* memento,
16783484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org                                   AllocationSite* allocation_site);
16793484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
16803484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocate a block of memory in the given space (filled with a filler).
16813484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Used as a fall-back for generated code when the space is full.
16823e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
16833e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateFillerObject(int size, bool double_align, AllocationSpace space);
16843484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
1685cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  // Allocate an uninitialized fixed array.
16863e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
16873e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateRawFixedArray(int length, PretenureFlag pretenure);
1688cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
1689cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  // Allocate an uninitialized fixed double array.
16903e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
16913e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateRawFixedDoubleArray(int length, PretenureFlag pretenure);
1692cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
1693cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  // Allocate an initialized fixed array with the given filler value.
16943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
16953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateFixedArrayWithFiller(int length, PretenureFlag pretenure,
16963e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                                   Object* filler);
1697cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
16984ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  // Allocate and partially initializes a String.  There are two String
16992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  // encodings: one-byte and two-byte.  These functions allocate a string of
17002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  // the given length and set its map and length fields.  The characters of
17012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  // the string are uninitialized.
17023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateRawOneByteString(int length, PretenureFlag pretenure);
17043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateRawTwoByteString(int length, PretenureFlag pretenure);
17064ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
1707ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool CreateInitialMaps();
17083484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  void CreateInitialObjects();
17093484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
1710a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Allocates an internalized string in old space based on the character
1711a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // stream.
1712a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult AllocateInternalizedStringFromUtf8(
17133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      Vector<const char> str, int chars, uint32_t hash_field);
1714a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1715a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult AllocateOneByteInternalizedString(
17163e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      Vector<const uint8_t> str, uint32_t hash_field);
1717a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1718a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult AllocateTwoByteInternalizedString(
17193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      Vector<const uc16> str, uint32_t hash_field);
1720a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
17213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  template <bool is_one_byte, typename T>
17223e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateInternalizedStringImpl(T t, int chars, uint32_t hash_field);
17243484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17253e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  template <typename T>
1726a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult AllocateInternalizedStringImpl(
1727a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      T t, int chars, uint32_t hash_field);
1728a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1729a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Allocates an uninitialized fixed array. It must be filled by the caller.
1730a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateUninitializedFixedArray(int length);
1731a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1732a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Make a copy of src and return it. Returns
1733a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed.
1734a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult CopyFixedArray(FixedArray* src);
1735a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1736a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Make a copy of src, set the map, and return the copy. Returns
1737a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed.
17383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CopyFixedArrayWithMap(FixedArray* src, Map* map);
1740a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1741a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Make a copy of src and return it. Returns
1742a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed.
1743a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult CopyFixedDoubleArray(
1744a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      FixedDoubleArray* src);
1745a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1746a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Make a copy of src and return it. Returns
1747a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed.
1748a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT inline AllocationResult CopyConstantPoolArray(
1749a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      ConstantPoolArray* src);
1750a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
1751a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
17523484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Computes a single character string where the character has code.
17532c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  // A cache is used for one-byte (Latin1) codes.
17543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      LookupSingleCharacterStringFromCode(uint16_t code);
17563484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17573484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocate a symbol in old space.
1758a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateSymbol();
17593484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17603484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Make a copy of src, set the map, and return the copy.
17613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17623e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CopyConstantPoolArrayWithMap(ConstantPoolArray* src, Map* map);
17633484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
1764a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateConstantPoolArray(
1765196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      const ConstantPoolArray::NumberOfEntries& small);
1766196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1767196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateExtendedConstantPoolArray(
1768196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      const ConstantPoolArray::NumberOfEntries& small,
1769196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      const ConstantPoolArray::NumberOfEntries& extended);
17703484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17713484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates an external array of the specified length and type.
17723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateExternalArray(int length, ExternalArrayType array_type,
17743e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                            void* external_pointer, PretenureFlag pretenure);
17753484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17763484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a fixed typed array of the specified length and type.
17773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17783e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateFixedTypedArray(int length, ExternalArrayType array_type,
17793e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                              PretenureFlag pretenure);
17803484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17813484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Make a copy of src and return it.
1782a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult CopyAndTenureFixedCOWArray(FixedArray* src);
17833484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17843484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Make a copy of src, set the map, and return the copy.
17853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
17863e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CopyFixedDoubleArrayWithMap(FixedDoubleArray* src, Map* map);
17873484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
17883484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a fixed double array with uninitialized values. Returns
1789a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateUninitializedFixedDoubleArray(
17903e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      int length, PretenureFlag pretenure = NOT_TENURED);
17912abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
1792ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // These five Create*EntryStub functions are here and forced to not be inlined
179376ae699a3d74409fe1f274fd1f548fbc4c958a13sgjesse@chromium.org  // because of a gcc-4.4 bug that assigns wrong vtable entries.
1794ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  NO_INLINE(void CreateJSEntryStub());
1795ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  NO_INLINE(void CreateJSConstructEntryStub());
179618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
1797ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CreateFixedStubs();
17982abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
179943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Allocate empty fixed array.
1800a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateEmptyFixedArray();
180143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18024e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // Allocate empty external array of given type.
18033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
18043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateEmptyExternalArray(ExternalArrayType array_type);
18054e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
1806895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  // Allocate empty fixed typed array of given type.
18073e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
18083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateEmptyFixedTypedArray(ExternalArrayType array_type);
1809895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
18109ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  // Allocate empty constant pool array.
1811a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateEmptyConstantPoolArray();
18129ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org
181371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  // Allocate a tenured simple cell.
1814a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateCell(Object* value);
181571f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org
181671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  // Allocate a tenured JS global property cell initialized with the hole.
1817a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocatePropertyCell();
181871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org
18193484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a new utility object in the old generation.
1820a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult AllocateStruct(InstanceType type);
18213484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
18223484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  // Allocates a new foreign object.
18233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
18243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateForeign(Address address, PretenureFlag pretenure = NOT_TENURED);
18253484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
18263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  MUST_USE_RESULT AllocationResult
18273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      AllocateCode(int object_size, bool immovable);
18283484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
1829a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult InternalizeStringWithKey(HashTableKey* key);
18303484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
1831a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  MUST_USE_RESULT AllocationResult InternalizeString(String* str);
18323484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
183343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Performs a minor collection in new generation.
1834ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Scavenge();
1835b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
1836ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // Commits from space if it is uncommitted.
1837ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  void EnsureFromSpaceIsCommitted();
1838ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org
1839ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // Uncommit unused semi space.
1840ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  bool UncommitFromSpace() { return new_space_.UncommitFromSpace(); }
1841ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org
1842ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  // Fill in bogus values in from space
1843ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  void ZapFromSpace();
1844ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org
1845b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  static String* UpdateNewSpaceReferenceInExternalStringTableEntry(
18463e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      Heap* heap, Object** pointer);
1847b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org
1848ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front);
18493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static void ScavengeStoreBufferCallback(Heap* heap, MemoryChunk* page,
1850c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                          StoreBufferEvent event);
185143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Performs a major collection in the whole heap.
1853474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org  void MarkCompact();
185443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Code to be run before and after mark-compact.
1856c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void MarkCompactPrologue();
1857720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
18581e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  void ProcessNativeContexts(WeakObjectRetainer* retainer);
18591e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  void ProcessArrayBuffers(WeakObjectRetainer* retainer);
18601e4822ffed805d9cbb2a47cc9453aef06f3dfacamachenbach@chromium.org  void ProcessAllocationSites(WeakObjectRetainer* retainer);
18611fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
1862034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // Deopts all code that contains allocation instruction which are tenured or
1863034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // not tenured. Moreover it clears the pretenuring allocation site statistics.
1864034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  void ResetAllAllocationSitesDependentCode(PretenureFlag flag);
1865034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
1866034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // Evaluates local pretenuring for the old space and calls
1867034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // ResetAllTenuredAllocationSitesDependentCode if too many objects died in
1868034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // the old space.
1869034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  void EvaluateOldSpaceLocalPretenuring(uint64_t size_of_objects_before_gc);
1870034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
18711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // Called on heap tear-down.
18721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  void TearDownArrayBuffers();
18731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
187443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Record statistics before and after garbage collection.
1875ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ReportStatisticsBeforeGC();
1876ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ReportStatisticsAfterGC();
187743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  // Slow part of scavenge object.
18795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  static void ScavengeObjectSlow(HeapObject** p, HeapObject* object);
18805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
188183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  // Total RegExp code ever generated
188283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  double total_regexp_code_generated_;
188383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
1884474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org  GCTracer tracer_;
18859dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
1886fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  // Creates and installs the full-sized number string cache.
1887fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  int FullSizeNumberStringCacheLength();
18880c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  // Flush the number to string cache.
1889ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void FlushNumberStringCache();
18900c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
1891bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  // Sets used allocation sites entries to undefined.
1892bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  void FlushAllocationSitesScratchpad();
1893bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org
1894bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  // Initializes the allocation sites scratchpad with undefined values.
1895bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  void InitializeAllocationSitesScratchpad();
1896bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org
1897bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  // Adds an allocation site to the scratchpad if there is space left.
1898bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  void AddAllocationSiteToScratchpad(AllocationSite* site,
1899bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org                                     ScratchpadSlotMode mode);
1900bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org
19017e6132b924829c353864933f29124419916db550machenbach@chromium.org  void UpdateSurvivalStatistics(int start_new_space_size);
190240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
1903659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  static const int kYoungSurvivalRateHighThreshold = 90;
190440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org  static const int kYoungSurvivalRateAllowedDeviation = 15;
190540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
1906285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  static const int kOldSurvivalRateLowThreshold = 10;
1907034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
1908ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int high_survival_rate_period_length_;
19096a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  intptr_t promoted_objects_size_;
19106a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  double promotion_rate_;
19116a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  intptr_t semi_space_copied_object_size_;
19126a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  double semi_space_copied_rate_;
191393720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org  int nodes_died_in_new_space_;
191493720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org  int nodes_copied_in_new_space_;
191593720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org  int nodes_promoted_;
19161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
1917196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // This is the pretenuring trigger for allocation sites that are in maybe
1918196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // tenure state. When we switched to the maximum new space size we deoptimize
1919196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // the code that belongs to the allocation site and derive the lifetime
1920196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // of the allocation site.
1921196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  unsigned int maximum_size_scavenges_;
1922196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
19237e6132b924829c353864933f29124419916db550machenbach@chromium.org  // TODO(hpayer): Allocation site pretenuring may make this method obsolete.
19247e6132b924829c353864933f29124419916db550machenbach@chromium.org  // Re-visit incremental marking heuristics.
19253e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  bool IsHighSurvivalRate() { return high_survival_rate_period_length_ > 0; }
192640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
1927c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  void SelectScavengingVisitorsTable();
1928c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
19299865d88eda6cb48e94d6408952cf4534fb1976faulan@chromium.org  void IdleMarkCompact(const char* message);
19309865d88eda6cb48e94d6408952cf4534fb1976faulan@chromium.org
1931a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  void AdvanceIdleIncrementalMarking(intptr_t step_size);
1932ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org
1933a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  bool WorthActivatingIncrementalMarking();
19346ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org
193528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  void ClearObjectStats(bool clear_last_time_stats = false);
19366ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org
193725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  void set_weak_object_to_code_table(Object* value) {
1938e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!InNewSpace(value));
193925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    weak_object_to_code_table_ = value;
194025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  }
194125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
194225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  Object** weak_object_to_code_table_address() {
194325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    return &weak_object_to_code_table_;
194425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  }
194525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
19464b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  inline void UpdateAllocationsHash(HeapObject* object);
19474b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  inline void UpdateAllocationsHash(uint32_t value);
19484b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  inline void PrintAlloctionsHash();
19494b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
19504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  static const int kInitialStringTableSize = 2048;
19519258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  static const int kInitialEvalCacheSize = 64;
1952fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  static const int kInitialNumberStringCacheSize = 256;
195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
195428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  // Object counts and used memory by InstanceType
1955753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  size_t object_counts_[OBJECT_STATS_COUNT];
1956753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  size_t object_counts_last_time_[OBJECT_STATS_COUNT];
1957753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  size_t object_sizes_[OBJECT_STATS_COUNT];
1958753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  size_t object_sizes_last_time_[OBJECT_STATS_COUNT];
195928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org
1960ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Maximum GC pause.
1961c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  double max_gc_pause_;
1962ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1963471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Total time spent in GC.
1964c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  double total_gc_time_ms_;
1965471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1966ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Maximum size of objects alive after GC.
1967ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t max_alive_after_gc_;
1968ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1969ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Minimal interval between two subsequent collections.
1970c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  double min_in_mutator_;
1971ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1972e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org  // Cumulative GC time spent in marking
1973e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org  double marking_time_;
1974e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org
1975e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org  // Cumulative GC time spent in sweeping
1976e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org  double sweeping_time_;
1977e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org
1978ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  MarkCompactCollector mark_compact_collector_;
1979ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1980c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  StoreBuffer store_buffer_;
1981c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1982c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Marking marking_;
1983c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1984c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  IncrementalMarking incremental_marking_;
1985ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1986a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  GCIdleTimeHandler gc_idle_time_handler_;
1987ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  unsigned int gc_count_at_last_idle_gc_;
1988ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org
1989a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  // These two counters are monotomically increasing and never reset.
1990a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  size_t full_codegen_bytes_generated_;
1991a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  size_t crankshaft_codegen_bytes_generated_;
1992a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
199332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // If the --deopt_every_n_garbage_collections flag is set to a positive value,
199432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // this variable holds the number of garbage collections since the last
199532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // deoptimization triggered by garbage collection.
199632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  int gcs_since_last_deopt_;
199732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
199894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP
199925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  int no_weak_object_verification_scope_depth_;
200094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif
200194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
200271ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  static const int kAllocationSiteScratchpadSize = 256;
2003bb8234d89692f5088ce3fe3ff5a8e8da2f038cfemachenbach@chromium.org  int allocation_sites_scratchpad_length_;
200471ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org
2005a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  static const int kMaxMarkCompactsInIdleRound = 7;
2006ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org  static const int kIdleScavengeThreshold = 5;
2007ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org
2008ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Shared state read by the scavenge collector and set by ScavengeObject.
2009ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  PromotionQueue promotion_queue_;
2010ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2011ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Flag is set when the heap has been configured.  The heap can be repeatedly
2012f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // configured through the API until it is set up.
2013ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool configured_;
2014ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2015ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExternalStringTable external_string_table_;
2016ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2017c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  VisitorDispatchTable<ScavengingCallback> scavenging_visitors_table_;
2018c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2019c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  MemoryChunk* chunks_queued_for_free_;
2020ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
20215de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::Mutex relocation_mutex_;
2022ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
20232904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  int gc_callbacks_depth_;
20242904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
20251e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  friend class AlwaysAllocateScope;
202643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class Factory;
20271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  friend class GCCallbacksScope;
2028ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class GCTracer;
20291e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  friend class HeapIterator;
2030ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Isolate;
2031d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  friend class MarkCompactCollector;
2032b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org  friend class MarkCompactMarkingVisitor;
2033ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class MapCompact;
203494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP
203525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  friend class NoWeakObjectVerificationScope;
203694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif
20371e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  friend class Page;
2038ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2039ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DISALLOW_COPY_AND_ASSIGN(Heap);
20409bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org};
20419bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org
20429bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org
20436736865049af913afbc9cee73f78c4e9b03f8f49ager@chromium.orgclass HeapStats {
20446736865049af913afbc9cee73f78c4e9b03f8f49ager@chromium.org public:
20450b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org  static const int kStartMarker = 0xDECADE00;
20460b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org  static const int kEndMarker = 0xDECADE01;
20470b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
20483e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* start_marker;                       //  0
20493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* new_space_size;                     //  1
20503e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* new_space_capacity;                 //  2
20513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* old_pointer_space_size;        //  3
20523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* old_pointer_space_capacity;    //  4
20533e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* old_data_space_size;           //  5
20543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* old_data_space_capacity;       //  6
20553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* code_space_size;               //  7
20563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* code_space_capacity;           //  8
20573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* map_space_size;                //  9
20583e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* map_space_capacity;            // 10
20593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* cell_space_size;               // 11
20603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* cell_space_capacity;           // 12
20613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* lo_space_size;                 // 13
20623e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* global_handle_count;                // 14
20633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* weak_global_handle_count;           // 15
20643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* pending_global_handle_count;        // 16
20653e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* near_death_global_handle_count;     // 17
20663e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* free_global_handle_count;           // 18
20673e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* memory_allocator_size;         // 19
20683e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* memory_allocator_capacity;     // 20
20693e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* objects_per_type;                   // 21
20703e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* size_per_type;                      // 22
20713e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* os_error;                           // 23
20723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int* end_marker;                         // 24
20733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* property_cell_space_size;      // 25
20743e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  intptr_t* property_cell_space_capacity;  // 26
20756012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org};
20766012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org
20776012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org
20789bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.orgclass AlwaysAllocateScope {
20799bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org public:
20805697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  explicit inline AlwaysAllocateScope(Isolate* isolate);
2081fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  inline ~AlwaysAllocateScope();
2082000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2083000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org private:
2084000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  // Implicitly disable artificial allocation failures.
20855697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  Heap* heap_;
20865697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  DisallowAllocationFailure daf_;
208743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
208843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2089935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
209094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP
209125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgclass NoWeakObjectVerificationScope {
209294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org public:
209325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  inline NoWeakObjectVerificationScope();
209425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  inline ~NoWeakObjectVerificationScope();
209594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org};
209694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif
209794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
209843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20992904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.orgclass GCCallbacksScope {
21002904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org public:
21012904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  explicit inline GCCallbacksScope(Heap* heap);
21022904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  inline ~GCCallbacksScope();
21032904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
21042904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  inline bool CheckReenter();
21052904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
21062904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org private:
21072904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  Heap* heap_;
21082904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org};
21092904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
21102904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org
211130ce411529579186181838984710b0b0980857aaricow@chromium.org// Visitor class to verify interior pointers in spaces that do not contain
211230ce411529579186181838984710b0b0980857aaricow@chromium.org// or care about intergenerational references. All heap object pointers have to
211330ce411529579186181838984710b0b0980857aaricow@chromium.org// point into the heap to a location that has a map pointer at its first word.
211430ce411529579186181838984710b0b0980857aaricow@chromium.org// Caveat: Heap::Contains is an approximation because it can return true for
211530ce411529579186181838984710b0b0980857aaricow@chromium.org// objects in a heap space but above the allocation pointer.
21163e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgclass VerifyPointersVisitor : public ObjectVisitor {
211743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2118fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  inline void VisitPointers(Object** start, Object** end);
211943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
212043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
212143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Verify that all objects are Smis.
21233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgclass VerifySmisVisitor : public ObjectVisitor {
2124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org public:
2125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  inline void VisitPointers(Object** start, Object** end);
2126f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org};
2127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
21297c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// Space iterator for iterating over all spaces of the heap.  Returns each space
21307c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// in turn, and null when it is done.
21319258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass AllSpaces BASE_EMBEDDED {
21329258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org public:
21337c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  explicit AllSpaces(Heap* heap) : heap_(heap), counter_(FIRST_SPACE) {}
21349258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  Space* next();
21353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
21369258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org private:
21377c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Heap* heap_;
21389258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  int counter_;
21399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org};
21409258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
21419258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
21429258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Space iterator for iterating over all old spaces of the heap: Old pointer
21437c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// space, old data space and code space.  Returns each space in turn, and null
21447c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// when it is done.
21459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass OldSpaces BASE_EMBEDDED {
21469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org public:
21477c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  explicit OldSpaces(Heap* heap) : heap_(heap), counter_(OLD_POINTER_SPACE) {}
21489258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  OldSpace* next();
21493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
21509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org private:
21517c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Heap* heap_;
21529258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  int counter_;
21539258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org};
21549258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
21559258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
21567c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// Space iterator for iterating over all the paged spaces of the heap: Map
21577c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// space, old pointer space, old data space, code space and cell space.  Returns
21587c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// each space in turn, and null when it is done.
21599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass PagedSpaces BASE_EMBEDDED {
21609258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org public:
21617c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  explicit PagedSpaces(Heap* heap) : heap_(heap), counter_(OLD_POINTER_SPACE) {}
21629258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  PagedSpace* next();
21633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
21649258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org private:
21657c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Heap* heap_;
21669258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  int counter_;
21679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org};
21689258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
21699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
21709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Space iterator for iterating over all spaces of the heap.
21717276f14ca716596e0a0d17539516370c1f453847kasper.lund// For each space an object iterator is provided. The deallocation of the
21727276f14ca716596e0a0d17539516370c1f453847kasper.lund// returned object iterators is handled by the space iterator.
21737276f14ca716596e0a0d17539516370c1f453847kasper.lundclass SpaceIterator : public Malloced {
21747276f14ca716596e0a0d17539516370c1f453847kasper.lund public:
21757c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  explicit SpaceIterator(Heap* heap);
21767c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  SpaceIterator(Heap* heap, HeapObjectCallback size_func);
21777276f14ca716596e0a0d17539516370c1f453847kasper.lund  virtual ~SpaceIterator();
21787276f14ca716596e0a0d17539516370c1f453847kasper.lund
21797276f14ca716596e0a0d17539516370c1f453847kasper.lund  bool has_next();
21807276f14ca716596e0a0d17539516370c1f453847kasper.lund  ObjectIterator* next();
21817276f14ca716596e0a0d17539516370c1f453847kasper.lund
21827276f14ca716596e0a0d17539516370c1f453847kasper.lund private:
21837276f14ca716596e0a0d17539516370c1f453847kasper.lund  ObjectIterator* CreateIterator();
21847276f14ca716596e0a0d17539516370c1f453847kasper.lund
21857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Heap* heap_;
21863e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  int current_space_;         // from enum AllocationSpace.
21877276f14ca716596e0a0d17539516370c1f453847kasper.lund  ObjectIterator* iterator_;  // object iterator for the current space.
21884a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  HeapObjectCallback size_func_;
21897276f14ca716596e0a0d17539516370c1f453847kasper.lund};
21907276f14ca716596e0a0d17539516370c1f453847kasper.lund
21917276f14ca716596e0a0d17539516370c1f453847kasper.lund
21924a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// A HeapIterator provides iteration over the whole heap. It
21934a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// aggregates the specific iterators for the different spaces as
21944a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// these can only iterate over one space only.
21954a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com//
2196fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org// HeapIterator ensures there is no allocation during its lifetime
2197fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org// (using an embedded DisallowHeapAllocation instance).
2198fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org//
21994a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// HeapIterator can skip free list nodes (that is, de-allocated heap
22004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// objects that still remain in the heap). As implementation of free
22014a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// nodes filtering uses GC marks, it can't be used during MS/MC GC
22024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// phases. Also, it is forbidden to interrupt iteration in this mode,
22034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// as this will leave heap objects marked (and thus, unusable).
2204023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.orgclass HeapObjectsFilter;
220543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
220643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass HeapIterator BASE_EMBEDDED {
220743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
22083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  enum HeapObjectsFiltering { kNoFiltering, kFilterUnreachable };
22094a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com
22107c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  explicit HeapIterator(Heap* heap);
22117c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  HeapIterator(Heap* heap, HeapObjectsFiltering filtering);
22124a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  ~HeapIterator();
221343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
221443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  HeapObject* next();
221543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void reset();
221643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
221743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
2218fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  struct MakeHeapIterableHelper {
2219fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    explicit MakeHeapIterableHelper(Heap* heap) { heap->MakeHeapIterable(); }
2220fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  };
2221fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org
222243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Perform the initialization.
222343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Init();
222443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Perform all necessary shutdown (destruction) work.
222543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Shutdown();
22264a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  HeapObject* NextObject();
222743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2228fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  MakeHeapIterableHelper make_heap_iterable_helper_;
2229fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  DisallowHeapAllocation no_heap_allocation_;
22307c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Heap* heap_;
2231023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org  HeapObjectsFiltering filtering_;
2232023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org  HeapObjectsFilter* filter_;
223343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Space iterator for iterating all the spaces.
223443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  SpaceIterator* space_iterator_;
223543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Object iterator for the space currently being iterated.
223643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ObjectIterator* object_iterator_;
223743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
223843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
223943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Cache for mapping (map, property name) into field offset.
22415aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Cleared at startup and prior to mark sweep collection.
22425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgclass KeyedLookupCache {
22435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org public:
22445aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Lookup field offset for (map, name). If absent, -1 is returned.
2245a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  int Lookup(Handle<Map> map, Handle<Name> name);
22465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
22475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Update an element in the cache.
2248a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  void Update(Handle<Map> map, Handle<Name> name, int field_offset);
22495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
22505aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Clear the cache.
2251ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Clear();
225213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
2253659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  static const int kLength = 256;
225413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  static const int kCapacityMask = kLength - 1;
225505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  static const int kMapHashShift = 5;
2256659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  static const int kHashMask = -4;  // Zero the last two bits.
2257659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  static const int kEntriesPerBucket = 4;
22581845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  static const int kEntryLength = 2;
22591845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  static const int kMapIndex = 0;
22601845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  static const int kKeyIndex = 1;
2261ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  static const int kNotFound = -1;
226213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
2263659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  // kEntriesPerBucket should be a power of 2.
2264659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  STATIC_ASSERT((kEntriesPerBucket & (kEntriesPerBucket - 1)) == 0);
2265659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  STATIC_ASSERT(kEntriesPerBucket == -kHashMask);
2266659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
22675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org private:
2268ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  KeyedLookupCache() {
2269ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    for (int i = 0; i < kLength; ++i) {
2270ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      keys_[i].map = NULL;
2271ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      keys_[i].name = NULL;
2272ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      field_offsets_[i] = kNotFound;
2273ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
2274ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
2275ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2276a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  static inline int Hash(Handle<Map> map, Handle<Name> name);
227713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
227813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  // Get the address of the keys and field_offsets arrays.  Used in
227913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  // generated code to perform cache lookups.
22803e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  Address keys_address() { return reinterpret_cast<Address>(&keys_); }
228113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
2282ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address field_offsets_address() {
228313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org    return reinterpret_cast<Address>(&field_offsets_);
228413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  }
228513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
22865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  struct Key {
22875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    Map* map;
2288750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    Name* name;
22895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  };
2290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2291ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Key keys_[kLength];
2292ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int field_offsets_[kLength];
22935aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
229413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  friend class ExternalReference;
2295ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Isolate;
2296ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DISALLOW_COPY_AND_ASSIGN(KeyedLookupCache);
229713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org};
22985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
22995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
230006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org// Cache for mapping (map, property name) into descriptor index.
23015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// The cache contains both positive and negative results.
23025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Descriptor index equals kNotFound means the property is absent.
23035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Cleared at startup and prior to any gc.
23045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgclass DescriptorLookupCache {
23055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org public:
23065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Lookup descriptor index for (map, name).
23075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // If absent, kAbsent is returned.
2308750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int Lookup(Map* source, Name* name) {
2309750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    if (!name->IsUniqueName()) return kAbsent;
231006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    int index = Hash(source, name);
23115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    Key& key = keys_[index];
231206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    if ((key.source == source) && (key.name == name)) return results_[index];
23135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    return kAbsent;
23145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  }
23155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
23165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Update an element in the cache.
2317750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void Update(Map* source, Name* name, int result) {
2318e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(result != kAbsent);
2319750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    if (name->IsUniqueName()) {
232006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      int index = Hash(source, name);
23215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org      Key& key = keys_[index];
232206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      key.source = source;
23235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org      key.name = name;
23245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org      results_[index] = result;
23255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    }
23265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  }
23275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
23285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Clear the cache.
2329ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void Clear();
23305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
23315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  static const int kAbsent = -2;
2332e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
23335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org private:
2334ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DescriptorLookupCache() {
2335ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    for (int i = 0; i < kLength; ++i) {
233606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      keys_[i].source = NULL;
2337ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      keys_[i].name = NULL;
2338ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      results_[i] = kAbsent;
2339ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
2340ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
2341ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2342750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static int Hash(Object* source, Name* name) {
23435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    // Uses only lower 32 bits if pointers are larger.
234406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    uint32_t source_hash =
23453e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(source)) >>
23463e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        kPointerSizeLog2;
2347b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org    uint32_t name_hash =
23483e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name)) >>
23493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        kPointerSizeLog2;
235006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    return (source_hash ^ name_hash) % kLength;
23515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  }
23525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
23535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  static const int kLength = 64;
23545aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  struct Key {
235506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    Map* source;
2356750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    Name* name;
23575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  };
23585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
2359ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Key keys_[kLength];
2360ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  int results_[kLength];
236143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2362ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Isolate;
2363ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache);
236443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
236543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
236643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
236778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgclass RegExpResultsCache {
2368486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org public:
236978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  enum ResultsCacheType { REGEXP_MULTIPLE_INDICES, STRING_SPLIT_SUBSTRINGS };
237078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
237178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  // Attempt to retrieve a cached result.  On failure, 0 is returned as a Smi.
237278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  // On success, the returned result is guaranteed to be a COW-array.
23733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static Object* Lookup(Heap* heap, String* key_string, Object* key_pattern,
237478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org                        ResultsCacheType type);
237578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  // Attempt to add value_array to the cache specified by type.  On success,
237678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  // value_array is turned into a COW-array.
23773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  static void Enter(Isolate* isolate, Handle<String> key_string,
23783e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                    Handle<Object> key_pattern, Handle<FixedArray> value_array,
237978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org                    ResultsCacheType type);
2380486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static void Clear(FixedArray* cache);
238178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  static const int kRegExpResultsCacheSize = 0x100;
2382486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
2383486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org private:
2384486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static const int kArrayEntriesPerCacheEntry = 4;
2385486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static const int kStringOffset = 0;
2386486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static const int kPatternOffset = 1;
2387486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org  static const int kArrayOffset = 2;
2388486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org};
2389486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
2390486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org
23914a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org// Abstract base class for checking whether a weak object should be retained.
23924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgclass WeakObjectRetainer {
23934a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org public:
23944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  virtual ~WeakObjectRetainer() {}
23954a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
23964a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Return whether this object should be retained. If NULL is returned the
23974a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // object has no references. Otherwise the address of the retained object
23984a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // should be returned as in some GC situations the object has been moved.
23994a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  virtual Object* RetainAs(Object* object) = 0;
24004a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org};
24014a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
24024a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
2403c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Intrusive object marking uses least significant bit of
2404c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// heap object's map word to mark objects.
2405c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Normally all map words have least significant bit set
2406c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// because they contain tagged map pointer.
2407c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// If the bit is not set object is marked.
2408c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// All objects should be unmarked before resuming
2409c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// JavaScript execution.
2410c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass IntrusiveMarking {
2411c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public:
2412c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static bool IsMarked(HeapObject* object) {
2413c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return (object->map_word().ToRawValue() & kNotMarkedBit) == 0;
2414c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2415c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2416c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static void ClearMark(HeapObject* object) {
2417c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    uintptr_t map_word = object->map_word().ToRawValue();
2418c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    object->set_map_word(MapWord::FromRawValue(map_word | kNotMarkedBit));
2419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!IsMarked(object));
2420c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2421c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2422c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static void SetMark(HeapObject* object) {
2423c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    uintptr_t map_word = object->map_word().ToRawValue();
2424c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    object->set_map_word(MapWord::FromRawValue(map_word & ~kNotMarkedBit));
2425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsMarked(object));
2426c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2427c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2428c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static Map* MapOfMarkedObject(HeapObject* object) {
2429c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    uintptr_t map_word = object->map_word().ToRawValue();
2430c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return MapWord::FromRawValue(map_word | kNotMarkedBit).ToMap();
2431c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2432c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2433c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static int SizeOfMarkedObject(HeapObject* object) {
2434c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    return object->SizeFromMap(MapOfMarkedObject(object));
2435c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2436c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2437c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private:
2438c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  static const uintptr_t kNotMarkedBit = 0x1;
2439196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  STATIC_ASSERT((kHeapObjectTag & kNotMarkedBit) != 0);  // NOLINT
2440c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com};
2441c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2442c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
244346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org#ifdef DEBUG
24443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// Helper class for tracing paths to a search target Object from all roots.
24453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// The TracePathFrom() method can be used to trace paths from a specific
24463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// object to the search target object.
24473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass PathTracer : public ObjectVisitor {
24483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org public:
24493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  enum WhatToFind {
24503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    FIND_ALL,   // Will find all matches.
24513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    FIND_FIRST  // Will stop the search after first match.
24523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  };
24533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2454196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Tags 0, 1, and 3 are used. Use 2 for marking visited HeapObject.
2455196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  static const int kMarkTag = 2;
2456196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
24573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // For the WhatToFind arg, if FIND_FIRST is specified, tracing will stop
24583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // after the first match.  If FIND_ALL is specified, then tracing will be
24593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // done for all matches.
24603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  PathTracer(Object* search_target, WhatToFind what_to_find,
24613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org             VisitMode visit_mode)
24623a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      : search_target_(search_target),
24633a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        found_target_(false),
24643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        found_target_in_trace_(false),
24653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        what_to_find_(what_to_find),
24663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        visit_mode_(visit_mode),
24673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        object_stack_(20),
246879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org        no_allocation() {}
24693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  virtual void VisitPointers(Object** start, Object** end);
24713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void Reset();
24733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void TracePathFrom(Object** root);
24743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  bool found() const { return found_target_; }
24763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  static Object* const kAnyGlobalObject;
24783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org protected:
24803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  class MarkVisitor;
24813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  class UnmarkVisitor;
24823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void MarkRecursively(Object** p, MarkVisitor* mark_visitor);
24843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void UnmarkRecursively(Object** p, UnmarkVisitor* unmark_visitor);
24853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  virtual void ProcessResults();
24863a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
24873a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  Object* search_target_;
24883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  bool found_target_;
24893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  bool found_target_in_trace_;
24903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  WhatToFind what_to_find_;
24913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  VisitMode visit_mode_;
24923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  List<Object*> object_stack_;
24933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
249479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_allocation;  // i.e. no gc allowed.
24953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
249605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org private:
24973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer);
24983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org};
249946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org#endif  // DEBUG
25003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org}
25013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org}  // namespace v8::internal
25023a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
25033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#endif  // V8_HEAP_HEAP_H_
2504