12efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// disclaimer in the documentation and/or other materials provided 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from this software without specific prior written permission. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_HEAP_H_ 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_HEAP_H_ 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org#include <cmath> 3218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h" 3479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org#include "assert-scope.h" 353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#include "globals.h" 36c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "incremental-marking.h" 373a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#include "list.h" 38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "mark-compact.h" 39c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "objects-visiting.h" 40d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include "spaces.h" 41ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org#include "splay-tree-inl.h" 42c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "store-buffer.h" 43ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org#include "v8-counters.h" 44c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "v8globals.h" 4518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 4771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Defines all the roots in Heap. 50a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org#define STRONG_ROOT_LIST(V) \ 513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, byte_array_map, ByteArrayMap) \ 52c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com V(Map, free_space_map, FreeSpaceMap) \ 533811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, one_pointer_filler_map, OnePointerFillerMap) \ 543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, two_pointer_filler_map, TwoPointerFillerMap) \ 553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org /* Cluster the most popular ones in a few cache lines here at the top. */ \ 56c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com V(Smi, store_buffer_top, StoreBufferTop) \ 57a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(Oddball, undefined_value, UndefinedValue) \ 58a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(Oddball, the_hole_value, TheHoleValue) \ 59a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(Oddball, null_value, NullValue) \ 60a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(Oddball, true_value, TrueValue) \ 61a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(Oddball, false_value, FalseValue) \ 621fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org V(Oddball, uninitialized_value, UninitializedValue) \ 6341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org V(Map, cell_map, CellMap) \ 64394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(Map, global_property_cell_map, GlobalPropertyCellMap) \ 65394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(Map, shared_function_info_map, SharedFunctionInfoMap) \ 66394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(Map, meta_map, MetaMap) \ 6768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(Map, heap_number_map, HeapNumberMap) \ 6846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org V(Map, native_context_map, NativeContextMap) \ 6918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org V(Map, fixed_array_map, FixedArrayMap) \ 70394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(Map, code_map, CodeMap) \ 71c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org V(Map, scope_info_map, ScopeInfoMap) \ 720b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org V(Map, fixed_cow_array_map, FixedCOWArrayMap) \ 736d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org V(Map, fixed_double_array_map, FixedDoubleArrayMap) \ 74a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org V(Map, constant_pool_array_map, ConstantPoolArrayMap) \ 7518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org V(Object, no_interceptor_result_sentinel, NoInterceptorResultSentinel) \ 7618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org V(Map, hash_table_map, HashTableMap) \ 77394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(FixedArray, empty_fixed_array, EmptyFixedArray) \ 78394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(ByteArray, empty_byte_array, EmptyByteArray) \ 79394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(DescriptorArray, empty_descriptor_array, EmptyDescriptorArray) \ 808f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Smi, stack_limit, StackLimit) \ 81394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com V(Oddball, arguments_marker, ArgumentsMarker) \ 821f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org /* The roots above this line should be boring from a GC point of view. */ \ 831f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org /* This means they are never in new space and never on a page that is */ \ 841f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org /* being compacted. */ \ 858f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(FixedArray, number_string_cache, NumberStringCache) \ 868f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Object, instanceof_cache_function, InstanceofCacheFunction) \ 878f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Object, instanceof_cache_map, InstanceofCacheMap) \ 888f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Object, instanceof_cache_answer, InstanceofCacheAnswer) \ 898f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(FixedArray, single_character_string_cache, SingleCharacterStringCache) \ 90486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org V(FixedArray, string_split_cache, StringSplitCache) \ 9178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org V(FixedArray, regexp_multiple_cache, RegExpMultipleCache) \ 928f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Object, termination_exception, TerminationException) \ 93f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com V(Smi, hash_seed, HashSeed) \ 94ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(Map, symbol_map, SymbolMap) \ 954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, string_map, StringMap) \ 964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, ascii_string_map, AsciiStringMap) \ 978f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Map, cons_string_map, ConsStringMap) \ 988f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org V(Map, cons_ascii_string_map, ConsAsciiStringMap) \ 994668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org V(Map, sliced_string_map, SlicedStringMap) \ 1004668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org V(Map, sliced_ascii_string_map, SlicedAsciiStringMap) \ 101ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(Map, external_string_map, ExternalStringMap) \ 102ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org V(Map, \ 103ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org external_string_with_one_byte_data_map, \ 104ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org ExternalStringWithOneByteDataMap) \ 105ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(Map, external_ascii_string_map, ExternalAsciiStringMap) \ 1061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org V(Map, short_external_string_map, ShortExternalStringMap) \ 1071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org V(Map, \ 108ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org short_external_string_with_one_byte_data_map, \ 109ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org ShortExternalStringWithOneByteDataMap) \ 1104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, internalized_string_map, InternalizedStringMap) \ 1114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, ascii_internalized_string_map, AsciiInternalizedStringMap) \ 1124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, cons_internalized_string_map, ConsInternalizedStringMap) \ 1134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, cons_ascii_internalized_string_map, ConsAsciiInternalizedStringMap) \ 1144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, \ 1154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org external_internalized_string_map, \ 1164a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ExternalInternalizedStringMap) \ 1174a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, \ 118ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org external_internalized_string_with_one_byte_data_map, \ 119ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org ExternalInternalizedStringWithOneByteDataMap) \ 1204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, \ 1214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org external_ascii_internalized_string_map, \ 1224a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ExternalAsciiInternalizedStringMap) \ 1234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, \ 1244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org short_external_internalized_string_map, \ 1254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ShortExternalInternalizedStringMap) \ 1264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, \ 127ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org short_external_internalized_string_with_one_byte_data_map, \ 128ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org ShortExternalInternalizedStringWithOneByteDataMap) \ 1294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Map, \ 1304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org short_external_ascii_internalized_string_map, \ 1314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ShortExternalAsciiInternalizedStringMap) \ 1321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org V(Map, short_external_ascii_string_map, ShortExternalAsciiStringMap) \ 133ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(Map, undetectable_string_map, UndetectableStringMap) \ 134ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org V(Map, undetectable_ascii_string_map, UndetectableAsciiStringMap) \ 1353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_byte_array_map, ExternalByteArrayMap) \ 1363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_unsigned_byte_array_map, ExternalUnsignedByteArrayMap) \ 1373811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_short_array_map, ExternalShortArrayMap) \ 1383811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_unsigned_short_array_map, ExternalUnsignedShortArrayMap) \ 1393811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_int_array_map, ExternalIntArrayMap) \ 1403811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_unsigned_int_array_map, ExternalUnsignedIntArrayMap) \ 1413811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org V(Map, external_float_array_map, ExternalFloatArrayMap) \ 1423847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com V(Map, external_double_array_map, ExternalDoubleArrayMap) \ 1434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(Map, external_pixel_array_map, ExternalPixelArrayMap) \ 1444e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_byte_array, \ 1454e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org EmptyExternalByteArray) \ 1464e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_unsigned_byte_array, \ 1474e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org EmptyExternalUnsignedByteArray) \ 1484e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_short_array, EmptyExternalShortArray) \ 1494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_unsigned_short_array, \ 1504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org EmptyExternalUnsignedShortArray) \ 1514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_int_array, EmptyExternalIntArray) \ 1524e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_unsigned_int_array, \ 1534e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org EmptyExternalUnsignedIntArray) \ 1544e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_float_array, EmptyExternalFloatArray) \ 1554e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_double_array, EmptyExternalDoubleArray) \ 1564e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(ExternalArray, empty_external_pixel_array, \ 1574e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org EmptyExternalPixelArray) \ 1587b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org V(Map, non_strict_arguments_elements_map, NonStrictArgumentsElementsMap) \ 1596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org V(Map, function_context_map, FunctionContextMap) \ 16068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(Map, catch_context_map, CatchContextMap) \ 1616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org V(Map, with_context_map, WithContextMap) \ 1624acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org V(Map, block_context_map, BlockContextMap) \ 163f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org V(Map, module_context_map, ModuleContextMap) \ 16446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org V(Map, global_context_map, GlobalContextMap) \ 16568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(Map, oddball_map, OddballMap) \ 16631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org V(Map, message_object_map, JSMessageObjectMap) \ 167ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org V(Map, foreign_map, ForeignMap) \ 168a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(HeapNumber, nan_value, NanValue) \ 169a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(HeapNumber, infinity_value, InfinityValue) \ 170a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org V(HeapNumber, minus_zero_value, MinusZeroValue) \ 17168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(Map, neander_map, NeanderMap) \ 17268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(JSObject, message_listeners, MessageListeners) \ 173f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com V(UnseededNumberDictionary, code_stubs, CodeStubs) \ 174f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com V(UnseededNumberDictionary, non_monomorphic_cache, NonMonomorphicCache) \ 175e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org V(PolymorphicCodeCache, polymorphic_code_cache, PolymorphicCodeCache) \ 17668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(Code, js_entry_code, JsEntryCode) \ 17768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(Code, js_construct_entry_code, JsConstructEntryCode) \ 17868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org V(FixedArray, natives_source_cache, NativesSourceCache) \ 1791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(Smi, last_script_id, LastScriptId) \ 1805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org V(Script, empty_script, EmptyScript) \ 181c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org V(Smi, real_stack_limit, RealStackLimit) \ 182d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org V(NameDictionary, intrinsic_function_names, IntrinsicFunctionNames) \ 183967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org V(Smi, arguments_adaptor_deopt_pc_offset, ArgumentsAdaptorDeoptPCOffset) \ 18446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org V(Smi, construct_stub_deopt_pc_offset, ConstructStubDeoptPCOffset) \ 185de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org V(Smi, getter_stub_deopt_pc_offset, GetterStubDeoptPCOffset) \ 186e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org V(Smi, setter_stub_deopt_pc_offset, SetterStubDeoptPCOffset) \ 187eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org V(JSObject, observation_state, ObservationState) \ 188a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org V(Map, external_map, ExternalMap) \ 189a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org V(Symbol, frozen_symbol, FrozenSymbol) \ 190d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org V(Symbol, elements_transition_symbol, ElementsTransitionSymbol) \ 191a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org V(SeededNumberDictionary, empty_slow_element_dictionary, \ 192169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org EmptySlowElementDictionary) \ 193594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org V(Symbol, observed_symbol, ObservedSymbol) 194b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define ROOT_LIST(V) \ 19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STRONG_ROOT_LIST(V) \ 1974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(StringTable, string_table, StringTable) 1984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 1994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#define INTERNALIZED_STRING_LIST(V) \ 2004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Array_string, "Array") \ 2014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Object_string, "Object") \ 2024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(proto_string, "__proto__") \ 2034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(arguments_string, "arguments") \ 2044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Arguments_string, "Arguments") \ 2054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(call_string, "call") \ 2064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(apply_string, "apply") \ 2074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(caller_string, "caller") \ 2084a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(boolean_string, "boolean") \ 2094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Boolean_string, "Boolean") \ 2104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(callee_string, "callee") \ 2114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(constructor_string, "constructor") \ 212e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org V(dot_result_string, ".result") \ 2134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(dot_for_string, ".for.") \ 214e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org V(dot_iterator_string, ".iterator") \ 215e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org V(dot_generator_object_string, ".generator_object") \ 2164a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(eval_string, "eval") \ 217e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org V(empty_string, "") \ 2184a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(function_string, "function") \ 2194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(length_string, "length") \ 2204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(module_string, "module") \ 2214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(name_string, "name") \ 2224a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(native_string, "native") \ 2234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(null_string, "null") \ 2244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(number_string, "number") \ 2254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Number_string, "Number") \ 2264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(nan_string, "NaN") \ 2274a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(RegExp_string, "RegExp") \ 2284a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(source_string, "source") \ 2294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(global_string, "global") \ 2304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(ignore_case_string, "ignoreCase") \ 2314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(multiline_string, "multiline") \ 2324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(input_string, "input") \ 2334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(index_string, "index") \ 2344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(last_index_string, "lastIndex") \ 2354a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(object_string, "object") \ 236bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org V(literals_string, "literals") \ 2374a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(prototype_string, "prototype") \ 2384a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(string_string, "string") \ 2394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(String_string, "String") \ 240f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org V(symbol_string, "symbol") \ 241f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org V(Symbol_string, "Symbol") \ 2424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(Date_string, "Date") \ 2434a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(this_string, "this") \ 2444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(to_string_string, "toString") \ 2454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(char_at_string, "CharAt") \ 2464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(undefined_string, "undefined") \ 2474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(value_of_string, "valueOf") \ 2484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(stack_string, "stack") \ 249f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org V(toJSON_string, "toJSON") \ 2504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(InitializeVarGlobal_string, "InitializeVarGlobal") \ 2514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(InitializeConstGlobal_string, "InitializeConstGlobal") \ 2524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(KeyedLoadElementMonomorphic_string, \ 2536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org "KeyedLoadElementMonomorphic") \ 2544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(KeyedStoreElementMonomorphic_string, \ 2556d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org "KeyedStoreElementMonomorphic") \ 2564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(stack_overflow_string, "kStackOverflowBoilerplate") \ 2574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(illegal_access_string, "illegal access") \ 2584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(illegal_execution_state_string, "illegal execution state") \ 2594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(get_string, "get") \ 2604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(set_string, "set") \ 2614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(map_field_string, "%map") \ 2624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(elements_field_string, "%elements") \ 2634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(length_field_string, "%length") \ 264e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org V(cell_value_string, "%cell_value") \ 2654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(function_class_string, "Function") \ 2664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(illegal_argument_string, "illegal argument") \ 2674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(MakeReferenceError_string, "MakeReferenceError") \ 2684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(MakeSyntaxError_string, "MakeSyntaxError") \ 2694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(MakeTypeError_string, "MakeTypeError") \ 2704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(invalid_lhs_in_assignment_string, "invalid_lhs_in_assignment") \ 2714a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(invalid_lhs_in_for_in_string, "invalid_lhs_in_for_in") \ 2724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(invalid_lhs_in_postfix_op_string, "invalid_lhs_in_postfix_op") \ 2734a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(invalid_lhs_in_prefix_op_string, "invalid_lhs_in_prefix_op") \ 2744a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(illegal_return_string, "illegal_return") \ 2754a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(illegal_break_string, "illegal_break") \ 2764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(illegal_continue_string, "illegal_continue") \ 2774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(unknown_label_string, "unknown_label") \ 2784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(redeclaration_string, "redeclaration") \ 2794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(space_string, " ") \ 2804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(exec_string, "exec") \ 2814a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(zero_string, "0") \ 2824a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(global_eval_string, "GlobalEval") \ 2834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(identity_hash_string, "v8::IdentityHash") \ 2844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(closure_string, "(closure)") \ 2854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(use_strict_string, "use strict") \ 2864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(dot_string, ".") \ 2874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(anonymous_function_string, "(anonymous function)") \ 2884a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(compare_ic_string, "==") \ 2894a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(strict_compare_ic_string, "===") \ 2904a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(infinity_string, "Infinity") \ 2914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(minus_infinity_string, "-Infinity") \ 2924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org V(hidden_stack_trace_string, "v8::hidden_stack_trace") \ 293b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org V(query_colon_string, "(?:)") \ 2944e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(Generator_string, "Generator") \ 2954e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(throw_string, "throw") \ 2964e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org V(done_string, "done") \ 2971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org V(value_string, "value") \ 2988e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org V(next_string, "next") \ 2998e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org V(byte_length_string, "byteLength") \ 3008e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org V(byte_offset_string, "byteOffset") \ 3018e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org V(buffer_string, "buffer") 30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3034a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org// Forward declarations. 3047276f14ca716596e0a0d17539516370c1f453847kasper.lundclass GCTracer; 3056012123a2f016c2ab333c2de98d0debd3966056bager@chromium.orgclass HeapStats; 306ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Isolate; 3074a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgclass WeakObjectRetainer; 3087276f14ca716596e0a0d17539516370c1f453847kasper.lund 3097276f14ca716596e0a0d17539516370c1f453847kasper.lund 310ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgtypedef String* (*ExternalStringTableUpdaterCallback)(Heap* heap, 311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object** pointer); 312b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass StoreBufferRebuilder { 314c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public: 315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com explicit StoreBufferRebuilder(StoreBuffer* store_buffer) 316c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : store_buffer_(store_buffer) { 317c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 318c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 319c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void Callback(MemoryChunk* page, StoreBufferEvent event); 320c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 321c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private: 322c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBuffer* store_buffer_; 323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // We record in this variable how full the store buffer was when we started 325c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // iterating over the current page, finding pointers to new space. If the 326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // store buffer overflows again we can exempt the page from the store buffer 327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // by rewinding to this point instead of having to search the store buffer. 328c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** start_of_current_page_; 329c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The current page we are scanning in the store buffer iterator. 330c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* current_page_; 331c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 332c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 33330ce411529579186181838984710b0b0980857aaricow@chromium.org 334b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 335ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// A queue of objects promoted during scavenge. Each object is accompanied 336ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// by it's size to avoid dereferencing a map pointer for scanning. 337ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass PromotionQueue { 338ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public: 339c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org explicit PromotionQueue(Heap* heap) 340c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org : front_(NULL), 341c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org rear_(NULL), 342c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org limit_(NULL), 343c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org emergency_stack_(0), 344c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org heap_(heap) { } 345c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 346c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org void Initialize(); 347c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 348c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org void Destroy() { 349c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org ASSERT(is_empty()); 350c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org delete emergency_stack_; 351c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org emergency_stack_ = NULL; 352ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 353ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 354c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org inline void ActivateGuardIfOnTheSamePage(); 355c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 356c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Page* GetHeadPage() { 357c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return Page::FromAllocationTop(reinterpret_cast<Address>(rear_)); 358c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 359c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 360c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org void SetNewLimit(Address limit) { 361c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org if (!guard_) { 362c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return; 363c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 364c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 365c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org ASSERT(GetHeadPage() == Page::FromAllocationTop(limit)); 366c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org limit_ = reinterpret_cast<intptr_t*>(limit); 367c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 368c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org if (limit_ <= rear_) { 369c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return; 370c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 371c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 372c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org RelocateQueueHead(); 373c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 374c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 375c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool is_empty() { 376c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return (front_ == rear_) && 377c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org (emergency_stack_ == NULL || emergency_stack_->length() == 0); 378c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void insert(HeapObject* target, int size); 381ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void remove(HeapObject** target, int* size) { 383c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!is_empty()); 384c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org if (front_ == rear_) { 385c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Entry e = emergency_stack_->RemoveLast(); 386c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org *target = e.obj_; 387c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org *size = e.size_; 388c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return; 389c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 390c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 391c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (NewSpacePage::IsAtStart(reinterpret_cast<Address>(front_))) { 392c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NewSpacePage* front_page = 393c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NewSpacePage::FromAddress(reinterpret_cast<Address>(front_)); 394c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!front_page->prev_page()->is_anchor()); 395c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com front_ = 396ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org reinterpret_cast<intptr_t*>(front_page->prev_page()->area_end()); 397c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 398ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *target = reinterpret_cast<HeapObject*>(*(--front_)); 399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *size = static_cast<int>(*(--front_)); 400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Assert no underflow. 401c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SemiSpace::AssertValidRange(reinterpret_cast<Address>(rear_), 402c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com reinterpret_cast<Address>(front_)); 403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 404ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 405ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org private: 406c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The front of the queue is higher in the memory page chain than the rear. 407ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t* front_; 408ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t* rear_; 409c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org intptr_t* limit_; 410c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 411c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool guard_; 412c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 413c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org static const int kEntrySizeInWords = 2; 414c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 415c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org struct Entry { 416c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Entry(HeapObject* obj, int size) : obj_(obj), size_(size) { } 417c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 418c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org HeapObject* obj_; 419c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org int size_; 420c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org }; 421c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org List<Entry>* emergency_stack_; 422c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 423c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Heap* heap_; 424c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 425c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org void RelocateQueueHead(); 426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(PromotionQueue); 428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}; 429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 430ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 431c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtypedef void (*ScavengingCallback)(Map* map, 432c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject** slot, 433c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* object); 434c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 435c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 436ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// External strings table is a place where all external strings are 437ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// registered. We need to keep track of such strings to properly 438ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// finalize them. 439ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass ExternalStringTable { 440ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public: 441ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Registers an external string. 442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void AddString(String* string); 443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void Iterate(ObjectVisitor* v); 445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 446ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Restores internal invariant and gets rid of collected strings. 447ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Must be called after each Iterate() that modified the strings. 448ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void CleanUp(); 449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Destroys all allocated memory. 451ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void TearDown(); 452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 453ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org private: 454ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExternalStringTable() { } 455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Heap; 457ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 458ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void Verify(); 459ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 460ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void AddOldString(String* string); 461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Notifies the table that only a prefix of the new list is valid. 463ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void ShrinkNewStrings(int position); 464ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // To speed up scavenge collections new space string are kept 466ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // separate from old space strings. 467ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org List<Object*> new_space_strings_; 468ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org List<Object*> old_space_strings_; 469ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 470ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Heap* heap_; 471ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); 473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}; 474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 476fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgenum ArrayStorageAllocationMode { 477fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org DONT_INITIALIZE_ARRAY_ELEMENTS, 478fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE 479fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}; 480fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 481d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass Heap { 48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Configure heap size before setup. Return false if the heap has been 485f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // set up already. 486ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool ConfigureHeap(int max_semispace_size, 487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t max_old_gen_size, 488c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t max_executable_size); 489ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool ConfigureHeapDefault(); 49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org // Prepares the heap, setting up memory areas that are needed in the isolate 49209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org // without actually creating any objects. 49309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org bool SetUp(); 49409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org 49509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org // Bootstraps the object heap with the core set of objects required to run. 49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns whether it succeeded. 49709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org bool CreateHeapObjects(); 49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Destroys all memory allocated by the heap. 500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void TearDown(); 50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 502c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Set the stack limit in the roots_ array. Some architectures generate 503c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // code that looks here, because it is faster than loading from the static 504c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // jslimit_/real_jslimit_ variable in the StackGuard. 505ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void SetStackLimits(); 50618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 507f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Returns whether SetUp has been called. 508f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com bool HasBeenSetUp(); 50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5103811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Returns the maximum amount of memory reserved for the heap. For 5113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // the young generation, we reserve 4 times the amount needed for a 5123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // semi space. The young generation consists of two semi spaces and 5133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // we reserve twice the amount needed for those in order to ensure 5143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // that new space can be aligned to its size. 515ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t MaxReserved() { 5163811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return 4 * reserved_semispace_size_ + max_old_generation_size_; 51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int MaxSemiSpaceSize() { return max_semispace_size_; } 519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int ReservedSemiSpaceSize() { return reserved_semispace_size_; } 520ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int InitialSemiSpaceSize() { return initial_semispace_size_; } 521ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t MaxOldGenerationSize() { return max_old_generation_size_; } 522ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t MaxExecutableSize() { return max_executable_size_; } 523e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org int MaxRegularSpaceAllocationSize() { return InitialSemiSpaceSize() * 4/5; } 52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the capacity of the heap in bytes w/o growing. Heap grows when 52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // more spaces are needed until it reaches the limit. 527ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t Capacity(); 52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Returns the amount of memory currently committed for the heap. 530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t CommittedMemory(); 5313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 53201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Returns the amount of executable memory currently committed for the heap. 533ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t CommittedMemoryExecutable(); 53401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 53572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org // Returns the amount of phyical memory currently committed for the heap. 53672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org size_t CommittedPhysicalMemory(); 53772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 538057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Returns the maximum amount of memory ever committed for the heap. 539057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org intptr_t MaximumCommittedMemory() { return maximum_committed_; } 540057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 541057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // Updates the maximum committed memory for the heap. Should be called 542057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org // whenever a space grows. 543057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org void UpdateMaximumCommitted(); 544057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the available bytes in space w/o growing. 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Heap doesn't guarantee that it can allocate an object that requires 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // all available bytes. Check MaxHeapObjectSize() instead. 548ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t Available(); 54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns of size of all objects residing in the heap. 551ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t SizeOfObjects(); 55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return the starting address and a mask for the new space. And-masking an 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // address with the mask will result in the start address of the new space 55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for all addresses in either semispace. 556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address NewSpaceStart() { return new_space_.start(); } 557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org uintptr_t NewSpaceMask() { return new_space_.mask(); } 558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address NewSpaceTop() { return new_space_.top(); } 559ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NewSpace* new_space() { return &new_space_; } 561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OldSpace* old_pointer_space() { return old_pointer_space_; } 562ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OldSpace* old_data_space() { return old_data_space_; } 563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OldSpace* code_space() { return code_space_; } 564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MapSpace* map_space() { return map_space_; } 565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CellSpace* cell_space() { return cell_space_; } 56641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org PropertyCellSpace* property_cell_space() { 56741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return property_cell_space_; 56841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 569ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LargeObjectSpace* lo_space() { return lo_space_; } 57056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org PagedSpace* paged_space(int idx) { 57156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org switch (idx) { 57256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case OLD_POINTER_SPACE: 57356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org return old_pointer_space(); 57456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case OLD_DATA_SPACE: 57556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org return old_data_space(); 57656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case MAP_SPACE: 57756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org return map_space(); 57856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case CELL_SPACE: 57956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org return cell_space(); 58041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case PROPERTY_CELL_SPACE: 58141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return property_cell_space(); 58256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case CODE_SPACE: 58356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org return code_space(); 58456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case NEW_SPACE: 58556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org case LO_SPACE: 58656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org UNREACHABLE(); 58756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 58856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org return NULL; 58956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 590ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool always_allocate() { return always_allocate_scope_depth_ != 0; } 592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address always_allocate_scope_depth_address() { 5939bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org return reinterpret_cast<Address>(&always_allocate_scope_depth_); 5949bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org } 595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool linear_allocation() { 5960c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return linear_allocation_scope_depth_ != 0; 5973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 5989bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 599ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address* NewSpaceAllocationTopAddress() { 6005a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return new_space_.allocation_top_address(); 60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address* NewSpaceAllocationLimitAddress() { 6035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return new_space_.allocation_limit_address(); 60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6062bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Address* OldPointerSpaceAllocationTopAddress() { 6072bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org return old_pointer_space_->allocation_top_address(); 6082bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 6092bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org Address* OldPointerSpaceAllocationLimitAddress() { 6102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org return old_pointer_space_->allocation_limit_address(); 6112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 6122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 613e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Address* OldDataSpaceAllocationTopAddress() { 614e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return old_data_space_->allocation_top_address(); 615e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 616e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Address* OldDataSpaceAllocationLimitAddress() { 617e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return old_data_space_->allocation_limit_address(); 618e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 619e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates and initializes a new JavaScript object based on a 62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // constructor. 62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSObject( 6264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org JSFunction* constructor, 6274a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org PretenureFlag pretenure = NOT_TENURED); 6284a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 6294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSObjectWithAllocationSite( 6304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org JSFunction* constructor, 631bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org Handle<AllocationSite> allocation_site); 63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSModule(Context* context, 63481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org ScopeInfo* scope_info); 635ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 636fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Allocate a JSArray with no elements 637fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateEmptyJSArray( 638fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 639fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure = NOT_TENURED) { 640fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return AllocateJSArrayAndStorage(elements_kind, 0, 0, 641fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org DONT_INITIALIZE_ARRAY_ELEMENTS, 642fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org pretenure); 643fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 644fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 645fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Allocate a JSArray with a specified length but elements that are left 646fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // uninitialized. 647fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSArrayAndStorage( 648fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 649fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int length, 650fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int capacity, 651fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS, 652fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure = NOT_TENURED); 653fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 6544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSArrayStorage( 6554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org JSArray* array, 6564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int length, 6574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int capacity, 6584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS); 6594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 660fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Allocate a JSArray with no elements 661fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSArrayWithElements( 662fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org FixedArrayBase* array_base, 663fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 664fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org int length, 665fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure = NOT_TENURED); 666fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 6675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Returns a deep copy of the JavaScript object. 6685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Properties and elements are copied too. 6695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Returns failure if allocation failed. 670528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Optionally takes an AllocationSite to be appended in an AllocationMemento. 671528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org MUST_USE_RESULT MaybeObject* CopyJSObject(JSObject* source, 672528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org AllocationSite* site = NULL); 6735a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 674ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // Allocates a JS ArrayBuffer object. 675ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 676ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // failed. 677ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org // Please note this does not perform a garbage collection. 678ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSArrayBuffer(); 679ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 68034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Allocates a Harmony proxy or function proxy. 6817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 6827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // failed. 6837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Please note this does not perform a garbage collection. 6847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSProxy(Object* handler, 6857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Object* prototype); 6867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 68734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSFunctionProxy(Object* handler, 68834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Object* call_trap, 68934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Object* construct_trap, 69034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Object* prototype); 69134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 69234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Reinitialize a JSReceiver into an (empty) JS object of respective type and 69334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // size, but keeping the original prototype. The receiver must have at least 69434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // the size of the new object. The object is reinitialized and behaves as an 69534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // object that has been freshly allocated. 696c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Returns failure if an error occured, otherwise object. 69734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org MUST_USE_RESULT MaybeObject* ReinitializeJSReceiver(JSReceiver* object, 69834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org InstanceType type, 69934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org int size); 700717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 7015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Reinitialize an JSGlobalProxy based on a constructor. The object 70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // must have the same size as objects allocated using the 7035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // constructor. The object is reinitialized and behaves as an 70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // object that has been freshly allocated using the constructor. 705ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* ReinitializeJSGlobalProxy( 706ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org JSFunction* constructor, JSGlobalProxy* global); 70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates and initializes a new JavaScript object based on a map. 70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 712ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSObjectFromMap( 713594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Map* map, PretenureFlag pretenure = NOT_TENURED, bool alloc_props = true); 71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSObjectFromMapWithAllocationSite( 716bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org Map* map, Handle<AllocationSite> allocation_site); 7174a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a heap object based on the map. 71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 722ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* Allocate(Map* map, AllocationSpace space); 72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateWithAllocationSite(Map* map, 725bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org AllocationSpace space, Handle<AllocationSite> allocation_site); 7264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a JS Map in the heap. 72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 731c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MUST_USE_RESULT MaybeObject* AllocateMap( 732c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com InstanceType instance_type, 733c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int instance_size, 734830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND); 73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a partial map for bootstrapping. 737ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocatePartialMap(InstanceType instance_type, 738ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int instance_size); 73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 740ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Allocates an empty code cache. 741ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateCodeCache(); 742ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 7434acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org // Allocates a serialized scope info. 744c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org MUST_USE_RESULT MaybeObject* AllocateScopeInfo(int length); 7454acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 746eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // Allocates an External object for v8's external API. 747eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateExternal(void* value); 748eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 749e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org // Allocates an empty PolymorphicCodeCache. 750e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org MUST_USE_RESULT MaybeObject* AllocatePolymorphicCodeCache(); 751e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 752f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Allocates a pre-tenured empty AccessorPair. 753f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com MUST_USE_RESULT MaybeObject* AllocateAccessorPair(); 754f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 755f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org // Allocates an empty TypeFeedbackInfo. 756f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org MUST_USE_RESULT MaybeObject* AllocateTypeFeedbackInfo(); 757f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 758ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org // Allocates an AliasedArgumentsEntry. 759ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateAliasedArgumentsEntry(int slot); 760ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 761720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org // Clear the Instanceof cache (used when a prototype changes). 762ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void ClearInstanceofCache(); 763720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 764e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Iterates the whole code space to clear all ICs of the given kind. 765e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org void ClearAllICsByKind(Code::Kind kind); 766e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 76756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // For use during bootup. 76856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org void RepairFreeListsAfterBoot(); 76956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates and fully initializes a String. There are two String 77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // encodings: ASCII and two byte. One should choose between the three string 77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // allocation functions based on the encoding of the string buffer used to 77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // initialized the string. 77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // - ...FromAscii initializes the string from a buffer that is ASCII 77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // encoded (it does not check that the buffer is ASCII encoded) and the 77643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // result will be ASCII encoded. 77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // - ...FromUTF8 initializes the string from a buffer that is UTF-8 77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // encoded. If the characters are all single-byte characters, the 77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // result will be ASCII encoded, otherwise it will converted to two 78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // byte. 78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // - ...FromTwoByte initializes the string from a buffer that is two-byte 78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // encoded. If the characters are all single-byte characters, the 78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // result will be converted to ASCII, otherwise it will be left as 78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // two-byte. 78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 78743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 7888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org MUST_USE_RESULT MaybeObject* AllocateStringFromOneByte( 78959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const uint8_t> str, 79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PretenureFlag pretenure = NOT_TENURED); 79159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // TODO(dcarney): remove this function. 79259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateStringFromOneByte( 79359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const char> str, 79459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org PretenureFlag pretenure = NOT_TENURED) { 79559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return AllocateStringFromOneByte(Vector<const uint8_t>::cast(str), 79659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org pretenure); 79759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 798ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateStringFromUtf8( 7999e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org Vector<const char> str, 8009e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org PretenureFlag pretenure = NOT_TENURED); 801ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateStringFromUtf8Slow( 80243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Vector<const char> str, 80389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org int non_ascii_start, 80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PretenureFlag pretenure = NOT_TENURED); 805ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateStringFromTwoByte( 80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Vector<const uc16> str, 80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PretenureFlag pretenure = NOT_TENURED); 80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Allocates an internalized string in old space based on the character 8104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // stream. Returns Failure::RetryAfterGC(requested_bytes, space) if the 8114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // allocation failed. 81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 8134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateInternalizedStringFromUtf8( 81459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const char> str, 81559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int chars, 81659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint32_t hash_field); 817a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 8184a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateOneByteInternalizedString( 81959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const uint8_t> str, 8209e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org uint32_t hash_field); 8219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 8224a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateTwoByteInternalizedString( 8239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org Vector<const uc16> str, 8249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org uint32_t hash_field); 8259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 826a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org template<typename T> 827a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org static inline bool IsOneByte(T t, int chars); 828a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 829a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org template<typename T> 8304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateInternalizedStringImpl( 831a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org T t, int chars, uint32_t hash_field); 832a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 833a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org template<bool is_one_byte, typename T> 8344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateInternalizedStringImpl( 835a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org T t, int chars, uint32_t hash_field); 836a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates and partially initializes a String. There are two String 83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // encodings: ASCII and two byte. These functions allocate a string of the 83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // given length and set its map and length fields. The characters of the 84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // string are uninitialized. 84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 8448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org MUST_USE_RESULT MaybeObject* AllocateRawOneByteString( 84543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int length, 84643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PretenureFlag pretenure = NOT_TENURED); 847ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateRawTwoByteString( 84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int length, 84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PretenureFlag pretenure = NOT_TENURED); 85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Computes a single character string where the character has code. 8522efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // A cache is used for ASCII codes. 85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. Please note this does not perform a garbage collection. 855ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* LookupSingleCharacterStringFromCode( 856d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org uint16_t code); 85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a byte array of the specified length 85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 861a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Please note this does not perform a garbage collection. 8623d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org MUST_USE_RESULT MaybeObject* AllocateByteArray( 8633d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org int length, 8643d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Allocates an external array of the specified length and type. 8673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 8683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // failed. 8693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Please note this does not perform a garbage collection. 870ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateExternalArray( 871d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org int length, 872d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org ExternalArrayType array_type, 873d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org void* external_pointer, 874d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org PretenureFlag pretenure); 8753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 876f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // Allocate a symbol in old space. 8774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 8784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // failed. 8794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Please note this does not perform a garbage collection. 880f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org MUST_USE_RESULT MaybeObject* AllocateSymbol(); 8810cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org MUST_USE_RESULT MaybeObject* AllocatePrivateSymbol(); 8824a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 883bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org // Allocate a tenured AllocationSite. It's payload is null 884bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateAllocationSite(); 885bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a fixed array initialized with undefined values 88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 8903d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org MUST_USE_RESULT MaybeObject* AllocateFixedArray( 8913d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org int length, 8923d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org PretenureFlag pretenure = NOT_TENURED); 89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 894ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Allocates an uninitialized fixed array. It must be filled by the caller. 895ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // 896ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 897ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // failed. 898ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Please note this does not perform a garbage collection. 899ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateUninitializedFixedArray(int length); 900ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 90159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // Move len elements within a given array from src_index index to dst_index 90259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // index. 90359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org void MoveElements(FixedArray* array, int dst_index, int src_index, int len); 90459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 9055a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Make a copy of src and return it. Returns 9065a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 907ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT inline MaybeObject* CopyFixedArray(FixedArray* src); 9084a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 9094a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // Make a copy of src, set the map, and return the copy. Returns 9104a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 911ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* CopyFixedArrayWithMap(FixedArray* src, Map* map); 91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9132c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Make a copy of src and return it. Returns 9142c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 9152c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org MUST_USE_RESULT inline MaybeObject* CopyFixedDoubleArray( 9162c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org FixedDoubleArray* src); 9172c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 9182c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Make a copy of src, set the map, and return the copy. Returns 9192c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 9202c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org MUST_USE_RESULT MaybeObject* CopyFixedDoubleArrayWithMap( 9212c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org FixedDoubleArray* src, Map* map); 9222c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 923a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Make a copy of src and return it. Returns 924a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 925a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org MUST_USE_RESULT inline MaybeObject* CopyConstantPoolArray( 926a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ConstantPoolArray* src); 927a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 928a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Make a copy of src, set the map, and return the copy. Returns 929a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 930a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org MUST_USE_RESULT MaybeObject* CopyConstantPoolArrayWithMap( 931a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ConstantPoolArray* src, Map* map); 932a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a fixed array initialized with the hole values. 93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 937ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateFixedArrayWithHoles( 938c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org int length, 939c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org PretenureFlag pretenure = NOT_TENURED); 94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 941a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org MUST_USE_RESULT MaybeObject* AllocateConstantPoolArray( 942a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int first_int64_index, 943a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int first_ptr_index, 944a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int first_int32_index); 945a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 9466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Allocates a fixed double array with uninitialized values. Returns 9476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 9486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Please note this does not perform a garbage collection. 9496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org MUST_USE_RESULT MaybeObject* AllocateUninitializedFixedDoubleArray( 9506d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int length, 9516d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org PretenureFlag pretenure = NOT_TENURED); 9526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 953fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Allocates a fixed double array with hole values. Returns 954fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Failure::RetryAfterGC(requested_bytes, space) if the allocation failed. 955fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Please note this does not perform a garbage collection. 956fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateFixedDoubleArrayWithHoles( 957fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int length, 958fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure = NOT_TENURED); 959fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // AllocateHashTable is identical to AllocateFixedArray except 96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // that the resulting object has hash_table_map as map. 962ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateHashTable( 963d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org int length, PretenureFlag pretenure = NOT_TENURED); 96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 96546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Allocate a native (but otherwise uninitialized) context. 96646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateNativeContext(); 96746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 96846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Allocate a global context. 96946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org MUST_USE_RESULT MaybeObject* AllocateGlobalContext(JSFunction* function, 97046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ScopeInfo* scope_info); 97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 972ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Allocate a module context. 97381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateModuleContext(ScopeInfo* scope_info); 974ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a function context. 976ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateFunctionContext(int length, 9773cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org JSFunction* function); 97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9796d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Allocate a catch context. 9803cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org MUST_USE_RESULT MaybeObject* AllocateCatchContext(JSFunction* function, 9813cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org Context* previous, 9826d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org String* name, 9836d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org Object* thrown_object); 98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a 'with' context. 9853cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org MUST_USE_RESULT MaybeObject* AllocateWithContext(JSFunction* function, 9863cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org Context* previous, 987ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org JSReceiver* extension); 98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9894acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org // Allocate a block context. 9904acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateBlockContext(JSFunction* function, 9914acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org Context* previous, 992c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ScopeInfo* info); 9934acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a new utility object in the old generation. 995ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateStruct(InstanceType type); 99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a function initialized with a shared part. 99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 99943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 100043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1001ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateFunction( 1002d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Map* function_map, 1003d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org SharedFunctionInfo* shared, 1004d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Object* prototype, 1005d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org PretenureFlag pretenure = TENURED); 100643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1007ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Arguments object size. 1008846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org static const int kArgumentsObjectSize = 1009846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org JSObject::kHeaderSize + 2 * kPointerSize; 1010ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Strict mode arguments has no callee so it is smaller. 1011ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kArgumentsObjectSizeStrict = 1012ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org JSObject::kHeaderSize + 1 * kPointerSize; 1013ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Indicies for direct access into argument objects. 1014ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kArgumentsLengthIndex = 0; 1015ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // callee is only valid in non-strict mode. 1016ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kArgumentsCalleeIndex = 1; 101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates an arguments object - optionally with an elements array. 101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1022ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateArgumentsObject( 1023ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object* callee, int length); 102443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Same as NewNumberFromDouble, but may return a preallocated/immutable 102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // number object (e.g., minus_zero_value_, nan_value_) 1027ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* NumberFromDouble( 1028d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org double value, PretenureFlag pretenure = NOT_TENURED); 102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocated a HeapNumber from value. 1031ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateHeapNumber( 10323d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org double value, PretenureFlag pretenure = NOT_TENURED); 103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Converts an int into either a Smi or a HeapNumber object. 103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 10380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry MUST_USE_RESULT inline MaybeObject* NumberFromInt32( 10390ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry int32_t value, PretenureFlag pretenure = NOT_TENURED); 104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Converts an int into either a Smi or a HeapNumber object. 104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 10450ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry MUST_USE_RESULT inline MaybeObject* NumberFromUint32( 10460ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry uint32_t value, PretenureFlag pretenure = NOT_TENURED); 104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1048ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org // Allocates a new foreign object. 104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 105043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1052ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org MUST_USE_RESULT MaybeObject* AllocateForeign( 1053ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org Address address, PretenureFlag pretenure = NOT_TENURED); 105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a new SharedFunctionInfo object. 105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1059ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateSharedFunctionInfo(Object* name); 106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // Allocates a new JSMessageObject object. 106231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 106331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // failed. 106431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org // Please note that this does not perform a garbage collection. 1065ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSMessageObject( 106631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org String* type, 106731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org JSArray* arguments, 106831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org int start_position, 106931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org int end_position, 107031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* script, 107131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* stack_trace, 107231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* stack_frames); 107331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 107443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a new cons string object. 107543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1078ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateConsString(String* first, 1079ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org String* second); 108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocates a new sub string object which is a substring of an underlying 108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // string buffer stretching from the index start (inclusive) to the index 108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // end (exclusive). 108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 108643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1087ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateSubString( 1088d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org String* buffer, 1089d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org int start, 1090d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org int end, 1091d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org PretenureFlag pretenure = NOT_TENURED); 109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate a new external string object, which is backed by a string 109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // resource that resides outside the V8 heap. 109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this does not perform a garbage collection. 1098ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateExternalStringFromAscii( 1099c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const ExternalAsciiString::Resource* resource); 1100ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateExternalStringFromTwoByte( 1101c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const ExternalTwoByteString::Resource* resource); 110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Finalizes an external string by deleting the associated external 110413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // data and clearing the resource pointer. 1105ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void FinalizeExternalString(String* string); 110613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 11079258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // Allocates an uninitialized object. The memory is non-executable if the 11089258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // hardware and OS allow. 110943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 111043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 111143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 1112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT inline MaybeObject* AllocateRaw(int size_in_bytes, 1113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org AllocationSpace space, 1114ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org AllocationSpace retry_space); 11157276f14ca716596e0a0d17539516370c1f453847kasper.lund 11166f10e41fef1524c70846d970268de222e41c594cager@chromium.org // Initialize a filler object to keep the ability to iterate over the heap 11176f10e41fef1524c70846d970268de222e41c594cager@chromium.org // when shortening objects. 1118ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void CreateFillerObjectAt(Address addr, int size); 11196f10e41fef1524c70846d970268de222e41c594cager@chromium.org 112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Makes a new native code object 112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 1122a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // failed. On success, the pointer to the Code object is stored in the 1123a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // self_reference. This allows generated code to reference its own Code 1124a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // object by containing this pointer. 112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 1126c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org MUST_USE_RESULT MaybeObject* CreateCode( 1127c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org const CodeDesc& desc, 1128c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org Code::Flags flags, 1129c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org Handle<Object> self_reference, 1130c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org bool immovable = false, 1131c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org bool crankshafted = false, 1132c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org int prologue_offset = Code::kPrologueOffsetNotSet); 113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* CopyCode(Code* code); 1135086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 1136086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Copy the code and scope info part of the code object, but insert 1137086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // the provided data as the relocation information. 1138ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* CopyCode(Code* code, Vector<byte> reloc_info); 1139086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 11404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Finds the internalized copy for string in the string table. 11414a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // If not found, a new string is added to the table and returned. 114243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if allocation 114343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 11454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* InternalizeUtf8String(Vector<const char> str); 11464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* InternalizeUtf8String(const char* str) { 11474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return InternalizeUtf8String(CStrVector(str)); 11484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 11494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* InternalizeOneByteString( 11504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Vector<const uint8_t> str); 11514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* InternalizeTwoByteString(Vector<const uc16> str); 11524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* InternalizeString(String* str); 11534a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* InternalizeOneByteString( 1154fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org Handle<SeqOneByteString> string, int from, int length); 115540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 11564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org bool InternalizeStringIfExists(String* str, String** result); 11574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org bool InternalizeTwoCharsStringIfExists(String* str, String** result); 115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Compute the matching internalized string map for a string if possible. 116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // NULL is returned if string is in new space or not flattened. 11614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Map* InternalizedStringMapForString(String* str); 116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1163086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Tries to flatten a string before compare operation. 1164086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // 1165086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Returns a failure in case it was decided that flattening was 1166086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // necessary and failed. Note, if flattening is not necessary the 1167086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // string might stay non-flat even when not a failure is returned. 1168086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // 1169086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Please note this function does not perform a garbage collection. 1170ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT inline MaybeObject* PrepareForCompare(String* str); 1171086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Converts the given boolean condition to JavaScript boolean value. 1173ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline Object* ToBoolean(bool condition); 117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1175f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Performs garbage collection operation. 1176f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Returns whether there is a chance that another major GC could 1177f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // collect more garbage. 1178994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org inline bool CollectGarbage(AllocationSpace space, 1179994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* gc_reason = NULL); 118043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1181c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const int kNoGCFlags = 0; 1182bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com static const int kSweepPreciselyMask = 1; 1183994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org static const int kReduceMemoryFootprintMask = 2; 1184bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com static const int kAbortIncrementalMarkingMask = 4; 1185bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1186bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Making the heap iterable requires us to sweep precisely and abort any 1187bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // incremental marking as well. 1188bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com static const int kMakeHeapIterableMask = 1189bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com kSweepPreciselyMask | kAbortIncrementalMarkingMask; 1190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1191c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Performs a full garbage collection. If (flags & kMakeHeapIterableMask) is 1192c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // non-zero, then the slower precise sweeper is used, which leaves the heap 1193c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // in a state where we can iterate over the heap visiting all objects. 1194994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org void CollectAllGarbage(int flags, const char* gc_reason = NULL); 11959258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 1196f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Last hope GC, should try to squeeze as much as possible. 1197994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org void CollectAllAvailableGarbage(const char* gc_reason = NULL); 1198f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 1199c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Check whether the heap is currently iterable. 1200c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool IsHeapIterable(); 1201c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Ensure that we have swept all spaces in such a way that we can iterate 1203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // over all objects. May cause a GC. 1204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void EnsureHeapIsIterable(); 1205c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1206061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // Notify the heap that a context has been disposed. 1207594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int NotifyContextDisposed(); 1208061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 120943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Utility to invoke the scavenger. This is needed in test code to 121043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ensure correct callback for weak global handles. 1211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void PerformScavenge(); 1212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1213c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void increment_scan_on_scavenge_pages() { 1214c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scan_on_scavenge_pages_++; 1215c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_gc_verbose) { 1216c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF("Scan-on-scavenge pages: %d\n", scan_on_scavenge_pages_); 1217c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1218c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void decrement_scan_on_scavenge_pages() { 1221c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scan_on_scavenge_pages_--; 1222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_gc_verbose) { 1223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF("Scan-on-scavenge pages: %d\n", scan_on_scavenge_pages_); 1224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1225c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1226c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PromotionQueue* promotion_queue() { return &promotion_queue_; } 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#ifdef DEBUG 12305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Utility used with flag gc-greedy. 1231ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void GarbageCollectionGreedyCheck(); 12325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#endif 12335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1234528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org void AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback, 1235528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type_filter, 1236528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate = true); 1237528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org void RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback); 12382f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 1239528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org void AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, 1240528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type_filter, 1241528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate = true); 1242528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org void RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback); 124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // Heap root getters. We have versions with and without type::cast() here. 124568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // You can't use type::cast during GC because the assert fails. 1246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // TODO(1490): Try removing the unchecked accessors, now that GC marking does 1247659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // not corrupt the map. 124868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#define ROOT_ACCESSOR(type, name, camel_name) \ 1249ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org type* name() { \ 125068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return type::cast(roots_[k##camel_name##RootIndex]); \ 125168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } \ 1252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org type* raw_unchecked_##name() { \ 125368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return reinterpret_cast<type*>(roots_[k##camel_name##RootIndex]); \ 125468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ROOT_LIST(ROOT_ACCESSOR) 125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef ROOT_ACCESSOR 125743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Utility type maps 125968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#define STRUCT_MAP_ACCESSOR(NAME, Name, name) \ 1260ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Map* name##_map() { \ 126168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return Map::cast(roots_[k##Name##MapRootIndex]); \ 126268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen STRUCT_LIST(STRUCT_MAP_ACCESSOR) 126443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef STRUCT_MAP_ACCESSOR 126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#define STRING_ACCESSOR(name, str) String* name() { \ 126768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return String::cast(roots_[k##name##RootIndex]); \ 126868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 12694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org INTERNALIZED_STRING_LIST(STRING_ACCESSOR) 12704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#undef STRING_ACCESSOR 127143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // The hidden_string is special because it is the empty string, but does 12733b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org // not match the empty string. 12744a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org String* hidden_string() { return hidden_string_; } 12753b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 127646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org void set_native_contexts_list(Object* object) { 127746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_contexts_list_ = object; 12784a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 127946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Object* native_contexts_list() { return native_contexts_list_; } 12804a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 12811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void set_array_buffers_list(Object* object) { 12821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org array_buffers_list_ = object; 12831fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 12841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Object* array_buffers_list() { return array_buffers_list_; } 12851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 1286ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org void set_allocation_sites_list(Object* object) { 1287ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org allocation_sites_list_ = object; 1288ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1289ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Object* allocation_sites_list() { return allocation_sites_list_; } 1290ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Object** allocation_sites_list_address() { return &allocation_sites_list_; } 12911fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 129225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org Object* weak_object_to_code_table() { return weak_object_to_code_table_; } 129325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 1294b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org // Number of mark-sweeps. 1295b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org unsigned int ms_count() { return ms_count_; } 1296b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org 129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterates over all roots in the heap. 1298ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void IterateRoots(ObjectVisitor* v, VisitMode mode); 129943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterates over all strong roots in the heap. 1300ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void IterateStrongRoots(ObjectVisitor* v, VisitMode mode); 1301b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Iterates over all the other roots in the heap. 1302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void IterateWeakRoots(ObjectVisitor* v, VisitMode mode); 130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13046a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org // Iterate pointers to from semispace of new space found in memory interval 13056a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org // from start to end. 1306ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void IterateAndMarkPointersToFromSpace(Address start, 1307ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address end, 1308ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ObjectSlotCallback callback); 130930ce411529579186181838984710b0b0980857aaricow@chromium.org 131043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns whether the object resides in new space. 1311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline bool InNewSpace(Object* object); 1312750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline bool InNewSpace(Address address); 1313750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline bool InNewSpacePage(Address address); 1314ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline bool InFromSpace(Object* object); 1315ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline bool InToSpace(Object* object); 131643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1317750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Returns whether the object resides in old pointer space. 1318750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline bool InOldPointerSpace(Address address); 1319750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org inline bool InOldPointerSpace(Object* object); 1320750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1321e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Returns whether the object resides in old data space. 1322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inline bool InOldDataSpace(Address address); 1323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inline bool InOldDataSpace(Object* object); 1324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 132543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Checks whether an address/object in the heap (including auxiliary 132643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // area and unused area). 1327ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool Contains(Address addr); 1328ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool Contains(HeapObject* value); 132943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 133043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Checks whether an address/object in a space. 13313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Currently used by tests, serialization and heap verification only. 1332ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool InSpace(Address addr, AllocationSpace space); 1333ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool InSpace(HeapObject* value, AllocationSpace space); 133443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13357276f14ca716596e0a0d17539516370c1f453847kasper.lund // Finds out which space an object should get promoted to based on its type. 1336ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline OldSpace* TargetSpace(HeapObject* object); 1337d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org static inline AllocationSpace TargetSpaceId(InstanceType type); 13387276f14ca716596e0a0d17539516370c1f453847kasper.lund 1339ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org // Checks whether the given object is allowed to be migrated from it's 1340ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org // current space into the given destination space. Used for debugging. 1341ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org inline bool AllowedToBeMigrated(HeapObject* object, AllocationSpace dest); 1342ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org 134343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Sets the stub_cache_ (only used when expanding the dictionary). 1344f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com void public_set_code_stubs(UnseededNumberDictionary* value) { 134568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org roots_[kCodeStubsRootIndex] = value; 134668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 134743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1348d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Support for computing object sizes for old objects during GCs. Returns 1349d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // a function that is guaranteed to be safe for computing object sizes in 1350d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // the current GC phase. 1351ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org HeapObjectCallback GcSafeSizeOfOldObjectFunction() { 1352d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org return gc_safe_size_of_old_object_; 1353d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org } 1354d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 135543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Sets the non_monomorphic_cache_ (only used when expanding the dictionary). 1356f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com void public_set_non_monomorphic_cache(UnseededNumberDictionary* value) { 135768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org roots_[kNonMonomorphicCacheRootIndex] = value; 135843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 135943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1360ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void public_set_empty_script(Script* script) { 13615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org roots_[kEmptyScriptRootIndex] = script; 13625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 13635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void public_set_store_buffer_top(Address* top) { 1365c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com roots_[kStoreBufferTopRootIndex] = reinterpret_cast<Smi*>(top); 1366c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1367c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1368ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org // Generated code can embed this address to get access to the roots. 1369394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Object** roots_array_start() { return roots_; } 1370ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org 1371c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address* store_buffer_top_address() { 1372c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return reinterpret_cast<Address*>(&roots_[kStoreBufferTopRootIndex]); 1373c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1374c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 137546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Get address of native contexts list for serialization support. 137646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Object** native_contexts_list_address() { 137746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return &native_contexts_list_; 13784a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 13794a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 1380c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 1381c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // Verify the heap is in its normal state before or after a GC. 1382c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org void Verify(); 138394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 138494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 138525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org bool weak_embedded_objects_verification_enabled() { 138625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org return no_weak_object_verification_scope_depth_ == 0; 138794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org } 1388c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 1389c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 1391ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void Print(); 1392ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void PrintHandles(); 139343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1394c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void OldPointerSpaceCheckStoreBuffer(); 1395c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void MapSpaceCheckStoreBuffer(); 1396c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void LargeObjectSpaceCheckStoreBuffer(); 1397c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 139843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Report heap statistics. 1399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ReportHeapStatistics(const char* title); 1400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ReportCodeStatistics(const char* title); 1401c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 1402c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 1403c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // Zapping is needed for verify heap, and always done in debug builds. 1404c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org static inline bool ShouldZapGarbage() { 1405c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef DEBUG 1406c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return true; 1407c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#else 1408c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 1409c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return FLAG_verify_heap; 1410c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#else 1411c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return false; 1412c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 1413c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 1414c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org } 141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1416e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Print short heap statistics. 1417ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void PrintShortHeapStatistics(); 1418e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 14194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Makes a new internalized string object 142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns Failure::RetryAfterGC(requested_bytes, space) if the allocation 142143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // failed. 142243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Please note this function does not perform a garbage collection. 14234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* CreateInternalizedString( 1424ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const char* str, int length, int hash); 14254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MUST_USE_RESULT MaybeObject* CreateInternalizedString(String* str); 142643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 142743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Write barrier support for address[offset] = o. 14282e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org INLINE(void RecordWrite(Address address, int offset)); 142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1430ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org // Write barrier support for address[start : start + len[ = o. 14312e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org INLINE(void RecordWrites(Address address, int start, int len)); 1432ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen enum HeapState { NOT_IN_GC, SCAVENGE, MARK_COMPACT }; 1434ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline HeapState gc_state() { return gc_state_; } 143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1436d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com inline bool IsInGCPostProcessing() { return gc_post_processing_depth_ > 0; } 1437d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 1439ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org void set_allocation_timeout(int timeout) { 1440ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org allocation_timeout_ = timeout; 1441ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org } 1442ebeba02c9ae4ffb0ceab36eb7239f143420f8607rossberg@chromium.org 1443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool disallow_allocation_failure() { 144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return disallow_allocation_failure_; 144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 144643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1447ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org void TracePathToObjectFrom(Object* target, Object* root); 1448ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void TracePathToObject(Object* target); 1449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void TracePathToGlobal(); 145043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Callback function passed to Heap::Iterate etc. Copies an object if 145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // necessary, the object might be promoted to an old space. The caller must 145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // ensure the precondition that the object is (a) a heap object and (b) in 145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // the heap's from space. 1456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline void ScavengePointer(HeapObject** p); 14575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org static inline void ScavengeObject(HeapObject** p, HeapObject* object); 145843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1459c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // An object may have an AllocationSite associated with it through a trailing 1460c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // AllocationMemento. Its feedback should be updated when objects are found 1461c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // in the heap. 1462c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org static inline void UpdateAllocationSiteFeedback(HeapObject* object); 1463c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 146456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // Support for partial snapshots. After calling this we have a linear 146556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // space to write objects in each space. 146656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org void ReserveSpace(int *sizes, Address* addresses); 14670c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 146843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 146943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Support for the API. 147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool CreateApiObjects(); 147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 147443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Attempt to find the number in a small cache. If we finds it, return 147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // the string representation of the number. Otherwise return undefined. 1476ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object* GetNumberStringCache(Object* number); 147743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 147843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Update the cache with a new number-string pair. 1479ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void SetNumberStringCache(Object* number, String* str); 148043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14817276f14ca716596e0a0d17539516370c1f453847kasper.lund // Adjusts the amount of registered external memory. 14827276f14ca716596e0a0d17539516370c1f453847kasper.lund // Returns the adjusted value. 14837ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org inline int64_t AdjustAmountOfExternalAllocatedMemory( 14847ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int64_t change_in_bytes); 14857276f14ca716596e0a0d17539516370c1f453847kasper.lund 1486a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org // This is only needed for testing high promotion mode. 1487a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org void SetNewSpaceHighPromotionModeActive(bool mode) { 1488a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org new_space_high_promotion_mode_active_ = mode; 1489e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 1490e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1491d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // Returns the allocation mode (pre-tenuring) based on observed promotion 1492d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // rates of previous collections. 149357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org inline PretenureFlag GetPretenureMode() { 1494d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return FLAG_pretenuring && new_space_high_promotion_mode_active_ 1495d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ? TENURED : NOT_TENURED; 149657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 149757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 149857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org inline Address* NewSpaceHighPromotionModeActiveAddress() { 149957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org return reinterpret_cast<Address*>(&new_space_high_promotion_mode_active_); 150057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 150157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 1502c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline intptr_t PromotedTotalSize() { 15037ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int64_t total = PromotedSpaceSizeOfObjects() + PromotedExternalMemorySize(); 15047ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org if (total > kMaxInt) return static_cast<intptr_t>(kMaxInt); 15057ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org if (total < 0) return 0; 15067ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org return static_cast<intptr_t>(total); 1507c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1508c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1509c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline intptr_t OldGenerationSpaceAvailable() { 1510a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return old_generation_allocation_limit_ - PromotedTotalSize(); 15110c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 15120c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 1513bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com inline intptr_t OldGenerationCapacityAvailable() { 1514bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com return max_old_generation_size_ - PromotedTotalSize(); 1515bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 1516bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1517a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org static const intptr_t kMinimumOldGenerationAllocationLimit = 1518c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 8 * (Page::kPageSize > MB ? Page::kPageSize : MB); 1519c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1520a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org intptr_t OldGenerationAllocationLimit(intptr_t old_gen_size) { 1521ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org const int divisor = FLAG_stress_compaction ? 10 : 1522ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org new_space_high_promotion_mode_active_ ? 1 : 3; 1523d9e468a431d0d87cf3e9898459410eedb1ea9e9aulan@chromium.org intptr_t limit = 1524a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org Max(old_gen_size + old_gen_size / divisor, 1525a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org kMinimumOldGenerationAllocationLimit); 1526c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com limit += new_space_.Capacity(); 15274e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // TODO(hpayer): Can be removed when when pretenuring is supported for all 15284e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // allocation sites. 15294e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (IsHighSurvivalRate() && IsStableOrIncreasingSurvivalTrend()) { 15304e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org limit *= 2; 15314e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 1532c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org intptr_t halfway_to_the_max = (old_gen_size + max_old_generation_size_) / 2; 1533c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return Min(limit, halfway_to_the_max); 15349bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org } 15359bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 1536b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Indicates whether inline bump-pointer allocation has been disabled. 1537b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org bool inline_allocation_disabled() { return inline_allocation_disabled_; } 1538b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 1539b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Switch whether inline bump-pointer allocation should be used. 1540b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org void EnableInlineAllocation(); 1541b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org void DisableInlineAllocation(); 1542b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 1543ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // Implements the corresponding V8 API function. 1544ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org bool IdleNotification(int hint); 1545ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org 1546ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org // Declare all the root indices. 1547ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org enum RootListIndex { 1548ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org#define ROOT_INDEX_DECLARATION(type, name, camel_name) k##camel_name##RootIndex, 1549ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org STRONG_ROOT_LIST(ROOT_INDEX_DECLARATION) 1550ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org#undef ROOT_INDEX_DECLARATION 1551ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org 15524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#define STRING_INDEX_DECLARATION(name, str) k##name##RootIndex, 15534a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org INTERNALIZED_STRING_LIST(STRING_INDEX_DECLARATION) 15544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#undef STRING_DECLARATION 1555ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org 155699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org // Utility type maps 155799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#define DECLARE_STRUCT_MAP(NAME, Name, name) k##Name##MapRootIndex, 155899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org STRUCT_LIST(DECLARE_STRUCT_MAP) 155999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org#undef DECLARE_STRUCT_MAP 156099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 15614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org kStringTableRootIndex, 15624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org kStrongRootListLength = kStringTableRootIndex, 1563ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org kRootListLength 1564ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org }; 1565ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org 1566efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org STATIC_CHECK(kUndefinedValueRootIndex == Internals::kUndefinedValueRootIndex); 1567efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org STATIC_CHECK(kNullValueRootIndex == Internals::kNullValueRootIndex); 1568efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org STATIC_CHECK(kTrueValueRootIndex == Internals::kTrueValueRootIndex); 1569efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org STATIC_CHECK(kFalseValueRootIndex == Internals::kFalseValueRootIndex); 15704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org STATIC_CHECK(kempty_stringRootIndex == Internals::kEmptyStringRootIndex); 1571efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 1572e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // Generated code can embed direct references to non-writable roots if 1573e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // they are in new space. 1574e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org static bool RootCanBeWrittenAfterInitialization(RootListIndex root_index); 1575594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Generated code can treat direct references to this root as constant. 1576594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool RootCanBeTreatedAsConstant(RootListIndex root_index); 1577e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1578ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* NumberToString( 157957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Object* number, bool check_number_string_cache = true, 158057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org PretenureFlag pretenure = NOT_TENURED); 1581c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MUST_USE_RESULT MaybeObject* Uint32ToString( 1582c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com uint32_t value, bool check_number_string_cache = true); 1583c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1584ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Map* MapForExternalArrayType(ExternalArrayType array_type); 1585ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org RootListIndex RootIndexForExternalArrayType( 15863811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org ExternalArrayType array_type); 15873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 15884e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org RootListIndex RootIndexForEmptyExternalArray(ElementsKind kind); 15894e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org ExternalArray* EmptyExternalArrayForMap(Map* map); 15904e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 1591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void RecordStats(HeapStats* stats, bool take_snapshot = false); 15926012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org 1593b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Copy block of memory from src to dst. Size of block should be aligned 1594b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // by pointer size. 159530ce411529579186181838984710b0b0980857aaricow@chromium.org static inline void CopyBlock(Address dst, Address src, int byte_size); 159630ce411529579186181838984710b0b0980857aaricow@chromium.org 1597b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Optimized version of memmove for blocks with pointer size aligned sizes and 1598b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // pointer size aligned addresses. 159930ce411529579186181838984710b0b0980857aaricow@chromium.org static inline void MoveBlock(Address dst, Address src, int byte_size); 160030ce411529579186181838984710b0b0980857aaricow@chromium.org 1601b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Check new space expansion criteria and expand semispaces if it was hit. 1602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void CheckNewSpaceExpansionCriteria(); 1603b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void IncrementYoungSurvivorsCounter(int survived) { 1605659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org ASSERT(survived >= 0); 160640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org young_survivors_after_last_gc_ = survived; 1607b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org survived_since_last_expansion_ += survived; 1608b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } 1609b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1610c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline bool NextGCIsLikelyToBeFull() { 1611c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_gc_global) return true; 1612c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1613efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org if (FLAG_stress_compaction && (gc_count_ & 1) != 0) return true; 1614efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 1615c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t adjusted_allocation_limit = 1616a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org old_generation_allocation_limit_ - new_space_.Capacity(); 1617c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1618a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (PromotedTotalSize() >= adjusted_allocation_limit) return true; 1619c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1620c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return false; 1621c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1622c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void UpdateNewSpaceReferencesInExternalStringTable( 1624b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org ExternalStringTableUpdaterCallback updater_func); 1625b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1626c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void UpdateReferencesInExternalStringTable( 1627c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ExternalStringTableUpdaterCallback updater_func); 1628c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1629ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ProcessWeakReferences(WeakObjectRetainer* retainer); 16304a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 1631f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com void VisitExternalResources(v8::ExternalResourceVisitor* visitor); 1632f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1633b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Helper function that governs the promotion policy from new space to 1634b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // old. If the object's old address lies below the new space's age 1635b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // mark or if we've already filled the bottom 1/16th of the to space, 1636b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // we try to promote this object. 1637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline bool ShouldBePromoted(Address old_address, int object_size); 1638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1639ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ClearJSFunctionResultCaches(); 1640ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1641ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ClearNormalizedMapCaches(); 1642ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GCTracer* tracer() { return tracer_; } 1644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1645c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Returns the size of objects residing in non new spaces. 1646659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org intptr_t PromotedSpaceSizeOfObjects(); 1647c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 164883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org double total_regexp_code_generated() { return total_regexp_code_generated_; } 164983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org void IncreaseTotalRegexpCodeGenerated(int size) { 165083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org total_regexp_code_generated_ += size; 165183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org } 165283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 1653a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org void IncrementCodeGeneratedBytes(bool is_crankshafted, int size) { 1654a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org if (is_crankshafted) { 1655a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org crankshaft_codegen_bytes_generated_ += size; 1656a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } else { 1657a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org full_codegen_bytes_generated_ += size; 1658a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 1659a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 1660a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 1661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Returns maximum GC pause. 1662c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org double get_max_gc_pause() { return max_gc_pause_; } 1663b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1664ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Returns maximum size of objects alive after GC. 1665ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t get_max_alive_after_gc() { return max_alive_after_gc_; } 1666ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1667ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Returns minimal interval between two subsequent collections. 1668c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org double get_min_in_mutator() { return min_in_mutator_; } 1669b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org 1670e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org // TODO(hpayer): remove, should be handled by GCTracer 1671e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org void AddMarkingTime(double marking_time) { 1672e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org marking_time_ += marking_time; 1673e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org } 1674e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 1675e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org double marking_time() const { 1676e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org return marking_time_; 1677e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org } 1678e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 1679e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org // TODO(hpayer): remove, should be handled by GCTracer 1680e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org void AddSweepingTime(double sweeping_time) { 1681e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org sweeping_time_ += sweeping_time; 1682e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org } 1683e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 1684e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org double sweeping_time() const { 1685e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org return sweeping_time_; 1686e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org } 1687e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 1688ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MarkCompactCollector* mark_compact_collector() { 1689ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return &mark_compact_collector_; 1690ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1691720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 1692c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBuffer* store_buffer() { 1693c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return &store_buffer_; 1694c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1695c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1696c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Marking* marking() { 1697c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return &marking_; 1698c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1699c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1700c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com IncrementalMarking* incremental_marking() { 1701c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return &incremental_marking_; 1702c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1703c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1704ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org bool IsSweepingComplete() { 17052f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org return !mark_compact_collector()->IsConcurrentSweepingInProgress() && 17062f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org old_data_space()->IsLazySweepingComplete() && 17072f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org old_pointer_space()->IsLazySweepingComplete(); 1708ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 1709ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 17109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org bool AdvanceSweepers(int step_size); 1711ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 1712750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool EnsureSweepersProgressed(int step_size) { 1713750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org bool sweeping_complete = old_data_space()->EnsureSweeperProgress(step_size); 1714750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org sweeping_complete &= old_pointer_space()->EnsureSweeperProgress(step_size); 1715750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return sweeping_complete; 1716750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 1717750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1718ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExternalStringTable* external_string_table() { 1719ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return &external_string_table_; 1720ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 172165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 1722ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Returns the current sweep generation. 1723ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org int sweep_generation() { 1724ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org return sweep_generation_; 1725ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 1726ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 1727ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline Isolate* isolate(); 17289dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 1729ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org void CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags); 1730003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org void CallGCEpilogueCallbacks(GCType gc_type); 1731b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 1732c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline bool OldGenerationAllocationLimitReached(); 1733c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1734c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void DoScavengeObject(Map* map, HeapObject** slot, HeapObject* obj) { 1735c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scavenging_visitors_table_.GetVisitor(map)(map, slot, obj); 1736c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1737c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1738c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void QueueMemoryChunkForFree(MemoryChunk* chunk); 1739c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void FreeQueuedChunks(); 1740c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1741e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org int gc_count() const { return gc_count_; } 1742e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1743c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Completely clear the Instanceof cache (to stop it keeping objects alive 1744c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // around a GC). 1745c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void CompletelyClearInstanceofCache(); 1746c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1747394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // The roots that have an index less than this are always in old space. 1748394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com static const int kOldSpaceRoots = 0x20; 1749394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 1750f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com uint32_t HashSeed() { 1751f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com uint32_t seed = static_cast<uint32_t>(hash_seed()->value()); 1752f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com ASSERT(FLAG_randomize_hashes || seed == 0); 1753fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org return seed; 1754fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 1755fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 1756659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org void SetArgumentsAdaptorDeoptPCOffset(int pc_offset) { 1757659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org ASSERT(arguments_adaptor_deopt_pc_offset() == Smi::FromInt(0)); 1758659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org set_arguments_adaptor_deopt_pc_offset(Smi::FromInt(pc_offset)); 1759659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 1760659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 1761967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org void SetConstructStubDeoptPCOffset(int pc_offset) { 1762967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org ASSERT(construct_stub_deopt_pc_offset() == Smi::FromInt(0)); 1763967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org set_construct_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); 1764967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org } 1765967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 1766de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org void SetGetterStubDeoptPCOffset(int pc_offset) { 1767de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org ASSERT(getter_stub_deopt_pc_offset() == Smi::FromInt(0)); 1768de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org set_getter_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); 1769de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org } 1770de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 177146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org void SetSetterStubDeoptPCOffset(int pc_offset) { 177246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(setter_stub_deopt_pc_offset() == Smi::FromInt(0)); 177346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org set_setter_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); 177446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 177546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 17762c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org // For post mortem debugging. 17772c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org void RememberUnmappedPage(Address page, bool compacted); 17782c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 177988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // Global inline caching age: it is incremented on some GCs after context 178088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org // disposal. We use it to flush inline caches. 178188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org int global_ic_age() { 178288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org return global_ic_age_; 178388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 178488aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org 178588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org void AgeInlineCaches() { 17867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org global_ic_age_ = (global_ic_age_ + 1) & SharedFunctionInfo::ICAgeBits::kMax; 178788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org } 178888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org 1789c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org bool flush_monomorphic_ics() { return flush_monomorphic_ics_; } 1790c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 17917ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int64_t amount_of_external_allocated_memory() { 1792471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return amount_of_external_allocated_memory_; 1793471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 1794471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1795753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org // ObjectStats are kept in two arrays, counts and sizes. Related stats are 1796753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org // stored in a contiguous linear buffer. Stats groups are stored one after 1797753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org // another. 1798753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org enum { 1799753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org FIRST_CODE_KIND_SUB_TYPE = LAST_TYPE + 1, 1800304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org FIRST_FIXED_ARRAY_SUB_TYPE = 18011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FIRST_CODE_KIND_SUB_TYPE + Code::NUMBER_OF_KINDS, 1802e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org FIRST_CODE_AGE_SUB_TYPE = 1803e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org FIRST_FIXED_ARRAY_SUB_TYPE + LAST_FIXED_ARRAY_SUB_TYPE + 1, 1804057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org OBJECT_STATS_COUNT = FIRST_CODE_AGE_SUB_TYPE + Code::kCodeAgeCount + 1 1805753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org }; 1806753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 1807e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org void RecordObjectStats(InstanceType type, size_t size) { 180828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org ASSERT(type <= LAST_TYPE); 1809e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org object_counts_[type]++; 1810e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org object_sizes_[type] += size; 1811e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org } 1812e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 1813e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org void RecordCodeSubTypeStats(int code_sub_type, int code_age, size_t size) { 1814057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org int code_sub_type_index = FIRST_CODE_KIND_SUB_TYPE + code_sub_type; 1815057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org int code_age_index = 1816057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org FIRST_CODE_AGE_SUB_TYPE + code_age - Code::kFirstCodeAge; 1817057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org ASSERT(code_sub_type_index >= FIRST_CODE_KIND_SUB_TYPE && 1818057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org code_sub_type_index < FIRST_CODE_AGE_SUB_TYPE); 1819057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org ASSERT(code_age_index >= FIRST_CODE_AGE_SUB_TYPE && 1820057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org code_age_index < OBJECT_STATS_COUNT); 1821057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org object_counts_[code_sub_type_index]++; 1822057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org object_sizes_[code_sub_type_index] += size; 1823057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org object_counts_[code_age_index]++; 1824057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org object_sizes_[code_age_index] += size; 1825e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org } 1826e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 1827e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org void RecordFixedArraySubTypeStats(int array_sub_type, size_t size) { 1828e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org ASSERT(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE); 1829e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++; 1830e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size; 183128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org } 183228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 183328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org void CheckpointObjectStats(); 183428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 1835dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org // We don't use a LockGuard here since we want to lock the heap 18369259716434187c932704601f700375e53d865de8rossberg@chromium.org // only when FLAG_concurrent_recompilation is true. 1837ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org class RelocationLock { 1838ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org public: 18399af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org explicit RelocationLock(Heap* heap) : heap_(heap) { 18409af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (FLAG_concurrent_recompilation) { 18419af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org heap_->relocation_mutex_->Lock(); 18429af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18439af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18449af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 1845ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 1846ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org ~RelocationLock() { 18479259716434187c932704601f700375e53d865de8rossberg@chromium.org if (FLAG_concurrent_recompilation) { 1848ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org heap_->relocation_mutex_->Unlock(); 1849ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org } 1850ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org } 1851ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 1852ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org private: 1853ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Heap* heap_; 1854ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org }; 1855ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 185625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org MaybeObject* AddWeakObjectToCodeDependency(Object* obj, DependentCode* dep); 185725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 185825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org DependentCode* LookupWeakObjectToCodeDependency(Object* obj); 185925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 186025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org void InitializeWeakObjectToCodeTable() { 186125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org set_weak_object_to_code_table(undefined_value()); 186225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org } 186325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 186425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org void EnsureWeakObjectToCodeTable(); 186525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 186643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1867ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Heap(); 1868ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1869ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // This can be calculated directly from a pointer to the heap; however, it is 1870ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // more expedient to get at the isolate directly from within Heap methods. 1871ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate_; 1872ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1873efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org Object* roots_[kRootListLength]; 1874efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 1875c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t code_range_size_; 1876ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int reserved_semispace_size_; 1877ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int max_semispace_size_; 1878ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int initial_semispace_size_; 1879ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t max_old_generation_size_; 1880ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t max_executable_size_; 1881057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org intptr_t maximum_committed_; 188243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1883eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // For keeping track of how much data has survived 1884eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // scavenge since last new space expansion. 1885ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int survived_since_last_expansion_; 188643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1887ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // For keeping track on when to flush RegExp code. 1888ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org int sweep_generation_; 1889ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 1890ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int always_allocate_scope_depth_; 1891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int linear_allocation_scope_depth_; 18928b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org 18938b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org // For keeping track of context disposals. 1894ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int contexts_disposed_; 18959bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 189688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org int global_ic_age_; 189788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org 1898c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org bool flush_monomorphic_ics_; 1899c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 1900c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int scan_on_scavenge_pages_; 1901c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1902ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NewSpace new_space_; 1903ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OldSpace* old_pointer_space_; 1904ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OldSpace* old_data_space_; 1905ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OldSpace* code_space_; 1906ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MapSpace* map_space_; 1907ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CellSpace* cell_space_; 190841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org PropertyCellSpace* property_cell_space_; 1909ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LargeObjectSpace* lo_space_; 1910ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org HeapState gc_state_; 1911d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com int gc_post_processing_depth_; 191243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19137276f14ca716596e0a0d17539516370c1f453847kasper.lund // Returns the amount of external memory registered since last global gc. 19147ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int64_t PromotedExternalMemorySize(); 19157276f14ca716596e0a0d17539516370c1f453847kasper.lund 1916b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org unsigned int ms_count_; // how many mark-sweep collections happened 1917ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned int gc_count_; // how many gc happened 191843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19192c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org // For post mortem debugging. 19202c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org static const int kRememberedUnmappedPages = 128; 19212c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org int remembered_unmapped_pages_index_; 19222c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Address remembered_unmapped_pages_[kRememberedUnmappedPages]; 19232c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 1924086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Total length of the strings we failed to flatten since the last GC. 1925ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int unflattened_strings_length_; 1926086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 192768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#define ROOT_ACCESSOR(type, name, camel_name) \ 1928394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com inline void set_##name(type* value) { \ 1929394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com /* The deserializer makes use of the fact that these common roots are */ \ 1930394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com /* never in new space and never on a page that is being compacted. */ \ 1931394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ASSERT(k##camel_name##RootIndex >= kOldSpaceRoots || !InNewSpace(value)); \ 193268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org roots_[k##camel_name##RootIndex] = value; \ 193368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 193468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org ROOT_LIST(ROOT_ACCESSOR) 193568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#undef ROOT_ACCESSOR 193668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 19377276f14ca716596e0a0d17539516370c1f453847kasper.lund#ifdef DEBUG 193843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the --gc-interval flag is set to a positive value, this 193943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // variable holds the value indicating the number of allocations 194043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // remain until the next failure and garbage collection. 1941ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int allocation_timeout_; 194243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 194343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Do we expect to be able to handle allocation failure at this 194443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // time? 1945ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool disallow_allocation_failure_; 194643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // DEBUG 194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19481b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Indicates that the new space should be kept small due to high promotion 19491b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // rates caused by the mutator allocating a lot of long-lived objects. 195057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // TODO(hpayer): change to bool if no longer accessed from generated code 195157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org intptr_t new_space_high_promotion_mode_active_; 19521b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 19539bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // Limit that triggers a global GC on the next (normally caused) GC. This 19549bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // is checked when we have already decided to do a GC to help determine 1955a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org // which collector to invoke, before expanding a paged space in the old 1956a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org // generation and on every allocation in large object space. 1957a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org intptr_t old_generation_allocation_limit_; 195843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1959c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Used to adjust the limits that control the timing of the next GC. 1960c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t size_of_old_gen_at_last_old_space_gc_; 1961c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1962e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Limit on the amount of externally allocated memory allowed 1963e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // between global GCs. If reached a global GC is forced. 1964ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t external_allocation_limit_; 1965e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 19667276f14ca716596e0a0d17539516370c1f453847kasper.lund // The amount of external memory registered through the API kept alive 19677276f14ca716596e0a0d17539516370c1f453847kasper.lund // by global handles 19687ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int64_t amount_of_external_allocated_memory_; 19697276f14ca716596e0a0d17539516370c1f453847kasper.lund 19707276f14ca716596e0a0d17539516370c1f453847kasper.lund // Caches the amount of external memory registered at the last global gc. 19717ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int64_t amount_of_external_allocated_memory_at_last_global_gc_; 19727276f14ca716596e0a0d17539516370c1f453847kasper.lund 197343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Indicates that an allocation has failed in the old generation since the 197443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // last GC. 1975a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org bool old_gen_exhausted_; 197643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1977b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Indicates that inline bump-pointer allocation has been globally disabled 1978b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // for all spaces. This is used to disable allocations in generated code. 1979b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org bool inline_allocation_disabled_; 1980b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 1981ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org // Weak list heads, threaded through the objects. 198225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // List heads are initilized lazily and contain the undefined_value at start. 198346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Object* native_contexts_list_; 19841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Object* array_buffers_list_; 1985ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Object* allocation_sites_list_; 19861fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 198725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // WeakHashTable that maps objects embedded in optimized code to dependent 198825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // code list. It is initilized lazily and contains the undefined_value at 198925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // start. 199025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org Object* weak_object_to_code_table_; 199125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 1992c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferRebuilder store_buffer_rebuilder_; 1993c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 199468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org struct StringTypeTable { 199568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org InstanceType type; 199668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org int size; 199768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org RootListIndex index; 199868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org }; 199968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 20004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org struct ConstantStringTable { 200168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org const char* contents; 200268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org RootListIndex index; 200368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org }; 200468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 200568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org struct StructTable { 200668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org InstanceType type; 200768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org int size; 200868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org RootListIndex index; 200968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org }; 201068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 201168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org static const StringTypeTable string_type_table[]; 20124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const ConstantStringTable constant_string_table[]; 201368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org static const StructTable struct_table[]; 201468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 20154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // The special hidden string which is an empty string, but does not match 20163b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org // any string when looked up in properties. 20174a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org String* hidden_string_; 20183b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 201943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // GC callback function, called before and after mark-compact GC. 202043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocations in the callback function are disallowed. 20215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org struct GCPrologueCallbackPair { 2022528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCPrologueCallbackPair(v8::Isolate::GCPrologueCallback callback, 2023528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type, 2024528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate) 2025528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org : callback(callback), gc_type(gc_type), pass_isolate_(pass_isolate) { 20265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 20275d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org bool operator==(const GCPrologueCallbackPair& pair) const { 20285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return pair.callback == callback; 20295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 2030528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::GCPrologueCallback callback; 20315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org GCType gc_type; 2032528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // TODO(dcarney): remove variable 2033528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate_; 20345d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org }; 2035ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org List<GCPrologueCallbackPair> gc_prologue_callbacks_; 20365d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 20375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org struct GCEpilogueCallbackPair { 2038528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCEpilogueCallbackPair(v8::Isolate::GCPrologueCallback callback, 2039528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type, 2040528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate) 2041528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org : callback(callback), gc_type(gc_type), pass_isolate_(pass_isolate) { 20425d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 20435d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org bool operator==(const GCEpilogueCallbackPair& pair) const { 20445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return pair.callback == callback; 20455d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 2046528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::GCPrologueCallback callback; 20475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org GCType gc_type; 2048528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // TODO(dcarney): remove variable 2049528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate_; 20505d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org }; 2051ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org List<GCEpilogueCallbackPair> gc_epilogue_callbacks_; 20525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 2053d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Support for computing object sizes during GC. 2054ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org HeapObjectCallback gc_safe_size_of_old_object_; 2055d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org static int GcSafeSizeOfOldObject(HeapObject* object); 2056d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 2057d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Update the GC state. Called from the mark-compact collector. 2058ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void MarkMapPointersAsEncoded(bool encoded) { 2059c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!encoded); 2060c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com gc_safe_size_of_old_object_ = &GcSafeSizeOfOldObject; 2061d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org } 2062d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 2063ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Code that should be run before and after each GC. Includes some 2064ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // reporting/verification activities when compiled with DEBUG set. 2065ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org void GarbageCollectionPrologue(); 2066ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org void GarbageCollectionEpilogue(); 2067ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 206843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Checks whether a global GC is necessary 2069994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GarbageCollector SelectGarbageCollector(AllocationSpace space, 2070994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char** reason); 207143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2072ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Performs garbage collection operation. 2073ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Returns whether there is a chance that another major GC could 2074ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // collect more garbage. 2075ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org bool CollectGarbage(AllocationSpace space, 2076ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org GarbageCollector collector, 2077ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org const char* gc_reason, 2078ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org const char* collector_reason); 2079ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 208043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Performs garbage collection 2081f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Returns whether there is a chance another major GC could 2082f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // collect more garbage. 2083ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool PerformGarbageCollection(GarbageCollector collector, 2084ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GCTracer* tracer); 2085ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2086ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline void UpdateOldSpaceLimits(); 208743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20883d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // Selects the proper allocation space depending on the given object 20893d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // size, pretenuring decision, and preferred old-space. 20903d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org static AllocationSpace SelectSpace(int object_size, 20913d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace preferred_old_space, 20923d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org PretenureFlag pretenure) { 20933d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org ASSERT(preferred_old_space == OLD_POINTER_SPACE || 20943d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org preferred_old_space == OLD_DATA_SPACE); 20953d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org if (object_size > Page::kMaxNonCodeHeapObjectSize) return LO_SPACE; 20963d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return (pretenure == TENURED) ? preferred_old_space : NEW_SPACE; 20973d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 20983d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org 2099cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org // Allocate an uninitialized fixed array. 2100cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org MUST_USE_RESULT MaybeObject* AllocateRawFixedArray( 2101cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org int length, PretenureFlag pretenure); 2102cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 2103cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org // Allocate an uninitialized fixed double array. 2104cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org MUST_USE_RESULT MaybeObject* AllocateRawFixedDoubleArray( 2105cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org int length, PretenureFlag pretenure); 2106cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 2107cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org // Allocate an initialized fixed array with the given filler value. 2108cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org MUST_USE_RESULT MaybeObject* AllocateFixedArrayWithFiller( 2109cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org int length, PretenureFlag pretenure, Object* filler); 2110cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 211143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initializes a JSObject based on its map. 2112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void InitializeJSObjectFromMap(JSObject* obj, 2113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org FixedArray* properties, 2114ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Map* map); 2115c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org void InitializeAllocationMemento(AllocationMemento* memento, 2116c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org AllocationSite* allocation_site); 211743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2118ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool CreateInitialMaps(); 2119ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool CreateInitialObjects(); 21202abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 2121ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // These five Create*EntryStub functions are here and forced to not be inlined 212276ae699a3d74409fe1f274fd1f548fbc4c958a13sgjesse@chromium.org // because of a gcc-4.4 bug that assigns wrong vtable entries. 2123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NO_INLINE(void CreateJSEntryStub()); 2124ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NO_INLINE(void CreateJSConstructEntryStub()); 212518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 2126ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void CreateFixedStubs(); 2127ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org void CreateStubsRequiringBuiltins(); 21282abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 21295323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org MUST_USE_RESULT MaybeObject* CreateOddball(const char* to_string, 21305323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org Object* to_number, 21315323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org byte kind); 213243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2133fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Allocate a JSArray with no elements 2134fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateJSArray( 2135fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 2136fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure = NOT_TENURED); 2137fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 213843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate empty fixed array. 2139ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT MaybeObject* AllocateEmptyFixedArray(); 214043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21414e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // Allocate empty external array of given type. 21424e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org MUST_USE_RESULT MaybeObject* AllocateEmptyExternalArray( 21434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org ExternalArrayType array_type); 21444e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 21456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Allocate empty fixed double array. 21466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org MUST_USE_RESULT MaybeObject* AllocateEmptyFixedDoubleArray(); 21476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 214871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org // Allocate a tenured simple cell. 214971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org MUST_USE_RESULT MaybeObject* AllocateCell(Object* value); 215071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 215171f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org // Allocate a tenured JS global property cell initialized with the hole. 215271f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org MUST_USE_RESULT MaybeObject* AllocatePropertyCell(); 215371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 215471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org // Allocate Box. 215571f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org MUST_USE_RESULT MaybeObject* AllocateBox(Object* value, 215671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org PretenureFlag pretenure); 215771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org 215843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Performs a minor collection in new generation. 2159ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void Scavenge(); 2160b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 2161ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Commits from space if it is uncommitted. 2162ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org void EnsureFromSpaceIsCommitted(); 2163ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2164ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Uncommit unused semi space. 2165ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org bool UncommitFromSpace() { return new_space_.UncommitFromSpace(); } 2166ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2167ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org // Fill in bogus values in from space 2168ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org void ZapFromSpace(); 2169ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 2170b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org static String* UpdateNewSpaceReferenceInExternalStringTableEntry( 2171ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Heap* heap, 2172b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org Object** pointer); 2173b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 2174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front); 2175c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static void ScavengeStoreBufferCallback(Heap* heap, 2176c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* page, 2177c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferEvent event); 217843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 217943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Performs a major collection in the whole heap. 2180ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void MarkCompact(GCTracer* tracer); 218143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 218243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code to be run before and after mark-compact. 2183c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void MarkCompactPrologue(); 2184720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 21851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void ProcessNativeContexts(WeakObjectRetainer* retainer, bool record_slots); 21861fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void ProcessArrayBuffers(WeakObjectRetainer* retainer, bool record_slots); 2187ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org void ProcessAllocationSites(WeakObjectRetainer* retainer, bool record_slots); 21881fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 21891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Called on heap tear-down. 21901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void TearDownArrayBuffers(); 21911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 219243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Record statistics before and after garbage collection. 2193ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ReportStatisticsBeforeGC(); 2194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void ReportStatisticsAfterGC(); 219543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Slow part of scavenge object. 21975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); 21985a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 21995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Initializes a function with a shared part and prototype. 22005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Note: this code was factored out of AllocateFunction such that 22015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // other parts of the VM could use it. Specifically, a function that creates 22025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // instances of type JS_FUNCTION_TYPE benefit from the use of this function. 22035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Please note this does not perform a garbage collection. 2204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inline void InitializeFunction( 2205d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org JSFunction* function, 2206d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org SharedFunctionInfo* shared, 2207d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Object* prototype); 22085a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 220983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org // Total RegExp code ever generated 221083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org double total_regexp_code_generated_; 221183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org 2212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GCTracer* tracer_; 22139dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 2214fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Allocates a small number to string cache. 2215fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MUST_USE_RESULT MaybeObject* AllocateInitialNumberStringCache(); 2216fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Creates and installs the full-sized number string cache. 2217fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org void AllocateFullSizeNumberStringCache(); 2218fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Get the length of the number to string cache based on the max semispace 2219fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // size. 2220fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int FullSizeNumberStringCacheLength(); 22210c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Flush the number to string cache. 2222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void FlushNumberStringCache(); 22230c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 2224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void UpdateSurvivalRateTrend(int start_new_space_size); 222540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 222640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org enum SurvivalRateTrend { INCREASING, STABLE, DECREASING, FLUCTUATING }; 222740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2228659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org static const int kYoungSurvivalRateHighThreshold = 90; 2229659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org static const int kYoungSurvivalRateLowThreshold = 10; 223040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org static const int kYoungSurvivalRateAllowedDeviation = 15; 223140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2232ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int young_survivors_after_last_gc_; 2233ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int high_survival_rate_period_length_; 2234659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org int low_survival_rate_period_length_; 2235ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org double survival_rate_; 2236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SurvivalRateTrend previous_survival_rate_trend_; 2237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SurvivalRateTrend survival_rate_trend_; 223840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void set_survival_rate_trend(SurvivalRateTrend survival_rate_trend) { 224040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org ASSERT(survival_rate_trend != FLUCTUATING); 224140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org previous_survival_rate_trend_ = survival_rate_trend_; 224240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org survival_rate_trend_ = survival_rate_trend; 224340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 224440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2245ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SurvivalRateTrend survival_rate_trend() { 224640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org if (survival_rate_trend_ == STABLE) { 224740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return STABLE; 224840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } else if (previous_survival_rate_trend_ == STABLE) { 224940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return survival_rate_trend_; 225040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } else if (survival_rate_trend_ != previous_survival_rate_trend_) { 225140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return FLUCTUATING; 225240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } else { 225340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return survival_rate_trend_; 225440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 225540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 225640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2257ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool IsStableOrIncreasingSurvivalTrend() { 225840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org switch (survival_rate_trend()) { 225940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org case STABLE: 226040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org case INCREASING: 226140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return true; 226240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org default: 226340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return false; 226440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 226540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 226640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2267659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org bool IsStableOrDecreasingSurvivalTrend() { 2268659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org switch (survival_rate_trend()) { 2269659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org case STABLE: 2270659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org case DECREASING: 2271659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return true; 2272659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org default: 2273659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return false; 2274659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 227540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 227640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2277659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org bool IsIncreasingSurvivalTrend() { 2278659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return survival_rate_trend() == INCREASING; 22791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org } 22801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 2281ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool IsHighSurvivalRate() { 228240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org return high_survival_rate_period_length_ > 0; 228340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 228440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 2285659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org bool IsLowSurvivalRate() { 2286659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return low_survival_rate_period_length_ > 0; 2287659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 2288659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 2289c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void SelectScavengingVisitorsTable(); 2290c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2291ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org void StartIdleRound() { 2292ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org mark_sweeps_since_idle_round_started_ = 0; 2293ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 2294ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 2295ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org void FinishIdleRound() { 2296ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org mark_sweeps_since_idle_round_started_ = kMaxMarkSweepsInIdleRound; 2297ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org scavenges_since_last_idle_round_ = 0; 2298ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 2299ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 2300ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org bool EnoughGarbageSinceLastIdleRound() { 2301ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org return (scavenges_since_last_idle_round_ >= kIdleScavengeThreshold); 2302ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 2303ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 23046ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org // Estimates how many milliseconds a Mark-Sweep would take to complete. 23056ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org // In idle notification handler we assume that this function will return: 23066ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org // - a number less than 10 for small heaps, which are less than 8Mb. 23076ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org // - a number greater than 10 for large heaps, which are greater than 32Mb. 23086ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org int TimeMarkSweepWouldTakeInMs() { 23096ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org // Rough estimate of how many megabytes of heap can be processed in 1 ms. 23106ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org static const int kMbPerMs = 2; 23116ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 23126ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org int heap_size_mb = static_cast<int>(SizeOfObjects() / MB); 23136ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org return heap_size_mb / kMbPerMs; 23146ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 23156ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 2316ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // Returns true if no more GC work is left. 2317ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org bool IdleGlobalGC(); 2318ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 23196ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org void AdvanceIdleIncrementalMarking(intptr_t step_size); 23206ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 232128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org void ClearObjectStats(bool clear_last_time_stats = false); 23226ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 232325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org void set_weak_object_to_code_table(Object* value) { 232425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org ASSERT(!InNewSpace(value)); 232525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org weak_object_to_code_table_ = value; 232625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org } 232725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 232825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org Object** weak_object_to_code_table_address() { 232925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org return &weak_object_to_code_table_; 233025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org } 233125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 23324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org static const int kInitialStringTableSize = 2048; 23339258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org static const int kInitialEvalCacheSize = 64; 2334fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org static const int kInitialNumberStringCacheSize = 256; 233543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 233628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org // Object counts and used memory by InstanceType 2337753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org size_t object_counts_[OBJECT_STATS_COUNT]; 2338753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org size_t object_counts_last_time_[OBJECT_STATS_COUNT]; 2339753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org size_t object_sizes_[OBJECT_STATS_COUNT]; 2340753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org size_t object_sizes_last_time_[OBJECT_STATS_COUNT]; 234128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 2342ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Maximum GC pause. 2343c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org double max_gc_pause_; 2344ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2345471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org // Total time spent in GC. 2346c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org double total_gc_time_ms_; 2347471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2348ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Maximum size of objects alive after GC. 2349ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t max_alive_after_gc_; 2350ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2351ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Minimal interval between two subsequent collections. 2352c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org double min_in_mutator_; 2353ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2354ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Size of objects alive after last GC. 2355ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org intptr_t alive_after_last_gc_; 2356ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2357ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org double last_gc_end_timestamp_; 2358ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2359e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org // Cumulative GC time spent in marking 2360e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org double marking_time_; 2361e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 2362e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org // Cumulative GC time spent in sweeping 2363e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org double sweeping_time_; 2364e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 2365ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MarkCompactCollector mark_compact_collector_; 2366ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2367c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBuffer store_buffer_; 2368c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2369c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Marking marking_; 2370c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2371c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com IncrementalMarking incremental_marking_; 2372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2373ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int number_idle_notifications_; 2374ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned int last_idle_notification_gc_count_; 2375ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool last_idle_notification_gc_count_init_; 2376ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2377ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org int mark_sweeps_since_idle_round_started_; 2378ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org unsigned int gc_count_at_last_idle_gc_; 2379ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org int scavenges_since_last_idle_round_; 2380ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 2381a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org // These two counters are monotomically increasing and never reset. 2382a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org size_t full_codegen_bytes_generated_; 2383a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org size_t crankshaft_codegen_bytes_generated_; 2384a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 238532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // If the --deopt_every_n_garbage_collections flag is set to a positive value, 238632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // this variable holds the number of garbage collections since the last 238732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // deoptimization triggered by garbage collection. 238832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int gcs_since_last_deopt_; 238932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 239094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP 239125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org int no_weak_object_verification_scope_depth_; 239294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif 239394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2394ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org static const int kMaxMarkSweepsInIdleRound = 7; 2395ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org static const int kIdleScavengeThreshold = 5; 2396ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 2397ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Shared state read by the scavenge collector and set by ScavengeObject. 2398ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PromotionQueue promotion_queue_; 2399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Flag is set when the heap has been configured. The heap can be repeatedly 2401f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // configured through the API until it is set up. 2402ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool configured_; 2403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2404ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExternalStringTable external_string_table_; 2405ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2406c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com VisitorDispatchTable<ScavengingCallback> scavenging_visitors_table_; 2407c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2408c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* chunks_queued_for_free_; 2409ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2410ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Mutex* relocation_mutex_; 2411ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#ifdef DEBUG 2412ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org bool relocation_mutex_locked_by_optimizer_thread_; 2413ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#endif // DEBUG; 2414ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 241543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen friend class Factory; 2416ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class GCTracer; 241743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen friend class DisallowAllocationFailure; 24189bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org friend class AlwaysAllocateScope; 2419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Page; 2420ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Isolate; 2421d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org friend class MarkCompactCollector; 2422b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org friend class MarkCompactMarkingVisitor; 2423ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class MapCompact; 242494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP 242525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org friend class NoWeakObjectVerificationScope; 242694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif 2427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(Heap); 24299bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org}; 24309bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 24319bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 24326736865049af913afbc9cee73f78c4e9b03f8f49ager@chromium.orgclass HeapStats { 24336736865049af913afbc9cee73f78c4e9b03f8f49ager@chromium.org public: 24340b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org static const int kStartMarker = 0xDECADE00; 24350b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org static const int kEndMarker = 0xDECADE01; 24360b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 2437c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* start_marker; // 0 2438c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* new_space_size; // 1 2439c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* new_space_capacity; // 2 2440f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* old_pointer_space_size; // 3 2441f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* old_pointer_space_capacity; // 4 2442f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* old_data_space_size; // 5 2443f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* old_data_space_capacity; // 6 2444f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* code_space_size; // 7 2445f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* code_space_capacity; // 8 2446f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* map_space_size; // 9 2447f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* map_space_capacity; // 10 2448f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* cell_space_size; // 11 2449f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* cell_space_capacity; // 12 2450f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* lo_space_size; // 13 2451c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* global_handle_count; // 14 2452c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* weak_global_handle_count; // 15 2453c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* pending_global_handle_count; // 16 2454c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* near_death_global_handle_count; // 17 2455e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org int* free_global_handle_count; // 18 2456f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* memory_allocator_size; // 19 2457f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t* memory_allocator_capacity; // 20 2458c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* objects_per_type; // 21 2459c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org int* size_per_type; // 22 2460ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int* os_error; // 23 2461ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int* end_marker; // 24 246241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org intptr_t* property_cell_space_size; // 25 246341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org intptr_t* property_cell_space_capacity; // 26 24646012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org}; 24656012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org 24666012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org 2467000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.orgclass DisallowAllocationFailure { 2468000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org public: 2469000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org inline DisallowAllocationFailure(); 2470000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org inline ~DisallowAllocationFailure(); 2471000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 2472000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org#ifdef DEBUG 2473000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org private: 2474000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org bool old_state_; 2475000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org#endif 2476000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org}; 2477000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 2478000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 24799bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.orgclass AlwaysAllocateScope { 24809bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org public: 2481fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org inline AlwaysAllocateScope(); 2482fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org inline ~AlwaysAllocateScope(); 2483000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org 2484000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org private: 2485000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org // Implicitly disable artificial allocation failures. 2486000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org DisallowAllocationFailure disallow_allocation_failure_; 248743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 248843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2489935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 249094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP 249125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgclass NoWeakObjectVerificationScope { 249294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org public: 249325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org inline NoWeakObjectVerificationScope(); 249425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org inline ~NoWeakObjectVerificationScope(); 249594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org}; 249694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif 249794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 249843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 249930ce411529579186181838984710b0b0980857aaricow@chromium.org// Visitor class to verify interior pointers in spaces that do not contain 250030ce411529579186181838984710b0b0980857aaricow@chromium.org// or care about intergenerational references. All heap object pointers have to 250130ce411529579186181838984710b0b0980857aaricow@chromium.org// point into the heap to a location that has a map pointer at its first word. 250230ce411529579186181838984710b0b0980857aaricow@chromium.org// Caveat: Heap::Contains is an approximation because it can return true for 250330ce411529579186181838984710b0b0980857aaricow@chromium.org// objects in a heap space but above the allocation pointer. 250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass VerifyPointersVisitor: public ObjectVisitor { 250543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2506fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org inline void VisitPointers(Object** start, Object** end); 250743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 250843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25107c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// Space iterator for iterating over all spaces of the heap. Returns each space 25117c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// in turn, and null when it is done. 25129258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass AllSpaces BASE_EMBEDDED { 25139258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org public: 25147c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org explicit AllSpaces(Heap* heap) : heap_(heap), counter_(FIRST_SPACE) {} 25159258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org Space* next(); 25169258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org private: 25177c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org Heap* heap_; 25189258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org int counter_; 25199258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org}; 25209258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 25219258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 25229258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Space iterator for iterating over all old spaces of the heap: Old pointer 25237c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// space, old data space and code space. Returns each space in turn, and null 25247c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// when it is done. 25259258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass OldSpaces BASE_EMBEDDED { 25269258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org public: 25277c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org explicit OldSpaces(Heap* heap) : heap_(heap), counter_(OLD_POINTER_SPACE) {} 25289258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org OldSpace* next(); 25299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org private: 25307c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org Heap* heap_; 25319258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org int counter_; 25329258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org}; 25339258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 25349258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 25357c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// Space iterator for iterating over all the paged spaces of the heap: Map 25367c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// space, old pointer space, old data space, code space and cell space. Returns 25377c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org// each space in turn, and null when it is done. 25389258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass PagedSpaces BASE_EMBEDDED { 25399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org public: 25407c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org explicit PagedSpaces(Heap* heap) : heap_(heap), counter_(OLD_POINTER_SPACE) {} 25419258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org PagedSpace* next(); 25429258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org private: 25437c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org Heap* heap_; 25449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org int counter_; 25459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org}; 25469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 25479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 25489258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Space iterator for iterating over all spaces of the heap. 25497276f14ca716596e0a0d17539516370c1f453847kasper.lund// For each space an object iterator is provided. The deallocation of the 25507276f14ca716596e0a0d17539516370c1f453847kasper.lund// returned object iterators is handled by the space iterator. 25517276f14ca716596e0a0d17539516370c1f453847kasper.lundclass SpaceIterator : public Malloced { 25527276f14ca716596e0a0d17539516370c1f453847kasper.lund public: 25537c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org explicit SpaceIterator(Heap* heap); 25547c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org SpaceIterator(Heap* heap, HeapObjectCallback size_func); 25557276f14ca716596e0a0d17539516370c1f453847kasper.lund virtual ~SpaceIterator(); 25567276f14ca716596e0a0d17539516370c1f453847kasper.lund 25577276f14ca716596e0a0d17539516370c1f453847kasper.lund bool has_next(); 25587276f14ca716596e0a0d17539516370c1f453847kasper.lund ObjectIterator* next(); 25597276f14ca716596e0a0d17539516370c1f453847kasper.lund 25607276f14ca716596e0a0d17539516370c1f453847kasper.lund private: 25617276f14ca716596e0a0d17539516370c1f453847kasper.lund ObjectIterator* CreateIterator(); 25627276f14ca716596e0a0d17539516370c1f453847kasper.lund 25637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org Heap* heap_; 25647276f14ca716596e0a0d17539516370c1f453847kasper.lund int current_space_; // from enum AllocationSpace. 25657276f14ca716596e0a0d17539516370c1f453847kasper.lund ObjectIterator* iterator_; // object iterator for the current space. 25664a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com HeapObjectCallback size_func_; 25677276f14ca716596e0a0d17539516370c1f453847kasper.lund}; 25687276f14ca716596e0a0d17539516370c1f453847kasper.lund 25697276f14ca716596e0a0d17539516370c1f453847kasper.lund 25704a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// A HeapIterator provides iteration over the whole heap. It 25714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// aggregates the specific iterators for the different spaces as 25724a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// these can only iterate over one space only. 25734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// 25744a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// HeapIterator can skip free list nodes (that is, de-allocated heap 25754a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// objects that still remain in the heap). As implementation of free 25764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// nodes filtering uses GC marks, it can't be used during MS/MC GC 25774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// phases. Also, it is forbidden to interrupt iteration in this mode, 25784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// as this will leave heap objects marked (and thus, unusable). 2579023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.orgclass HeapObjectsFilter; 258043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 258143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass HeapIterator BASE_EMBEDDED { 258243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2583023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org enum HeapObjectsFiltering { 25844a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com kNoFiltering, 2585023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org kFilterUnreachable 25864a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com }; 25874a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 25887c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org explicit HeapIterator(Heap* heap); 25897c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org HeapIterator(Heap* heap, HeapObjectsFiltering filtering); 25904a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com ~HeapIterator(); 259143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 259243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HeapObject* next(); 259343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void reset(); 259443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 259543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 259643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Perform the initialization. 259743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Init(); 259843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Perform all necessary shutdown (destruction) work. 259943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Shutdown(); 26004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com HeapObject* NextObject(); 260143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26027c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org Heap* heap_; 2603023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org HeapObjectsFiltering filtering_; 2604023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org HeapObjectsFilter* filter_; 260543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Space iterator for iterating all the spaces. 260643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SpaceIterator* space_iterator_; 260743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Object iterator for the space currently being iterated. 260843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ObjectIterator* object_iterator_; 260943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 261043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 261143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Cache for mapping (map, property name) into field offset. 26135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Cleared at startup and prior to mark sweep collection. 26145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgclass KeyedLookupCache { 26155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org public: 26165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Lookup field offset for (map, name). If absent, -1 is returned. 2617750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int Lookup(Map* map, Name* name); 26185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 26195aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Update an element in the cache. 2620750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org void Update(Map* map, Name* name, int field_offset); 26215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 26225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Clear the cache. 2623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void Clear(); 262413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2625659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org static const int kLength = 256; 262613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org static const int kCapacityMask = kLength - 1; 262705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org static const int kMapHashShift = 5; 2628659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org static const int kHashMask = -4; // Zero the last two bits. 2629659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org static const int kEntriesPerBucket = 4; 2630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kNotFound = -1; 263113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2632659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // kEntriesPerBucket should be a power of 2. 2633659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org STATIC_ASSERT((kEntriesPerBucket & (kEntriesPerBucket - 1)) == 0); 2634659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org STATIC_ASSERT(kEntriesPerBucket == -kHashMask); 2635659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 26365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org private: 2637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org KeyedLookupCache() { 2638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (int i = 0; i < kLength; ++i) { 2639ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org keys_[i].map = NULL; 2640ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org keys_[i].name = NULL; 2641ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org field_offsets_[i] = kNotFound; 2642ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2645750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static inline int Hash(Map* map, Name* name); 264613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 264713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Get the address of the keys and field_offsets arrays. Used in 264813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // generated code to perform cache lookups. 2649ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address keys_address() { 265013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org return reinterpret_cast<Address>(&keys_); 265113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 265213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2653ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address field_offsets_address() { 265413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org return reinterpret_cast<Address>(&field_offsets_); 265513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 265613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 26575aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org struct Key { 26585aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org Map* map; 2659750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* name; 26605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org }; 2661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2662ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Key keys_[kLength]; 2663ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int field_offsets_[kLength]; 26645aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 266513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org friend class ExternalReference; 2666ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Isolate; 2667ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(KeyedLookupCache); 266813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org}; 26695aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 26705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 267106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org// Cache for mapping (map, property name) into descriptor index. 26725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// The cache contains both positive and negative results. 26735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Descriptor index equals kNotFound means the property is absent. 26745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Cleared at startup and prior to any gc. 26755aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgclass DescriptorLookupCache { 26765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org public: 26775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Lookup descriptor index for (map, name). 26785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // If absent, kAbsent is returned. 2679750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int Lookup(Map* source, Name* name) { 2680750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (!name->IsUniqueName()) return kAbsent; 268106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org int index = Hash(source, name); 26825aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org Key& key = keys_[index]; 268306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org if ((key.source == source) && (key.name == name)) return results_[index]; 26845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org return kAbsent; 26855aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 26865aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 26875aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Update an element in the cache. 2688750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org void Update(Map* source, Name* name, int result) { 26895aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org ASSERT(result != kAbsent); 2690750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (name->IsUniqueName()) { 269106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org int index = Hash(source, name); 26925aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org Key& key = keys_[index]; 269306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org key.source = source; 26945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org key.name = name; 26955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org results_[index] = result; 26965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 26975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 26985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 26995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Clear the cache. 2700ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void Clear(); 27015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 27025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org static const int kAbsent = -2; 2703e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 27045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org private: 2705ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DescriptorLookupCache() { 2706ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (int i = 0; i < kLength; ++i) { 270706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org keys_[i].source = NULL; 2708ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org keys_[i].name = NULL; 2709ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org results_[i] = kAbsent; 2710ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2711ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2712ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2713750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org static int Hash(Object* source, Name* name) { 27145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Uses only lower 32 bits if pointers are larger. 271506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org uint32_t source_hash = 271606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org static_cast<uint32_t>(reinterpret_cast<uintptr_t>(source)) 2717000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org >> kPointerSizeLog2; 2718b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org uint32_t name_hash = 2719000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name)) 2720000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org >> kPointerSizeLog2; 272106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org return (source_hash ^ name_hash) % kLength; 27225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 27235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 27245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org static const int kLength = 64; 27255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org struct Key { 272606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org Map* source; 2727750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Name* name; 27285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org }; 27295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 2730ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Key keys_[kLength]; 2731ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int results_[kLength]; 273243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2733ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Isolate; 2734ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache); 273543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 273643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 273743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27387276f14ca716596e0a0d17539516370c1f453847kasper.lund// GCTracer collects and prints ONE line after each garbage collector 27397276f14ca716596e0a0d17539516370c1f453847kasper.lund// invocation IFF --trace_gc is used. 27407276f14ca716596e0a0d17539516370c1f453847kasper.lund 27417276f14ca716596e0a0d17539516370c1f453847kasper.lundclass GCTracer BASE_EMBEDDED { 27427276f14ca716596e0a0d17539516370c1f453847kasper.lund public: 27439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com class Scope BASE_EMBEDDED { 2744ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org public: 27459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com enum ScopeId { 27469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com EXTERNAL, 27479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com MC_MARK, 27489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com MC_SWEEP, 2749ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org MC_SWEEP_NEWSPACE, 27501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_EVACUATE_PAGES, 27511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_UPDATE_NEW_TO_NEW_POINTERS, 27521b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_UPDATE_ROOT_TO_NEW_POINTERS, 27531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_UPDATE_OLD_TO_NEW_POINTERS, 27541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_UPDATE_POINTERS_TO_EVACUATED, 27551b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_UPDATE_POINTERS_BETWEEN_EVACUATED, 27561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MC_UPDATE_MISC_POINTERS, 2757ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org MC_WEAKCOLLECTION_PROCESS, 2758ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org MC_WEAKCOLLECTION_CLEAR, 2759ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org MC_FLUSH_CODE, 27609dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com kNumberOfScopes 27619dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com }; 27629dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 27639dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com Scope(GCTracer* tracer, ScopeId scope) 27649dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com : tracer_(tracer), 27659dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com scope_(scope) { 2766ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org start_time_ = OS::TimeCurrentMillis(); 2767ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 27689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 27699dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com ~Scope() { 2770c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ASSERT(scope_ < kNumberOfScopes); // scope_ is unsigned. 27719dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com tracer_->scopes_[scope_] += OS::TimeCurrentMillis() - start_time_; 2772ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org } 2773ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2774ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org private: 2775ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org GCTracer* tracer_; 27769dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com ScopeId scope_; 2777ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org double start_time_; 2778ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org }; 27797276f14ca716596e0a0d17539516370c1f453847kasper.lund 2780994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org explicit GCTracer(Heap* heap, 2781994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* gc_reason, 2782994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* collector_reason); 27837276f14ca716596e0a0d17539516370c1f453847kasper.lund ~GCTracer(); 27847276f14ca716596e0a0d17539516370c1f453847kasper.lund 27857276f14ca716596e0a0d17539516370c1f453847kasper.lund // Sets the collector. 27867276f14ca716596e0a0d17539516370c1f453847kasper.lund void set_collector(GarbageCollector collector) { collector_ = collector; } 27877276f14ca716596e0a0d17539516370c1f453847kasper.lund 27887276f14ca716596e0a0d17539516370c1f453847kasper.lund // Sets the GC count. 27893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void set_gc_count(unsigned int count) { gc_count_ = count; } 27907276f14ca716596e0a0d17539516370c1f453847kasper.lund 27917276f14ca716596e0a0d17539516370c1f453847kasper.lund // Sets the full GC count. 27927276f14ca716596e0a0d17539516370c1f453847kasper.lund void set_full_gc_count(int count) { full_gc_count_ = count; } 27937276f14ca716596e0a0d17539516370c1f453847kasper.lund 27949dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com void increment_promoted_objects_size(int object_size) { 27959dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com promoted_objects_size_ += object_size; 27969dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 27979dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 2798cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org void increment_nodes_died_in_new_space() { 2799cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org nodes_died_in_new_space_++; 2800cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org } 2801cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org 2802cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org void increment_nodes_copied_in_new_space() { 2803cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org nodes_copied_in_new_space_++; 2804cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org } 2805cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org 2806cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org void increment_nodes_promoted() { 2807cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org nodes_promoted_++; 2808cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org } 2809cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org 28107276f14ca716596e0a0d17539516370c1f453847kasper.lund private: 28117276f14ca716596e0a0d17539516370c1f453847kasper.lund // Returns a string matching the collector. 28127276f14ca716596e0a0d17539516370c1f453847kasper.lund const char* CollectorString(); 28137276f14ca716596e0a0d17539516370c1f453847kasper.lund 28147276f14ca716596e0a0d17539516370c1f453847kasper.lund // Returns size of object in heap (in MB). 2815fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org inline double SizeOfHeapObjects(); 28167276f14ca716596e0a0d17539516370c1f453847kasper.lund 28171145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org // Timestamp set in the constructor. 28181145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org double start_time_; 28191145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org 28201145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org // Size of objects in heap set in constructor. 28211145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org intptr_t start_object_size_; 28221145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org 28231145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org // Size of memory allocated from OS set in constructor. 28241145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org intptr_t start_memory_size_; 28251145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org 28261145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org // Type of collector. 28271145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org GarbageCollector collector_; 28287276f14ca716596e0a0d17539516370c1f453847kasper.lund 28292efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // A count (including this one, e.g. the first collection is 1) of the 28307276f14ca716596e0a0d17539516370c1f453847kasper.lund // number of garbage collections. 28313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org unsigned int gc_count_; 28327276f14ca716596e0a0d17539516370c1f453847kasper.lund 28337276f14ca716596e0a0d17539516370c1f453847kasper.lund // A count (including this one) of the number of full garbage collections. 28347276f14ca716596e0a0d17539516370c1f453847kasper.lund int full_gc_count_; 28357276f14ca716596e0a0d17539516370c1f453847kasper.lund 28369dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Amounts of time spent in different scopes during GC. 28379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com double scopes_[Scope::kNumberOfScopes]; 28389dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 28399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Total amount of space either wasted or contained in one of free lists 28409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // before the current GC. 2841f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t in_free_list_or_wasted_before_gc_; 28429dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 28439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Difference between space used in the heap at the beginning of the current 28449dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // collection and the end of the previous collection. 2845f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t allocated_since_last_gc_; 28469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 28479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Amount of time spent in mutator that is time elapsed between end of the 28489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // previous collection and the beginning of the current one. 28499dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com double spent_in_mutator_; 28509dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 28519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Size of objects promoted during the current collection. 2852f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t promoted_objects_size_; 28539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 2854cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org // Number of died nodes in the new space. 2855cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org int nodes_died_in_new_space_; 2856cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org 2857cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org // Number of copied nodes to the new space. 2858cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org int nodes_copied_in_new_space_; 2859cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org 2860cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org // Number of promoted nodes to the old space. 2861cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org int nodes_promoted_; 2862cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org 2863c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Incremental marking steps counters. 2864c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int steps_count_; 2865c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com double steps_took_; 2866c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com double longest_step_; 2867c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int steps_count_since_last_gc_; 2868c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com double steps_took_since_last_gc_; 2869c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2870ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Heap* heap_; 2871994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 2872994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* gc_reason_; 2873994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* collector_reason_; 28747276f14ca716596e0a0d17539516370c1f453847kasper.lund}; 28757276f14ca716596e0a0d17539516370c1f453847kasper.lund 287618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 287778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgclass RegExpResultsCache { 2878486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org public: 287978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org enum ResultsCacheType { REGEXP_MULTIPLE_INDICES, STRING_SPLIT_SUBSTRINGS }; 288078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org 288178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org // Attempt to retrieve a cached result. On failure, 0 is returned as a Smi. 288278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org // On success, the returned result is guaranteed to be a COW-array. 288378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org static Object* Lookup(Heap* heap, 288478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org String* key_string, 288578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org Object* key_pattern, 288678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ResultsCacheType type); 288778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org // Attempt to add value_array to the cache specified by type. On success, 288878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org // value_array is turned into a COW-array. 2889486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org static void Enter(Heap* heap, 289078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org String* key_string, 289178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org Object* key_pattern, 289278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org FixedArray* value_array, 289378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ResultsCacheType type); 2894486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org static void Clear(FixedArray* cache); 289578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org static const int kRegExpResultsCacheSize = 0x100; 2896486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 2897486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org private: 2898486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org static const int kArrayEntriesPerCacheEntry = 4; 2899486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org static const int kStringOffset = 0; 2900486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org static const int kPatternOffset = 1; 2901486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org static const int kArrayOffset = 2; 2902486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org}; 2903486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 2904486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 290518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgclass TranscendentalCache { 290618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org public: 290718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org enum Type {ACOS, ASIN, ATAN, COS, EXP, LOG, SIN, TAN, kNumberOfCaches}; 2908023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org static const int kTranscendentalTypeBits = 3; 2909023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org STATIC_ASSERT((1 << kTranscendentalTypeBits) >= kNumberOfCaches); 291018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 291118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // Returns a heap number with f(input), where f is a math function specified 291218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // by the 'type' argument. 2913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT inline MaybeObject* Get(Type type, double input); 291418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 291518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // The cache contains raw Object pointers. This method disposes of 291618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // them before a garbage collection. 2917ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void Clear(); 291818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 291918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org private: 2920ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org class SubCache { 2921ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static const int kCacheSize = 512; 292218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 29233d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org explicit SubCache(Isolate* isolate, Type t); 2924ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2925ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org MUST_USE_RESULT inline MaybeObject* Get(double input); 2926ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2927ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline double Calculate(double input); 292818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 2929ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct Element { 2930ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org uint32_t in[2]; 2931ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object* output; 2932ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org }; 293318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 2934ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org union Converter { 2935ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org double dbl; 2936ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org uint32_t integers[2]; 2937ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org }; 293813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2939ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline static int Hash(const Converter& c) { 2940ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org uint32_t hash = (c.integers[0] ^ c.integers[1]); 2941ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org hash ^= static_cast<int32_t>(hash) >> 16; 2942ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org hash ^= static_cast<int32_t>(hash) >> 8; 2943ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return (hash & (kCacheSize - 1)); 2944ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 294513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2946ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Element elements_[kCacheSize]; 2947ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Type type_; 2948ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate_; 294913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2950ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allow access to the caches_ array as an ExternalReference. 2951ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class ExternalReference; 2952ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Inline implementation of the cache. 2953ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class TranscendentalCacheStub; 2954ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // For evaluating value. 2955ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class TranscendentalCache; 295613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2957ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(SubCache); 2958ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org }; 295913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 29603d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org explicit TranscendentalCache(Isolate* isolate) : isolate_(isolate) { 2961ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (int i = 0; i < kNumberOfCaches; ++i) caches_[i] = NULL; 2962ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 296313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 296493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org ~TranscendentalCache() { 296593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org for (int i = 0; i < kNumberOfCaches; ++i) delete caches_[i]; 296693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org } 296793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 2968ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Used to create an external reference. 2969ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org inline Address cache_array_address(); 297013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 2971ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Instantiation 2972ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Isolate; 2973ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Inline implementation of the caching. 2974ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class TranscendentalCacheStub; 2975ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allow access to the caches_ array as an ExternalReference. 2976ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class ExternalReference; 297713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 29783d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Isolate* isolate_; 2979ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SubCache* caches_[kNumberOfCaches]; 2980ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(TranscendentalCache); 298113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org}; 298213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 29834a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 29844a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org// Abstract base class for checking whether a weak object should be retained. 29854a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgclass WeakObjectRetainer { 29864a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org public: 29874a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org virtual ~WeakObjectRetainer() {} 29884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 29894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // Return whether this object should be retained. If NULL is returned the 29904a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // object has no references. Otherwise the address of the retained object 29914a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // should be returned as in some GC situations the object has been moved. 29924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org virtual Object* RetainAs(Object* object) = 0; 29934a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}; 29944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 29954a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 2996c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Intrusive object marking uses least significant bit of 2997c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// heap object's map word to mark objects. 2998c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Normally all map words have least significant bit set 2999c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// because they contain tagged map pointer. 3000c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// If the bit is not set object is marked. 3001c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// All objects should be unmarked before resuming 3002c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// JavaScript execution. 3003c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comclass IntrusiveMarking { 3004c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com public: 3005c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static bool IsMarked(HeapObject* object) { 3006c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return (object->map_word().ToRawValue() & kNotMarkedBit) == 0; 3007c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 3008c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3009c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static void ClearMark(HeapObject* object) { 3010c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com uintptr_t map_word = object->map_word().ToRawValue(); 3011c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com object->set_map_word(MapWord::FromRawValue(map_word | kNotMarkedBit)); 3012c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!IsMarked(object)); 3013c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 3014c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3015c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static void SetMark(HeapObject* object) { 3016c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com uintptr_t map_word = object->map_word().ToRawValue(); 3017c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com object->set_map_word(MapWord::FromRawValue(map_word & ~kNotMarkedBit)); 3018c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(IsMarked(object)); 3019c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 3020c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3021c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static Map* MapOfMarkedObject(HeapObject* object) { 3022c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com uintptr_t map_word = object->map_word().ToRawValue(); 3023c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return MapWord::FromRawValue(map_word | kNotMarkedBit).ToMap(); 3024c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 3025c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3026c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static int SizeOfMarkedObject(HeapObject* object) { 3027c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return object->SizeFromMap(MapOfMarkedObject(object)); 3028c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 3029c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3030c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com private: 3031c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const uintptr_t kNotMarkedBit = 0x1; 3032c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com STATIC_ASSERT((kHeapObjectTag & kNotMarkedBit) != 0); 3033c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 3034c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3035c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 303646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org#ifdef DEBUG 30373a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// Helper class for tracing paths to a search target Object from all roots. 30383a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// The TracePathFrom() method can be used to trace paths from a specific 30393a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// object to the search target object. 30403a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass PathTracer : public ObjectVisitor { 30413a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org public: 30423a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org enum WhatToFind { 30433a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org FIND_ALL, // Will find all matches. 30443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org FIND_FIRST // Will stop the search after first match. 30453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org }; 30463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // For the WhatToFind arg, if FIND_FIRST is specified, tracing will stop 30483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // after the first match. If FIND_ALL is specified, then tracing will be 30493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // done for all matches. 30503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org PathTracer(Object* search_target, 30513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org WhatToFind what_to_find, 30523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org VisitMode visit_mode) 30533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org : search_target_(search_target), 30543a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org found_target_(false), 30553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org found_target_in_trace_(false), 30563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org what_to_find_(what_to_find), 30573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org visit_mode_(visit_mode), 30583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object_stack_(20), 305979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org no_allocation() {} 30603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org virtual void VisitPointers(Object** start, Object** end); 30623a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30633a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void Reset(); 30643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void TracePathFrom(Object** root); 30653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org bool found() const { return found_target_; } 30673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30683a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org static Object* const kAnyGlobalObject; 30693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org protected: 30713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org class MarkVisitor; 30723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org class UnmarkVisitor; 30733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void MarkRecursively(Object** p, MarkVisitor* mark_visitor); 30753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void UnmarkRecursively(Object** p, UnmarkVisitor* unmark_visitor); 30763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org virtual void ProcessResults(); 30773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // Tags 0, 1, and 3 are used. Use 2 for marking visited HeapObject. 30793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org static const int kMarkTag = 2; 30803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 30813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org Object* search_target_; 30823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org bool found_target_; 30833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org bool found_target_in_trace_; 30843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org WhatToFind what_to_find_; 30853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org VisitMode visit_mode_; 30863a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org List<Object*> object_stack_; 30873a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 308879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_allocation; // i.e. no gc allowed. 30893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 309005ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org private: 30913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); 30923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}; 309346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org#endif // DEBUG 30943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 309543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 309643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 309743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_HEAP_H_ 3098