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