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#include "v8.h" 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "accessors.h" 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "api.h" 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "bootstrapper.h" 3344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org#include "codegen.h" 34b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org#include "compilation-cache.h" 35c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org#include "cpu-profiler.h" 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "debug.h" 374f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#include "deoptimizer.h" 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "global-handles.h" 39fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org#include "heap-profiler.h" 40c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "incremental-marking.h" 41c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org#include "isolate-inl.h" 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "mark-compact.h" 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "natives.h" 44ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org#include "objects-visiting.h" 45c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "objects-visiting-inl.h" 467d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org#include "once.h" 47a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "runtime-profiler.h" 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "scopeinfo.h" 493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#include "snapshot.h" 50c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "store-buffer.h" 51c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org#include "utils/random-number-generator.h" 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "v8threads.h" 5356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org#include "v8utils.h" 54a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "vm-state-inl.h" 55c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#if V8_TARGET_ARCH_ARM && !V8_INTERPRETED_REGEXP 5618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#include "regexp-macro-assembler.h" 573811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#include "arm/regexp-macro-assembler-arm.h" 5818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif 597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#if V8_TARGET_ARCH_MIPS && !V8_INTERPRETED_REGEXP 607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#include "regexp-macro-assembler.h" 617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#include "mips/regexp-macro-assembler-mips.h" 627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 6571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 677276f14ca716596e0a0d17539516370c1f453847kasper.lund 68ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgHeap::Heap() 69ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org : isolate_(NULL), 70cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org code_range_size_(kIs64BitArch ? 512 * MB : 0), 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// semispace_size_ should be a power of 2 and old_generation_size_ should be 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// a multiple of Page::kPageSize. 73cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org reserved_semispace_size_(8 * (kPointerSize / 4) * MB), 74cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org max_semispace_size_(8 * (kPointerSize / 4) * MB), 7564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org initial_semispace_size_(Page::kPageSize), 76cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org max_old_generation_size_(700ul * (kPointerSize / 4) * MB), 77cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org max_executable_size_(256ul * (kPointerSize / 4) * MB), 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Variables set based on semispace_size_ and old_generation_size_ in 79ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// ConfigureHeap (survived_since_last_expansion_, external_allocation_limit_) 803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// Will be 4 * reserved_semispace_size_ to ensure that young 813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// generation can be aligned to its size. 82057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org maximum_committed_(0), 83ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org survived_since_last_expansion_(0), 84ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org sweep_generation_(0), 85ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org always_allocate_scope_depth_(0), 86ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org linear_allocation_scope_depth_(0), 87ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org contexts_disposed_(0), 8888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org global_ic_age_(0), 89c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org flush_monomorphic_ics_(false), 90c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scan_on_scavenge_pages_(0), 91ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org new_space_(this), 92ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org old_pointer_space_(NULL), 93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org old_data_space_(NULL), 94ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_space_(NULL), 95ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org map_space_(NULL), 96ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org cell_space_(NULL), 9741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_(NULL), 98ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org lo_space_(NULL), 99ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org gc_state_(NOT_IN_GC), 100d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com gc_post_processing_depth_(0), 101ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ms_count_(0), 102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org gc_count_(0), 1032c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org remembered_unmapped_pages_index_(0), 104ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unflattened_strings_length_(0), 1057276f14ca716596e0a0d17539516370c1f453847kasper.lund#ifdef DEBUG 106ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org allocation_timeout_(0), 107ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org disallow_allocation_failure_(false), 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // DEBUG 1091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org new_space_high_promotion_mode_active_(false), 110a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org old_generation_allocation_limit_(kMinimumOldGenerationAllocationLimit), 111c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com size_of_old_gen_at_last_old_space_gc_(0), 112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org external_allocation_limit_(0), 113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org amount_of_external_allocated_memory_(0), 114ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org amount_of_external_allocated_memory_at_last_global_gc_(0), 115ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org old_gen_exhausted_(false), 116b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline_allocation_disabled_(false), 117c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_rebuilder_(store_buffer()), 1184a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org hidden_string_(NULL), 119ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org gc_safe_size_of_old_object_(NULL), 1207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org total_regexp_code_generated_(0), 121ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org tracer_(NULL), 122ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org young_survivors_after_last_gc_(0), 123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org high_survival_rate_period_length_(0), 124fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org low_survival_rate_period_length_(0), 125ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org survival_rate_(0), 126ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org previous_survival_rate_trend_(Heap::STABLE), 127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org survival_rate_trend_(Heap::STABLE), 128c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org max_gc_pause_(0.0), 129c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org total_gc_time_ms_(0.0), 130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org max_alive_after_gc_(0), 131ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org min_in_mutator_(kMaxInt), 132ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org alive_after_last_gc_(0), 133ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_gc_end_timestamp_(0.0), 134e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org marking_time_(0.0), 135e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org sweeping_time_(0.0), 136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_(this), 137c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com marking_(this), 138c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com incremental_marking_(this), 139ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org number_idle_notifications_(0), 140ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_(0), 141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_init_(false), 142ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org mark_sweeps_since_idle_round_started_(0), 143ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org gc_count_at_last_idle_gc_(0), 144ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org scavenges_since_last_idle_round_(kIdleScavengeThreshold), 145a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org full_codegen_bytes_generated_(0), 146a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org crankshaft_codegen_bytes_generated_(0), 14732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org gcs_since_last_deopt_(0), 14894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#ifdef VERIFY_HEAP 14925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org no_weak_object_verification_scope_depth_(0), 15094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org#endif 151c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org promotion_queue_(this), 152ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org configured_(false), 153ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org chunks_queued_for_free_(NULL), 154ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org relocation_mutex_(NULL) { 155ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Allow build-time customization of the max semispace size. Building 156ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // V8 with snapshots and a non-default max semispace size is much 157ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // easier if you can define it as part of the build environment. 158ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#if defined(V8_MAX_SEMISPACE_SIZE) 159ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org max_semispace_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; 160ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 161ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 162cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org // Ensure old_generation_size_ is a multiple of kPageSize. 163cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org ASSERT(MB >= Page::kPageSize); 164cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org 165ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org intptr_t max_virtual = OS::MaxVirtualMemory(); 166ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 167ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org if (max_virtual > 0) { 168ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org if (code_range_size_ > 0) { 169ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org // Reserve no more than 1/8 of the memory for the code range. 170ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org code_range_size_ = Min(code_range_size_, max_virtual >> 3); 171ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org } 172ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org } 173ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org 174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); 17546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_contexts_list_ = NULL; 1761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org array_buffers_list_ = Smi::FromInt(0); 177ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org allocation_sites_list_ = Smi::FromInt(0); 178ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org mark_compact_collector_.heap_ = this; 179ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org external_string_table_.heap_ = this; 180cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org // Put a dummy entry in the remembered pages so we can find the list the 181cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org // minidump even if there are no real unmapped pages. 182cb9affa86506f210b7d9b425012b1026b4fd0f2fyangguo@chromium.org RememberUnmappedPage(NULL, false); 18328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 18428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org ClearObjectStats(true); 185ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 188f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgintptr_t Heap::Capacity() { 189f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!HasBeenSetUp()) return 0; 19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return new_space_.Capacity() + 1929258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_->Capacity() + 1939258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_->Capacity() + 19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_->Capacity() + 195defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org map_space_->Capacity() + 19641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org cell_space_->Capacity() + 19741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->Capacity(); 19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 201f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgintptr_t Heap::CommittedMemory() { 202f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!HasBeenSetUp()) return 0; 2033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return new_space_.CommittedMemory() + 2053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org old_pointer_space_->CommittedMemory() + 2063811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org old_data_space_->CommittedMemory() + 2073811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org code_space_->CommittedMemory() + 2083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org map_space_->CommittedMemory() + 2093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org cell_space_->CommittedMemory() + 21041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->CommittedMemory() + 2113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org lo_space_->Size(); 2123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 2133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 21472204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 21572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.orgsize_t Heap::CommittedPhysicalMemory() { 21672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org if (!HasBeenSetUp()) return 0; 21772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 21872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org return new_space_.CommittedPhysicalMemory() + 21972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org old_pointer_space_->CommittedPhysicalMemory() + 22072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org old_data_space_->CommittedPhysicalMemory() + 22172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org code_space_->CommittedPhysicalMemory() + 22272204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org map_space_->CommittedPhysicalMemory() + 22372204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org cell_space_->CommittedPhysicalMemory() + 22441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->CommittedPhysicalMemory() + 22572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org lo_space_->CommittedPhysicalMemory(); 22672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org} 22772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 22872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 22901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgintptr_t Heap::CommittedMemoryExecutable() { 230f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!HasBeenSetUp()) return 0; 23101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 232ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return isolate()->memory_allocator()->SizeExecutable(); 23301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 23401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 2353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 236057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid Heap::UpdateMaximumCommitted() { 237057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org if (!HasBeenSetUp()) return; 238057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 239057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org intptr_t current_committed_memory = CommittedMemory(); 240057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org if (current_committed_memory > maximum_committed_) { 241057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org maximum_committed_ = current_committed_memory; 242057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org } 243057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org} 244057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 245057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 246f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgintptr_t Heap::Available() { 247f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!HasBeenSetUp()) return 0; 24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return new_space_.Available() + 2509258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_->Available() + 2519258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_->Available() + 25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_->Available() + 253defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org map_space_->Available() + 25441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org cell_space_->Available() + 25541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->Available(); 25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 259f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.combool Heap::HasBeenSetUp() { 2605a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return old_pointer_space_ != NULL && 2619258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_ != NULL && 2629258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org code_space_ != NULL && 2639258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org map_space_ != NULL && 264defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org cell_space_ != NULL && 26541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_ != NULL && 2669258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org lo_space_ != NULL; 26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 270d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgint Heap::GcSafeSizeOfOldObject(HeapObject* object) { 271c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (IntrusiveMarking::IsMarked(object)) { 272c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return IntrusiveMarking::SizeOfMarkedObject(object); 273d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org } 274c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return object->SizeFromMap(object->map()); 275d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org} 276d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 277d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 278994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgGarbageCollector Heap::SelectGarbageCollector(AllocationSpace space, 279994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char** reason) { 28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Is global GC requested? 281efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org if (space != NEW_SPACE) { 282ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->gc_compactor_caused_by_request()->Increment(); 283994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org *reason = "GC in old space requested"; 28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return MARK_COMPACTOR; 28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 287efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org if (FLAG_gc_global || (FLAG_stress_compaction && (gc_count_ & 1) != 0)) { 288efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org *reason = "GC in old space forced by flags"; 289efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org return MARK_COMPACTOR; 290efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org } 291efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Is enough data promoted to justify a global GC? 293a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (OldGenerationAllocationLimitReached()) { 294ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->gc_compactor_caused_by_promoted_data()->Increment(); 295994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org *reason = "promotion limit reached"; 29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return MARK_COMPACTOR; 29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Have allocation in OLD and LO failed? 30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (old_gen_exhausted_) { 301ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()-> 302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org gc_compactor_caused_by_oldspace_exhaustion()->Increment(); 303994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org *reason = "old generations exhausted"; 30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return MARK_COMPACTOR; 30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Is there enough space left in OLD to guarantee that a scavenge can 30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // succeed? 30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 3109258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // Note that MemoryAllocator->MaxAvailable() undercounts the memory available 31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for object promotion. It counts only the bytes that the memory 31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // allocator has not yet allocated from the OS and assigned to any space, 31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // and does not count available bytes already in the old space or code 31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // space. Undercounting is safe---we may get an unrequested full GC when 31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // a scavenge would have succeeded. 316ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (isolate_->memory_allocator()->MaxAvailable() <= new_space_.Size()) { 317ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()-> 318ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org gc_compactor_caused_by_oldspace_exhaustion()->Increment(); 319994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org *reason = "scavenge might not succeed"; 32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return MARK_COMPACTOR; 32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Default 324994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org *reason = NULL; 32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return SCAVENGER; 32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// TODO(1238405): Combine the infrastructure for --heap-stats and 33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-gc to avoid the complicated preprocessor and flag testing. 33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::ReportStatisticsBeforeGC() { 33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Heap::ReportHeapStatistics will also log NewSpace statistics when 333030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org // compiled --log-gc is set. The following logic is used to avoid 334030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org // double logging. 335030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#ifdef DEBUG 3365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (FLAG_heap_stats || FLAG_log_gc) new_space_.CollectStatistics(); 33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_heap_stats) { 33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ReportHeapStatistics("Before GC"); 33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (FLAG_log_gc) { 3405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.ReportStatistics(); 34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 3425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (FLAG_heap_stats || FLAG_log_gc) new_space_.ClearHistograms(); 343030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#else 34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_log_gc) { 3455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.CollectStatistics(); 3465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.ReportStatistics(); 3475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.ClearHistograms(); 34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 349030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#endif // DEBUG 35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 353e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgvoid Heap::PrintShortHeapStatistics() { 354e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org if (!FLAG_trace_gc_verbose) return; 355657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Memory allocator, used: %6" V8_PTR_PREFIX "d KB" 356657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB\n", 357657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org isolate_->memory_allocator()->Size() / KB, 358657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org isolate_->memory_allocator()->Available() / KB); 359657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("New space, used: %6" V8_PTR_PREFIX "d KB" 360657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 361657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 362657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org new_space_.Size() / KB, 363657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org new_space_.Available() / KB, 364657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org new_space_.CommittedMemory() / KB); 365657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Old pointers, used: %6" V8_PTR_PREFIX "d KB" 366657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 367657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 368657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org old_pointer_space_->SizeOfObjects() / KB, 369657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org old_pointer_space_->Available() / KB, 370657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org old_pointer_space_->CommittedMemory() / KB); 371657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Old data space, used: %6" V8_PTR_PREFIX "d KB" 372657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 373657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 374657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org old_data_space_->SizeOfObjects() / KB, 375657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org old_data_space_->Available() / KB, 376657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org old_data_space_->CommittedMemory() / KB); 377657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Code space, used: %6" V8_PTR_PREFIX "d KB" 378657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 379657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 380657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org code_space_->SizeOfObjects() / KB, 381657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org code_space_->Available() / KB, 382657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org code_space_->CommittedMemory() / KB); 383657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Map space, used: %6" V8_PTR_PREFIX "d KB" 384657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 385657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 386657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org map_space_->SizeOfObjects() / KB, 387657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org map_space_->Available() / KB, 388657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org map_space_->CommittedMemory() / KB); 389657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Cell space, used: %6" V8_PTR_PREFIX "d KB" 390657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 391657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 392657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org cell_space_->SizeOfObjects() / KB, 393657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org cell_space_->Available() / KB, 394657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org cell_space_->CommittedMemory() / KB); 39541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org PrintPID("PropertyCell space, used: %6" V8_PTR_PREFIX "d KB" 39641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 39741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 39841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->SizeOfObjects() / KB, 39941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->Available() / KB, 40041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->CommittedMemory() / KB); 401657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Large object space, used: %6" V8_PTR_PREFIX "d KB" 402657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 403657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 404657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org lo_space_->SizeOfObjects() / KB, 405657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org lo_space_->Available() / KB, 406657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org lo_space_->CommittedMemory() / KB); 40733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org PrintPID("All spaces, used: %6" V8_PTR_PREFIX "d KB" 40833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org ", available: %6" V8_PTR_PREFIX "d KB" 40933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org ", committed: %6" V8_PTR_PREFIX "d KB\n", 41033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org this->SizeOfObjects() / KB, 41133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org this->Available() / KB, 41233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org this->CommittedMemory() / KB); 413f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org PrintPID("External memory reported: %6" V8_PTR_PREFIX "d KB\n", 4147ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org static_cast<intptr_t>(amount_of_external_allocated_memory_ / KB)); 415c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintPID("Total time spent in GC : %.1f ms\n", total_gc_time_ms_); 416e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org} 417e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 418e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// TODO(1238405): Combine the infrastructure for --heap-stats and 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --log-gc to avoid the complicated preprocessor and flag testing. 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::ReportStatisticsAfterGC() { 42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Similar to the before GC, we use some complicated logic to ensure that 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // NewSpace statistics are logged exactly once when --log-gc is turned on. 424030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#if defined(DEBUG) 42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_heap_stats) { 4262abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org new_space_.CollectStatistics(); 42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ReportHeapStatistics("After GC"); 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (FLAG_log_gc) { 4295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.ReportStatistics(); 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 431030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#else 4325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (FLAG_log_gc) new_space_.ReportStatistics(); 433030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#endif // DEBUG 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::GarbageCollectionPrologue() { 43879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org { AllowHeapAllocation for_the_first_part_of_prologue; 43979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org isolate_->transcendental_cache()->Clear(); 44079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org ClearJSFunctionResultCaches(); 44179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org gc_count_++; 44279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org unflattened_strings_length_ = 0; 44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org if (FLAG_flush_code && FLAG_flush_code_incrementally) { 44579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org mark_compact_collector()->EnableCodeFlushing(true); 44679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org } 447e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 448c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 44979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org if (FLAG_verify_heap) { 45079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org Verify(); 45179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org } 452c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 45379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org } 454c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 455057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org UpdateMaximumCommitted(); 456057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 457c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef DEBUG 45879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org ASSERT(!AllowHeapAllocation::IsAllowed() && gc_state_ == NOT_IN_GC); 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_gc_verbose) Print(); 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ReportStatisticsBeforeGC(); 463030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#endif // DEBUG 4640ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 465c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->GCPrologue(); 4662ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org 4679af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (isolate()->concurrent_osr_enabled()) { 4682ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org isolate()->optimizing_compiler_thread()->AgeBufferedOsrJobs(); 4692ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org } 47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 473f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.orgintptr_t Heap::SizeOfObjects() { 474f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t total = 0; 4757c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org AllSpaces spaces(this); 476b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org for (Space* space = spaces.next(); space != NULL; space = spaces.next()) { 4774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com total += space->SizeOfObjects(); 478911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 4799258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return total; 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 483e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgvoid Heap::ClearAllICsByKind(Code::Kind kind) { 484e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org HeapObjectIterator it(code_space()); 485e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 486e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org for (Object* object = it.Next(); object != NULL; object = it.Next()) { 487e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Code* code = Code::cast(object); 488e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Code::Kind current_kind = code->kind(); 489e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (current_kind == Code::FUNCTION || 490e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org current_kind == Code::OPTIMIZED_FUNCTION) { 491e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org code->ClearInlineCaches(kind); 492e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 493e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 494e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 495e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 496e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 49756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgvoid Heap::RepairFreeListsAfterBoot() { 4987c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org PagedSpaces spaces(this); 49956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (PagedSpace* space = spaces.next(); 50056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org space != NULL; 50156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org space = spaces.next()) { 50256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org space->RepairFreeListsAfterBoot(); 50356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 50456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org} 50556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 50656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::GarbageCollectionEpilogue() { 508c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org if (FLAG_allocation_site_pretenuring) { 509c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org int tenure_decisions = 0; 510c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org int dont_tenure_decisions = 0; 511c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org int allocation_mementos_found = 0; 512c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 513c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org Object* cur = allocation_sites_list(); 514c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org while (cur->IsAllocationSite()) { 515c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org AllocationSite* casted = AllocationSite::cast(cur); 516c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org allocation_mementos_found += casted->memento_found_count()->value(); 517c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org if (casted->DigestPretenuringFeedback()) { 518c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org if (casted->GetPretenureMode() == TENURED) { 519c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org tenure_decisions++; 520c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } else { 521c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org dont_tenure_decisions++; 522c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 523c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 524c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org cur = casted->weak_next(); 525c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 526c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 527c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // TODO(mvstanton): Pretenure decisions are only made once for an allocation 528c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // site. Find a sane way to decide about revisiting the decision later. 529c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 530c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org if (FLAG_trace_track_allocation_sites && 531c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org (allocation_mementos_found > 0 || 532c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org tenure_decisions > 0 || 533c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org dont_tenure_decisions > 0)) { 534c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org PrintF("GC: (#mementos, #tenure decisions, #donttenure decisions) " 535c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org "(%d, %d, %d)\n", 536c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org allocation_mementos_found, 537c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org tenure_decisions, 538c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org dont_tenure_decisions); 539c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 540c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 541c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 542c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->GCEpilogue(); 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 544c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // In release mode, we only zap the from space under heap verification. 545c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org if (Heap::ShouldZapGarbage()) { 546c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org ZapFromSpace(); 547c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org } 548c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 549c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_verify_heap) { 55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Verify(); 55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 553c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org AllowHeapAllocation for_the_rest_of_the_epilogue; 55679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org 557c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef DEBUG 558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (FLAG_print_global_handles) isolate_->global_handles()->Print(); 55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_print_handles) PrintHandles(); 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_gc_verbose) Print(); 56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (FLAG_code_stats) ReportCodeStatistics("After GC"); 56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 56332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (FLAG_deopt_every_n_garbage_collections > 0) { 56432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (++gcs_since_last_deopt_ == FLAG_deopt_every_n_garbage_collections) { 56532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Deoptimizer::DeoptimizeAll(isolate()); 56632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org gcs_since_last_deopt_ = 0; 56732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 56832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 570057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org UpdateMaximumCommitted(); 571057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 572ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->alive_after_last_gc()->Set( 573ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static_cast<int>(SizeOfObjects())); 57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5754a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org isolate_->counters()->string_table_capacity()->Set( 5764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->Capacity()); 577ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->number_of_symbols()->Set( 5784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->NumberOfElements()); 5797a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org 580a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org if (full_codegen_bytes_generated_ + crankshaft_codegen_bytes_generated_ > 0) { 581a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->codegen_fraction_crankshaft()->AddSample( 582a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org static_cast<int>((crankshaft_codegen_bytes_generated_ * 100.0) / 583a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org (crankshaft_codegen_bytes_generated_ 584a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org + full_codegen_bytes_generated_))); 585a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 586a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 587753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org if (CommittedMemory() > 0) { 588753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org isolate_->counters()->external_fragmentation_total()->AddSample( 589753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(100 - (SizeOfObjects() * 100.0) / CommittedMemory())); 590471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 591a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->heap_fraction_new_space()-> 592a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org AddSample(static_cast<int>( 593a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org (new_space()->CommittedMemory() * 100.0) / CommittedMemory())); 594a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->heap_fraction_old_pointer_space()->AddSample( 595a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org static_cast<int>( 596a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org (old_pointer_space()->CommittedMemory() * 100.0) / 597a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CommittedMemory())); 598a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->heap_fraction_old_data_space()->AddSample( 599a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org static_cast<int>( 600a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org (old_data_space()->CommittedMemory() * 100.0) / 601a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CommittedMemory())); 602a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->heap_fraction_code_space()-> 603a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org AddSample(static_cast<int>( 604a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org (code_space()->CommittedMemory() * 100.0) / CommittedMemory())); 605471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org isolate_->counters()->heap_fraction_map_space()->AddSample( 606471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static_cast<int>( 607471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org (map_space()->CommittedMemory() * 100.0) / CommittedMemory())); 608471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org isolate_->counters()->heap_fraction_cell_space()->AddSample( 609471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static_cast<int>( 610471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org (cell_space()->CommittedMemory() * 100.0) / CommittedMemory())); 61141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org isolate_->counters()->heap_fraction_property_cell_space()-> 61241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org AddSample(static_cast<int>( 61341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org (property_cell_space()->CommittedMemory() * 100.0) / 61441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org CommittedMemory())); 615a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->heap_fraction_lo_space()-> 616a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org AddSample(static_cast<int>( 617a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org (lo_space()->CommittedMemory() * 100.0) / CommittedMemory())); 618471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 619471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org isolate_->counters()->heap_sample_total_committed()->AddSample( 620471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static_cast<int>(CommittedMemory() / KB)); 621471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org isolate_->counters()->heap_sample_total_used()->AddSample( 622471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static_cast<int>(SizeOfObjects() / KB)); 623471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org isolate_->counters()->heap_sample_map_space_committed()->AddSample( 624471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static_cast<int>(map_space()->CommittedMemory() / KB)); 625471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org isolate_->counters()->heap_sample_cell_space_committed()->AddSample( 626471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static_cast<int>(cell_space()->CommittedMemory() / KB)); 62741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org isolate_->counters()-> 62841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap_sample_property_cell_space_committed()-> 62941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org AddSample(static_cast<int>( 63041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space()->CommittedMemory() / KB)); 631a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org isolate_->counters()->heap_sample_code_space_committed()->AddSample( 632a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org static_cast<int>(code_space()->CommittedMemory() / KB)); 633057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 634057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org isolate_->counters()->heap_sample_maximum_committed()->AddSample( 635057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static_cast<int>(MaximumCommittedMemory() / KB)); 636753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org } 637753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 638753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#define UPDATE_COUNTERS_FOR_SPACE(space) \ 639753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org isolate_->counters()->space##_bytes_available()->Set( \ 640753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(space()->Available())); \ 641753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org isolate_->counters()->space##_bytes_committed()->Set( \ 642753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(space()->CommittedMemory())); \ 643753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org isolate_->counters()->space##_bytes_used()->Set( \ 644753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(space()->SizeOfObjects())); 645753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#define UPDATE_FRAGMENTATION_FOR_SPACE(space) \ 646753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org if (space()->CommittedMemory() > 0) { \ 647753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org isolate_->counters()->external_fragmentation_##space()->AddSample( \ 648753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(100 - \ 649753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org (space()->SizeOfObjects() * 100.0) / space()->CommittedMemory())); \ 650753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org } 651753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#define UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(space) \ 652753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_FOR_SPACE(space) \ 653753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_FRAGMENTATION_FOR_SPACE(space) 654753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 65528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org UPDATE_COUNTERS_FOR_SPACE(new_space) 656753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_pointer_space) 657753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_data_space) 658753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(code_space) 659753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(map_space) 660753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(cell_space) 66141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(property_cell_space) 662753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(lo_space) 66328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org#undef UPDATE_COUNTERS_FOR_SPACE 664753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#undef UPDATE_FRAGMENTATION_FOR_SPACE 665753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE 6667a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org 667030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#if defined(DEBUG) 66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ReportStatisticsAfterGC(); 669030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#endif // DEBUG 6707c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT 671ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->debug()->AfterGarbageCollection(); 6727c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#endif // ENABLE_DEBUGGER_SUPPORT 67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 676994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid Heap::CollectAllGarbage(int flags, const char* gc_reason) { 6779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // Since we are ignoring the return value, the exact choice of space does 6789258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // not matter, so long as we do not specify NEW_SPACE, which would not 6799258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // cause a full GC. 680c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mark_compact_collector_.SetFlags(flags); 681994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CollectGarbage(OLD_POINTER_SPACE, gc_reason); 682c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mark_compact_collector_.SetFlags(kNoGCFlags); 6839258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 6849258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 6859258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 686994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgvoid Heap::CollectAllAvailableGarbage(const char* gc_reason) { 687f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Since we are ignoring the return value, the exact choice of space does 688f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // not matter, so long as we do not specify NEW_SPACE, which would not 689f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // cause a full GC. 690f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Major GC would invoke weak handle callbacks on weakly reachable 691f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // handles, but won't collect weakly reachable objects until next 692f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // major GC. Therefore if we collect aggressively and weak handle callback 693f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // has been invoked, we rerun major GC to release objects which become 694f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // garbage. 695f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Note: as weak callbacks can execute arbitrary code, we cannot 696f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // hope that eventually there will be no weak callbacks invocations. 697f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Therefore stop recollecting after several attempts. 6989af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (isolate()->concurrent_recompilation_enabled()) { 6993d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org // The optimizing compiler may be unnecessarily holding on to memory. 7003d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org DisallowHeapAllocation no_recursive_gc; 7013d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org isolate()->optimizing_compiler_thread()->Flush(); 7023d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org } 703994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org mark_compact_collector()->SetFlags(kMakeHeapIterableMask | 704994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org kReduceMemoryFootprintMask); 705c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org isolate_->compilation_cache()->Clear(); 706f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org const int kMaxNumberOfAttempts = 7; 707bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org const int kMinNumberOfAttempts = 2; 708f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org for (int attempt = 0; attempt < kMaxNumberOfAttempts; attempt++) { 709bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org if (!CollectGarbage(OLD_POINTER_SPACE, MARK_COMPACTOR, gc_reason, NULL) && 710bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org attempt + 1 >= kMinNumberOfAttempts) { 711f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org break; 712f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org } 713f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org } 714c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mark_compact_collector()->SetFlags(kNoGCFlags); 715c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org new_space_.Shrink(); 716bf0c820d028452571c8c744ddd212c32c6d6a996danno@chromium.org UncommitFromSpace(); 717c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org incremental_marking()->UncommitMarkingDeque(); 718f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 719f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 720f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 721994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgbool Heap::CollectGarbage(AllocationSpace space, 722994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GarbageCollector collector, 723994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* gc_reason, 724994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* collector_reason) { 72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The VM is in the GC state until exiting this function. 726ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org VMState<GC> state(isolate_); 72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Reset the allocation timeout to the GC interval, but make sure to 73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // allow at least a few allocations after a collection. The reason 73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for this is that we have a lot of allocation sequences and we 73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // assume that a garbage collection will allow the subsequent 73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // allocation attempts to go through. 73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen allocation_timeout_ = Max(6, FLAG_gc_interval); 73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 737c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (collector == SCAVENGER && !incremental_marking()->IsStopped()) { 738c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_trace_incremental_marking) { 739c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF("[IncrementalMarking] Scavenge during marking.\n"); 740c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 741c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 742c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 743c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (collector == MARK_COMPACTOR && 74483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org !mark_compact_collector()->abort_incremental_marking() && 745c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com !incremental_marking()->IsStopped() && 746c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com !incremental_marking()->should_hurry() && 747c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FLAG_incremental_marking_steps) { 7487d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org // Make progress in incremental marking. 7497d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const intptr_t kStepSizeWhenDelayedByScavenge = 1 * MB; 7507d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org incremental_marking()->Step(kStepSizeWhenDelayedByScavenge, 7517d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org IncrementalMarking::NO_GC_VIA_STACK_GUARD); 7527d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org if (!incremental_marking()->IsComplete()) { 7537d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org if (FLAG_trace_incremental_marking) { 7547d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org PrintF("[IncrementalMarking] Delaying MarkSweep.\n"); 7557d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org } 7567d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org collector = SCAVENGER; 7577d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org collector_reason = "incremental marking delaying mark-sweep"; 758c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 759c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 760c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 761f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org bool next_gc_likely_to_collect_more = false; 762f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 763994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org { GCTracer tracer(this, gc_reason, collector_reason); 76479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org ASSERT(AllowHeapAllocation::IsAllowed()); 76579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_allocation_during_gc; 76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GarbageCollectionPrologue(); 7677276f14ca716596e0a0d17539516370c1f453847kasper.lund // The GC count was incremented in the prologue. Tell the tracer about 7687276f14ca716596e0a0d17539516370c1f453847kasper.lund // it. 7697276f14ca716596e0a0d17539516370c1f453847kasper.lund tracer.set_gc_count(gc_count_); 77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7717276f14ca716596e0a0d17539516370c1f453847kasper.lund // Tell the tracer which collector we've selected. 77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen tracer.set_collector(collector); 77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7748e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { 7758e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org HistogramTimerScope histogram_timer_scope( 7768e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (collector == SCAVENGER) ? isolate_->counters()->gc_scavenger() 7778e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : isolate_->counters()->gc_compactor()); 7788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org next_gc_likely_to_collect_more = 7798e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org PerformGarbageCollection(collector, &tracer); 7808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GarbageCollectionEpilogue(); 78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 78583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // Start incremental marking for the next cycle. The heap snapshot 78683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // generator needs incremental marking to stay off after it aborted. 78783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (!mark_compact_collector()->abort_incremental_marking() && 78883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org incremental_marking()->IsStopped() && 78983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org incremental_marking()->WorthActivating() && 79083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org NextGCIsLikelyToBeFull()) { 79183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org incremental_marking()->Start(); 792c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 793c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 794f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org return next_gc_likely_to_collect_more; 79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 798594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgint Heap::NotifyContextDisposed() { 7999af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (isolate()->concurrent_recompilation_enabled()) { 800594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Flush the queued recompilation tasks. 801594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org isolate()->optimizing_compiler_thread()->Flush(); 802594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 803594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org flush_monomorphic_ics_ = true; 804e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org AgeInlineCaches(); 805594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return ++contexts_disposed_; 806594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 807594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 808594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 8097276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid Heap::PerformScavenge() { 810994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org GCTracer tracer(this, NULL, NULL); 811c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (incremental_marking()->IsStopped()) { 812c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PerformGarbageCollection(SCAVENGER, &tracer); 813c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 814c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PerformGarbageCollection(MARK_COMPACTOR, &tracer); 815c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 8167276f14ca716596e0a0d17539516370c1f453847kasper.lund} 8177276f14ca716596e0a0d17539516370c1f453847kasper.lund 8187276f14ca716596e0a0d17539516370c1f453847kasper.lund 81959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgvoid Heap::MoveElements(FixedArray* array, 82059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int dst_index, 82159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int src_index, 82259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int len) { 82359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (len == 0) return; 82459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 825c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org ASSERT(array->map() != fixed_cow_array_map()); 82659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Object** dst_objects = array->data_start() + dst_index; 827e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemMove(dst_objects, 828e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array->data_start() + src_index, 829e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org len * kPointerSize); 83059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (!InNewSpace(array)) { 83159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org for (int i = 0; i < len; i++) { 83259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // TODO(hpayer): check store buffer for entries 83359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (InNewSpace(dst_objects[i])) { 83459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org RecordWrite(array->address(), array->OffsetOfElementAt(dst_index + i)); 83559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 83659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 83759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 83859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org incremental_marking()->RecordWrites(array); 83959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 84059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 84159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 842c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 8434a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org// Helper class for verifying the string table. 8444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgclass StringTableVerifier : public ObjectVisitor { 845416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org public: 846416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org void VisitPointers(Object** start, Object** end) { 847416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org // Visit all HeapObject pointers in [start, end). 848416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org for (Object** p = start; p < end; p++) { 849416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org if ((*p)->IsHeapObject()) { 8504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Check that the string is actually internalized. 8514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org CHECK((*p)->IsTheHole() || (*p)->IsUndefined() || 8524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org (*p)->IsInternalizedString()); 853d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 854d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 855416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org } 856416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org}; 857d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 858416c5b0a9354c0e058499fb00384edefe874e1fbkasperl@chromium.org 859c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgstatic void VerifyStringTable(Heap* heap) { 8604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org StringTableVerifier verifier; 861c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org heap->string_table()->IterateElements(&verifier); 862d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 863c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif // VERIFY_HEAP 864d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 865d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 866bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comstatic bool AbortIncrementalMarkingAndCollectGarbage( 867bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Heap* heap, 868bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com AllocationSpace space, 869bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com const char* gc_reason = NULL) { 870bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com heap->mark_compact_collector()->SetFlags(Heap::kAbortIncrementalMarkingMask); 871bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com bool result = heap->CollectGarbage(space, gc_reason); 872bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com heap->mark_compact_collector()->SetFlags(Heap::kNoGCFlags); 873bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com return result; 874bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com} 875bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 876bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 877935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.orgvoid Heap::ReserveSpace(int *sizes, Address *locations_out) { 8780c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org bool gc_performed = true; 87905ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org int counter = 0; 88005ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org static const int kThreshold = 20; 88105ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org while (gc_performed && counter++ < kThreshold) { 8820c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org gc_performed = false; 88356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ASSERT(NEW_SPACE == FIRST_PAGED_SPACE - 1); 88456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org for (int space = NEW_SPACE; space <= LAST_PAGED_SPACE; space++) { 88556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (sizes[space] != 0) { 88656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org MaybeObject* allocation; 88756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (space == NEW_SPACE) { 88856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org allocation = new_space()->AllocateRaw(sizes[space]); 88956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } else { 89056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org allocation = paged_space(space)->AllocateRaw(sizes[space]); 89156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 89256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org FreeListNode* node; 89356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (!allocation->To<FreeListNode>(&node)) { 89456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (space == NEW_SPACE) { 89556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org Heap::CollectGarbage(NEW_SPACE, 89656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org "failed to reserve space in the new space"); 89756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } else { 89856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org AbortIncrementalMarkingAndCollectGarbage( 89956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org this, 90056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org static_cast<AllocationSpace>(space), 90156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org "failed to reserve space in paged space"); 90256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 90356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org gc_performed = true; 90456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org break; 90556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } else { 90656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // Mark with a free list node, in case we have a GC before 90756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // deserializing. 90856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org node->set_size(this, sizes[space]); 90956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org locations_out[space] = node->address(); 91056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 91156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 9120c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 9130c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 91405ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org 91505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org if (gc_performed) { 91605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org // Failed to reserve the space after several attempts. 91705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org V8::FatalProcessOutOfMemory("Heap::ReserveSpace"); 91805ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org } 9190c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 9200c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 9210c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 922add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.orgvoid Heap::EnsureFromSpaceIsCommitted() { 923add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org if (new_space_.CommitFromSpaceIfNeeded()) return; 924add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org 925add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org // Committing memory to from space failed. 926add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org // Memory is exhausted and we will die. 927add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org V8::FatalProcessOutOfMemory("Committing semi space failed."); 928add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org} 929add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org 930add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org 931e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgvoid Heap::ClearJSFunctionResultCaches() { 932ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (isolate_->bootstrapper()->IsActive()) return; 933ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 93446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Object* context = native_contexts_list_; 935e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org while (!context->IsUndefined()) { 9367ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Get the caches for this context. GC can happen when the context 9377ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // is not fully initialized, so the caches can be undefined. 9387ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org Object* caches_or_undefined = 9397ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org Context::cast(context)->get(Context::JSFUNCTION_RESULT_CACHES_INDEX); 9407ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org if (!caches_or_undefined->IsUndefined()) { 9417ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org FixedArray* caches = FixedArray::cast(caches_or_undefined); 9427ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // Clear the caches: 9437ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org int length = caches->length(); 9447ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org for (int i = 0; i < length; i++) { 9457ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org JSFunctionResultCache::cast(caches->get(i))->Clear(); 9467ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org } 947ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org } 948e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // Get the next context: 949e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK); 950ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org } 951ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org} 952ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 953ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org 95465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgvoid Heap::ClearNormalizedMapCaches() { 955c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (isolate_->bootstrapper()->IsActive() && 956c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com !incremental_marking()->IsMarking()) { 957c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return; 958c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 9594a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 96046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Object* context = native_contexts_list_; 9614a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org while (!context->IsUndefined()) { 9627ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // GC can happen when the context is not fully initialized, 9637ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org // so the cache can be undefined. 9647ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org Object* cache = 9657ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org Context::cast(context)->get(Context::NORMALIZED_MAP_CACHE_INDEX); 9667ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org if (!cache->IsUndefined()) { 9677ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org NormalizedMapCache::cast(cache)->Clear(); 9687ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org } 9694a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK); 9704a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 97165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org} 97265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 97365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 97440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.orgvoid Heap::UpdateSurvivalRateTrend(int start_new_space_size) { 975b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org if (start_new_space_size == 0) return; 976b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 97740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org double survival_rate = 97840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org (static_cast<double>(young_survivors_after_last_gc_) * 100) / 97940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org start_new_space_size; 98040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 981659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org if (survival_rate > kYoungSurvivalRateHighThreshold) { 98240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org high_survival_rate_period_length_++; 98340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } else { 98440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org high_survival_rate_period_length_ = 0; 98540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 98640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 987659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org if (survival_rate < kYoungSurvivalRateLowThreshold) { 988659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org low_survival_rate_period_length_++; 989659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } else { 990659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org low_survival_rate_period_length_ = 0; 991659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 992659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 99340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org double survival_rate_diff = survival_rate_ - survival_rate; 99440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 99540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org if (survival_rate_diff > kYoungSurvivalRateAllowedDeviation) { 99640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org set_survival_rate_trend(DECREASING); 99740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } else if (survival_rate_diff < -kYoungSurvivalRateAllowedDeviation) { 99840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org set_survival_rate_trend(INCREASING); 99940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } else { 100040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org set_survival_rate_trend(STABLE); 100140b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org } 100240b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 100340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org survival_rate_ = survival_rate; 100440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org} 100530ce411529579186181838984710b0b0980857aaricow@chromium.org 1006f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgbool Heap::PerformGarbageCollection(GarbageCollector collector, 1007303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org GCTracer* tracer) { 1008f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org bool next_gc_likely_to_collect_more = false; 1009f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 10104a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (collector != SCAVENGER) { 1011ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PROFILE(isolate_, CodeMovingGCEvent()); 10124a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 10134a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 1014c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 1015394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 1016c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org VerifyStringTable(this); 1017394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 1018c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 1019c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 10205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org GCType gc_type = 10215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org collector == MARK_COMPACTOR ? kGCTypeMarkSweepCompact : kGCTypeScavenge; 10225d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 102346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org { 102446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL); 1025ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org VMState<EXTERNAL> state(isolate_); 1026fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org HandleScope handle_scope(isolate_); 1027ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org CallGCPrologueCallbacks(gc_type, kNoGCCallbackFlags); 10285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 10295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1030add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org EnsureFromSpaceIsCommitted(); 1031ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 1032f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org int start_new_space_size = Heap::new_space()->SizeAsInt(); 103340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 1034c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (IsHighSurvivalRate()) { 1035c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // We speed up the incremental marker if it is running so that it 1036c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // does not fall behind the rate of promotion, which would cause a 1037c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // constantly growing old space. 1038c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com incremental_marking()->NotifyOfHighPromotionRate(); 1039c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1040c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (collector == MARK_COMPACTOR) { 1042b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Perform mark-sweep with optional compaction. 10437276f14ca716596e0a0d17539516370c1f453847kasper.lund MarkCompact(tracer); 1044ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org sweep_generation_++; 104540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 104640b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org UpdateSurvivalRateTrend(start_new_space_size); 104740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 1048212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org size_of_old_gen_at_last_old_space_gc_ = PromotedSpaceSizeOfObjects(); 1049303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 1050a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org old_generation_allocation_limit_ = 1051a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org OldGenerationAllocationLimit(size_of_old_gen_at_last_old_space_gc_); 1052c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1053303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org old_gen_exhausted_ = false; 1054b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } else { 10559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com tracer_ = tracer; 1056b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org Scavenge(); 10579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com tracer_ = NULL; 105840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 105940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org UpdateSurvivalRateTrend(start_new_space_size); 106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1061439e85a92a8f3544428743c458d4941ad6deb1c2ager@chromium.org 1062659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org if (!new_space_high_promotion_mode_active_ && 1063659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org new_space_.Capacity() == new_space_.MaximumCapacity() && 1064659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org IsStableOrIncreasingSurvivalTrend() && 1065659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org IsHighSurvivalRate()) { 1066659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // Stable high survival rates even though young generation is at 1067659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // maximum capacity indicates that most objects will be promoted. 1068659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // To decrease scavenger pauses and final mark-sweep pauses, we 1069659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // have to limit maximal capacity of the young generation. 1070a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org SetNewSpaceHighPromotionModeActive(true); 1071659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org if (FLAG_trace_gc) { 1072657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Limited new space size due to high promotion rate: %d MB\n", 1073657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org new_space_.InitialCapacity() / MB); 1074659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 1075e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Support for global pre-tenuring uses the high promotion mode as a 1076e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // heuristic indicator of whether to pretenure or not, we trigger 1077e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // deoptimization here to take advantage of pre-tenuring as soon as 1078e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // possible. 1079a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (FLAG_pretenuring) { 1080e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org isolate_->stack_guard()->FullDeopt(); 1081e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 1082659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } else if (new_space_high_promotion_mode_active_ && 1083659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org IsStableOrDecreasingSurvivalTrend() && 1084659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org IsLowSurvivalRate()) { 1085659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // Decreasing low survival rates might indicate that the above high 1086659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // promotion mode is over and we should allow the young generation 1087659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // to grow again. 1088a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org SetNewSpaceHighPromotionModeActive(false); 1089659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org if (FLAG_trace_gc) { 1090657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Unlimited new space size due to low promotion rate: %d MB\n", 1091657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org new_space_.MaximumCapacity() / MB); 1092659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 1093e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Trigger deoptimization here to turn off pre-tenuring as soon as 1094e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // possible. 1095a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (FLAG_pretenuring) { 1096e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org isolate_->stack_guard()->FullDeopt(); 1097e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 1098659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 1099659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 11001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org if (new_space_high_promotion_mode_active_ && 11011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org new_space_.Capacity() > new_space_.InitialCapacity()) { 11021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org new_space_.Shrink(); 11031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org } 11041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 1105ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->objs_since_last_young()->Set(0); 110643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // Callbacks that fire after this point might trigger nested GCs and 110883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org // restart incremental marking, the assertion can't be moved down. 110983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org ASSERT(collector == SCAVENGER || incremental_marking()->IsStopped()); 111083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 1111d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com gc_post_processing_depth_++; 111279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org { AllowHeapAllocation allow_allocation; 1113303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL); 1114f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org next_gc_likely_to_collect_more = 1115cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org isolate_->global_handles()->PostGarbageCollectionProcessing( 1116cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org collector, tracer); 1117303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 1118d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com gc_post_processing_depth_--; 1119303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 1120594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org isolate_->eternal_handles()->PostGarbageCollectionProcessing(this); 1121594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 11223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // Update relocatables. 11233d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Relocatable::PostGarbageCollectionProcessing(isolate_); 112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11257276f14ca716596e0a0d17539516370c1f453847kasper.lund if (collector == MARK_COMPACTOR) { 11267276f14ca716596e0a0d17539516370c1f453847kasper.lund // Register the amount of external allocated memory. 11277276f14ca716596e0a0d17539516370c1f453847kasper.lund amount_of_external_allocated_memory_at_last_global_gc_ = 11287276f14ca716596e0a0d17539516370c1f453847kasper.lund amount_of_external_allocated_memory_; 11297276f14ca716596e0a0d17539516370c1f453847kasper.lund } 11307276f14ca716596e0a0d17539516370c1f453847kasper.lund 113146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org { 113246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org GCTracer::Scope scope(tracer, GCTracer::Scope::EXTERNAL); 1133ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org VMState<EXTERNAL> state(isolate_); 1134fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org HandleScope handle_scope(isolate_); 1135003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CallGCEpilogueCallbacks(gc_type); 113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1137c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 1138c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 1139394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 1140c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org VerifyStringTable(this); 1141394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 1142c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 1143f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 1144f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org return next_gc_likely_to_collect_more; 114543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1148ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgvoid Heap::CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags) { 1149003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) { 1150003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (gc_type & gc_prologue_callbacks_[i].gc_type) { 1151528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (!gc_prologue_callbacks_[i].pass_isolate_) { 1152528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::GCPrologueCallback callback = 1153528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<v8::GCPrologueCallback>( 1154528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org gc_prologue_callbacks_[i].callback); 1155528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org callback(gc_type, flags); 1156528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 1157528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); 1158528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org gc_prologue_callbacks_[i].callback(isolate, gc_type, flags); 1159528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 1160003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1161003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1162003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org} 1163003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1164003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1165003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgvoid Heap::CallGCEpilogueCallbacks(GCType gc_type) { 1166003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) { 1167003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (gc_type & gc_epilogue_callbacks_[i].gc_type) { 1168528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (!gc_epilogue_callbacks_[i].pass_isolate_) { 1169528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::GCPrologueCallback callback = 1170528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<v8::GCPrologueCallback>( 1171528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org gc_epilogue_callbacks_[i].callback); 1172528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org callback(gc_type, kNoGCCallbackFlags); 1173528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 1174528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); 1175528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org gc_epilogue_callbacks_[i].callback( 1176528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, gc_type, kNoGCCallbackFlags); 1177528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 1178003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1179003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1180003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org} 1181003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 1182003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 11837276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid Heap::MarkCompact(GCTracer* tracer) { 118443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gc_state_ = MARK_COMPACT; 1185ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(isolate_, ResourceEvent("markcompact", "begin")); 118643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1187ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org mark_compact_collector_.Prepare(tracer); 1188061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 1189c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ms_count_++; 1190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com tracer->set_full_gc_count(ms_count_); 11912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 1192c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MarkCompactPrologue(); 119343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1194ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org mark_compact_collector_.CollectGarbage(); 119543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1196ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(isolate_, ResourceEvent("markcompact", "end")); 119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gc_state_ = NOT_IN_GC; 119943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1200ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->objs_since_last_full()->Set(0); 12018b2bb2665b37457fd2bdccbce0356051c83a73fckasperl@chromium.org 1202c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org flush_monomorphic_ics_ = false; 120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 120543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::MarkCompactPrologue() { 1207061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // At any old GC clear the keyed lookup cache to enable collection of unused 1208061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // maps. 1209ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->keyed_lookup_cache()->Clear(); 1210ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->context_slot_cache()->Clear(); 1211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->descriptor_lookup_cache()->Clear(); 121278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org RegExpResultsCache::Clear(string_split_cache()); 121378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org RegExpResultsCache::Clear(regexp_multiple_cache()); 1214061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 1215ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->compilation_cache()->MarkCompactPrologue(); 1216061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org 1217720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org CompletelyClearInstanceofCache(); 1218720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 1219fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org FlushNumberStringCache(); 1220e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org if (FLAG_cleanup_code_caches_at_gc) { 1221e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org polymorphic_code_cache()->set_cache(undefined_value()); 1222e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 122365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 122465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org ClearNormalizedMapCaches(); 122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Helper class for copying HeapObjects 12295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgclass ScavengeVisitor: public ObjectVisitor { 123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1231ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org explicit ScavengeVisitor(Heap* heap) : heap_(heap) {} 123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org void VisitPointer(Object** p) { ScavengePointer(p); } 123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void VisitPointers(Object** start, Object** end) { 123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copy all HeapObject pointers in [start, end) 12375a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (Object** p = start; p < end; p++) ScavengePointer(p); 123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 12415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org void ScavengePointer(Object** p) { 12425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Object* object = *p; 1243ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!heap_->InNewSpace(object)) return; 12445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Heap::ScavengeObject(reinterpret_cast<HeapObject**>(p), 12455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org reinterpret_cast<HeapObject*>(object)); 124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Heap* heap_; 1249b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org}; 1250b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1251b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1252c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 12539258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Visitor class to verify pointers in code or data space do not point into 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// new space. 12559258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgclass VerifyNonPointerSpacePointersVisitor: public ObjectVisitor { 125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1257c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org explicit VerifyNonPointerSpacePointersVisitor(Heap* heap) : heap_(heap) {} 125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void VisitPointers(Object** start, Object**end) { 125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (Object** current = start; current < end; current++) { 126043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((*current)->IsHeapObject()) { 1261c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org CHECK(!heap_->InNewSpace(HeapObject::cast(*current))); 126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 126443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1265c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 1266c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org private: 1267c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org Heap* heap_; 126843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 12699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1270b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1271c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgstatic void VerifyNonPointerSpacePointers(Heap* heap) { 1272b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // Verify that there are no pointers to new space in spaces where we 1273b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // do not expect them. 1274c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org VerifyNonPointerSpacePointersVisitor v(heap); 1275c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org HeapObjectIterator code_it(heap->code_space()); 1276c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (HeapObject* object = code_it.Next(); 1277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com object != NULL; object = code_it.Next()) 12782bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com object->Iterate(&v); 1279b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1280c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The old data space was normally swept conservatively so that the iterator 1281c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // doesn't work, so we normally skip the next bit. 1282c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (!heap->old_data_space()->was_swept_conservatively()) { 1283c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org HeapObjectIterator data_it(heap->old_data_space()); 1284c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (HeapObject* object = data_it.Next(); 1285c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com object != NULL; object = data_it.Next()) 1286c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com object->Iterate(&v); 1287c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1288b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 1289c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif // VERIFY_HEAP 1290b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1291defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 1292b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.orgvoid Heap::CheckNewSpaceExpansionCriteria() { 1293b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org if (new_space_.Capacity() < new_space_.MaximumCapacity() && 12941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org survived_since_last_expansion_ > new_space_.Capacity() && 12951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org !new_space_high_promotion_mode_active_) { 12961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Grow the size of new space if there is room to grow, enough data 12971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // has survived scavenge since the last expansion and we are not in 12981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // high promotion mode. 1299b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org new_space_.Grow(); 1300b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org survived_since_last_expansion_ = 0; 1301b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } 1302b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org} 1303b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1304b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1305c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgstatic bool IsUnscavengedHeapObject(Heap* heap, Object** p) { 1306c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org return heap->InNewSpace(*p) && 1307c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org !HeapObject::cast(*p)->map_word().IsForwardingAddress(); 1308c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 1309c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1310c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::ScavengeStoreBufferCallback( 1312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Heap* heap, 1313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* page, 1314c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferEvent event) { 1315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->store_buffer_rebuilder_.Callback(page, event); 1316c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1317c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1318c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1319c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid StoreBufferRebuilder::Callback(MemoryChunk* page, StoreBufferEvent event) { 1320c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (event == kStoreBufferStartScanningPagesEvent) { 1321c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com start_of_current_page_ = NULL; 1322c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_page_ = NULL; 1323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else if (event == kStoreBufferScanningPageEvent) { 1324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (current_page_ != NULL) { 1325c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // If this page already overflowed the store buffer during this iteration. 1326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (current_page_->scan_on_scavenge()) { 1327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Then we should wipe out the entries that have been added for it. 1328c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->SetTop(start_of_current_page_); 1329c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else if (store_buffer_->Top() - start_of_current_page_ >= 1330c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (store_buffer_->Limit() - store_buffer_->Top()) >> 2) { 1331c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Did we find too many pointers in the previous page? The heuristic is 1332c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // that no page can take more then 1/5 the remaining slots in the store 1333c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // buffer. 1334c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_page_->set_scan_on_scavenge(true); 1335c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->SetTop(start_of_current_page_); 1336c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 1337c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // In this case the page we scanned took a reasonable number of slots in 1338c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // the store buffer. It has now been rehabilitated and is no longer 1339c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // marked scan_on_scavenge. 1340c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!current_page_->scan_on_scavenge()); 1341c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1342c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com start_of_current_page_ = store_buffer_->Top(); 1344c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_page_ = page; 1345c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else if (event == kStoreBufferFullEvent) { 1346c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The current page overflowed the store buffer again. Wipe out its entries 1347c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // in the store buffer and mark it scan-on-scavenge again. This may happen 1348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // several times while scanning. 1349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (current_page_ == NULL) { 1350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Store Buffer overflowed while scanning promoted objects. These are not 1351c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // in any particular page, though they are likely to be clustered by the 1352c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // allocation routines. 135341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org store_buffer_->EnsureSpace(StoreBuffer::kStoreBufferSize / 2); 1354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 1355c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Store Buffer overflowed while scanning a particular old space page for 1356c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // pointers to new space. 1357c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(current_page_ == page); 1358c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(page != NULL); 1359c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_page_->set_scan_on_scavenge(true); 1360c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(start_of_current_page_ != store_buffer_->Top()); 1361c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_->SetTop(start_of_current_page_); 1362c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1363c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 1364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com UNREACHABLE(); 1365c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1366c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1367c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1368c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1369c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgvoid PromotionQueue::Initialize() { 1370c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // Assumes that a NewSpacePage exactly fits a number of promotion queue 1371c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // entries (where each is a pair of intptr_t). This allows us to simplify 1372c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org // the test fpr when to switch pages. 1373c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org ASSERT((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) 1374c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org == 0); 1375c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org limit_ = reinterpret_cast<intptr_t*>(heap_->new_space()->ToSpaceStart()); 1376c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org front_ = rear_ = 1377c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org reinterpret_cast<intptr_t*>(heap_->new_space()->ToSpaceEnd()); 1378c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org emergency_stack_ = NULL; 1379c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org guard_ = false; 1380c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} 1381c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1382c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1383c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgvoid PromotionQueue::RelocateQueueHead() { 1384c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org ASSERT(emergency_stack_ == NULL); 1385c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1386c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Page* p = Page::FromAllocationTop(reinterpret_cast<Address>(rear_)); 1387c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org intptr_t* head_start = rear_; 1388c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org intptr_t* head_end = 1389ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Min(front_, reinterpret_cast<intptr_t*>(p->area_end())); 1390c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1391c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org int entries_count = 1392c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org static_cast<int>(head_end - head_start) / kEntrySizeInWords; 1393c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1394c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org emergency_stack_ = new List<Entry>(2 * entries_count); 1395c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1396c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org while (head_start != head_end) { 1397c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org int size = static_cast<int>(*(head_start++)); 1398c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org HeapObject* obj = reinterpret_cast<HeapObject*>(*(head_start++)); 1399c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org emergency_stack_->Add(Entry(obj, size)); 1400c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 1401c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org rear_ = head_end; 1402c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} 1403c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1404c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1405ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comclass ScavengeWeakObjectRetainer : public WeakObjectRetainer { 1406ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com public: 1407ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com explicit ScavengeWeakObjectRetainer(Heap* heap) : heap_(heap) { } 1408ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1409ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com virtual Object* RetainAs(Object* object) { 1410ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (!heap_->InFromSpace(object)) { 1411ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return object; 1412ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1413ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1414ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com MapWord map_word = HeapObject::cast(object)->map_word(); 1415ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (map_word.IsForwardingAddress()) { 1416ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return map_word.ToForwardingAddress(); 1417ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1418ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return NULL; 1419ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1420ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1421ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com private: 1422ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Heap* heap_; 1423ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}; 1424ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1425ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1426b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgvoid Heap::Scavenge() { 1427ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org RelocationLock relocation_lock(this); 1428ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 1429c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 1430c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (FLAG_verify_heap) VerifyNonPointerSpacePointers(this); 143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen gc_state_ = SCAVENGE; 143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Implements Cheney's copying algorithm 1436ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(isolate_, ResourceEvent("scavenge", "begin")); 143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14385aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Clear descriptor cache. 1439ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->descriptor_lookup_cache()->Clear(); 14405aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1441eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Used for updating survived_since_last_expansion_ at function end. 1442659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org intptr_t survived_watermark = PromotedSpaceSizeOfObjects(); 1443eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 1444b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org CheckNewSpaceExpansionCriteria(); 144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1446c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SelectScavengingVisitorsTable(); 1447c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1448c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com incremental_marking()->PrepareForScavenge(); 1449c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1450e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org paged_space(OLD_DATA_SPACE)->EnsureSweeperProgress(new_space_.Size()); 1451e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org paged_space(OLD_POINTER_SPACE)->EnsureSweeperProgress(new_space_.Size()); 1452c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Flip the semispaces. After flipping, to space is empty, from space has 145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // live objects. 14555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.Flip(); 14565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.ResetAllocationInfo(); 145743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1458b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // We need to sweep newly copied objects which can be either in the 1459b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // to space or promoted to the old generation. For to-space 1460b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // objects, we treat the bottom of the to space as a queue. Newly 1461b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // copied and unswept objects lie between a 'front' mark and the 1462b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // allocation pointer. 1463b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // 1464b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // Promoted objects can go into various old-generation spaces, and 1465b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // can be allocated internally in the spaces (from the free list). 1466b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // We treat the top of the to space as a queue of addresses of 1467b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // promoted objects. The addresses of newly promoted and unswept 1468b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // objects lie between a 'front' mark and a 'rear' mark that is 1469b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // updated as a side effect of promoting an object. 147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 1471b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // There is guaranteed to be enough room at the top of the to space 1472b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // for the addresses of promoted objects: every object promoted 1473b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // frees up its size in bytes from the top of the new space, and 1474b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // objects are at least one pointer in size. 1475c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address new_space_front = new_space_.ToSpaceStart(); 1476c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org promotion_queue_.Initialize(); 1477c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1478c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#ifdef DEBUG 1479c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->Clean(); 1480c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif 148143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ScavengeVisitor scavenge_visitor(this); 148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copy roots. 148413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org IterateRoots(&scavenge_visitor, VISIT_ALL_IN_SCAVENGE); 1485b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1486c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Copy objects reachable from the old generation. 1487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { 1488c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferRebuildScope scope(this, 1489c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer(), 1490c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &ScavengeStoreBufferCallback); 1491c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->IteratePointersToNewSpace(&ScavengeObject); 1492c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1493defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 149441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Copy objects reachable from simple cells by scavenging cell values 149541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // directly. 1496defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org HeapObjectIterator cell_iterator(cell_space_); 1497000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org for (HeapObject* heap_object = cell_iterator.Next(); 1498000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org heap_object != NULL; 1499000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org heap_object = cell_iterator.Next()) { 150041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (heap_object->IsCell()) { 150141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Cell* cell = Cell::cast(heap_object); 150241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Address value_address = cell->ValueAddress(); 150341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); 150441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 150541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 150641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 150741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Copy objects reachable from global property cells by scavenging global 150841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // property cell values directly. 150941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org HeapObjectIterator js_global_property_cell_iterator(property_cell_space_); 151041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org for (HeapObject* heap_object = js_global_property_cell_iterator.Next(); 151141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap_object != NULL; 151241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap_object = js_global_property_cell_iterator.Next()) { 1513b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (heap_object->IsPropertyCell()) { 1514b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org PropertyCell* cell = PropertyCell::cast(heap_object); 1515000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org Address value_address = cell->ValueAddress(); 1516defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); 151741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Address type_address = cell->TypeAddress(); 151841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(type_address)); 1519defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 1520defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 152143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1522e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org // Copy objects reachable from the code flushing candidates list. 1523e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org MarkCompactCollector* collector = mark_compact_collector(); 1524e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org if (collector->is_code_flushing_enabled()) { 1525e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); 1526e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 1527e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 152846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Scavenge object reachable from the native contexts list directly. 152946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org scavenge_visitor.VisitPointer(BitCast<Object**>(&native_contexts_list_)); 15304a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 153113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org new_space_front = DoScavenge(&scavenge_visitor, new_space_front); 1532e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 153349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org while (isolate()->global_handles()->IterateObjectGroups( 153449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org &scavenge_visitor, &IsUnscavengedHeapObject)) { 1535e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org new_space_front = DoScavenge(&scavenge_visitor, new_space_front); 1536e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 1537e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org isolate()->global_handles()->RemoveObjectGroups(); 1538003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org isolate()->global_handles()->RemoveImplicitRefGroups(); 1539e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 1540e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org isolate_->global_handles()->IdentifyNewSpaceWeakIndependentHandles( 1541c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org &IsUnscavengedHeapObject); 1542e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org isolate_->global_handles()->IterateNewSpaceWeakIndependentRoots( 1543e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org &scavenge_visitor); 1544c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org new_space_front = DoScavenge(&scavenge_visitor, new_space_front); 1545c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1546b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org UpdateNewSpaceReferencesInExternalStringTable( 1547b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org &UpdateNewSpaceReferenceInExternalStringTableEntry); 1548b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1549c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org promotion_queue_.Destroy(); 1550c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 155178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org if (!FLAG_watch_ic_patching) { 155278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org isolate()->runtime_profiler()->UpdateSamplesAfterScavenge(); 155378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 1554c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com incremental_marking()->UpdateMarkingDequeAfterScavenge(); 15550ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 1556ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com ScavengeWeakObjectRetainer weak_object_retainer(this); 1557ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com ProcessWeakReferences(&weak_object_retainer); 1558ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 155913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org ASSERT(new_space_front == new_space_.top()); 156013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 156113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Set age mark. 156213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org new_space_.set_age_mark(new_space_.top()); 156313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1564c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com new_space_.LowerInlineAllocationLimit( 1565c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com new_space_.inline_allocation_limit_step()); 1566c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 156713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Update how much has survived scavenge. 1568f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org IncrementYoungSurvivorsCounter(static_cast<int>( 1569659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org (PromotedSpaceSizeOfObjects() - survived_watermark) + new_space_.Size())); 157013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1571ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(isolate_, ResourceEvent("scavenge", "end")); 157213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 157313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org gc_state_ = NOT_IN_GC; 1574ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 1575ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org scavenges_since_last_idle_round_++; 157613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org} 157713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 157813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1579ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgString* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap, 1580ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object** p) { 1581b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org MapWord first_word = HeapObject::cast(*p)->map_word(); 1582b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1583b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org if (!first_word.IsForwardingAddress()) { 1584b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // Unreachable external string can be finalized. 1585ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap->FinalizeExternalString(String::cast(*p)); 1586b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org return NULL; 1587b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org } 1588b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1589b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org // String is still reachable. 1590b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org return String::cast(first_word.ToForwardingAddress()); 1591b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org} 1592b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1593b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org 1594b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.orgvoid Heap::UpdateNewSpaceReferencesInExternalStringTable( 1595b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org ExternalStringTableUpdaterCallback updater_func) { 1596c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 1597394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 1598394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com external_string_table_.Verify(); 1599394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 1600c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 160113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (external_string_table_.new_space_strings_.is_empty()) return; 160313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 16042ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** start = &external_string_table_.new_space_strings_[0]; 16052ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** end = start + external_string_table_.new_space_strings_.length(); 16062ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** last = start; 160713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 16082ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org for (Object** p = start; p < end; ++p) { 1609ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(InFromSpace(*p)); 1610ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org String* target = updater_func(this, p); 161113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1612b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org if (target == NULL) continue; 161313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 161413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org ASSERT(target->IsExternalString()); 161513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1616ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (InNewSpace(target)) { 161713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // String is still in new space. Update the table entry. 161813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org *last = target; 161913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org ++last; 162013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } else { 162113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // String got promoted. Move it to the old string list. 1622ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org external_string_table_.AddOldString(target); 162313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 162413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 162513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 16262ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org ASSERT(last <= end); 16272ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org external_string_table_.ShrinkNewStrings(static_cast<int>(last - start)); 162813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org} 162913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 163013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 1631c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::UpdateReferencesInExternalStringTable( 1632c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ExternalStringTableUpdaterCallback updater_func) { 1633c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1634c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Update old space string references. 1635c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (external_string_table_.old_space_strings_.length() > 0) { 16362ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** start = &external_string_table_.old_space_strings_[0]; 16372ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** end = start + external_string_table_.old_space_strings_.length(); 16382ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org for (Object** p = start; p < end; ++p) *p = updater_func(this, p); 1639c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1640c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1641c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com UpdateNewSpaceReferencesInExternalStringTable(updater_func); 1642c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1643c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1644c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 164541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtemplate <class T> 164641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgstruct WeakListVisitor; 164741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 164841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 164941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtemplate <class T> 165041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgstatic Object* VisitWeakList(Heap* heap, 165141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Object* list, 165241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org WeakObjectRetainer* retainer, 165341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org bool record_slots) { 1654c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* undefined = heap->undefined_value(); 1655c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* head = undefined; 165641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org T* tail = NULL; 165741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org MarkCompactCollector* collector = heap->mark_compact_collector(); 165841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org while (list != undefined) { 1659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Check whether to keep the candidate in the list. 166041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org T* candidate = reinterpret_cast<T*>(list); 166141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Object* retained = retainer->RetainAs(list); 166241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (retained != NULL) { 1663c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (head == undefined) { 1664a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // First element in the list. 166541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org head = retained; 1666a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1667a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Subsequent elements in the list. 1668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(tail != NULL); 166941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org WeakListVisitor<T>::SetWeakNext(tail, retained); 1670ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (record_slots) { 167141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Object** next_slot = 167241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org HeapObject::RawField(tail, WeakListVisitor<T>::WeakNextOffset()); 167341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org collector->RecordSlot(next_slot, next_slot, retained); 1674ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1675a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 167641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Retained object is new tail. 167741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org ASSERT(!retained->IsUndefined()); 167841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org candidate = reinterpret_cast<T*>(retained); 167941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org tail = candidate; 1680c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1681c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 168241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // tail is a live object, visit it. 168341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org WeakListVisitor<T>::VisitLiveObject( 168441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap, tail, retainer, record_slots); 16851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else { 16861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org WeakListVisitor<T>::VisitPhantomObject(heap, candidate); 1687a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1688c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Move to next element in the list. 169041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org list = WeakListVisitor<T>::WeakNext(candidate); 1691a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1692a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1693a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Terminate the list if there is one or more elements. 1694a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (tail != NULL) { 169541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org WeakListVisitor<T>::SetWeakNext(tail, undefined); 1696a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1697a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return head; 1698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1699a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1700a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 170141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtemplate<> 170241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgstruct WeakListVisitor<JSFunction> { 170341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void SetWeakNext(JSFunction* function, Object* next) { 170441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org function->set_next_function_link(next); 170541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 170641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 170741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static Object* WeakNext(JSFunction* function) { 170841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return function->next_function_link(); 170941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 171041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 171141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static int WeakNextOffset() { 171241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return JSFunction::kNextFunctionLinkOffset; 171341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 171441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 171541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void VisitLiveObject(Heap*, JSFunction*, 171641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org WeakObjectRetainer*, bool) { 171741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 17181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void VisitPhantomObject(Heap*, JSFunction*) { 17201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 172141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}; 172241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 172341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 172441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtemplate<> 17253d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstruct WeakListVisitor<Code> { 17263d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void SetWeakNext(Code* code, Object* next) { 17273d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org code->set_next_code_link(next); 17283d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 17293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17303d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static Object* WeakNext(Code* code) { 17313d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return code->next_code_link(); 17323d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 17333d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17343d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static int WeakNextOffset() { 17353d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return Code::kNextCodeLinkOffset; 17363d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 17373d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17383d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void VisitLiveObject(Heap*, Code*, 17393d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org WeakObjectRetainer*, bool) { 17403d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 17413d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17423d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void VisitPhantomObject(Heap*, Code*) { 17433d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 17443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org}; 17453d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17473d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgtemplate<> 174841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgstruct WeakListVisitor<Context> { 174941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void SetWeakNext(Context* context, Object* next) { 175041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org context->set(Context::NEXT_CONTEXT_LINK, 175141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org next, 175241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org UPDATE_WRITE_BARRIER); 175341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 175441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 175541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static Object* WeakNext(Context* context) { 175641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return context->get(Context::NEXT_CONTEXT_LINK); 175741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 175841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 175941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void VisitLiveObject(Heap* heap, 176041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Context* context, 176141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org WeakObjectRetainer* retainer, 176241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org bool record_slots) { 17633d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Process the three weak lists linked off the context. 17643d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org DoWeakList<JSFunction>(heap, context, retainer, record_slots, 17653d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Context::OPTIMIZED_FUNCTIONS_LIST); 17663d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org DoWeakList<Code>(heap, context, retainer, record_slots, 17673d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Context::OPTIMIZED_CODE_LIST); 17683d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org DoWeakList<Code>(heap, context, retainer, record_slots, 17693d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Context::DEOPTIMIZED_CODE_LIST); 17703d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 17713d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17723d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org template<class T> 17733d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org static void DoWeakList(Heap* heap, 17743d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Context* context, 17753d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org WeakObjectRetainer* retainer, 17763d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org bool record_slots, 17773d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org int index) { 17783d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Visit the weak list, removing dead intermediate elements. 17793d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Object* list_head = VisitWeakList<T>(heap, context->get(index), retainer, 17803d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org record_slots); 17813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 17823d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Update the list head. 17833d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org context->set(index, list_head, UPDATE_WRITE_BARRIER); 17843d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org 178541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (record_slots) { 17863d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Record the updated slot if necessary. 17873d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Object** head_slot = HeapObject::RawField( 17883d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org context, FixedArray::SizeFor(index)); 178941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap->mark_compact_collector()->RecordSlot( 17903d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org head_slot, head_slot, list_head); 179141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 179241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 179341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 17941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void VisitPhantomObject(Heap*, Context*) { 17951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 179741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static int WeakNextOffset() { 179841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return FixedArray::SizeFor(Context::NEXT_CONTEXT_LINK); 179941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 180041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}; 180141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 180241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 18034a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgvoid Heap::ProcessWeakReferences(WeakObjectRetainer* retainer) { 1804ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // We don't record weak slots during marking or scavenges. 1805ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Instead we do it once when we complete mark-compact cycle. 1806ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Note that write barrier has no effect if we are already in the middle of 1807ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // compacting mark-sweep cycle and we have to record slots manually. 1808ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com bool record_slots = 1809ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com gc_state() == MARK_COMPACT && 1810ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com mark_compact_collector()->is_compacting(); 18111fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ProcessArrayBuffers(retainer, record_slots); 18121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ProcessNativeContexts(retainer, record_slots); 1813af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org // TODO(mvstanton): AllocationSites only need to be processed during 1814af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org // MARK_COMPACT, as they live in old space. Verify and address. 1815ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ProcessAllocationSites(retainer, record_slots); 18161fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org} 18171fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18181fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid Heap::ProcessNativeContexts(WeakObjectRetainer* retainer, 18191fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org bool record_slots) { 182041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Object* head = 182141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org VisitWeakList<Context>( 182241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org this, native_contexts_list(), retainer, record_slots); 18234a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // Update the head of the list of contexts. 182446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_contexts_list_ = head; 18254a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 18264a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 18274a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 18281fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgtemplate<> 18291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstruct WeakListVisitor<JSArrayBufferView> { 18301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void SetWeakNext(JSArrayBufferView* obj, Object* next) { 18311fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org obj->set_weak_next(next); 18321fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 18331fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Object* WeakNext(JSArrayBufferView* obj) { 18351fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return obj->weak_next(); 18361fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 18371fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 183841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void VisitLiveObject(Heap*, 18391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org JSArrayBufferView* obj, 18401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org WeakObjectRetainer* retainer, 18411fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org bool record_slots) {} 18421fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void VisitPhantomObject(Heap*, JSArrayBufferView*) {} 18441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 184541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static int WeakNextOffset() { 18461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return JSArrayBufferView::kWeakNextOffset; 184741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 18481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}; 18491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgtemplate<> 18521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgstruct WeakListVisitor<JSArrayBuffer> { 185341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void SetWeakNext(JSArrayBuffer* obj, Object* next) { 18541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org obj->set_weak_next(next); 18551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 18561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 185741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static Object* WeakNext(JSArrayBuffer* obj) { 18581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return obj->weak_next(); 18591fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 18601fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 186141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static void VisitLiveObject(Heap* heap, 186241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org JSArrayBuffer* array_buffer, 18631fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org WeakObjectRetainer* retainer, 18641fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org bool record_slots) { 18651fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Object* typed_array_obj = 18661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org VisitWeakList<JSArrayBufferView>( 186741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap, 18681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_buffer->weak_first_view(), 186941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org retainer, record_slots); 18701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_buffer->set_weak_first_view(typed_array_obj); 187141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (typed_array_obj != heap->undefined_value() && record_slots) { 18721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Object** slot = HeapObject::RawField( 18731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_buffer, JSArrayBuffer::kWeakFirstViewOffset); 187441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org heap->mark_compact_collector()->RecordSlot(slot, slot, typed_array_obj); 18751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 18761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 18771fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void VisitPhantomObject(Heap* heap, JSArrayBuffer* phantom) { 18791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Runtime::FreeArrayBuffer(heap->isolate(), phantom); 18801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 188241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org static int WeakNextOffset() { 188341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return JSArrayBuffer::kWeakNextOffset; 188441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 18851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}; 18861fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18871fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18881fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid Heap::ProcessArrayBuffers(WeakObjectRetainer* retainer, 18891fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org bool record_slots) { 18901fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Object* array_buffer_obj = 189141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org VisitWeakList<JSArrayBuffer>(this, 189241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org array_buffers_list(), 18931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org retainer, record_slots); 18941fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org set_array_buffers_list(array_buffer_obj); 18951fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org} 18961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 18981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid Heap::TearDownArrayBuffers() { 18991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Object* undefined = undefined_value(); 19001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org for (Object* o = array_buffers_list(); o != undefined;) { 19011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org JSArrayBuffer* buffer = JSArrayBuffer::cast(o); 19021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Runtime::FreeArrayBuffer(isolate(), buffer); 19031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org o = buffer->weak_next(); 19041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org array_buffers_list_ = undefined; 19061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 19071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1909ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgtemplate<> 1910ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstruct WeakListVisitor<AllocationSite> { 1911ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static void SetWeakNext(AllocationSite* obj, Object* next) { 1912ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org obj->set_weak_next(next); 1913ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1914ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1915ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static Object* WeakNext(AllocationSite* obj) { 1916ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return obj->weak_next(); 1917ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1918ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1919ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static void VisitLiveObject(Heap* heap, 1920af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org AllocationSite* site, 1921ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org WeakObjectRetainer* retainer, 1922ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org bool record_slots) {} 1923ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1924ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static void VisitPhantomObject(Heap* heap, AllocationSite* phantom) {} 1925ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1926ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org static int WeakNextOffset() { 1927ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return AllocationSite::kWeakNextOffset; 1928ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1929ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}; 1930ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1931ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1932ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Heap::ProcessAllocationSites(WeakObjectRetainer* retainer, 1933ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org bool record_slots) { 1934ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Object* allocation_site_obj = 1935ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org VisitWeakList<AllocationSite>(this, 1936ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org allocation_sites_list(), 1937ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org retainer, record_slots); 1938ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org set_allocation_sites_list(allocation_site_obj); 1939ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} 1940ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1941ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1942f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) { 194379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_allocation; 1944f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 19454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Both the external string table and the string table may contain 1946e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org // external strings, but neither lists them exhaustively, nor is the 1947e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org // intersection set empty. Therefore we iterate over the external string 19484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // table first, ignoring internalized strings, and then over the 19494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // internalized string table. 1950e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1951e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org class ExternalStringTableVisitorAdapter : public ObjectVisitor { 1952f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com public: 1953e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org explicit ExternalStringTableVisitorAdapter( 1954e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org v8::ExternalResourceVisitor* visitor) : visitor_(visitor) {} 1955e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org virtual void VisitPointers(Object** start, Object** end) { 1956e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org for (Object** p = start; p < end; p++) { 19574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Visit non-internalized external strings, 19584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // since internalized strings are listed in the string table. 19594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!(*p)->IsInternalizedString()) { 1960e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org ASSERT((*p)->IsExternalString()); 1961e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org visitor_->VisitExternalString(Utils::ToLocal( 1962e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org Handle<String>(String::cast(*p)))); 1963e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 1964e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 1965e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 1966e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org private: 1967e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org v8::ExternalResourceVisitor* visitor_; 1968e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } external_string_table_visitor(visitor); 1969e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1970e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org external_string_table_.Iterate(&external_string_table_visitor); 1971e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 19724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org class StringTableVisitorAdapter : public ObjectVisitor { 1973e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org public: 19744a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org explicit StringTableVisitorAdapter( 1975e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org v8::ExternalResourceVisitor* visitor) : visitor_(visitor) {} 1976f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com virtual void VisitPointers(Object** start, Object** end) { 1977f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com for (Object** p = start; p < end; p++) { 1978f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if ((*p)->IsExternalString()) { 19794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT((*p)->IsInternalizedString()); 1980f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com visitor_->VisitExternalString(Utils::ToLocal( 1981f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<String>(String::cast(*p)))); 1982f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1983f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1984f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1985f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com private: 1986f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com v8::ExternalResourceVisitor* visitor_; 19874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } string_table_visitor(visitor); 1988e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 19894a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->IterateElements(&string_table_visitor); 1990f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 1991f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1992f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 1993ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass NewSpaceScavenger : public StaticNewSpaceVisitor<NewSpaceScavenger> { 1994ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 1995ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static inline void VisitPointer(Heap* heap, Object** p) { 1996ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Object* object = *p; 1997ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!heap->InNewSpace(object)) return; 1998ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Heap::ScavengeObject(reinterpret_cast<HeapObject**>(p), 1999ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org reinterpret_cast<HeapObject*>(object)); 2000ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 2001ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 2002ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 2003ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 200413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgAddress Heap::DoScavenge(ObjectVisitor* scavenge_visitor, 200513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org Address new_space_front) { 2006b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org do { 2007c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SemiSpace::AssertValidRange(new_space_front, new_space_.top()); 2008b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // The addresses new_space_front and new_space_.top() define a 2009b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // queue of unprocessed copied objects. Process them until the 2010b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // queue is empty. 2011c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (new_space_front != new_space_.top()) { 2012c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!NewSpacePage::IsAtEnd(new_space_front)) { 2013c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* object = HeapObject::FromAddress(new_space_front); 2014c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com new_space_front += 2015c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NewSpaceScavenger::IterateBody(object->map(), object); 2016c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 2017c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com new_space_front = 2018ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org NewSpacePage::FromLimit(new_space_front)->next_page()->area_start(); 2019c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2020b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org } 202143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2022b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // Promote and process all the to-be-promoted objects. 2023c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { 2024c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com StoreBufferRebuildScope scope(this, 2025c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer(), 2026c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &ScavengeStoreBufferCallback); 2027c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (!promotion_queue()->is_empty()) { 2028c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* target; 2029c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int size; 2030c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com promotion_queue()->remove(&target, &size); 2031c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2032c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Promoted object might be already partially visited 2033c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // during old space pointer iteration. Thus we search specificly 2034c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // for pointers to from semispace instead of looking for pointers 2035c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // to new space. 2036c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!target->IsMap()); 2037c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com IterateAndMarkPointersToFromSpace(target->address(), 2038c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com target->address() + size, 2039c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &ScavengeObject); 2040c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 204143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2043b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // Take another spin if there are now unswept objects in new space 2044b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // (there are currently no more unswept promoted objects). 2045c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } while (new_space_front != new_space_.top()); 204643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 204713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org return new_space_front; 204843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 204943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 205043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2051ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comSTATIC_ASSERT((FixedDoubleArray::kHeaderSize & kDoubleAlignmentMask) == 0); 2052a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgSTATIC_ASSERT((ConstantPoolArray::kHeaderSize & kDoubleAlignmentMask) == 0); 2053ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2054ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2055ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comINLINE(static HeapObject* EnsureDoubleAligned(Heap* heap, 2056ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com HeapObject* object, 2057ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com int size)); 2058ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2059ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comstatic HeapObject* EnsureDoubleAligned(Heap* heap, 2060ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com HeapObject* object, 2061ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com int size) { 2062ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if ((OffsetFrom(object->address()) & kDoubleAlignmentMask) != 0) { 2063ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com heap->CreateFillerObjectAt(object->address(), kPointerSize); 2064ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return HeapObject::FromAddress(object->address() + kPointerSize); 2065ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } else { 2066ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com heap->CreateFillerObjectAt(object->address() + size - kPointerSize, 2067ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com kPointerSize); 2068ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return object; 2069ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 2070ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 2071ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2072ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2073c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgenum LoggingAndProfiling { 2074c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org LOGGING_AND_PROFILING_ENABLED, 2075c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org LOGGING_AND_PROFILING_DISABLED 2076c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}; 2077c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2078c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2079c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comenum MarksHandling { TRANSFER_MARKS, IGNORE_MARKS }; 2080c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2081c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2082c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtemplate<MarksHandling marks_handling, 2083c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LoggingAndProfiling logging_and_profiling_mode> 2084ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgclass ScavengingVisitor : public StaticVisitorBase { 2085ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 2086ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static void Initialize() { 2087fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org table_.Register(kVisitSeqOneByteString, &EvacuateSeqOneByteString); 2088ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.Register(kVisitSeqTwoByteString, &EvacuateSeqTwoByteString); 2089ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.Register(kVisitShortcutCandidate, &EvacuateShortcutCandidate); 2090ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.Register(kVisitByteArray, &EvacuateByteArray); 2091ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.Register(kVisitFixedArray, &EvacuateFixedArray); 20926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org table_.Register(kVisitFixedDoubleArray, &EvacuateFixedDoubleArray); 2093c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 209446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org table_.Register(kVisitNativeContext, 20954a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2096c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org template VisitSpecialized<Context::kSize>); 209743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2098ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.Register(kVisitConsString, 2099ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2100c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org template VisitSpecialized<ConsString::kSize>); 210143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21024668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org table_.Register(kVisitSlicedString, 21034668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 21044668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org template VisitSpecialized<SlicedString::kSize>); 21054668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 2106f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org table_.Register(kVisitSymbol, 2107f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2108f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org template VisitSpecialized<Symbol::kSize>); 2109f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 2110ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.Register(kVisitSharedFunctionInfo, 2111ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2112c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org template VisitSpecialized<SharedFunctionInfo::kSize>); 211343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org table_.Register(kVisitJSWeakMap, 21157c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 21167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org Visit); 21177c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 2118ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org table_.Register(kVisitJSWeakSet, 2119ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2120ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Visit); 2121ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 21221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org table_.Register(kVisitJSArrayBuffer, 21231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 21241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Visit); 21251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 21261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org table_.Register(kVisitJSTypedArray, 21271fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 21281fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Visit); 21291fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 21301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org table_.Register(kVisitJSDataView, 21311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 21321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Visit); 21331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2134ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org table_.Register(kVisitJSRegExp, 2135ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2136ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org Visit); 2137ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 2138c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (marks_handling == IGNORE_MARKS) { 2139c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com table_.Register(kVisitJSFunction, 2140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &ObjectEvacuationStrategy<POINTER_OBJECT>:: 2141c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com template VisitSpecialized<JSFunction::kSize>); 2142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 2143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com table_.Register(kVisitJSFunction, &EvacuateJSFunction); 2144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 21450b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 2146ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.RegisterSpecializations<ObjectEvacuationStrategy<DATA_OBJECT>, 2147ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitDataObject, 2148ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitDataObjectGeneric>(); 214943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2150ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.RegisterSpecializations<ObjectEvacuationStrategy<POINTER_OBJECT>, 2151ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitJSObject, 2152ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitJSObjectGeneric>(); 215343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2154ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org table_.RegisterSpecializations<ObjectEvacuationStrategy<POINTER_OBJECT>, 2155ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitStruct, 2156ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org kVisitStructGeneric>(); 2157ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 215843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2159c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org static VisitorDispatchTable<ScavengingCallback>* GetTable() { 2160c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return &table_; 2161ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 21626a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2163ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org private: 2164ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org enum ObjectContents { DATA_OBJECT, POINTER_OBJECT }; 21656a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2166ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static void RecordCopiedObject(Heap* heap, HeapObject* obj) { 2167ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org bool should_record = false; 2168ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org#ifdef DEBUG 2169ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org should_record = FLAG_heap_stats; 2170ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org#endif 2171ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org should_record = should_record || FLAG_log_gc; 2172ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (should_record) { 2173ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (heap->new_space()->Contains(obj)) { 2174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap->new_space()->RecordAllocation(obj); 21756a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } else { 2176ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap->new_space()->RecordPromotion(obj); 21776a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 21786a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 21796a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 21805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 2181ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // Helper function used by CopyObject to copy a source object to an 2182ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // allocated target object and update the forwarding pointer in the source 2183ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // object. Returns the target object. 21841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org INLINE(static void MigrateObject(Heap* heap, 21851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org HeapObject* source, 21861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org HeapObject* target, 21871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org int size)) { 2188ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // Copy the content of source to target. 2189ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap->CopyBlock(target->address(), source->address(), size); 21905a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 2191ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org // Set the forwarding address. 2192ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org source->set_map_word(MapWord::FromForwardingAddress(target)); 21936a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2194c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (logging_and_profiling_mode == LOGGING_AND_PROFILING_ENABLED) { 2195c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // Update NewSpace stats if necessary. 2196c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org RecordCopiedObject(heap, target); 2197c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org Isolate* isolate = heap->isolate(); 21982ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org HeapProfiler* heap_profiler = isolate->heap_profiler(); 2199cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org if (heap_profiler->is_tracking_object_moves()) { 22002ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org heap_profiler->ObjectMoveEvent(source->address(), target->address(), 22012ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org size); 22022ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org } 2203355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org if (isolate->logger()->is_logging_code_events() || 2204f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org isolate->cpu_profiler()->is_profiling()) { 2205c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (target->IsSharedFunctionInfo()) { 2206c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org PROFILE(isolate, SharedFunctionInfoMoveEvent( 2207c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org source->address(), target->address())); 2208c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 22094a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org } 2210c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 2211c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2212c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (marks_handling == TRANSFER_MARKS) { 2213c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (Marking::TransferColor(source, target)) { 22142efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org MemoryChunk::IncrementLiveBytesFromGC(target->address(), size); 2215c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2216c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2217ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 22186a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2219ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2220594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org template<ObjectContents object_contents, int alignment> 2221ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void EvacuateObject(Map* map, 2222ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2223ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object, 2224ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size) { 2225594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org SLOW_ASSERT(object_size <= Page::kMaxNonCodeHeapObjectSize); 2226394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT(object->Size() == object_size); 22276a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2228ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com int allocation_size = object_size; 2229ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (alignment != kObjectAlignment) { 2230ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com ASSERT(alignment == kDoubleAlignment); 2231ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com allocation_size += kPointerSize; 2232ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 2233ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 2234c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Heap* heap = map->GetHeap(); 2235ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (heap->ShouldBePromoted(object->address(), object_size)) { 2236303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org MaybeObject* maybe_result; 22376a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2238594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (object_contents == DATA_OBJECT) { 2239fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE)); 2240594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org maybe_result = heap->old_data_space()->AllocateRaw(allocation_size); 2241ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } else { 2242fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE)); 2243ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org maybe_result = heap->old_pointer_space()->AllocateRaw(allocation_size); 2244ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 22456a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2246303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result = NULL; // Initialization to please compiler. 2247303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (maybe_result->ToObject(&result)) { 2248ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* target = HeapObject::cast(result); 22491b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 2250ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (alignment != kObjectAlignment) { 2251ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com target = EnsureDoubleAligned(heap, target, allocation_size); 2252ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 2253ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 22541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Order is important: slot might be inside of the target if target 22551b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // was allocated over a dead object and slot comes from the store 22561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // buffer. 22571b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org *slot = target; 22581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MigrateObject(heap, object, target, object_size); 22596a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2260ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (object_contents == POINTER_OBJECT) { 2261ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (map->instance_type() == JS_FUNCTION_TYPE) { 2262ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com heap->promotion_queue()->insert( 2263ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com target, JSFunction::kNonWeakFieldsEndOffset); 2264ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } else { 2265ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com heap->promotion_queue()->insert(target, object_size); 2266ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 2267ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 22686a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2269ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap->tracer()->increment_promoted_objects_size(object_size); 2270ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return; 22716a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 2272ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 2273fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org ASSERT(heap->AllowedToBeMigrated(object, NEW_SPACE)); 2274ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com MaybeObject* allocation = heap->new_space()->AllocateRaw(allocation_size); 2275c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org heap->promotion_queue()->SetNewLimit(heap->new_space()->top()); 2276c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* result = allocation->ToObjectUnchecked(); 22771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org HeapObject* target = HeapObject::cast(result); 2278c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2279ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (alignment != kObjectAlignment) { 2280ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com target = EnsureDoubleAligned(heap, target, allocation_size); 2281ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 2282ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 22831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Order is important: slot might be inside of the target if target 22841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // was allocated over a dead object and slot comes from the store 22851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // buffer. 22861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org *slot = target; 22871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org MigrateObject(heap, object, target, object_size); 2288ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return; 2289ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 22906a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 22916a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2292c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static inline void EvacuateJSFunction(Map* map, 2293c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject** slot, 2294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* object) { 2295c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ObjectEvacuationStrategy<POINTER_OBJECT>:: 2296c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com template VisitSpecialized<JSFunction::kSize>(map, slot, object); 2297c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2298c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* target = *slot; 2299c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MarkBit mark_bit = Marking::MarkBitFrom(target); 2300c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (Marking::IsBlack(mark_bit)) { 2301c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // This object is black and it might not be rescanned by marker. 2302c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // We should explicitly record code entry slot for compaction because 2303c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // promotion queue processing (IterateAndMarkPointersToFromSpace) will 2304c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // miss it as it is not HeapObject-tagged. 2305c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address code_entry_slot = 2306c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com target->address() + JSFunction::kCodeEntryOffset; 2307c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Code* code = Code::cast(Code::GetObjectFromEntryAddress(code_entry_slot)); 2308c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->GetHeap()->mark_compact_collector()-> 2309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RecordCodeEntrySlot(code_entry_slot, code); 2310c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2314ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void EvacuateFixedArray(Map* map, 2315ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2316ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object) { 2317ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size = FixedArray::BodyDescriptor::SizeOf(map, object); 2318594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<POINTER_OBJECT, kObjectAlignment>( 2319594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org map, slot, object, object_size); 23206a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 23216a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 23226a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 23236d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org static inline void EvacuateFixedDoubleArray(Map* map, 23246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org HeapObject** slot, 23256d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org HeapObject* object) { 23266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int length = reinterpret_cast<FixedDoubleArray*>(object)->length(); 23276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int object_size = FixedDoubleArray::SizeFor(length); 2328594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<DATA_OBJECT, kDoubleAlignment>( 2329594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org map, slot, object, object_size); 23306d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 23316d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 23326d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 2333ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void EvacuateByteArray(Map* map, 2334ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2335ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object) { 2336ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size = reinterpret_cast<ByteArray*>(object)->ByteArraySize(); 2337594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<DATA_OBJECT, kObjectAlignment>( 2338ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com map, slot, object, object_size); 2339ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 23406a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 23416a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2342fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org static inline void EvacuateSeqOneByteString(Map* map, 23436a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org HeapObject** slot, 23446a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org HeapObject* object) { 2345fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org int object_size = SeqOneByteString::cast(object)-> 2346fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org SeqOneByteStringSize(map->instance_type()); 2347594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<DATA_OBJECT, kObjectAlignment>( 2348ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com map, slot, object, object_size); 2349ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 23506a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 23516a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2352ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void EvacuateSeqTwoByteString(Map* map, 2353ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2354ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object) { 2355ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size = SeqTwoByteString::cast(object)-> 2356ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org SeqTwoByteStringSize(map->instance_type()); 2357594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<DATA_OBJECT, kObjectAlignment>( 2358ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com map, slot, object, object_size); 2359ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 23606a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 23615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 2362ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline bool IsShortcutCandidate(int type) { 2363ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return ((type & kShortcutTypeMask) == kShortcutTypeTag); 2364ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 23656a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2366ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void EvacuateShortcutCandidate(Map* map, 2367ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2368ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object) { 2369ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org ASSERT(IsShortcutCandidate(map->instance_type())); 23706a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2371c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Heap* heap = map->GetHeap(); 2372c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2373c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (marks_handling == IGNORE_MARKS && 2374c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ConsString::cast(object)->unchecked_second() == 2375c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->empty_string()) { 2376ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* first = 2377ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject::cast(ConsString::cast(object)->unchecked_first()); 23786a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2379ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org *slot = first; 23806a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2381c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!heap->InNewSpace(first)) { 2382ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org object->set_map_word(MapWord::FromForwardingAddress(first)); 2383ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return; 2384ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 23856a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2386ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org MapWord first_word = first->map_word(); 2387ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (first_word.IsForwardingAddress()) { 2388ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* target = first_word.ToForwardingAddress(); 2389ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 2390ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org *slot = target; 2391ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org object->set_map_word(MapWord::FromForwardingAddress(target)); 2392ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return; 2393ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 2394ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 2395c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->DoScavengeObject(first->map(), slot, first); 2396ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org object->set_map_word(MapWord::FromForwardingAddress(*slot)); 239743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return; 239843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 23996a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2400ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size = ConsString::kSize; 2401594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<POINTER_OBJECT, kObjectAlignment>( 2402ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com map, slot, object, object_size); 240343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 240443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2405ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<ObjectContents object_contents> 2406ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org class ObjectEvacuationStrategy { 2407ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org public: 2408ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org template<int object_size> 2409ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void VisitSpecialized(Map* map, 2410ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2411ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object) { 2412594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<object_contents, kObjectAlignment>( 2413ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com map, slot, object, object_size); 241443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 24156a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2416ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org static inline void Visit(Map* map, 2417ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject** slot, 2418ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org HeapObject* object) { 2419ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org int object_size = map->instance_size(); 2420594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org EvacuateObject<object_contents, kObjectAlignment>( 2421ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com map, slot, object, object_size); 2422ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 2423ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org }; 24246a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2425c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org static VisitorDispatchTable<ScavengingCallback> table_; 2426ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}; 24276a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 24286a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 2429c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtemplate<MarksHandling marks_handling, 2430c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LoggingAndProfiling logging_and_profiling_mode> 2431c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgVisitorDispatchTable<ScavengingCallback> 2432c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<marks_handling, logging_and_profiling_mode>::table_; 2433c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2434c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2435c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgstatic void InitializeScavengingVisitorsTables() { 2436c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<TRANSFER_MARKS, 2437c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOGGING_AND_PROFILING_DISABLED>::Initialize(); 2438c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<IGNORE_MARKS, LOGGING_AND_PROFILING_DISABLED>::Initialize(); 2439c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<TRANSFER_MARKS, 2440c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOGGING_AND_PROFILING_ENABLED>::Initialize(); 2441c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<IGNORE_MARKS, LOGGING_AND_PROFILING_ENABLED>::Initialize(); 2442c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 2443c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2444c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2445c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::SelectScavengingVisitorsTable() { 2446c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool logging_and_profiling = 2447c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com isolate()->logger()->is_logging() || 2448f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org isolate()->cpu_profiler()->is_profiling() || 2449c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org (isolate()->heap_profiler() != NULL && 2450cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org isolate()->heap_profiler()->is_tracking_object_moves()); 2451c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2452c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!incremental_marking()->IsMarking()) { 2453c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!logging_and_profiling) { 2454c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scavenging_visitors_table_.CopyFrom( 2455c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<IGNORE_MARKS, 2456c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOGGING_AND_PROFILING_DISABLED>::GetTable()); 2457c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 2458c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scavenging_visitors_table_.CopyFrom( 2459c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<IGNORE_MARKS, 2460c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOGGING_AND_PROFILING_ENABLED>::GetTable()); 2461c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2462c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 2463c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!logging_and_profiling) { 2464c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scavenging_visitors_table_.CopyFrom( 2465c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<TRANSFER_MARKS, 2466c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOGGING_AND_PROFILING_DISABLED>::GetTable()); 2467c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 2468c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com scavenging_visitors_table_.CopyFrom( 2469c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ScavengingVisitor<TRANSFER_MARKS, 2470c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOGGING_AND_PROFILING_ENABLED>::GetTable()); 2471c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2472a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org 2473a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org if (incremental_marking()->IsCompacting()) { 2474a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // When compacting forbid short-circuiting of cons-strings. 2475a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // Scavenging code relies on the fact that new space object 2476a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // can't be evacuated into evacuation candidate but 2477a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // short-circuiting violates this assumption. 2478a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org scavenging_visitors_table_.Register( 2479a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org StaticVisitorBase::kVisitShortcutCandidate, 2480a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org scavenging_visitors_table_.GetVisitorById( 2481a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org StaticVisitorBase::kVisitConsString)); 2482a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org } 2483c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org } 2484c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 24856a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 24866a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org 24876a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.orgvoid Heap::ScavengeObjectSlow(HeapObject** p, HeapObject* object) { 2488c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org SLOW_ASSERT(object->GetIsolate()->heap()->InFromSpace(object)); 24896a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org MapWord first_word = object->map_word(); 2490394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT(!first_word.IsForwardingAddress()); 24916a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org Map* map = first_word.ToMap(); 2492c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->GetHeap()->DoScavengeObject(map, p, object); 24935a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 24945a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 24955a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 2496303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocatePartialMap(InstanceType instance_type, 2497303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org int instance_size) { 2498303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 2499e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org MaybeObject* maybe_result = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); 250046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 250143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Map::cast cannot be used due to uninitialized map field. 250368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org reinterpret_cast<Map*>(result)->set_map(raw_unchecked_meta_map()); 250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<Map*>(result)->set_instance_type(instance_type); 250543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<Map*>(result)->set_instance_size(instance_size); 2506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org reinterpret_cast<Map*>(result)->set_visitor_id( 2507ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org StaticVisitorBase::GetVisitorId(instance_type, instance_size)); 25087c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org reinterpret_cast<Map*>(result)->set_inobject_properties(0); 2509b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org reinterpret_cast<Map*>(result)->set_pre_allocated_property_fields(0); 251043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<Map*>(result)->set_unused_property_fields(0); 2511b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org reinterpret_cast<Map*>(result)->set_bit_field(0); 2512b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org reinterpret_cast<Map*>(result)->set_bit_field2(0); 2513af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org int bit_field3 = Map::EnumLengthBits::encode(kInvalidEnumCacheSentinel) | 251406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org Map::OwnsDescriptors::encode(true); 251506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org reinterpret_cast<Map*>(result)->set_bit_field3(bit_field3); 251643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 251743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 251843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 251943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2520c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comMaybeObject* Heap::AllocateMap(InstanceType instance_type, 2521c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int instance_size, 2522c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ElementsKind elements_kind) { 2523303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 2524e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org MaybeObject* maybe_result = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); 2525304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (!maybe_result->To(&result)) return maybe_result; 252643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 252743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Map* map = reinterpret_cast<Map*>(result); 252864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org map->set_map_no_write_barrier(meta_map()); 252943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map->set_instance_type(instance_type); 2530ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org map->set_visitor_id( 2531ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org StaticVisitorBase::GetVisitorId(instance_type, instance_size)); 253227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org map->set_prototype(null_value(), SKIP_WRITE_BARRIER); 253327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org map->set_constructor(null_value(), SKIP_WRITE_BARRIER); 253443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map->set_instance_size(instance_size); 25357c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org map->set_inobject_properties(0); 2536911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org map->set_pre_allocated_property_fields(0); 253727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org map->set_code_cache(empty_fixed_array(), SKIP_WRITE_BARRIER); 25382e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org map->set_dependent_code(DependentCode::cast(empty_fixed_array()), 25392e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org SKIP_WRITE_BARRIER); 254081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org map->init_back_pointer(undefined_value()); 254143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map->set_unused_property_fields(0); 254289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org map->set_instance_descriptors(empty_descriptor_array()); 254343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map->set_bit_field(0); 2544d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com map->set_bit_field2(1 << Map::kIsExtensible); 2545af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org int bit_field3 = Map::EnumLengthBits::encode(kInvalidEnumCacheSentinel) | 254606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org Map::OwnsDescriptors::encode(true); 2547355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org map->set_bit_field3(bit_field3); 2548c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->set_elements_kind(elements_kind); 2549846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 255043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return map; 255143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 255243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 255343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2554303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateCodeCache() { 25559a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org CodeCache* code_cache; 25569a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org { MaybeObject* maybe_code_cache = AllocateStruct(CODE_CACHE_TYPE); 25579a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org if (!maybe_code_cache->To(&code_cache)) return maybe_code_cache; 2558303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 255927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org code_cache->set_default_cache(empty_fixed_array(), SKIP_WRITE_BARRIER); 256027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org code_cache->set_normal_type_cache(undefined_value(), SKIP_WRITE_BARRIER); 2561ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return code_cache; 2562ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 2563ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2564ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 2565e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgMaybeObject* Heap::AllocatePolymorphicCodeCache() { 2566e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org return AllocateStruct(POLYMORPHIC_CODE_CACHE_TYPE); 2567e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org} 2568e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2569e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2570f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comMaybeObject* Heap::AllocateAccessorPair() { 25719a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org AccessorPair* accessors; 25729a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org { MaybeObject* maybe_accessors = AllocateStruct(ACCESSOR_PAIR_TYPE); 25739a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org if (!maybe_accessors->To(&accessors)) return maybe_accessors; 2574f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 25759a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org accessors->set_getter(the_hole_value(), SKIP_WRITE_BARRIER); 25769a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org accessors->set_setter(the_hole_value(), SKIP_WRITE_BARRIER); 25771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org accessors->set_access_flags(Smi::FromInt(0), SKIP_WRITE_BARRIER); 2578f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return accessors; 2579f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com} 2580f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 2581f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 2582f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgMaybeObject* Heap::AllocateTypeFeedbackInfo() { 2583f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org TypeFeedbackInfo* info; 25849a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org { MaybeObject* maybe_info = AllocateStruct(TYPE_FEEDBACK_INFO_TYPE); 25859a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org if (!maybe_info->To(&info)) return maybe_info; 2586f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org } 258746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org info->initialize_storage(); 2588f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org info->set_type_feedback_cells(TypeFeedbackCells::cast(empty_fixed_array()), 2589f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org SKIP_WRITE_BARRIER); 2590f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org return info; 2591f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org} 2592f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 2593f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 2594ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgMaybeObject* Heap::AllocateAliasedArgumentsEntry(int aliased_context_slot) { 2595ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org AliasedArgumentsEntry* entry; 25969a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org { MaybeObject* maybe_entry = AllocateStruct(ALIASED_ARGUMENTS_ENTRY_TYPE); 25979a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org if (!maybe_entry->To(&entry)) return maybe_entry; 2598ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 2599ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org entry->set_aliased_context_slot(aliased_context_slot); 2600ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return entry; 2601ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org} 2602ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 2603ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 260468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgconst Heap::StringTypeTable Heap::string_type_table[] = { 260568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#define STRING_TYPE_ELEMENT(type, size, name, camel_name) \ 260668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org {type, size, k##camel_name##MapRootIndex}, 260768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org STRING_TYPE_LIST(STRING_TYPE_ELEMENT) 260868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#undef STRING_TYPE_ELEMENT 260968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org}; 261068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 261168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 26124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgconst Heap::ConstantStringTable Heap::constant_string_table[] = { 26134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#define CONSTANT_STRING_ELEMENT(name, contents) \ 261468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org {contents, k##name##RootIndex}, 26154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org INTERNALIZED_STRING_LIST(CONSTANT_STRING_ELEMENT) 26164a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#undef CONSTANT_STRING_ELEMENT 261768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org}; 261868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 261968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 262068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgconst Heap::StructTable Heap::struct_table[] = { 262168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#define STRUCT_TABLE_ELEMENT(NAME, Name, name) \ 262268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org { NAME##_TYPE, Name::kSize, k##Name##MapRootIndex }, 262368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org STRUCT_LIST(STRUCT_TABLE_ELEMENT) 262468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org#undef STRUCT_TABLE_ELEMENT 262568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org}; 262668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 262768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org 262843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::CreateInitialMaps() { 2629303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* obj; 2630303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocatePartialMap(MAP_TYPE, Map::kSize); 2631303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2632303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 263343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Map::cast cannot be used due to uninitialized map field. 263468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org Map* new_meta_map = reinterpret_cast<Map*>(obj); 263568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_meta_map(new_meta_map); 263668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org new_meta_map->set_map(new_meta_map); 263743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2638303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2639303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocatePartialMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2640303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2641303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 264268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_fixed_array_map(Map::cast(obj)); 264343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2644303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocatePartialMap(ODDBALL_TYPE, Oddball::kSize); 2645303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2646303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 264768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_oddball_map(Map::cast(obj)); 264843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26495d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Allocate the empty array. 2650303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateEmptyFixedArray(); 2651303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2652303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 265368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_empty_fixed_array(FixedArray::cast(obj)); 265443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2655c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { MaybeObject* maybe_obj = Allocate(oddball_map(), OLD_POINTER_SPACE); 2656303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2657303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2658a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_null_value(Oddball::cast(obj)); 2659ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::cast(obj)->set_kind(Oddball::kNull); 266043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2661a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org { MaybeObject* maybe_obj = Allocate(oddball_map(), OLD_POINTER_SPACE); 2662a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2663a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org } 2664a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_undefined_value(Oddball::cast(obj)); 2665a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org Oddball::cast(obj)->set_kind(Oddball::kUndefined); 2666a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org ASSERT(!InNewSpace(undefined_value())); 2667a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org 2668defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org // Allocate the empty descriptor array. 2669303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateEmptyFixedArray(); 2670303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2671303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2672defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_empty_descriptor_array(DescriptorArray::cast(obj)); 267343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Fix the instance_descriptors for the existing maps. 267543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen meta_map()->set_code_cache(empty_fixed_array()); 26762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org meta_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); 267781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org meta_map()->init_back_pointer(undefined_value()); 267889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org meta_map()->set_instance_descriptors(empty_descriptor_array()); 267943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 268043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen fixed_array_map()->set_code_cache(empty_fixed_array()); 26812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org fixed_array_map()->set_dependent_code( 26822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org DependentCode::cast(empty_fixed_array())); 268381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org fixed_array_map()->init_back_pointer(undefined_value()); 268489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org fixed_array_map()->set_instance_descriptors(empty_descriptor_array()); 268543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 268643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen oddball_map()->set_code_cache(empty_fixed_array()); 26872e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org oddball_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); 268881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org oddball_map()->init_back_pointer(undefined_value()); 268989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org oddball_map()->set_instance_descriptors(empty_descriptor_array()); 269043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 269143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Fix prototype object for existing maps. 269243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen meta_map()->set_prototype(null_value()); 269343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen meta_map()->set_constructor(null_value()); 269443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 269543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen fixed_array_map()->set_prototype(null_value()); 269643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen fixed_array_map()->set_constructor(null_value()); 2697defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 269843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen oddball_map()->set_prototype(null_value()); 269943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen oddball_map()->set_constructor(null_value()); 270043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2701303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2702303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2703303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2704303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 27050b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org set_fixed_cow_array_map(Map::cast(obj)); 27060b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org ASSERT(fixed_array_map() != fixed_cow_array_map()); 27070b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 27084acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org { MaybeObject* maybe_obj = 27094acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 27104acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 27114acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org } 2712c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org set_scope_info_map(Map::cast(obj)); 27134acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 2714303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(HEAP_NUMBER_TYPE, HeapNumber::kSize); 2715303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2716303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 271768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_heap_number_map(Map::cast(obj)); 271843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org { MaybeObject* maybe_obj = AllocateMap(SYMBOL_TYPE, Symbol::kSize); 27204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 27214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 27224a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org set_symbol_map(Map::cast(obj)); 27234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 2724ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org { MaybeObject* maybe_obj = AllocateMap(FOREIGN_TYPE, Foreign::kSize); 2725303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2726303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2727ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org set_foreign_map(Map::cast(obj)); 272843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 272968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org for (unsigned i = 0; i < ARRAY_SIZE(string_type_table); i++) { 273068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org const StringTypeTable& entry = string_type_table[i]; 2731303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); 2732303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2733303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 273468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org roots_[entry.index] = Map::cast(obj); 273568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 273643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2737303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(STRING_TYPE, kVariableSizeSentinel); 2738303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2739303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2740ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org set_undetectable_string_map(Map::cast(obj)); 274168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org Map::cast(obj)->set_is_undetectable(); 274243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2743303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2744303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(ASCII_STRING_TYPE, kVariableSizeSentinel); 2745303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2746303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2747ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org set_undetectable_ascii_string_map(Map::cast(obj)); 274868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org Map::cast(obj)->set_is_undetectable(); 274943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2750303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 27516d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org AllocateMap(FIXED_DOUBLE_ARRAY_TYPE, kVariableSizeSentinel); 27526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 27536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 27546d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org set_fixed_double_array_map(Map::cast(obj)); 27556d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 27566d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org { MaybeObject* maybe_obj = 2757a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org AllocateMap(CONSTANT_POOL_ARRAY_TYPE, kVariableSizeSentinel); 2758a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2759a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 2760a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org set_constant_pool_array_map(Map::cast(obj)); 2761a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 2762a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { MaybeObject* maybe_obj = 2763303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(BYTE_ARRAY_TYPE, kVariableSizeSentinel); 2764303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2765303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 276668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_byte_array_map(Map::cast(obj)); 276743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2768c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { MaybeObject* maybe_obj = 2769c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com AllocateMap(FREE_SPACE_TYPE, kVariableSizeSentinel); 2770c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe_obj->ToObject(&obj)) return false; 2771c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2772c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com set_free_space_map(Map::cast(obj)); 2773c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org { MaybeObject* maybe_obj = AllocateByteArray(0, TENURED); 2775a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2776a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 2777a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org set_empty_byte_array(ByteArray::cast(obj)); 2778a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2779303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 27804d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org AllocateMap(EXTERNAL_PIXEL_ARRAY_TYPE, ExternalArray::kAlignedSize); 2781303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2782303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 27834d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org set_external_pixel_array_map(Map::cast(obj)); 27840b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 2785303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_BYTE_ARRAY_TYPE, 2786303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2787303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2788303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 27893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_byte_array_map(Map::cast(obj)); 27903811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2791303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE, 2792303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2793303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2794303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 27953811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_unsigned_byte_array_map(Map::cast(obj)); 27963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2797303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_SHORT_ARRAY_TYPE, 2798303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2799303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2800303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 28013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_short_array_map(Map::cast(obj)); 28023811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2803303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE, 2804303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2805303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2806303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 28073811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_unsigned_short_array_map(Map::cast(obj)); 28083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2809303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_INT_ARRAY_TYPE, 2810303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2811303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2812303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 28133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_int_array_map(Map::cast(obj)); 28143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2815303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_UNSIGNED_INT_ARRAY_TYPE, 2816303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2817303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2818303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 28193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_unsigned_int_array_map(Map::cast(obj)); 28203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2821303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_FLOAT_ARRAY_TYPE, 2822303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArray::kAlignedSize); 2823303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2824303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 28253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org set_external_float_array_map(Map::cast(obj)); 28263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 28277b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org { MaybeObject* maybe_obj = 28287b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 28297b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28307b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org } 28317b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org set_non_strict_arguments_elements_map(Map::cast(obj)); 28327b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 28333847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com { MaybeObject* maybe_obj = AllocateMap(EXTERNAL_DOUBLE_ARRAY_TYPE, 28343847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com ExternalArray::kAlignedSize); 28353847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com if (!maybe_obj->ToObject(&obj)) return false; 28363847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com } 28373847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com set_external_double_array_map(Map::cast(obj)); 28383847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 28394e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalByteArray); 28404e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28414e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28424e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_byte_array(ExternalArray::cast(obj)); 28434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28444e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = 28454e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org AllocateEmptyExternalArray(kExternalUnsignedByteArray); 28464e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28474e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28484e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_unsigned_byte_array(ExternalArray::cast(obj)); 28494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalShortArray); 28514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28524e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28534e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_short_array(ExternalArray::cast(obj)); 28544e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28554e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray( 28564e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org kExternalUnsignedShortArray); 28574e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28584e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28594e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_unsigned_short_array(ExternalArray::cast(obj)); 28604e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28614e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalIntArray); 28624e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28634e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28644e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_int_array(ExternalArray::cast(obj)); 28654e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28664e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = 28674e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org AllocateEmptyExternalArray(kExternalUnsignedIntArray); 28684e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28694e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28704e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_unsigned_int_array(ExternalArray::cast(obj)); 28714e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28724e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalFloatArray); 28734e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28744e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28754e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_float_array(ExternalArray::cast(obj)); 28764e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28774e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalDoubleArray); 28784e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28794e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28804e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_double_array(ExternalArray::cast(obj)); 28814e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 28824e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateEmptyExternalArray(kExternalPixelArray); 28834e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 28844e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 28854e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org set_empty_external_pixel_array(ExternalArray::cast(obj)); 28864e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 2887303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(CODE_TYPE, kVariableSizeSentinel); 2888303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2889303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 289068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_code_map(Map::cast(obj)); 289143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 289241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org { MaybeObject* maybe_obj = AllocateMap(CELL_TYPE, Cell::kSize); 289341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 289441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 289541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org set_cell_map(Map::cast(obj)); 289641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 289741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org { MaybeObject* maybe_obj = AllocateMap(PROPERTY_CELL_TYPE, 2898b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org PropertyCell::kSize); 2899303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2900303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2901defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_global_property_cell_map(Map::cast(obj)); 2902defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 2903303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(FILLER_TYPE, kPointerSize); 2904303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2905303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2906defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_one_pointer_filler_map(Map::cast(obj)); 290743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2908303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(FILLER_TYPE, 2 * kPointerSize); 2909303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2910303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 2911defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org set_two_pointer_filler_map(Map::cast(obj)); 291243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 291368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org for (unsigned i = 0; i < ARRAY_SIZE(struct_table); i++) { 291468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org const StructTable& entry = struct_table[i]; 2915303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(entry.type, entry.size); 2916303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2917303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 291868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org roots_[entry.index] = Map::cast(obj); 291968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 292043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2921303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2922303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2923303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2924303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 292568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_hash_table_map(Map::cast(obj)); 292643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2927303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2928303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2929303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2930303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 29316d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org set_function_context_map(Map::cast(obj)); 293243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2933303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2934303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2935303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2936303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 293768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_catch_context_map(Map::cast(obj)); 293837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 2939303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 2940303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2941303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2942303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 29436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org set_with_context_map(Map::cast(obj)); 29446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 29456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org { MaybeObject* maybe_obj = 29466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 29476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 29486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 29494acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org set_block_context_map(Map::cast(obj)); 29504acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 29514acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org { MaybeObject* maybe_obj = 29524acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 29534acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 29544acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org } 2955f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org set_module_context_map(Map::cast(obj)); 2956f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 2957f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org { MaybeObject* maybe_obj = 2958f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 2959f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2960f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org } 296146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org set_global_context_map(Map::cast(obj)); 296246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 296346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org { MaybeObject* maybe_obj = 296446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org AllocateMap(FIXED_ARRAY_TYPE, kVariableSizeSentinel); 296546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 296646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 296746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Map* native_context_map = Map::cast(obj); 296846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context_map->set_dictionary_map(true); 296946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context_map->set_visitor_id(StaticVisitorBase::kVisitNativeContext); 297046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org set_native_context_map(native_context_map); 297143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2972303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(SHARED_FUNCTION_INFO_TYPE, 2973303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org SharedFunctionInfo::kAlignedSize); 2974303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 2975303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 297668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_shared_function_info_map(Map::cast(obj)); 297743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 297831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org { MaybeObject* maybe_obj = AllocateMap(JS_MESSAGE_OBJECT_TYPE, 297931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org JSMessageObject::kSize); 298031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 298131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org } 298231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org set_message_object_map(Map::cast(obj)); 298331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 2984eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org Map* external_map; 2985eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org { MaybeObject* maybe_obj = 2986eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize + kPointerSize); 2987eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!maybe_obj->To(&external_map)) return false; 2988eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 2989eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org external_map->set_is_extensible(false); 2990eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org set_external_map(external_map); 2991eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 2992ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(!InNewSpace(empty_fixed_array())); 299343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 299443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 299543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 299643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2997303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) { 299843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Statically ensure that it is safe to allocate heap numbers in paged 299943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // spaces. 30003d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org int size = HeapNumber::kSize; 3001ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org STATIC_ASSERT(HeapNumber::kSize <= Page::kNonCodeObjectAreaSize); 30023d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 3003c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 3004303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 30053d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 3006303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3007303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 300843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 300964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(heap_number_map()); 301043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HeapNumber::cast(result)->set_value(value); 301143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 301243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 301343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 301443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 301541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgMaybeObject* Heap::AllocateCell(Object* value) { 3016e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org int size = Cell::kSize; 3017e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org STATIC_ASSERT(Cell::kSize <= Page::kNonCodeObjectAreaSize); 3018e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 3019303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 3020e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, CELL_SPACE, CELL_SPACE); 3021303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3022303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 302341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(cell_map()); 302441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Cell::cast(result)->set_value(value); 302541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return result; 302641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org} 302741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 302841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 302971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.orgMaybeObject* Heap::AllocatePropertyCell() { 3030e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org int size = PropertyCell::kSize; 3031e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org STATIC_ASSERT(PropertyCell::kSize <= Page::kNonCodeObjectAreaSize); 3032e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org 303341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Object* result; 3034e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org MaybeObject* maybe_result = 3035e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org AllocateRaw(size, PROPERTY_CELL_SPACE, PROPERTY_CELL_SPACE); 3036e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3037e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 303864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org HeapObject::cast(result)->set_map_no_write_barrier( 303964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org global_property_cell_map()); 30401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org PropertyCell* cell = PropertyCell::cast(result); 30411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), 30421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SKIP_WRITE_BARRIER); 304371f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org cell->set_value(the_hole_value()); 30441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org cell->set_type(Type::None()); 30452abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org return result; 30462abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 30472abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 30482abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 30491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgMaybeObject* Heap::AllocateBox(Object* value, PretenureFlag pretenure) { 30501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Box* result; 30511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org MaybeObject* maybe_result = AllocateStruct(BOX_TYPE); 30521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org if (!maybe_result->To(&result)) return maybe_result; 30531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org result->set_value(value); 30541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return result; 30551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org} 30561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 30571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 3058bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgMaybeObject* Heap::AllocateAllocationSite() { 3059528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org AllocationSite* site; 3060bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org MaybeObject* maybe_result = Allocate(allocation_site_map(), 3061bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org OLD_POINTER_SPACE); 3062528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (!maybe_result->To(&site)) return maybe_result; 3063ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org site->Initialize(); 3064ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 3065ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org // Link the site 3066ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org site->set_weak_next(allocation_sites_list()); 3067ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org set_allocation_sites_list(site); 3068528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return site; 3069bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org} 3070bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 3071bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org 3072303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::CreateOddball(const char* to_string, 3073ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object* to_number, 3074ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org byte kind) { 3075303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 3076c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { MaybeObject* maybe_result = Allocate(oddball_map(), OLD_POINTER_SPACE); 3077303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3078303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 30793d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org return Oddball::cast(result)->Initialize(this, to_string, to_number, kind); 308043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 308143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 308243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 308343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::CreateApiObjects() { 308443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* obj; 308543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3086303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 3087303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3088303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3089c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Don't use Smi-only elements optimizations for objects with the neander 3090c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // map. There are too many cases where element values are set directly with a 3091c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // bottleneck to trap the Smi-only -> fast elements transition, and there 3092c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // appears to be no benefit for optimize this case. 3093c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Map* new_neander_map = Map::cast(obj); 3094830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org new_neander_map->set_elements_kind(TERMINAL_FAST_ELEMENTS_KIND); 3095c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com set_neander_map(new_neander_map); 309643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3097ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = AllocateJSObjectFromMap(neander_map()); 3098303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3099303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3100303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* elements; 3101303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_elements = AllocateFixedArray(2); 3102303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_elements->ToObject(&elements)) return false; 3103303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 310443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FixedArray::cast(elements)->set(0, Smi::FromInt(0)); 310543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen JSObject::cast(obj)->set_elements(FixedArray::cast(elements)); 310668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_message_listeners(JSObject::cast(obj)); 310743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 310843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 310943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 311043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31112abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 31122abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.orgvoid Heap::CreateJSEntryStub() { 31132abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org JSEntryStub stub; 31148432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org set_js_entry_code(*stub.GetCode(isolate())); 31152abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 31162abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 31172abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 31182abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.orgvoid Heap::CreateJSConstructEntryStub() { 31192abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org JSConstructEntryStub stub; 31208432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org set_js_construct_entry_code(*stub.GetCode(isolate())); 31212abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 31222abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 31232abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 312443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::CreateFixedStubs() { 312543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Here we create roots for fixed stubs. They are needed at GC 312643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for cooking and uncooking (check out frames.cc). 312743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The eliminates the need for doing dictionary lookup in the 312843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // stub cache for these stubs. 3129c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(isolate()); 31302abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // gcc-4.4 has problem generating correct code of following snippet: 31314d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // { JSEntryStub stub; 31324d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // js_entry_code_ = *stub.GetCode(); 31332abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // } 31344d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // { JSConstructEntryStub stub; 31354d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // js_construct_entry_code_ = *stub.GetCode(); 31362abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // } 31372abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // To workaround the problem, make separate functions without inlining. 31382abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org Heap::CreateJSEntryStub(); 31392abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org Heap::CreateJSConstructEntryStub(); 3140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3141c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Create stubs that should be there, so we don't unexpectedly have to 3142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // create them if we need them during the creation of another stub. 3143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Stub creation mixes raw pointers and handles in an unsafe manner so 3144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // we cannot create stubs while we are creating stubs. 31458432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org CodeStub::GenerateStubsAheadOfTime(isolate()); 314643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 314743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 314843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3149ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.orgvoid Heap::CreateStubsRequiringBuiltins() { 3150ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org HandleScope scope(isolate()); 3151ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org CodeStub::GenerateStubsRequiringBuiltinsAheadOfTime(isolate()); 3152ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org} 3153ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 3154ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org 315543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::CreateInitialObjects() { 315643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* obj; 315743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 315843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The -0 value must be set before NumberFromDouble works. 3159303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, TENURED); 3160303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3161303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3162a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_minus_zero_value(HeapNumber::cast(obj)); 316377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org ASSERT(std::signbit(minus_zero_value()->Number()) != 0); 316443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3165303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateHeapNumber(OS::nan_value(), TENURED); 3166303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3167303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3168a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_nan_value(HeapNumber::cast(obj)); 316943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3170c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { MaybeObject* maybe_obj = AllocateHeapNumber(V8_INFINITY, TENURED); 3171c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe_obj->ToObject(&obj)) return false; 3172c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 3173a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_infinity_value(HeapNumber::cast(obj)); 317443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3175fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org // The hole has not been created yet, but we want to put something 31764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // predictable in the gaps in the string table, so lets make that Smi zero. 3177fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org set_the_hole_value(reinterpret_cast<Oddball*>(Smi::FromInt(0))); 3178fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 31794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Allocate initial string table. 31806e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org { MaybeObject* maybe_obj = 31816e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org StringTable::Allocate(this, kInitialStringTableSize); 3182303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3183303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 31844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Don't use set_string_table() due to asserts. 31854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[kStringTableRootIndex] = obj; 318643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Finish initializing oddballs after creating the string table. 3188a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org { MaybeObject* maybe_obj = 31893d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org undefined_value()->Initialize(this, 31903d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org "undefined", 3191a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org nan_value(), 3192a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org Oddball::kUndefined); 3193a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3194303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 319543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3196a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // Initialize the null_value. 31973d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org { MaybeObject* maybe_obj = null_value()->Initialize( 31983d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org this, "null", Smi::FromInt(0), Oddball::kNull); 3199303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3200303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 320143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3202ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = CreateOddball("true", 3203ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Smi::FromInt(1), 3204ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::kTrue); 3205303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3206303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3207a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_true_value(Oddball::cast(obj)); 320843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3209ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = CreateOddball("false", 3210ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Smi::FromInt(0), 3211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::kFalse); 3212303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3213303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3214a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_false_value(Oddball::cast(obj)); 321543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3216ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = CreateOddball("hole", 3217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Smi::FromInt(-1), 3218ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::kTheHole); 3219303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3220303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3221a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_the_hole_value(Oddball::cast(obj)); 322243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org { MaybeObject* maybe_obj = CreateOddball("uninitialized", 32241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Smi::FromInt(-1), 32251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Oddball::kUninitialized); 32261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 32271fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 32281fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org set_uninitialized_value(Oddball::cast(obj)); 32291fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 3230d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org { MaybeObject* maybe_obj = CreateOddball("arguments_marker", 32312c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Smi::FromInt(-4), 3232ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::kArgumentMarker); 3233d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3234d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org } 3235a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org set_arguments_marker(Oddball::cast(obj)); 3236d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 3237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = CreateOddball("no_interceptor_result_sentinel", 32382c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Smi::FromInt(-2), 3239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::kOther); 3240303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3241303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 32420b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org set_no_interceptor_result_sentinel(obj); 32430b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 3244ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = CreateOddball("termination_exception", 32452c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Smi::FromInt(-3), 3246ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Oddball::kOther); 3247303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3248303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3249c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org set_termination_exception(obj); 32500b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 32514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org for (unsigned i = 0; i < ARRAY_SIZE(constant_string_table); i++) { 3252303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 32534a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org InternalizeUtf8String(constant_string_table[i].contents); 3254303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3255303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 32564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[constant_string_table[i].index] = String::cast(obj); 325768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org } 325843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Allocate the hidden string which is used to identify the hidden properties 32603b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org // in JSObjects. The hash code has a special value so that it will not match 32613b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org // the empty string when searching for the property. It cannot be part of the 326268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // loop above because it needs to be allocated manually with the special 32634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // hash code in place. The hash code for the hidden_string is zero to ensure 32643b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org // that it will always be at the first entry in property descriptors. 32654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org { MaybeObject* maybe_obj = AllocateOneByteInternalizedString( 32664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org OneByteVector("", 0), String::kEmptyStringHash); 3267303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3268303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 32694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org hidden_string_ = String::cast(obj); 32703b45ab59f57a3f7a11fdc5278839a881780cb9cbager@chromium.org 32710b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // Allocate the code_stubs dictionary. The initial size is set to avoid 32720b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // expanding the dictionary during bootstrapping. 32736e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org { MaybeObject* maybe_obj = UnseededNumberDictionary::Allocate(this, 128); 3274303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3275303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3276f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com set_code_stubs(UnseededNumberDictionary::cast(obj)); 327743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 327864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 32790b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // Allocate the non_monomorphic_cache used in stub-cache.cc. The initial size 32800b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org // is set to avoid expanding the dictionary during bootstrapping. 32816e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org { MaybeObject* maybe_obj = UnseededNumberDictionary::Allocate(this, 64); 3282303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3283303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3284f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com set_non_monomorphic_cache(UnseededNumberDictionary::cast(obj)); 328543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3286e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org { MaybeObject* maybe_obj = AllocatePolymorphicCodeCache(); 3287e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3288e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 3289e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org set_polymorphic_code_cache(PolymorphicCodeCache::cast(obj)); 3290e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 3291720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org set_instanceof_cache_function(Smi::FromInt(0)); 3292720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org set_instanceof_cache_map(Smi::FromInt(0)); 3293720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org set_instanceof_cache_answer(Smi::FromInt(0)); 3294720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 329543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CreateFixedStubs(); 329643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3297d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com // Allocate the dictionary of intrinsic function names. 32986e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org { MaybeObject* maybe_obj = 32996e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org NameDictionary::Allocate(this, Runtime::kNumFunctions); 3300303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3301303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_obj = Runtime::InitializeIntrinsicFunctionNames(this, 3303ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org obj); 3304303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3305303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3306750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org set_intrinsic_function_names(NameDictionary::cast(obj)); 3307d88afa260e45de10e729b05a20146184a488aff7erik.corry@gmail.com 3308fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org { MaybeObject* maybe_obj = AllocateInitialNumberStringCache(); 3309fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3310fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 3311fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org set_number_string_cache(FixedArray::cast(obj)); 331243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 331359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // Allocate cache for single character one byte strings. 3314303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = 331559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org AllocateFixedArray(String::kMaxOneByteCharCode + 1, TENURED); 3316303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3317303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 331868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_single_character_string_cache(FixedArray::cast(obj)); 331943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3320486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org // Allocate cache for string split. 332178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateFixedArray( 332278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org RegExpResultsCache::kRegExpResultsCacheSize, TENURED); 3323486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3324486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 3325486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org set_string_split_cache(FixedArray::cast(obj)); 3326486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 332778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org { MaybeObject* maybe_obj = AllocateFixedArray( 332878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org RegExpResultsCache::kRegExpResultsCacheSize, TENURED); 332978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 333078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } 333178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org set_regexp_multiple_cache(FixedArray::cast(obj)); 333278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org 333343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate cache for external strings pointing to native source code. 3334303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_obj = AllocateFixedArray(Natives::GetBuiltinsCount()); 3335303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3336303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 333768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org set_natives_source_cache(FixedArray::cast(obj)); 333843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3339e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org // Allocate object to hold object observation state. 3340e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 3341e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3342e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 3343e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org { MaybeObject* maybe_obj = AllocateJSObjectFromMap(Map::cast(obj)); 3344e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3345e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 3346e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org set_observation_state(JSObject::cast(obj)); 3347e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 3348a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org { MaybeObject* maybe_obj = AllocateSymbol(); 3349a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3350a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 33510cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Symbol::cast(obj)->set_is_private(true); 3352a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org set_frozen_symbol(Symbol::cast(obj)); 3353a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 3354d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org { MaybeObject* maybe_obj = AllocateSymbol(); 3355d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3356d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 33570cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Symbol::cast(obj)->set_is_private(true); 3358d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org set_elements_transition_symbol(Symbol::cast(obj)); 3359d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 3360a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org { MaybeObject* maybe_obj = SeededNumberDictionary::Allocate(this, 0, TENURED); 3361a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3362a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 3363a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org SeededNumberDictionary::cast(obj)->set_requires_slow_elements(); 3364a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org set_empty_slow_element_dictionary(SeededNumberDictionary::cast(obj)); 3365a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org 3366169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org { MaybeObject* maybe_obj = AllocateSymbol(); 3367169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (!maybe_obj->ToObject(&obj)) return false; 3368169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 33690cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Symbol::cast(obj)->set_is_private(true); 3370169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org set_observed_symbol(Symbol::cast(obj)); 3371169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 3372d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org // Handling of script id generation is in Factory::NewScript. 33731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_last_script_id(Smi::FromInt(v8::Script::kNoScriptId)); 33747be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 33755a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Initialize keyed lookup cache. 3376ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->keyed_lookup_cache()->Clear(); 33775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 33785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Initialize context slot cache. 3379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->context_slot_cache()->Clear(); 33805aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 33815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Initialize descriptor cache. 3382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->descriptor_lookup_cache()->Clear(); 33835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 3384b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org // Initialize compilation cache. 3385ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->compilation_cache()->Clear(); 33869258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 338743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 338843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 338943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 339043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3391e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgbool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { 3392e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org RootListIndex writable_roots[] = { 3393e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kStoreBufferTopRootIndex, 3394e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kStackLimitRootIndex, 33954121f23c2a08f8ef03858df1477b81a0450b94a0ulan@chromium.org kNumberStringCacheRootIndex, 3396e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kInstanceofCacheFunctionRootIndex, 3397e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kInstanceofCacheMapRootIndex, 3398e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kInstanceofCacheAnswerRootIndex, 3399e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kCodeStubsRootIndex, 3400e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kNonMonomorphicCacheRootIndex, 3401e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kPolymorphicCodeCacheRootIndex, 3402e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kLastScriptIdRootIndex, 3403e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kEmptyScriptRootIndex, 3404e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kRealStackLimitRootIndex, 3405e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kArgumentsAdaptorDeoptPCOffsetRootIndex, 3406e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kConstructStubDeoptPCOffsetRootIndex, 3407e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kGetterStubDeoptPCOffsetRootIndex, 3408e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org kSetterStubDeoptPCOffsetRootIndex, 34094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org kStringTableRootIndex, 3410e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org }; 3411e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 3412e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org for (unsigned int i = 0; i < ARRAY_SIZE(writable_roots); i++) { 3413e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (root_index == writable_roots[i]) 3414e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org return true; 3415e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 3416e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org return false; 3417e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org} 3418e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 3419e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 3420594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgbool Heap::RootCanBeTreatedAsConstant(RootListIndex root_index) { 3421594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return !RootCanBeWrittenAfterInitialization(root_index) && 3422594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org !InNewSpace(roots_array_start()[root_index]); 3423594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 3424594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 3425594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 342678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgObject* RegExpResultsCache::Lookup(Heap* heap, 342778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org String* key_string, 342878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org Object* key_pattern, 342978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ResultsCacheType type) { 343078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org FixedArray* cache; 34314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!key_string->IsInternalizedString()) return Smi::FromInt(0); 343278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org if (type == STRING_SPLIT_SUBSTRINGS) { 343378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ASSERT(key_pattern->IsString()); 34344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!key_pattern->IsInternalizedString()) return Smi::FromInt(0); 343578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache = heap->string_split_cache(); 343678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } else { 343778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ASSERT(type == REGEXP_MULTIPLE_INDICES); 343878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ASSERT(key_pattern->IsFixedArray()); 343978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache = heap->regexp_multiple_cache(); 344078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } 344178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org 344278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org uint32_t hash = key_string->Hash(); 344378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org uint32_t index = ((hash & (kRegExpResultsCacheSize - 1)) & 3444486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org ~(kArrayEntriesPerCacheEntry - 1)); 344578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org if (cache->get(index + kStringOffset) == key_string && 344678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->get(index + kPatternOffset) == key_pattern) { 3447486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org return cache->get(index + kArrayOffset); 3448486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 344978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org index = 345078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ((index + kArrayEntriesPerCacheEntry) & (kRegExpResultsCacheSize - 1)); 345178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org if (cache->get(index + kStringOffset) == key_string && 345278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->get(index + kPatternOffset) == key_pattern) { 3453486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org return cache->get(index + kArrayOffset); 3454486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 3455486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org return Smi::FromInt(0); 3456486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org} 3457486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 3458486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 345978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgvoid RegExpResultsCache::Enter(Heap* heap, 346078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org String* key_string, 346178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org Object* key_pattern, 346278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org FixedArray* value_array, 346378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ResultsCacheType type) { 346478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org FixedArray* cache; 34654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!key_string->IsInternalizedString()) return; 346678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org if (type == STRING_SPLIT_SUBSTRINGS) { 346778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ASSERT(key_pattern->IsString()); 34684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!key_pattern->IsInternalizedString()) return; 346978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache = heap->string_split_cache(); 347078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } else { 347178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ASSERT(type == REGEXP_MULTIPLE_INDICES); 347278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ASSERT(key_pattern->IsFixedArray()); 347378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache = heap->regexp_multiple_cache(); 347478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } 347578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org 347678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org uint32_t hash = key_string->Hash(); 347778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org uint32_t index = ((hash & (kRegExpResultsCacheSize - 1)) & 3478486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org ~(kArrayEntriesPerCacheEntry - 1)); 3479486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org if (cache->get(index + kStringOffset) == Smi::FromInt(0)) { 348078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index + kStringOffset, key_string); 348178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index + kPatternOffset, key_pattern); 348278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index + kArrayOffset, value_array); 348355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org } else { 348455ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org uint32_t index2 = 348578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org ((index + kArrayEntriesPerCacheEntry) & (kRegExpResultsCacheSize - 1)); 348655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org if (cache->get(index2 + kStringOffset) == Smi::FromInt(0)) { 348778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index2 + kStringOffset, key_string); 348878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index2 + kPatternOffset, key_pattern); 348978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index2 + kArrayOffset, value_array); 349055ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org } else { 349155ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org cache->set(index2 + kStringOffset, Smi::FromInt(0)); 349255ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org cache->set(index2 + kPatternOffset, Smi::FromInt(0)); 349355ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org cache->set(index2 + kArrayOffset, Smi::FromInt(0)); 349478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index + kStringOffset, key_string); 349578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index + kPatternOffset, key_pattern); 349678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org cache->set(index + kArrayOffset, value_array); 349755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org } 3498486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 349978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org // If the array is a reasonably short list of substrings, convert it into a 35004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // list of internalized strings. 350178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org if (type == STRING_SPLIT_SUBSTRINGS && value_array->length() < 100) { 350278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org for (int i = 0; i < value_array->length(); i++) { 350378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org String* str = String::cast(value_array->get(i)); 35044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* internalized_str; 35054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MaybeObject* maybe_string = heap->InternalizeString(str); 35064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (maybe_string->ToObject(&internalized_str)) { 35074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org value_array->set(i, internalized_str); 3508486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 3509486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 3510486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 351178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org // Convert backing store to a copy-on-write array. 351278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org value_array->set_map_no_write_barrier(heap->fixed_cow_array_map()); 3513486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org} 3514486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 3515486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 351678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgvoid RegExpResultsCache::Clear(FixedArray* cache) { 351778502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org for (int i = 0; i < kRegExpResultsCacheSize; i++) { 3518486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org cache->set(i, Smi::FromInt(0)); 3519486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org } 3520486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org} 3521486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 3522486075aa3f2e6d0031ff182961b9eab00e1081d8jkummerow@chromium.org 3523fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgMaybeObject* Heap::AllocateInitialNumberStringCache() { 3524303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org MaybeObject* maybe_obj = 3525fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org AllocateFixedArray(kInitialNumberStringCacheSize * 2, TENURED); 3526303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return maybe_obj; 35270c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 35280c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 35290c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 3530fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgint Heap::FullSizeNumberStringCacheLength() { 3531fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // Compute the size of the number string cache based on the max newspace size. 3532fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // The number string cache has a minimum size based on twice the initial cache 3533fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // size to ensure that it is bigger after being made 'full size'. 3534fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int number_string_cache_size = max_semispace_size_ / 512; 3535fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org number_string_cache_size = Max(kInitialNumberStringCacheSize * 2, 3536fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Min(0x4000, number_string_cache_size)); 3537fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // There is a string and a number per entry so the length is twice the number 3538fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // of entries. 3539fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return number_string_cache_size * 2; 3540fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 3541fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 3542fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 3543fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgvoid Heap::AllocateFullSizeNumberStringCache() { 3544fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // The idea is to have a small number string cache in the snapshot to keep 3545fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // boot-time memory usage down. If we expand the number string cache already 3546fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // while creating the snapshot then that didn't work out. 35475a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org ASSERT(!Serializer::enabled() || FLAG_extra_code != NULL); 3548fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* maybe_obj = 3549fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org AllocateFixedArray(FullSizeNumberStringCacheLength(), TENURED); 3550fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Object* new_cache; 3551fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (maybe_obj->ToObject(&new_cache)) { 3552fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // We don't bother to repopulate the cache with entries from the old cache. 3553fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // It will be repopulated soon enough with new strings. 3554fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org set_number_string_cache(FixedArray::cast(new_cache)); 3555fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 3556fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // If allocation fails then we just return without doing anything. It is only 3557fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // a cache, so best effort is OK here. 3558fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 3559fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 3560fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 35610c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.orgvoid Heap::FlushNumberStringCache() { 35620c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Flush the number to string cache. 35630c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org int len = number_string_cache()->length(); 35640c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org for (int i = 0; i < len; i++) { 35651f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org number_string_cache()->set_undefined(i); 35660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 35670c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 35680c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 35690c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 357043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic inline int double_get_hash(double d) { 357143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DoubleRepresentation rep(d); 35720c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return static_cast<int>(rep.bits) ^ static_cast<int>(rep.bits >> 32); 357343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 357443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 357543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 357643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic inline int smi_get_hash(Smi* smi) { 35770c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return smi->value(); 357843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 357943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 358043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 358143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* Heap::GetNumberStringCache(Object* number) { 358243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int hash; 35830c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org int mask = (number_string_cache()->length() >> 1) - 1; 358443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (number->IsSmi()) { 35850c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org hash = smi_get_hash(Smi::cast(number)) & mask; 358643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 35870c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org hash = double_get_hash(number->Number()) & mask; 358843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 358968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org Object* key = number_string_cache()->get(hash * 2); 359043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (key == number) { 359168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return String::cast(number_string_cache()->get(hash * 2 + 1)); 359243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (key->IsHeapNumber() && 359343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen number->IsHeapNumber() && 359443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen key->Number() == number->Number()) { 359568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org return String::cast(number_string_cache()->get(hash * 2 + 1)); 359643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 359743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return undefined_value(); 359843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 359943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 360043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 360143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::SetNumberStringCache(Object* number, String* string) { 360243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int hash; 36030c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org int mask = (number_string_cache()->length() >> 1) - 1; 360443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (number->IsSmi()) { 36050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org hash = smi_get_hash(Smi::cast(number)) & mask; 360643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 36070c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org hash = double_get_hash(number->Number()) & mask; 360843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 3609fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (number_string_cache()->get(hash * 2) != undefined_value() && 3610fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org number_string_cache()->length() != FullSizeNumberStringCacheLength()) { 3611fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // The first time we have a hash collision, we move to the full sized 3612fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // number string cache. 3613fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org AllocateFullSizeNumberStringCache(); 3614fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return; 3615fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 3616fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org number_string_cache()->set(hash * 2, number); 361768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org number_string_cache()->set(hash * 2 + 1, string); 361843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 361943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 362043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3621303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::NumberToString(Object* number, 362257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org bool check_number_string_cache, 362357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org PretenureFlag pretenure) { 3624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->number_to_string_runtime()->Increment(); 3625357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org if (check_number_string_cache) { 3626357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Object* cached = GetNumberStringCache(number); 3627357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org if (cached != undefined_value()) { 3628357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return cached; 3629357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } 3630c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 3631c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 3632c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org char arr[100]; 3633c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org Vector<char> buffer(arr, ARRAY_SIZE(arr)); 3634c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org const char* str; 3635c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (number->IsSmi()) { 3636c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org int num = Smi::cast(number)->value(); 3637c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org str = IntToCString(num, buffer); 3638c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } else { 3639c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org double num = HeapNumber::cast(number)->value(); 3640c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org str = DoubleToCString(num, buffer); 3641c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 3642c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 3643303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* js_string; 364457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org MaybeObject* maybe_js_string = 364557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org AllocateStringFromOneByte(CStrVector(str), pretenure); 3646303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (maybe_js_string->ToObject(&js_string)) { 3647303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org SetNumberStringCache(number, String::cast(js_string)); 3648c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 3649303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return maybe_js_string; 3650c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 3651c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 3652c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 3653c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comMaybeObject* Heap::Uint32ToString(uint32_t value, 3654c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool check_number_string_cache) { 3655c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* number; 3656c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MaybeObject* maybe = NumberFromUint32(value); 3657c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe->To<Object>(&number)) return maybe; 3658c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return NumberToString(number, check_number_string_cache); 3659c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 3660c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3661c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 36623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgMap* Heap::MapForExternalArrayType(ExternalArrayType array_type) { 36633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return Map::cast(roots_[RootIndexForExternalArrayType(array_type)]); 36643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 36653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 36663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 36673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgHeap::RootListIndex Heap::RootIndexForExternalArrayType( 36683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org ExternalArrayType array_type) { 36693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org switch (array_type) { 36703811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalByteArray: 36713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalByteArrayMapRootIndex; 36723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalUnsignedByteArray: 36733811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalUnsignedByteArrayMapRootIndex; 36743811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalShortArray: 36753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalShortArrayMapRootIndex; 36763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalUnsignedShortArray: 36773811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalUnsignedShortArrayMapRootIndex; 36783811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalIntArray: 36793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalIntArrayMapRootIndex; 36803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalUnsignedIntArray: 36813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalUnsignedIntArrayMapRootIndex; 36823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org case kExternalFloatArray: 36833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kExternalFloatArrayMapRootIndex; 36843847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com case kExternalDoubleArray: 36853847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com return kExternalDoubleArrayMapRootIndex; 36864d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org case kExternalPixelArray: 36874d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org return kExternalPixelArrayMapRootIndex; 36883811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org default: 36893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org UNREACHABLE(); 36903811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kUndefinedValueRootIndex; 36913811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 36923811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 36933811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 36944e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgHeap::RootListIndex Heap::RootIndexForEmptyExternalArray( 36954e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org ElementsKind elementsKind) { 36964e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org switch (elementsKind) { 36974e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_BYTE_ELEMENTS: 36984e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalByteArrayRootIndex; 36994e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 37004e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalUnsignedByteArrayRootIndex; 37014e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_SHORT_ELEMENTS: 37024e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalShortArrayRootIndex; 37034e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 37044e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalUnsignedShortArrayRootIndex; 37054e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_INT_ELEMENTS: 37064e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalIntArrayRootIndex; 37074e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_UNSIGNED_INT_ELEMENTS: 37084e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalUnsignedIntArrayRootIndex; 37094e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_FLOAT_ELEMENTS: 37104e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalFloatArrayRootIndex; 37114e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_DOUBLE_ELEMENTS: 37124e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalDoubleArrayRootIndex; 37134e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org case EXTERNAL_PIXEL_ELEMENTS: 37144e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kEmptyExternalPixelArrayRootIndex; 37154e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org default: 37164e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org UNREACHABLE(); 37174e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return kUndefinedValueRootIndex; 37184e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 37194e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 37204e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 3721e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 37224e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgExternalArray* Heap::EmptyExternalArrayForMap(Map* map) { 37234e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return ExternalArray::cast( 37244e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org roots_[RootIndexForEmptyExternalArray(map->elements_kind())]); 37254e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 37264e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 37274e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 37284e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 37293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 3730303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::NumberFromDouble(double value, PretenureFlag pretenure) { 37314111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // We need to distinguish the minus zero value and this cannot be 37324111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // done after conversion to int. Doing this by comparing bit 37334111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // patterns is faster than using fpclassify() et al. 37344111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org static const DoubleRepresentation minus_zero(-0.0); 373543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37364111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org DoubleRepresentation rep(value); 37374111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org if (rep.bits == minus_zero.bits) { 37384111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org return AllocateHeapNumber(-0.0, pretenure); 37394111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org } 374043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37414111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org int int_value = FastD2I(value); 37424111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org if (value == int_value && Smi::IsValid(int_value)) { 37434111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org return Smi::FromInt(int_value); 37444111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org } 37454111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org 37464111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // Materialize the value in the heap. 37474111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org return AllocateHeapNumber(value, pretenure); 374843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 374943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 375043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3751ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgMaybeObject* Heap::AllocateForeign(Address address, PretenureFlag pretenure) { 3752ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org // Statically ensure that it is safe to allocate foreigns in paged spaces. 3753ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org STATIC_ASSERT(Foreign::kSize <= Page::kMaxNonCodeHeapObjectSize); 37540b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; 3755c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Foreign* result; 3756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org MaybeObject* maybe_result = Allocate(foreign_map(), space); 3757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (!maybe_result->To(&result)) return maybe_result; 3758c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org result->set_foreign_address(address); 375943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 376043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 376143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 376243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3763303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateSharedFunctionInfo(Object* name) { 37647c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org SharedFunctionInfo* share; 37657c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org MaybeObject* maybe = Allocate(shared_function_info_map(), OLD_POINTER_SPACE); 37667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (!maybe->To<SharedFunctionInfo>(&share)) return maybe; 376743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Set pointer fields. 376943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen share->set_name(name); 37707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Code* illegal = isolate_->builtins()->builtin(Builtins::kIllegal); 377143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen share->set_code(illegal); 3772906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org share->set_optimized_code_map(Smi::FromInt(0)); 37738432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org share->set_scope_info(ScopeInfo::Empty(isolate_)); 37747c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org Code* construct_stub = 37757c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org isolate_->builtins()->builtin(Builtins::kJSConstructStubGeneric); 37765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org share->set_construct_stub(construct_stub); 37774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org share->set_instance_class_name(Object_string()); 377827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org share->set_function_data(undefined_value(), SKIP_WRITE_BARRIER); 377927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org share->set_script(undefined_value(), SKIP_WRITE_BARRIER); 378027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org share->set_debug_info(undefined_value(), SKIP_WRITE_BARRIER); 378127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org share->set_inferred_name(empty_string(), SKIP_WRITE_BARRIER); 378227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org share->set_initial_map(undefined_value(), SKIP_WRITE_BARRIER); 3783b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org share->set_ast_node_count(0); 37847028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org share->set_counters(0); 37857c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 37867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // Set integer fields (smi or int, depending on the architecture). 37877c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org share->set_length(0); 37887c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org share->set_formal_parameter_count(0); 37897c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org share->set_expected_nof_properties(0); 379030ce411529579186181838984710b0b0980857aaricow@chromium.org share->set_num_literals(0); 37917c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org share->set_start_position_and_type(0); 379230ce411529579186181838984710b0b0980857aaricow@chromium.org share->set_end_position(0); 379330ce411529579186181838984710b0b0980857aaricow@chromium.org share->set_function_token_position(0); 37947c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org // All compiler hints default to false or 0. 37957c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org share->set_compiler_hints(0); 37962c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org share->set_opt_count_and_bailout_reason(0); 37977c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 37987c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return share; 379943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 380043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 380143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 380231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgMaybeObject* Heap::AllocateJSMessageObject(String* type, 380331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org JSArray* arguments, 380431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org int start_position, 380531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org int end_position, 380631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* script, 380731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* stack_trace, 380831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* stack_frames) { 380931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org Object* result; 381031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org { MaybeObject* maybe_result = Allocate(message_object_map(), NEW_SPACE); 381131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 381231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org } 381331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org JSMessageObject* message = JSMessageObject::cast(result); 381427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org message->set_properties(Heap::empty_fixed_array(), SKIP_WRITE_BARRIER); 3815830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org message->initialize_elements(); 381627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org message->set_elements(Heap::empty_fixed_array(), SKIP_WRITE_BARRIER); 381731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_type(type); 381831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_arguments(arguments); 381931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_start_position(start_position); 382031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_end_position(end_position); 382131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_script(script); 382231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_stack_trace(stack_trace); 382331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org message->set_stack_frames(stack_frames); 382431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org return result; 382531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org} 382631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 382731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 382831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org 38296141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org// Returns true for a character in a range. Both limits are inclusive. 38306141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.orgstatic inline bool Between(uint32_t character, uint32_t from, uint32_t to) { 38316141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // This makes uses of the the unsigned wraparound. 38326141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org return character - from <= to - from; 38336141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org} 38346141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org 38356141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org 3836303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMUST_USE_RESULT static inline MaybeObject* MakeOrFindTwoCharacterString( 3837ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Heap* heap, 3838a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t c1, 3839a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t c2) { 38404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org String* result; 38416141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // Numeric strings have a different hash algorithm not known by 38424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // LookupTwoCharsStringIfExists, so we skip this step for such strings. 38436141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org if ((!Between(c1, '0', '9') || !Between(c2, '0', '9')) && 38444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org heap->string_table()->LookupTwoCharsStringIfExists(c1, c2, &result)) { 38454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 38466141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // Now we know the length is 2, we might as well make use of that fact 38476141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // when building the new string. 384859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } else if (static_cast<unsigned>(c1 | c2) <= String::kMaxOneByteCharCodeU) { 3849a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // We can do this. 385059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org ASSERT(IsPowerOf2(String::kMaxOneByteCharCodeU + 1)); // because of this. 3851303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 38528e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { MaybeObject* maybe_result = heap->AllocateRawOneByteString(2); 3853303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3854303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 385559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t* dest = SeqOneByteString::cast(result)->GetChars(); 385659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org dest[0] = static_cast<uint8_t>(c1); 385759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org dest[1] = static_cast<uint8_t>(c2); 38586141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org return result; 38596141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org } else { 3860303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 3861ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_result = heap->AllocateRawTwoByteString(2); 3862303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3863303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 38646141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org uc16* dest = SeqTwoByteString::cast(result)->GetChars(); 38656141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org dest[0] = c1; 38666141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org dest[1] = c2; 38676141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org return result; 38686141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org } 38696141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org} 38706141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org 38716141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org 3872303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateConsString(String* first, String* second) { 3873bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org int first_length = first->length(); 3874c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (first_length == 0) { 3875c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return second; 3876c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 38773e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 3878bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org int second_length = second->length(); 3879c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (second_length == 0) { 3880c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return first; 3881c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 38823e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 38835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int length = first_length + second_length; 38846141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org 38856141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // Optimization for 2-byte strings often used as keys in a decompression 38864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // dictionary. Check whether we already have the string in the string 38876141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // table to prevent creation of many unneccesary strings. 38886141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org if (length == 2) { 3889a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t c1 = first->Get(0); 3890a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t c2 = second->Get(0); 3891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MakeOrFindTwoCharacterString(this, c1, c2); 38926141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org } 38936141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org 389459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool first_is_one_byte = first->IsOneByteRepresentation(); 389559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool second_is_one_byte = second->IsOneByteRepresentation(); 389659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool is_one_byte = first_is_one_byte && second_is_one_byte; 38973e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // Make sure that an out of memory exception is thrown if the length 38989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // of the new cons string is too large. 38999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (length > String::kMaxLength || length < 0) { 3900ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->context()->mark_out_of_memory(); 390159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0x4); 39023e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org } 39033e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 3904ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org bool is_one_byte_data_in_two_byte_string = false; 390559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (!is_one_byte) { 39065ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // At least one of the strings uses two-byte representation so we 39072efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // can't use the fast case code for short ASCII strings below, but 39082efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // we can try to save memory if all chars actually fit in ASCII. 3909ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org is_one_byte_data_in_two_byte_string = 3910ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org first->HasOnlyOneByteChars() && second->HasOnlyOneByteChars(); 3911ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org if (is_one_byte_data_in_two_byte_string) { 3912ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->string_add_runtime_ext_to_ascii()->Increment(); 39135ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 39145ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 39155ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 391643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the resulting string is small make a flat string. 39172efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org if (length < ConsString::kMinLength) { 39184668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Note that neither of the two inputs can be a slice because: 39192efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org STATIC_ASSERT(ConsString::kMinLength <= SlicedString::kMinLength); 3920bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org ASSERT(first->IsFlat()); 3921bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org ASSERT(second->IsFlat()); 392259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (is_one_byte) { 3923303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 39248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { MaybeObject* maybe_result = AllocateRawOneByteString(length); 3925303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3926303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 39275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Copy the characters into the new object. 392859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t* dest = SeqOneByteString::cast(result)->GetChars(); 39293e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // Copy first part. 393059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org const uint8_t* src; 3931ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org if (first->IsExternalString()) { 39320ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry src = ExternalAsciiString::cast(first)->GetChars(); 3933ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org } else { 3934fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org src = SeqOneByteString::cast(first)->GetChars(); 3935ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org } 39363e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org for (int i = 0; i < first_length; i++) *dest++ = src[i]; 39373e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // Copy second part. 3938ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org if (second->IsExternalString()) { 39390ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry src = ExternalAsciiString::cast(second)->GetChars(); 3940ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org } else { 3941fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org src = SeqOneByteString::cast(second)->GetChars(); 3942ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org } 39433e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org for (int i = 0; i < second_length; i++) *dest++ = src[i]; 39445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return result; 39455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } else { 3946ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org if (is_one_byte_data_in_two_byte_string) { 3947303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 39488e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { MaybeObject* maybe_result = AllocateRawOneByteString(length); 3949303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3950303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3951aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org // Copy the characters into the new object. 395259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t* dest = SeqOneByteString::cast(result)->GetChars(); 3953aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org String::WriteToFlat(first, dest, 0, first_length); 3954aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org String::WriteToFlat(second, dest + first_length, 0, second_length); 3955ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->counters()->string_add_runtime_ext_to_ascii()->Increment(); 3956aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org return result; 3957aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org } 3958aa1b6165f7efc4a40c71aa4cb22966c480108fa5ricow@chromium.org 3959303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 3960303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = AllocateRawTwoByteString(length); 3961303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3962303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 39635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Copy the characters into the new object. 39645a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org uc16* dest = SeqTwoByteString::cast(result)->GetChars(); 3965bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org String::WriteToFlat(first, dest, 0, first_length); 3966bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org String::WriteToFlat(second, dest + first_length, 0, second_length); 39675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return result; 396843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 396943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 397043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3971ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Map* map = (is_one_byte || is_one_byte_data_in_two_byte_string) ? 39725ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org cons_ascii_string_map() : cons_string_map(); 397343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3974303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 3975303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = Allocate(map, NEW_SPACE); 3976303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 3977303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 3978b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 397979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_gc; 398043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ConsString* cons_string = ConsString::cast(result); 3981b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org WriteBarrierMode mode = cons_string->GetWriteBarrierMode(no_gc); 3982ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org cons_string->set_length(length); 3983ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org cons_string->set_hash_field(String::kEmptyHashField); 3984c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org cons_string->set_first(first, mode); 3985c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org cons_string->set_second(second, mode); 398643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 398743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 398843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 398943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3990303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateSubString(String* buffer, 399104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org int start, 399204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org int end, 399304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org PretenureFlag pretenure) { 399443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int length = end - start; 39952efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org if (length <= 0) { 399604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org return empty_string(); 3997c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 3998c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 3999c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // Make an attempt to flatten the buffer to reduce access time. 4000c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org buffer = buffer->TryFlattenGetString(); 4001c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 4002c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org if (length == 1) { 4003ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return LookupSingleCharacterStringFromCode(buffer->Get(start)); 40046141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org } else if (length == 2) { 40056141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org // Optimization for 2-byte strings often used as keys in a decompression 40064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // dictionary. Check whether we already have the string in the string 40074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // table to prevent creation of many unnecessary strings. 4008a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t c1 = buffer->Get(start); 4009a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t c2 = buffer->Get(start + 1); 4010ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MakeOrFindTwoCharacterString(this, c1, c2); 40117c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org } 40127c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 40134668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org if (!FLAG_string_slices || 4014c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com !buffer->IsFlat() || 40154668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org length < SlicedString::kMinLength || 40164668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org pretenure == TENURED) { 40174668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org Object* result; 4018c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // WriteToFlat takes care of the case when an indirect string has a 4019c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // different encoding from its underlying string. These encodings may 4020c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // differ because of externalization. 402159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org bool is_one_byte = buffer->IsOneByteRepresentation(); 402259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org { MaybeObject* maybe_result = is_one_byte 40238e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ? AllocateRawOneByteString(length, pretenure) 4024c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : AllocateRawTwoByteString(length, pretenure); 40254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 40264668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org } 40274668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org String* string_result = String::cast(result); 40284668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Copy the characters into the new object. 402959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (is_one_byte) { 40308e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ASSERT(string_result->IsOneByteRepresentation()); 403159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t* dest = SeqOneByteString::cast(string_result)->GetChars(); 40324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org String::WriteToFlat(buffer, dest, start, end); 40334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org } else { 40344668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org ASSERT(string_result->IsTwoByteRepresentation()); 40354668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org uc16* dest = SeqTwoByteString::cast(string_result)->GetChars(); 40364668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org String::WriteToFlat(buffer, dest, start, end); 40374668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org } 40384668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org return result; 40394668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org } 40404668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 40414668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org ASSERT(buffer->IsFlat()); 4042c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#if VERIFY_HEAP 4043394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 4044394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com buffer->StringVerify(); 4045394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 40464668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org#endif 40474668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 4048303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4049c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // When slicing an indirect string we use its encoding for a newly created 4050c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // slice and don't check the encoding of the underlying string. This is safe 4051c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // even if the encodings are different because of externalization. If an 4052c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // indirect ASCII string is pointing to a two-byte string, the two-byte char 4053c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // codes of the underlying string must still fit into ASCII (because 4054c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // externalization must not change char codes). 40558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org { Map* map = buffer->IsOneByteRepresentation() 40564668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org ? sliced_ascii_string_map() 40574668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org : sliced_string_map(); 40584668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org MaybeObject* maybe_result = Allocate(map, NEW_SPACE); 4059303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4060303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 40614668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 406279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_gc; 40634668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org SlicedString* sliced_string = SlicedString::cast(result); 40644668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_length(length); 40654668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_hash_field(String::kEmptyHashField); 40664668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org if (buffer->IsConsString()) { 40674668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org ConsString* cons = ConsString::cast(buffer); 40684668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org ASSERT(cons->second()->length() == 0); 40694668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_parent(cons->first()); 40704668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_offset(start); 40714668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org } else if (buffer->IsSlicedString()) { 40724668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Prevent nesting sliced strings. 40734668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org SlicedString* parent_slice = SlicedString::cast(buffer); 40744668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_parent(parent_slice->parent()); 40754668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_offset(start + parent_slice->offset()); 4076c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else { 40774668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_parent(buffer); 40784668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org sliced_string->set_offset(start); 407943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 4080c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(sliced_string->parent()->IsSeqString() || 4081c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com sliced_string->parent()->IsExternalString()); 408243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 408343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 408443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 408543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4086303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateExternalStringFromAscii( 4087c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const ExternalAsciiString::Resource* resource) { 4088c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org size_t length = resource->length(); 4089ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org if (length > static_cast<size_t>(String::kMaxLength)) { 4090ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->context()->mark_out_of_memory(); 409159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0x5); 409243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 409343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4094ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org Map* map = external_ascii_string_map(); 4095303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4096303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = Allocate(map, NEW_SPACE); 4097303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4098303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 409943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 410043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ExternalAsciiString* external_string = ExternalAsciiString::cast(result); 4101c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org external_string->set_length(static_cast<int>(length)); 4102ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org external_string->set_hash_field(String::kEmptyHashField); 410343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen external_string->set_resource(resource); 410443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 410543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 410643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 410743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 410843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4109303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateExternalStringFromTwoByte( 4110c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const ExternalTwoByteString::Resource* resource) { 4111c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org size_t length = resource->length(); 4112c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (length > static_cast<size_t>(String::kMaxLength)) { 4113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->context()->mark_out_of_memory(); 411459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0x6); 4115c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 4116ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 41175ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // For small strings we check whether the resource contains only 411859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // one byte characters. If yes, we use a different string map. 4119ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org static const size_t kOneByteCheckLengthLimit = 32; 4120ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org bool is_one_byte = length <= kOneByteCheckLengthLimit && 412159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org String::IsOneByte(resource->data(), static_cast<int>(length)); 412259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Map* map = is_one_byte ? 4123ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org external_string_with_one_byte_data_map() : external_string_map(); 4124303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4125303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = Allocate(map, NEW_SPACE); 4126303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4127303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 412843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 412943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); 4130c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org external_string->set_length(static_cast<int>(length)); 4131ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org external_string->set_hash_field(String::kEmptyHashField); 413243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen external_string->set_resource(resource); 413343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 413443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 413543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 413643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 413743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4138303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { 413959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (code <= String::kMaxOneByteCharCode) { 4140ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Object* value = single_character_string_cache()->get(code); 4141ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (value != undefined_value()) return value; 41425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 414359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t buffer[1]; 414459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org buffer[0] = static_cast<uint8_t>(code); 4145303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4146a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org MaybeObject* maybe_result = 41474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org InternalizeOneByteString(Vector<const uint8_t>(buffer, 1)); 41485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 4149303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4150ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org single_character_string_cache()->set(code, result); 415143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 415243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 41535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 4154e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org SeqTwoByteString* result; 4155ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_result = AllocateRawTwoByteString(1); 4156e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (!maybe_result->To<SeqTwoByteString>(&result)) return maybe_result; 4157303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 4158e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org result->SeqTwoByteStringSet(0, code); 4159e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return result; 416043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 416143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 416243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4163303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { 41640c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (length < 0 || length > ByteArray::kMaxLength) { 416559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0x7); 41660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 4167a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int size = ByteArray::SizeFor(length); 41683d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 4169303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4170303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 4171303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4172303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 417343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 417464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<ByteArray*>(result)->set_map_no_write_barrier( 417564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org byte_array_map()); 417630ce411529579186181838984710b0b0980857aaricow@chromium.org reinterpret_cast<ByteArray*>(result)->set_length(length); 417743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 417843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 417943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 418043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41816f10e41fef1524c70846d970268de222e41c594cager@chromium.orgvoid Heap::CreateFillerObjectAt(Address addr, int size) { 41826f10e41fef1524c70846d970268de222e41c594cager@chromium.org if (size == 0) return; 41836f10e41fef1524c70846d970268de222e41c594cager@chromium.org HeapObject* filler = HeapObject::FromAddress(addr); 41846f10e41fef1524c70846d970268de222e41c594cager@chromium.org if (size == kPointerSize) { 418564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org filler->set_map_no_write_barrier(one_pointer_filler_map()); 4186013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org } else if (size == 2 * kPointerSize) { 418764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org filler->set_map_no_write_barrier(two_pointer_filler_map()); 41886f10e41fef1524c70846d970268de222e41c594cager@chromium.org } else { 418964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org filler->set_map_no_write_barrier(free_space_map()); 4190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FreeSpace::cast(filler)->set_size(size); 41916f10e41fef1524c70846d970268de222e41c594cager@chromium.org } 41926f10e41fef1524c70846d970268de222e41c594cager@chromium.org} 41936f10e41fef1524c70846d970268de222e41c594cager@chromium.org 41946f10e41fef1524c70846d970268de222e41c594cager@chromium.org 4195303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateExternalArray(int length, 4196303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ExternalArrayType array_type, 4197303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org void* external_pointer, 4198303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org PretenureFlag pretenure) { 41993d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org int size = ExternalArray::kAlignedSize; 42003d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 4201303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 42023d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 4203303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4204303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 42053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 420664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<ExternalArray*>(result)->set_map_no_write_barrier( 42073811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org MapForExternalArrayType(array_type)); 42083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org reinterpret_cast<ExternalArray*>(result)->set_length(length); 42093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org reinterpret_cast<ExternalArray*>(result)->set_external_pointer( 42103811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org external_pointer); 42113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 42123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return result; 42133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 42143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 42153811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 4216303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::CreateCode(const CodeDesc& desc, 4217303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Code::Flags flags, 42184d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org Handle<Object> self_reference, 4219b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org bool immovable, 4220c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org bool crankshafted, 4221c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org int prologue_offset) { 42224a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // Allocate ByteArray before the Code object, so that we do not risk 42234a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // leaving uninitialized Code object (and breaking the heap). 422404e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org ByteArray* reloc_info; 422504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org MaybeObject* maybe_reloc_info = AllocateByteArray(desc.reloc_size, TENURED); 422604e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org if (!maybe_reloc_info->To(&reloc_info)) return maybe_reloc_info; 42274a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 42284d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // Compute size. 42294a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com int body_size = RoundUp(desc.instr_size, kObjectAlignment); 42306a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org int obj_size = Code::SizeFor(body_size); 42314a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ASSERT(IsAligned(static_cast<intptr_t>(obj_size), kCodeAlignment)); 4232303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org MaybeObject* maybe_result; 42334d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // Large code objects and code objects which should stay at a fixed address 42344d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org // are allocated in large object space. 423556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org HeapObject* result; 423656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org bool force_lo_space = obj_size > code_space()->AreaSize(); 423756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (force_lo_space) { 4238c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE); 42399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } else { 4240935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org maybe_result = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE); 42419258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 424256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (!maybe_result->To<HeapObject>(&result)) return maybe_result; 424343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 424456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (immovable && !force_lo_space && 424556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // Objects on the first page of each space are never moved. 424656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org !code_space_->FirstPage()->Contains(result->address())) { 424756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // Discard the first code allocation, which was on a page where it could be 424856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org // moved. 424956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org CreateFillerObjectAt(result->address(), obj_size); 425056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE); 425156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (!maybe_result->To<HeapObject>(&result)) return maybe_result; 425256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org } 425343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 425443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the object 425556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org result->set_map_no_write_barrier(code_map()); 425643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Code* code = Code::cast(result); 4257ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(!isolate_->code_range()->exists() || 4258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->code_range()->contains(code->address())); 425943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code->set_instruction_size(desc.instr_size); 426004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org code->set_relocation_info(reloc_info); 426143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code->set_flags(flags); 4262aafe5810a82411878a83bbf65e492fa19d152226jkummerow@chromium.org code->set_raw_kind_specific_flags1(0); 4263aafe5810a82411878a83bbf65e492fa19d152226jkummerow@chromium.org code->set_raw_kind_specific_flags2(0); 4264c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (code->is_call_stub() || code->is_keyed_call_stub()) { 4265c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org code->set_check_type(RECEIVER_MAP_CHECK); 4266c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 4267b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org code->set_is_crankshafted(crankshafted); 426827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org code->set_deoptimization_data(empty_fixed_array(), SKIP_WRITE_BARRIER); 4269057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org code->set_raw_type_feedback_info(undefined_value()); 427027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org code->set_handler_table(empty_fixed_array(), SKIP_WRITE_BARRIER); 4271659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org code->set_gc_metadata(Smi::FromInt(0)); 427288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org code->set_ic_age(global_ic_age_); 4273c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org code->set_prologue_offset(prologue_offset); 4274003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (code->kind() == Code::OPTIMIZED_FUNCTION) { 4275003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org code->set_marked_for_deoptimization(false); 4276003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 4277c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 4278c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT 4279c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org if (code->kind() == Code::FUNCTION) { 4280c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org code->set_has_debug_break_slots( 4281c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org isolate_->debugger()->IsDebuggerActive()); 4282c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 4283c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org#endif 4284c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 4285061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // Allow self references to created code object by patching the handle to 4286061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org // point to the newly allocated Code object. 4287061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org if (!self_reference.is_null()) { 4288061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org *(self_reference.location()) = code; 4289a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 4290a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Migrate generated code. 4291a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // The generated code can contain Object** values (typically from handles) 4292a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // that are dereferenced during the copy to point directly to the actual heap 4293a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // objects. These pointers can include references to the code object itself, 4294a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // through the self_reference parameter. 4295a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org code->CopyFrom(desc); 429643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4297c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 4298394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 4299394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com code->Verify(); 4300394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 430143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 430243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return code; 430343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 430443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 430543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4306303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::CopyCode(Code* code) { 430743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate an object the same size as the code object. 430843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int obj_size = code->Size(); 4309303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org MaybeObject* maybe_result; 4310ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org if (obj_size > code_space()->AreaSize()) { 4311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE); 43129258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } else { 4313935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org maybe_result = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE); 43149258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 43159258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 4316303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4317303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 431843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 431943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copy code object. 432043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Address old_addr = code->address(); 432143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Address new_addr = reinterpret_cast<HeapObject*>(result)->address(); 432230ce411529579186181838984710b0b0980857aaricow@chromium.org CopyBlock(new_addr, old_addr, obj_size); 432343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Relocate the copy. 432443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Code* new_code = Code::cast(result); 4325ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(!isolate_->code_range()->exists() || 4326ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->code_range()->contains(code->address())); 432743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen new_code->Relocate(new_addr - old_addr); 432843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return new_code; 432943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 433043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 433143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4332303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) { 43334a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // Allocate ByteArray before the Code object, so that we do not risk 43344a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // leaving uninitialized Code object (and breaking the heap). 4335303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* reloc_info_array; 4336303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_reloc_info_array = 4337303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateByteArray(reloc_info.length(), TENURED); 4338303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_reloc_info_array->ToObject(&reloc_info_array)) { 4339303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return maybe_reloc_info_array; 4340303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 4341303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 43424a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com 43434a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com int new_body_size = RoundUp(code->instruction_size(), kObjectAlignment); 4344086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 43456a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org int new_obj_size = Code::SizeFor(new_body_size); 4346086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4347086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org Address old_addr = code->address(); 4348086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4349b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org size_t relocation_offset = 43504a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com static_cast<size_t>(code->instruction_end() - old_addr); 4351086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4352303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org MaybeObject* maybe_result; 4353ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org if (new_obj_size > code_space()->AreaSize()) { 4354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe_result = lo_space_->AllocateRaw(new_obj_size, EXECUTABLE); 4355086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org } else { 4356935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org maybe_result = AllocateRaw(new_obj_size, CODE_SPACE, CODE_SPACE); 4357086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org } 4358086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4359303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4360303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4361086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4362086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Copy code object. 4363086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org Address new_addr = reinterpret_cast<HeapObject*>(result)->address(); 4364086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4365086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Copy header and instructions. 4366f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org CopyBytes(new_addr, old_addr, relocation_offset); 4367086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4368086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org Code* new_code = Code::cast(result); 43694a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com new_code->set_relocation_info(ByteArray::cast(reloc_info_array)); 4370086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 43714a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com // Copy patched rinfo. 4372c99cd48a7a41dae45e3b166f9d71a3dd1f76fa27danno@chromium.org CopyBytes(new_code->relocation_start(), 4373c99cd48a7a41dae45e3b166f9d71a3dd1f76fa27danno@chromium.org reloc_info.start(), 4374f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org static_cast<size_t>(reloc_info.length())); 4375086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4376086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org // Relocate the copy. 4377ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(!isolate_->code_range()->exists() || 4378ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->code_range()->contains(code->address())); 4379086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org new_code->Relocate(new_addr - old_addr); 4380086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4381c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 4382394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 4383394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com code->Verify(); 4384394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 4385086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org#endif 4386086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org return new_code; 4387086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org} 4388086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4389086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 4390c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid Heap::InitializeAllocationMemento(AllocationMemento* memento, 4391c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org AllocationSite* allocation_site) { 4392c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org memento->set_map_no_write_barrier(allocation_memento_map()); 4393c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org ASSERT(allocation_site->map() == allocation_site_map()); 4394c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org memento->set_allocation_site(allocation_site, SKIP_WRITE_BARRIER); 4395c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org if (FLAG_allocation_site_pretenuring) { 4396c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org allocation_site->IncrementMementoCreateCount(); 4397c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } 4398c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org} 4399c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 4400c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org 44014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateWithAllocationSite(Map* map, AllocationSpace space, 4402bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org Handle<AllocationSite> allocation_site) { 44034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(gc_state_ == NOT_IN_GC); 44044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(map->instance_type() != MAP_TYPE); 44054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // If allocation failures are disallowed, we may allocate in a different 44064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // space when new space is full and the object is not a large object. 44074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org AllocationSpace retry_space = 44084a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); 4409ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org int size = map->instance_size() + AllocationMemento::kSize; 44104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result; 44114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); 44124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 44134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // No need for write barrier since object is white and map is in old space. 44144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(map); 4415ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( 44164a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org reinterpret_cast<Address>(result) + map->instance_size()); 4417c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org InitializeAllocationMemento(alloc_memento, *allocation_site); 44184a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 44194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 44204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 44214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4422303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::Allocate(Map* map, AllocationSpace space) { 442343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(gc_state_ == NOT_IN_GC); 442443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(map->instance_type() != MAP_TYPE); 44250c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // If allocation failures are disallowed, we may allocate in a different 44260c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // space when new space is full and the object is not a large object. 44270c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org AllocationSpace retry_space = 44280c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); 44294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int size = map->instance_size(); 4430303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 44314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); 44324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 443327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org // No need for write barrier since object is white and map is in old space. 443464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(map); 443543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 443643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 443743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 443843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4439c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::InitializeFunction(JSFunction* function, 4440c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SharedFunctionInfo* shared, 4441c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* prototype) { 444243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(!prototype->IsMap()); 444343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen function->initialize_properties(); 444443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen function->initialize_elements(); 444543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen function->set_shared(shared); 444626c16f8ef35ec25d36420512a4ceaa74ea2e2b05vegorov@chromium.org function->set_code(shared->code()); 444743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen function->set_prototype_or_initial_map(prototype); 444843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen function->set_context(undefined_value()); 4449394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com function->set_literals_or_bindings(empty_fixed_array()); 4450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org function->set_next_function_link(undefined_value()); 445143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 445243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 445343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4454303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateFunction(Map* function_map, 4455303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org SharedFunctionInfo* shared, 4456303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* prototype, 4457303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org PretenureFlag pretenure) { 4458846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org AllocationSpace space = 4459846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; 4460303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4461303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = Allocate(function_map, space); 4462303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4463303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 4464c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com InitializeFunction(JSFunction::cast(result), shared, prototype); 4465c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return result; 446643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 446743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 446843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4469303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) { 44709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // To get fast allocation and map sharing for arguments objects we 44719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // allocate them based on an arguments boilerplate. 447243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org JSObject* boilerplate; 4474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int arguments_object_size; 4475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool strict_mode_callee = callee->IsJSFunction() && 44761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org !JSFunction::cast(callee)->shared()->is_classic_mode(); 4477ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (strict_mode_callee) { 4478ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org boilerplate = 447946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org isolate()->context()->native_context()-> 4480ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org strict_mode_arguments_boilerplate(); 4481ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org arguments_object_size = kArgumentsObjectSizeStrict; 4482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else { 4483ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org boilerplate = 448446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org isolate()->context()->native_context()->arguments_boilerplate(); 4485ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org arguments_object_size = kArgumentsObjectSize; 4486ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 4487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 4488846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org // Check that the size of the boilerplate matches our 4489846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org // expectations. The ArgumentsAccessStub::GenerateNewObject relies 4490846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org // on the size being a known constant. 4491ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(arguments_object_size == boilerplate->map()->instance_size()); 4492846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org 4493846fb74ad58083497b91fc4668a56fddb36fbd2esgjesse@chromium.org // Do the allocation. 4494303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 4495303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = 4496ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org AllocateRaw(arguments_object_size, NEW_SPACE, OLD_POINTER_SPACE); 4497303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 4498303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 449943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45009bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // Copy the content. The arguments boilerplate doesn't have any 45019bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // fields that point to new space so it's safe to skip the write 45029bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org // barrier here. 450330ce411529579186181838984710b0b0980857aaricow@chromium.org CopyBlock(HeapObject::cast(result)->address(), 450430ce411529579186181838984710b0b0980857aaricow@chromium.org boilerplate->address(), 4505ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org JSObject::kHeaderSize); 450643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4507ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Set the length property. 4508ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org JSObject::cast(result)->InObjectPropertyAtPut(kArgumentsLengthIndex, 45095a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Smi::FromInt(length), 45105a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org SKIP_WRITE_BARRIER); 4511ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Set the callee property for non-strict mode arguments object only. 4512ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!strict_mode_callee) { 4513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org JSObject::cast(result)->InObjectPropertyAtPut(kArgumentsCalleeIndex, 4514ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org callee); 4515ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 45165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 451743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check the state of the object 451843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(JSObject::cast(result)->HasFastProperties()); 4519830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org ASSERT(JSObject::cast(result)->HasFastObjectElements()); 452043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 452143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 452243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 452343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 452443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 452543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::InitializeJSObjectFromMap(JSObject* obj, 452643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FixedArray* properties, 452743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Map* map) { 452843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->set_properties(properties); 452943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->initialize_elements(); 453043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // TODO(1240798): Initialize the object's body using valid initial values 453143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // according to the object's initial map. For example, if the map's 453243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // instance type is JS_ARRAY_TYPE, the length field should be initialized 45332efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // to a number (e.g. Smi::FromInt(0)) and the elements initialized to a 45342efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // fixed array (e.g. Heap::empty_fixed_array()). Currently, the object 453543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // verification code has to cope with (temporarily) invalid objects. See 453643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for example, JSArray::JSArrayVerify). 45374a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Object* filler; 45384a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // We cannot always fill with one_pointer_filler_map because objects 45394a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // created from API functions expect their internal fields to be initialized 45404a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // with undefined_value. 4541c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Pre-allocated fields need to be initialized with undefined_value as well 4542c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // so that object accesses before the constructor completes (e.g. in the 4543c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // debugger) will not cause a crash. 45444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org if (map->constructor()->IsJSFunction() && 45454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org JSFunction::cast(map->constructor())->shared()-> 45464a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org IsInobjectSlackTrackingInProgress()) { 45474a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // We might want to shrink the object later. 45484a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ASSERT(obj->GetInternalFieldCount() == 0); 45494a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org filler = Heap::one_pointer_filler_map(); 45504a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org } else { 45514a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org filler = Heap::undefined_value(); 45524a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org } 4553c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com obj->InitializeBody(map, Heap::undefined_value(), filler); 455443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 455543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 455643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4557594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgMaybeObject* Heap::AllocateJSObjectFromMap( 4558594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Map* map, PretenureFlag pretenure, bool allocate_properties) { 455943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // JSFunctions should be allocated using AllocateFunction to be 456043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // properly initialized. 456143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(map->instance_type() != JS_FUNCTION_TYPE); 456243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 456340b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org // Both types of global objects should be allocated using 456440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org // AllocateGlobalObject to be properly initialized. 45650b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); 45660b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); 45670b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 456843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the backing storage for the properties. 4569594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org FixedArray* properties; 4570594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (allocate_properties) { 4571594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int prop_size = map->InitialPropertiesLength(); 4572594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(prop_size >= 0); 4573594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure); 4574594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (!maybe_properties->To(&properties)) return maybe_properties; 4575594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 4576594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else { 4577594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org properties = empty_fixed_array(); 4578303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 457943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 458043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the JSObject. 45813d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org int size = map->instance_size(); 45823d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); 4583303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* obj; 45844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MaybeObject* maybe_obj = Allocate(map, space); 45854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_obj->To(&obj)) return maybe_obj; 45864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 45874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Initialize the JSObject. 4588594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org InitializeJSObjectFromMap(JSObject::cast(obj), properties, map); 45894e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org ASSERT(JSObject::cast(obj)->HasFastElements() || 45904e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org JSObject::cast(obj)->HasExternalArrayElements()); 45914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return obj; 45924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 45934a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 45944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4595594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgMaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite( 4596594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Map* map, Handle<AllocationSite> allocation_site) { 45974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // JSFunctions should be allocated using AllocateFunction to be 45984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // properly initialized. 45994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(map->instance_type() != JS_FUNCTION_TYPE); 46004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 46014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Both types of global objects should be allocated using 46024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // AllocateGlobalObject to be properly initialized. 46034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); 46044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); 46054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 46064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Allocate the backing storage for the properties. 460710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org int prop_size = map->InitialPropertiesLength(); 46084a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(prop_size >= 0); 4609594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org FixedArray* properties; 46104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org { MaybeObject* maybe_properties = AllocateFixedArray(prop_size); 4611594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (!maybe_properties->To(&properties)) return maybe_properties; 4612303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 461343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Allocate the JSObject. 46153d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org int size = map->instance_size(); 46163d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, NOT_TENURED); 46174a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* obj; 4618bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org MaybeObject* maybe_obj = 4619bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org AllocateWithAllocationSite(map, space, allocation_site); 46204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_obj->To(&obj)) return maybe_obj; 46214a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 462243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the JSObject. 4623594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org InitializeJSObjectFromMap(JSObject::cast(obj), properties, map); 4624fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org ASSERT(JSObject::cast(obj)->HasFastElements()); 462543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return obj; 462643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 462743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 462843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4629303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateJSObject(JSFunction* constructor, 4630303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org PretenureFlag pretenure) { 4631057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org ASSERT(constructor->has_initial_map()); 463243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the object based on the constructors initial map. 4633fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* result = AllocateJSObjectFromMap( 4634fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org constructor->initial_map(), pretenure); 4635303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org#ifdef DEBUG 46362abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org // Make sure result is NOT a global object if valid. 4637303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* non_failure; 4638303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject()); 4639303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org#endif 46402abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org return result; 46412abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org} 46422abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 46432abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org 46444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateJSObjectWithAllocationSite(JSFunction* constructor, 4645bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org Handle<AllocationSite> allocation_site) { 4646057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org ASSERT(constructor->has_initial_map()); 46474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Allocate the object based on the constructors initial map, or the payload 46484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // advice 46494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Map* initial_map = constructor->initial_map(); 46504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4651b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org ElementsKind to_kind = allocation_site->GetElementsKind(); 46524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org AllocationSiteMode mode = TRACK_ALLOCATION_SITE; 46534a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (to_kind != initial_map->elements_kind()) { 465457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org MaybeObject* maybe_new_map = initial_map->AsElementsKind(to_kind); 46554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_new_map->To(&initial_map)) return maybe_new_map; 46564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Possibly alter the mode, since we found an updated elements kind 46574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // in the type info cell. 4658bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org mode = AllocationSite::GetMode(to_kind); 46594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 46604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 46614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MaybeObject* result; 46624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (mode == TRACK_ALLOCATION_SITE) { 46634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org result = AllocateJSObjectFromMapWithAllocationSite(initial_map, 4664bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org allocation_site); 46654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } else { 46664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org result = AllocateJSObjectFromMap(initial_map, NOT_TENURED); 46674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 46684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#ifdef DEBUG 46694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Make sure result is NOT a global object if valid. 46704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* non_failure; 46714a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(!result->ToObject(&non_failure) || !non_failure->IsGlobalObject()); 46724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org#endif 46734a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 46744a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 46754a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 46764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 467781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgMaybeObject* Heap::AllocateJSModule(Context* context, ScopeInfo* scope_info) { 4678ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Allocate a fresh map. Modules do not have a prototype. 4679ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Map* map; 4680ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com MaybeObject* maybe_map = AllocateMap(JS_MODULE_TYPE, JSModule::kSize); 4681ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (!maybe_map->To(&map)) return maybe_map; 4682ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com // Allocate the object based on the map. 468381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org JSModule* module; 468481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org MaybeObject* maybe_module = AllocateJSObjectFromMap(map, TENURED); 468581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org if (!maybe_module->To(&module)) return maybe_module; 468681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org module->set_context(context); 468781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org module->set_scope_info(scope_info); 468881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org return module; 4689ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 4690ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 4691ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 4692fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgMaybeObject* Heap::AllocateJSArrayAndStorage( 4693fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 4694fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int length, 4695fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int capacity, 4696fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ArrayStorageAllocationMode mode, 4697fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure) { 4698fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* maybe_array = AllocateJSArray(elements_kind, pretenure); 4699fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org JSArray* array; 4700fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (!maybe_array->To(&array)) return maybe_array; 4701fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 47024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // TODO(mvstanton): this body of code is duplicate with AllocateJSArrayStorage 47034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // for performance reasons. 47044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(capacity >= length); 47054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4706fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (capacity == 0) { 4707fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org array->set_length(Smi::FromInt(0)); 4708fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org array->set_elements(empty_fixed_array()); 4709fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return array; 4710fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 4711fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 4712fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org FixedArrayBase* elms; 4713fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* maybe_elms = NULL; 4714fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org if (IsFastDoubleElementsKind(elements_kind)) { 4715fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { 4716fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org maybe_elms = AllocateUninitializedFixedDoubleArray(capacity); 4717fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } else { 4718fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); 4719fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org maybe_elms = AllocateFixedDoubleArrayWithHoles(capacity); 4720fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 4721fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } else { 4722830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org ASSERT(IsFastSmiOrObjectElementsKind(elements_kind)); 4723fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { 4724fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org maybe_elms = AllocateUninitializedFixedArray(capacity); 4725fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } else { 4726fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); 4727fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org maybe_elms = AllocateFixedArrayWithHoles(capacity); 4728fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 4729fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 4730fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (!maybe_elms->To(&elms)) return maybe_elms; 4731fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 4732fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org array->set_elements(elms); 4733fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org array->set_length(Smi::FromInt(length)); 4734fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return array; 4735fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 4736fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 4737fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 47384a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateJSArrayStorage( 47394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org JSArray* array, 47404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int length, 47414a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int capacity, 47424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ArrayStorageAllocationMode mode) { 47434a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(capacity >= length); 47444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 47454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (capacity == 0) { 47464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org array->set_length(Smi::FromInt(0)); 47474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org array->set_elements(empty_fixed_array()); 47484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return array; 47494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 47504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 47514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org FixedArrayBase* elms; 47524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org MaybeObject* maybe_elms = NULL; 47534a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ElementsKind elements_kind = array->GetElementsKind(); 47544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (IsFastDoubleElementsKind(elements_kind)) { 47554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { 47564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org maybe_elms = AllocateUninitializedFixedDoubleArray(capacity); 47574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } else { 47584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); 47594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org maybe_elms = AllocateFixedDoubleArrayWithHoles(capacity); 47604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 47614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } else { 47624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(IsFastSmiOrObjectElementsKind(elements_kind)); 47634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { 47644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org maybe_elms = AllocateUninitializedFixedArray(capacity); 47654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } else { 47664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); 47674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org maybe_elms = AllocateFixedArrayWithHoles(capacity); 47684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 47694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 47704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_elms->To(&elms)) return maybe_elms; 47714a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 47724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org array->set_elements(elms); 47734a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org array->set_length(Smi::FromInt(length)); 47744a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return array; 47754a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 47764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 47774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4778fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgMaybeObject* Heap::AllocateJSArrayWithElements( 4779fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org FixedArrayBase* elements, 4780fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 4781fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org int length, 4782fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure) { 4783fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* maybe_array = AllocateJSArray(elements_kind, pretenure); 4784fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org JSArray* array; 4785fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (!maybe_array->To(&array)) return maybe_array; 4786fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 4787fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org array->set_elements(elements); 4788fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org array->set_length(Smi::FromInt(length)); 4789830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org array->ValidateElements(); 4790fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return array; 4791fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 4792fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 4793fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 47947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgMaybeObject* Heap::AllocateJSProxy(Object* handler, Object* prototype) { 47957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Allocate map. 47967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // TODO(rossberg): Once we optimize proxies, think about a scheme to share 47977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // maps. Will probably depend on the identity of the handler object, too. 479840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org Map* map; 47997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MaybeObject* maybe_map_obj = AllocateMap(JS_PROXY_TYPE, JSProxy::kSize); 480040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; 48017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org map->set_prototype(prototype); 48027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 48037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Allocate the proxy object. 480434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org JSProxy* result; 48057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MaybeObject* maybe_result = Allocate(map, NEW_SPACE); 480634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (!maybe_result->To<JSProxy>(&result)) return maybe_result; 480734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org result->InitializeBody(map->instance_size(), Smi::FromInt(0)); 480834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org result->set_handler(handler); 480927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org result->set_hash(undefined_value(), SKIP_WRITE_BARRIER); 481034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org return result; 481134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org} 481234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 481334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 481434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgMaybeObject* Heap::AllocateJSFunctionProxy(Object* handler, 481534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Object* call_trap, 481634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Object* construct_trap, 481734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Object* prototype) { 481834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Allocate map. 481934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // TODO(rossberg): Once we optimize proxies, think about a scheme to share 482034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // maps. Will probably depend on the identity of the handler object, too. 482134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org Map* map; 482234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org MaybeObject* maybe_map_obj = 482334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org AllocateMap(JS_FUNCTION_PROXY_TYPE, JSFunctionProxy::kSize); 482434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; 482534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org map->set_prototype(prototype); 482634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 482734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Allocate the proxy object. 482834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org JSFunctionProxy* result; 482934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org MaybeObject* maybe_result = Allocate(map, NEW_SPACE); 483034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (!maybe_result->To<JSFunctionProxy>(&result)) return maybe_result; 483134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org result->InitializeBody(map->instance_size(), Smi::FromInt(0)); 483234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org result->set_handler(handler); 483327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org result->set_hash(undefined_value(), SKIP_WRITE_BARRIER); 483434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org result->set_call_trap(call_trap); 483534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org result->set_construct_trap(construct_trap); 48367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return result; 48377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 48387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 48397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 4840528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgMaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) { 48415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Never used to copy functions. If functions need to be copied we 48425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // have to be careful to clear the literals array. 4843394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT(!source->IsJSFunction()); 48445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 48455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Make the clone. 48465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Map* map = source->map(); 48475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int object_size = map->instance_size(); 48489bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org Object* clone; 48499bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 4850c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org ASSERT(site == NULL || AllocationSite::CanTrack(map->instance_type())); 4851528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 48524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org WriteBarrierMode wb_mode = UPDATE_WRITE_BARRIER; 48534a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 48544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // If we're forced to always allocate, we use the general allocation 48554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // functions which may leave us with an object in old space. 48564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (always_allocate()) { 48574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org { MaybeObject* maybe_clone = 48584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE); 48594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_clone->ToObject(&clone)) return maybe_clone; 48604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 48614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Address clone_address = HeapObject::cast(clone)->address(); 48624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org CopyBlock(clone_address, 48634a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org source->address(), 48644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org object_size); 48654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Update write barrier for all fields that lie beyond the header. 48664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org RecordWrites(clone_address, 48674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org JSObject::kHeaderSize, 48684a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org (object_size - JSObject::kHeaderSize) / kPointerSize); 48694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } else { 48704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org wb_mode = SKIP_WRITE_BARRIER; 48714a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4872528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org { int adjusted_object_size = site != NULL 4873528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ? object_size + AllocationMemento::kSize 4874528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org : object_size; 4875935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org MaybeObject* maybe_clone = 4876935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org AllocateRaw(adjusted_object_size, NEW_SPACE, NEW_SPACE); 48774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe_clone->ToObject(&clone)) return maybe_clone; 48784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } 48794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org SLOW_ASSERT(InNewSpace(clone)); 48804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Since we know the clone is allocated in new space, we can copy 48814a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // the contents without worrying about updating the write barrier. 48824a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org CopyBlock(HeapObject::cast(clone)->address(), 48834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org source->address(), 48844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org object_size); 48854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 4886528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (site != NULL) { 4887528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( 4888528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org reinterpret_cast<Address>(clone) + object_size); 4889c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org InitializeAllocationMemento(alloc_memento, site); 4890303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 489146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org } 489246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 4893394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT( 4894394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JSObject::cast(clone)->GetElementsKind() == source->GetElementsKind()); 48952c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org FixedArrayBase* elements = FixedArrayBase::cast(source->elements()); 48965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org FixedArray* properties = FixedArray::cast(source->properties()); 48975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Update elements if necessary. 4898b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org if (elements->length() > 0) { 4899303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* elem; 49002c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org { MaybeObject* maybe_elem; 49012c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org if (elements->map() == fixed_cow_array_map()) { 49022c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org maybe_elem = FixedArray::cast(elements); 49032c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org } else if (source->HasFastDoubleElements()) { 49042c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org maybe_elem = CopyFixedDoubleArray(FixedDoubleArray::cast(elements)); 49052c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org } else { 49062c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org maybe_elem = CopyFixedArray(FixedArray::cast(elements)); 49072c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org } 4908303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_elem->ToObject(&elem)) return maybe_elem; 4909303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 4910394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JSObject::cast(clone)->set_elements(FixedArrayBase::cast(elem), wb_mode); 49115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 49125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Update properties if necessary. 49135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org if (properties->length() > 0) { 4914303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* prop; 4915303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_prop = CopyFixedArray(properties); 4916303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_prop->ToObject(&prop)) return maybe_prop; 4917303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 4918394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com JSObject::cast(clone)->set_properties(FixedArray::cast(prop), wb_mode); 49195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 49205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Return the new clone. 49215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return clone; 49225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 49235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 49245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 492534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgMaybeObject* Heap::ReinitializeJSReceiver( 492634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org JSReceiver* object, InstanceType type, int size) { 4927c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(type >= FIRST_JS_OBJECT_TYPE); 492834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 4929717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // Allocate fresh map. 4930717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // TODO(rossberg): Once we optimize proxies, cache these maps. 4931717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org Map* map; 4932c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MaybeObject* maybe = AllocateMap(type, size); 4933c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe->To<Map>(&map)) return maybe; 4934717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 493534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Check that the receiver has at least the size of the fresh object. 493634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org int size_difference = object->map()->instance_size() - map->instance_size(); 493734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org ASSERT(size_difference >= 0); 4938717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4939717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org map->set_prototype(object->map()->prototype()); 4940717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4941717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // Allocate the backing storage for the properties. 4942717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org int prop_size = map->unused_property_fields() - map->inobject_properties(); 4943717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org Object* properties; 4944c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe = AllocateFixedArray(prop_size, TENURED); 4945c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe->ToObject(&properties)) return maybe; 4946c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4947c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Functions require some allocation, which might fail here. 4948c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SharedFunctionInfo* shared = NULL; 4949c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (type == JS_FUNCTION_TYPE) { 4950c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com String* name; 49514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org maybe = 49524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org InternalizeOneByteString(STATIC_ASCII_VECTOR("<freezing call trap>")); 4953c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe->To<String>(&name)) return maybe; 4954c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe = AllocateSharedFunctionInfo(name); 4955c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe; 4956717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org } 4957717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4958c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Because of possible retries of this function after failure, 4959c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // we must NOT fail after this point, where we have changed the type! 4960c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4961717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // Reset the map for the object. 4962717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org object->set_map(map); 4963c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JSObject* jsobj = JSObject::cast(object); 4964717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4965717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org // Reinitialize the object from the constructor map. 4966c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com InitializeJSObjectFromMap(jsobj, FixedArray::cast(properties), map); 496734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 496834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Functions require some minimal initialization. 496934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (type == JS_FUNCTION_TYPE) { 4970c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map->set_function_with_prototype(true); 4971c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com InitializeFunction(JSFunction::cast(object), shared, the_hole_value()); 4972c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com JSFunction::cast(object)->set_context( 497346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org isolate()->context()->native_context()); 497434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org } 497534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 497634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org // Put in filler if the new object is smaller than the old. 497734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (size_difference > 0) { 497834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org CreateFillerObjectAt( 497934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org object->address() + map->instance_size(), size_difference); 498034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org } 498134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 4982717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org return object; 4983717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org} 4984717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4985717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4986303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, 4987303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org JSGlobalProxy* object) { 49884a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ASSERT(constructor->has_initial_map()); 498943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Map* map = constructor->initial_map(); 499043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49914a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org // Check that the already allocated object has the same size and type as 499243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // objects allocated using the constructor. 499343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(map->instance_size() == object->map()->instance_size()); 49944a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ASSERT(map->instance_type() == object->map()->instance_type()); 499543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 499643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate the backing storage for the properties. 49977c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org int prop_size = map->unused_property_fields() - map->inobject_properties(); 4998303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* properties; 4999303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, TENURED); 5000303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_properties->ToObject(&properties)) return maybe_properties; 5001303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 500243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 500343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Reset the map for the object. 500443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object->set_map(constructor->initial_map()); 500543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 500643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Reinitialize the object from the constructor map. 500743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen InitializeJSObjectFromMap(object, FixedArray::cast(properties), map); 500843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return object; 500943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 501043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 501143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 501259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgMaybeObject* Heap::AllocateStringFromOneByte(Vector<const uint8_t> string, 5013c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org PretenureFlag pretenure) { 501456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org int length = string.length(); 501556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (length == 1) { 501655ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org return Heap::LookupSingleCharacterStringFromCode(string[0]); 501755ee80713569ab0324fc8dcedcb5518501daa6a6ricow@chromium.org } 5018303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5019303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = 50208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org AllocateRawOneByteString(string.length(), pretenure); 5021303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5022303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 502343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 502443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Copy the characters into the new object. 502559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org CopyChars(SeqOneByteString::cast(result)->GetChars(), 502659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org string.start(), 502759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org length); 502843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 502943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 503043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 503143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgMaybeObject* Heap::AllocateStringFromUtf8Slow(Vector<const char> string, 503389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org int non_ascii_start, 50349e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org PretenureFlag pretenure) { 503589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org // Continue counting the number of characters in the UTF-8 string, starting 503689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org // from the first non-ascii character or word. 5037a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org Access<UnicodeCache::Utf8Decoder> 5038a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org decoder(isolate_->unicode_cache()->utf8_decoder()); 5039a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org decoder->Reset(string.start() + non_ascii_start, 5040a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org string.length() - non_ascii_start); 5041a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int utf16_length = decoder->Utf16Length(); 5042a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org ASSERT(utf16_length > 0); 5043a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Allocate string. 5044303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5045a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org { 5046a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int chars = non_ascii_start + utf16_length; 5047a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org MaybeObject* maybe_result = AllocateRawTwoByteString(chars, pretenure); 5048303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5049303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 505043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Convert and copy the characters into the new object. 505156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org SeqTwoByteString* twobyte = SeqTwoByteString::cast(result); 5052a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Copy ascii portion. 5053a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org uint16_t* data = twobyte->GetChars(); 5054a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (non_ascii_start != 0) { 5055a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org const char* ascii_data = string.start(); 5056a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org for (int i = 0; i < non_ascii_start; i++) { 5057a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org *data++ = *ascii_data++; 5058154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org } 505943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5060a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Now write the remainder. 5061a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org decoder->WriteUtf16(data, utf16_length); 506243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 506343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 506443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 506543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5066303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateStringFromTwoByte(Vector<const uc16> string, 5067303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org PretenureFlag pretenure) { 506843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check if the string is an ASCII string. 5069303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 507056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org int length = string.length(); 507156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org const uc16* start = string.start(); 507243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 507359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (String::IsOneByte(start, length)) { 50748e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org MaybeObject* maybe_result = AllocateRawOneByteString(length, pretenure); 507556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5076fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org CopyChars(SeqOneByteString::cast(result)->GetChars(), start, length); 507759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } else { // It's not a one byte string. 507856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org MaybeObject* maybe_result = AllocateRawTwoByteString(length, pretenure); 507956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 508056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org CopyChars(SeqTwoByteString::cast(result)->GetChars(), start, length); 508143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 508243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 508343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 508443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 508543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMap* Heap::InternalizedStringMapForString(String* string) { 50874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // If the string is in new space it cannot be used as internalized. 508843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (InNewSpace(string)) return NULL; 508943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50904a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Find the corresponding internalized string map for strings. 50911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org switch (string->map()->instance_type()) { 50924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case STRING_TYPE: return internalized_string_map(); 50934a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case ASCII_STRING_TYPE: return ascii_internalized_string_map(); 50944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case CONS_STRING_TYPE: return cons_internalized_string_map(); 50954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case CONS_ASCII_STRING_TYPE: return cons_ascii_internalized_string_map(); 50964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case EXTERNAL_STRING_TYPE: return external_internalized_string_map(); 50974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case EXTERNAL_ASCII_STRING_TYPE: 50984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return external_ascii_internalized_string_map(); 5099ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org case EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: 5100ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org return external_internalized_string_with_one_byte_data_map(); 51014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org case SHORT_EXTERNAL_STRING_TYPE: 51024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return short_external_internalized_string_map(); 51031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org case SHORT_EXTERNAL_ASCII_STRING_TYPE: 51044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return short_external_ascii_internalized_string_map(); 5105ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: 5106ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org return short_external_internalized_string_with_one_byte_data_map(); 51071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org default: return NULL; // No match found. 5108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 510943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 511043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 511143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 511246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgstatic inline void WriteOneByteData(Vector<const char> vector, 511346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org uint8_t* chars, 511446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int len) { 511546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org // Only works for ascii. 511646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(vector.length() == len); 5117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemCopy(chars, vector.start(), len); 511846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 511946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 512046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgstatic inline void WriteTwoByteData(Vector<const char> vector, 512146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org uint16_t* chars, 512246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int len) { 512346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org const uint8_t* stream = reinterpret_cast<const uint8_t*>(vector.start()); 512446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org unsigned stream_length = vector.length(); 512546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org while (stream_length != 0) { 512646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org unsigned consumed = 0; 512746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org uint32_t c = unibrow::Utf8::ValueOf(stream, stream_length, &consumed); 512846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(c != unibrow::Utf8::kBadChar); 512946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(consumed <= stream_length); 513046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org stream_length -= consumed; 513146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org stream += consumed; 513246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) { 513346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org len -= 2; 513446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org if (len < 0) break; 513546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org *chars++ = unibrow::Utf16::LeadSurrogate(c); 513646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org *chars++ = unibrow::Utf16::TrailSurrogate(c); 513746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org } else { 513846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org len -= 1; 513946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org if (len < 0) break; 514046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org *chars++ = c; 51410c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 514243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 514346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(stream_length == 0); 514446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(len == 0); 514546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 514643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5147a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 514846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgstatic inline void WriteOneByteData(String* s, uint8_t* chars, int len) { 514946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(s->length() == len); 515046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org String::WriteToFlat(s, chars, 0, len); 515146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 5152a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 5153e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 515446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgstatic inline void WriteTwoByteData(String* s, uint16_t* chars, int len) { 515546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org ASSERT(s->length() == len); 515646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org String::WriteToFlat(s, chars, 0, len); 515746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 5158a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 5159a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 5160a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgtemplate<bool is_one_byte, typename T> 51614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateInternalizedStringImpl( 51624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org T t, int chars, uint32_t hash_field) { 5163a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org ASSERT(chars >= 0); 516443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Compute map and object size. 516543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int size; 516643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Map* map; 516743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5168a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (is_one_byte) { 5169fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org if (chars > SeqOneByteString::kMaxLength) { 517059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0x9); 51710c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 51724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org map = ascii_internalized_string_map(); 5173fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org size = SeqOneByteString::SizeFor(chars); 517443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 51750c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (chars > SeqTwoByteString::kMaxLength) { 517659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0xa); 51770c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 51784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org map = internalized_string_map(); 51797c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org size = SeqTwoByteString::SizeFor(chars); 518043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 51813d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, TENURED); 518243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 518343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Allocate string. 5184303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 51853d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 5186303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5187303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 518843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 518964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<HeapObject*>(result)->set_map_no_write_barrier(map); 5190ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // Set length and hash fields of the allocated string. 5191870a0b67c822d289024711912e2512af01b66c3bager@chromium.org String* answer = String::cast(result); 5192ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org answer->set_length(chars); 5193ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org answer->set_hash_field(hash_field); 519443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5195870a0b67c822d289024711912e2512af01b66c3bager@chromium.org ASSERT_EQ(size, answer->Size()); 519643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5197a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (is_one_byte) { 519846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org WriteOneByteData(t, SeqOneByteString::cast(answer)->GetChars(), chars); 5199a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } else { 520046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org WriteTwoByteData(t, SeqTwoByteString::cast(answer)->GetChars(), chars); 520143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5202870a0b67c822d289024711912e2512af01b66c3bager@chromium.org return answer; 520343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 520443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 520543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5206a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org// Need explicit instantiations. 5207a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgtemplate 52084a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateInternalizedStringImpl<true>(String*, int, uint32_t); 5209a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgtemplate 52104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateInternalizedStringImpl<false>( 52114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org String*, int, uint32_t); 5212a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgtemplate 52134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::AllocateInternalizedStringImpl<false>( 52144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Vector<const char>, int, uint32_t); 5215a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 5216a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 52178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgMaybeObject* Heap::AllocateRawOneByteString(int length, 52188e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org PretenureFlag pretenure) { 5219fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org if (length < 0 || length > SeqOneByteString::kMaxLength) { 522059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0xb); 52210c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 5222fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org int size = SeqOneByteString::SizeFor(length); 5223fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org ASSERT(size <= SeqOneByteString::kMaxSize); 52243d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 5225c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org 5226303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 52273d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 5228303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5229303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 523043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 523143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Partially initialize the object. 523264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(ascii_string_map()); 523343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen String::cast(result)->set_length(length); 5234ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org String::cast(result)->set_hash_field(String::kEmptyHashField); 523543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_EQ(size, HeapObject::cast(result)->Size()); 523615613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org 523743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 523843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 523943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 524043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5241303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateRawTwoByteString(int length, 5242303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org PretenureFlag pretenure) { 52430c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (length < 0 || length > SeqTwoByteString::kMaxLength) { 524459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0xc); 52450c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 52467c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org int size = SeqTwoByteString::SizeFor(length); 52470c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org ASSERT(size <= SeqTwoByteString::kMaxSize); 52483d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 5249c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org 5250303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 52513d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 5252303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5253303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 525443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 525543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Partially initialize the object. 525664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(string_map()); 525743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen String::cast(result)->set_length(length); 5258ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org String::cast(result)->set_hash_field(String::kEmptyHashField); 525943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_EQ(size, HeapObject::cast(result)->Size()); 526043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 526143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 526243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 526343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5264fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgMaybeObject* Heap::AllocateJSArray( 5265fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org ElementsKind elements_kind, 5266fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure) { 526746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Context* native_context = isolate()->context()->native_context(); 526846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org JSFunction* array_function = native_context->array_function(); 5269fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Map* map = array_function->initial_map(); 5270906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Map* transition_map = isolate()->get_initial_js_array_map(elements_kind); 5271906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (transition_map != NULL) map = transition_map; 5272fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return AllocateJSObjectFromMap(map, pretenure); 5273fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 5274fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5275fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5276303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateEmptyFixedArray() { 527743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int size = FixedArray::SizeFor(0); 5278303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5279303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = 5280303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); 5281303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5282303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 528343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the object. 528464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<FixedArray*>(result)->set_map_no_write_barrier( 528564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org fixed_array_map()); 528630ce411529579186181838984710b0b0980857aaricow@chromium.org reinterpret_cast<FixedArray*>(result)->set_length(0); 528743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 528843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 528943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5290e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 52914e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgMaybeObject* Heap::AllocateEmptyExternalArray(ExternalArrayType array_type) { 52924e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return AllocateExternalArray(0, array_type, NULL, TENURED); 52934e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 52944e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 529543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5296303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { 52975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org int len = src->length(); 5298303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* obj; 5299cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org { MaybeObject* maybe_obj = AllocateRawFixedArray(len, NOT_TENURED); 5300303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return maybe_obj; 5301303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 5302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (InNewSpace(obj)) { 53035a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org HeapObject* dst = HeapObject::cast(obj); 530464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org dst->set_map_no_write_barrier(map); 53054a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org CopyBlock(dst->address() + kPointerSize, 53064a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org src->address() + kPointerSize, 53074a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org FixedArray::SizeFor(len) - kPointerSize); 53085a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return obj; 53095a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 531064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org HeapObject::cast(obj)->set_map_no_write_barrier(map); 53115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org FixedArray* result = FixedArray::cast(obj); 53125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org result->set_length(len); 5313b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 53145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org // Copy the content 531579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_gc; 5316b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); 53175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org for (int i = 0; i < len; i++) result->set(i, src->get(i), mode); 53185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return result; 53195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 53205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 53215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 53222c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.orgMaybeObject* Heap::CopyFixedDoubleArrayWithMap(FixedDoubleArray* src, 53232c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org Map* map) { 53242c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org int len = src->length(); 53252c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org Object* obj; 53262c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(len, NOT_TENURED); 53272c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org if (!maybe_obj->ToObject(&obj)) return maybe_obj; 53282c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org } 53292c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org HeapObject* dst = HeapObject::cast(obj); 533064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org dst->set_map_no_write_barrier(map); 53312c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org CopyBlock( 53322c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org dst->address() + FixedDoubleArray::kLengthOffset, 53332c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org src->address() + FixedDoubleArray::kLengthOffset, 53342c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org FixedDoubleArray::SizeFor(len) - FixedDoubleArray::kLengthOffset); 53352c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org return obj; 53362c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org} 53372c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 53382c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org 5339a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgMaybeObject* Heap::CopyConstantPoolArrayWithMap(ConstantPoolArray* src, 5340a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Map* map) { 5341a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int int64_entries = src->count_of_int64_entries(); 5342a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int ptr_entries = src->count_of_ptr_entries(); 5343a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int int32_entries = src->count_of_int32_entries(); 5344a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Object* obj; 5345a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org { MaybeObject* maybe_obj = 5346a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org AllocateConstantPoolArray(int64_entries, ptr_entries, int32_entries); 5347a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org if (!maybe_obj->ToObject(&obj)) return maybe_obj; 5348a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 5349a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org HeapObject* dst = HeapObject::cast(obj); 5350a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org dst->set_map_no_write_barrier(map); 5351a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CopyBlock( 5352a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org dst->address() + ConstantPoolArray::kLengthOffset, 5353a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org src->address() + ConstantPoolArray::kLengthOffset, 5354a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ConstantPoolArray::SizeFor(int64_entries, ptr_entries, int32_entries) 5355a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org - ConstantPoolArray::kLengthOffset); 5356a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org return obj; 5357a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} 5358a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 5359a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 5360303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) { 53610c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (length < 0 || length > FixedArray::kMaxLength) { 536259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0xe); 53630c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 5364c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org int size = FixedArray::SizeFor(length); 53653d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); 53660c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 53673d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org return AllocateRaw(size, space, OLD_POINTER_SPACE); 5368c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org} 5369c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5370c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5371cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgMaybeObject* Heap::AllocateFixedArrayWithFiller(int length, 5372cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org PretenureFlag pretenure, 5373cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org Object* filler) { 5374c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org ASSERT(length >= 0); 5375cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org ASSERT(empty_fixed_array()->IsFixedArray()); 5376cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org if (length == 0) return empty_fixed_array(); 5377c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5378cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org ASSERT(!InNewSpace(filler)); 5379303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5380cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org { MaybeObject* maybe_result = AllocateRawFixedArray(length, pretenure); 5381303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5382303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 53830c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 5384cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(fixed_array_map()); 538543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FixedArray* array = FixedArray::cast(result); 538643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen array->set_length(length); 5387c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org MemsetPointer(array->data_start(), filler, length); 538843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return array; 538943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 539043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 539143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5392303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { 5393cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return AllocateFixedArrayWithFiller(length, pretenure, undefined_value()); 5394c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org} 5395c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5396c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5397303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateFixedArrayWithHoles(int length, 5398303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org PretenureFlag pretenure) { 5399cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org return AllocateFixedArrayWithFiller(length, pretenure, the_hole_value()); 5400c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org} 5401c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5402c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 5403303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateUninitializedFixedArray(int length) { 5404ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (length == 0) return empty_fixed_array(); 5405ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 5406303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* obj; 5407cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org { MaybeObject* maybe_obj = AllocateRawFixedArray(length, NOT_TENURED); 5408303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_obj->ToObject(&obj)) return maybe_obj; 5409303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 5410ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 541164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<FixedArray*>(obj)->set_map_no_write_barrier( 541264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org fixed_array_map()); 5413ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org FixedArray::cast(obj)->set_length(length); 5414ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return obj; 5415ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org} 5416ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 5417ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 54186d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgMaybeObject* Heap::AllocateEmptyFixedDoubleArray() { 54196d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int size = FixedDoubleArray::SizeFor(0); 54206d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org Object* result; 54216d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org { MaybeObject* maybe_result = 54226d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); 54236d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 54246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 54256d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // Initialize the object. 542664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<FixedDoubleArray*>(result)->set_map_no_write_barrier( 54276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org fixed_double_array_map()); 54286d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org reinterpret_cast<FixedDoubleArray*>(result)->set_length(0); 54296d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return result; 54306d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 54316d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 54326d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 54336d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgMaybeObject* Heap::AllocateUninitializedFixedDoubleArray( 54346d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int length, 54356d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org PretenureFlag pretenure) { 543665a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org if (length == 0) return empty_fixed_array(); 54376d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 5438fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Object* elements_object; 5439fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure); 5440fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (!maybe_obj->ToObject(&elements_object)) return maybe_obj; 5441fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org FixedDoubleArray* elements = 5442fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org reinterpret_cast<FixedDoubleArray*>(elements_object); 5443fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5444fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org elements->set_map_no_write_barrier(fixed_double_array_map()); 5445fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org elements->set_length(length); 5446fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return elements; 5447fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 5448fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5449fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5450fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgMaybeObject* Heap::AllocateFixedDoubleArrayWithHoles( 5451fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int length, 5452fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org PretenureFlag pretenure) { 545365a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org if (length == 0) return empty_fixed_array(); 5454fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5455fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org Object* elements_object; 5456fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure); 5457fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (!maybe_obj->ToObject(&elements_object)) return maybe_obj; 5458fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org FixedDoubleArray* elements = 5459fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org reinterpret_cast<FixedDoubleArray*>(elements_object); 5460fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 5461fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org for (int i = 0; i < length; ++i) { 5462fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org elements->set_the_hole(i); 54636d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 54646d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 5465fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org elements->set_map_no_write_barrier(fixed_double_array_map()); 5466fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org elements->set_length(length); 5467fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org return elements; 54686d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 54696d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 54706d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 54716d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgMaybeObject* Heap::AllocateRawFixedDoubleArray(int length, 54726d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org PretenureFlag pretenure) { 54736d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (length < 0 || length > FixedDoubleArray::kMaxLength) { 547459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return Failure::OutOfMemoryException(0xf); 54756d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 54766d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int size = FixedDoubleArray::SizeFor(length); 5477ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#ifndef V8_HOST_ARCH_64_BIT 5478ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com size += kPointerSize; 5479ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#endif 54803d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 54816d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 5482ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com HeapObject* object; 54833d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org { MaybeObject* maybe_object = AllocateRaw(size, space, OLD_DATA_SPACE); 5484ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (!maybe_object->To<HeapObject>(&object)) return maybe_object; 5485ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 5486ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 5487ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return EnsureDoubleAligned(this, object, size); 54886d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 54896d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 54906d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 5491a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgMaybeObject* Heap::AllocateConstantPoolArray(int number_of_int64_entries, 5492a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int number_of_ptr_entries, 5493a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int number_of_int32_entries) { 5494a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ASSERT(number_of_int64_entries > 0 || number_of_ptr_entries > 0 || 5495a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org number_of_int32_entries > 0); 5496a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int size = ConstantPoolArray::SizeFor(number_of_int64_entries, 5497a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org number_of_ptr_entries, 5498a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org number_of_int32_entries); 5499a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org#ifndef V8_HOST_ARCH_64_BIT 5500a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org size += kPointerSize; 5501a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org#endif 5502c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); 5503a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 5504a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org HeapObject* object; 5505c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org { MaybeObject* maybe_object = AllocateRaw(size, space, OLD_POINTER_SPACE); 5506a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org if (!maybe_object->To<HeapObject>(&object)) return maybe_object; 5507a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 5508a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org object = EnsureDoubleAligned(this, object, size); 5509a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org HeapObject::cast(object)->set_map_no_write_barrier(constant_pool_array_map()); 5510a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 5511a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ConstantPoolArray* constant_pool = 5512a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org reinterpret_cast<ConstantPoolArray*>(object); 5513a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org constant_pool->SetEntryCounts(number_of_int64_entries, 5514a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org number_of_ptr_entries, 5515a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org number_of_int32_entries); 5516a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org MemsetPointer( 5517a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org HeapObject::RawField( 5518a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org constant_pool, 5519a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org constant_pool->OffsetOfElementAt(constant_pool->first_ptr_index())), 5520a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org undefined_value(), 5521a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org number_of_ptr_entries); 5522a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org return constant_pool; 5523a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org} 5524a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 5525a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 5526303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateHashTable(int length, PretenureFlag pretenure) { 5527303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5528ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_result = AllocateFixedArray(length, pretenure); 5529303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5530303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 553164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org reinterpret_cast<HeapObject*>(result)->set_map_no_write_barrier( 553264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org hash_table_map()); 553386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org ASSERT(result->IsHashTable()); 553443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 553543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 553643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 553743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5538f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgMaybeObject* Heap::AllocateSymbol() { 55394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Statically ensure that it is safe to allocate symbols in paged spaces. 55404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org STATIC_ASSERT(Symbol::kSize <= Page::kNonCodeObjectAreaSize); 55414a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result; 5543f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org MaybeObject* maybe = 5544f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org AllocateRaw(Symbol::kSize, OLD_POINTER_SPACE, OLD_POINTER_SPACE); 55454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (!maybe->ToObject(&result)) return maybe; 55464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org HeapObject::cast(result)->set_map_no_write_barrier(symbol_map()); 55484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Generate a random hash value. 55504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int hash; 55514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org int attempts = 0; 55524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org do { 5553c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org hash = isolate()->random_number_generator()->NextInt() & Name::kHashBitMask; 55544a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org attempts++; 55554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org } while (hash == 0 && attempts < 30); 55564a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (hash == 0) hash = 1; // never return 0 55574a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Symbol::cast(result)->set_hash_field( 55594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Name::kIsNotArrayIndexMask | (hash << Name::kHashShift)); 5560f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org Symbol::cast(result)->set_name(undefined_value()); 55610cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Symbol::cast(result)->set_flags(Smi::FromInt(0)); 55624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55630cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org ASSERT(!Symbol::cast(result)->is_private()); 55644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 55654a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 55664a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55674a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 55680cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgMaybeObject* Heap::AllocatePrivateSymbol() { 55690cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org MaybeObject* maybe = AllocateSymbol(); 55700cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Symbol* symbol; 55710cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org if (!maybe->To(&symbol)) return maybe; 55720cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org symbol->set_is_private(true); 55730cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return symbol; 55740cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 55750cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 55760cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 557746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgMaybeObject* Heap::AllocateNativeContext() { 5578303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5579303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_result = 558046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org AllocateFixedArray(Context::NATIVE_CONTEXT_SLOTS); 5581303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5582303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 558343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Context* context = reinterpret_cast<Context*>(result); 558446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_map_no_write_barrier(native_context_map()); 5585830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org context->set_js_array_maps(undefined_value()); 558646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(context->IsNativeContext()); 558743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(result->IsContext()); 558843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 558943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 559043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 559143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 559246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgMaybeObject* Heap::AllocateGlobalContext(JSFunction* function, 559346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ScopeInfo* scope_info) { 559446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Object* result; 559546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org { MaybeObject* maybe_result = 559646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org AllocateFixedArray(scope_info->ContextLength(), TENURED); 559746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 559846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 559946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Context* context = reinterpret_cast<Context*>(result); 560046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_map_no_write_barrier(global_context_map()); 560146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_closure(function); 5602355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org context->set_previous(function->context()); 560346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_extension(scope_info); 5604355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org context->set_global_object(function->context()->global_object()); 560546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(context->IsGlobalContext()); 560646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org ASSERT(result->IsContext()); 560746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return context; 560846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org} 560946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 561046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 561181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgMaybeObject* Heap::AllocateModuleContext(ScopeInfo* scope_info) { 5612ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Object* result; 5613ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com { MaybeObject* maybe_result = 561481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org AllocateFixedArray(scope_info->ContextLength(), TENURED); 5615ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com if (!maybe_result->ToObject(&result)) return maybe_result; 5616ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 5617ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Context* context = reinterpret_cast<Context*>(result); 5618ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com context->set_map_no_write_barrier(module_context_map()); 56198e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // Instance link will be set later. 562081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org context->set_extension(Smi::FromInt(0)); 5621ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com return context; 5622ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com} 5623ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 5624ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 5625303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateFunctionContext(int length, JSFunction* function) { 562643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(length >= Context::MIN_CONTEXT_SLOTS); 5627303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5628ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_result = AllocateFixedArray(length); 5629303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5630303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 563143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Context* context = reinterpret_cast<Context*>(result); 563264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org context->set_map_no_write_barrier(function_context_map()); 563343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen context->set_closure(function); 56346d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org context->set_previous(function->context()); 563581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org context->set_extension(Smi::FromInt(0)); 563646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_global_object(function->context()->global_object()); 56376d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return context; 56386d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org} 56396d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 56406d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 56413cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orgMaybeObject* Heap::AllocateCatchContext(JSFunction* function, 56423cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org Context* previous, 56436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org String* name, 56446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org Object* thrown_object) { 56456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS == Context::THROWN_OBJECT_INDEX); 56466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org Object* result; 56476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org { MaybeObject* maybe_result = 56486d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org AllocateFixedArray(Context::MIN_CONTEXT_SLOTS + 1); 56496d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 56506d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 56516d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org Context* context = reinterpret_cast<Context*>(result); 565264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org context->set_map_no_write_barrier(catch_context_map()); 56533cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org context->set_closure(function); 56546d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org context->set_previous(previous); 56556d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org context->set_extension(name); 565646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_global_object(previous->global_object()); 56576d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org context->set(Context::THROWN_OBJECT_INDEX, thrown_object); 56586d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return context; 565943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 566043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 566143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56623cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.orgMaybeObject* Heap::AllocateWithContext(JSFunction* function, 56633cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org Context* previous, 5664ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org JSReceiver* extension) { 5665303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5666ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_result = AllocateFixedArray(Context::MIN_CONTEXT_SLOTS); 5667303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5668303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 566943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Context* context = reinterpret_cast<Context*>(result); 567064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org context->set_map_no_write_barrier(with_context_map()); 56713cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org context->set_closure(function); 567243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen context->set_previous(previous); 567343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen context->set_extension(extension); 567446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_global_object(previous->global_object()); 56756d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org return context; 567643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 567743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 567843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56794acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgMaybeObject* Heap::AllocateBlockContext(JSFunction* function, 56804acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org Context* previous, 5681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ScopeInfo* scope_info) { 56824acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org Object* result; 56834acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org { MaybeObject* maybe_result = 5684c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org AllocateFixedArrayWithHoles(scope_info->ContextLength()); 56854acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 56864acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org } 56874acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org Context* context = reinterpret_cast<Context*>(result); 568864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org context->set_map_no_write_barrier(block_context_map()); 56894acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org context->set_closure(function); 56904acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org context->set_previous(previous); 56914acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org context->set_extension(scope_info); 569246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org context->set_global_object(previous->global_object()); 56934acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org return context; 56944acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org} 56954acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 56964acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 5697c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgMaybeObject* Heap::AllocateScopeInfo(int length) { 5698c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org FixedArray* scope_info; 5699c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org MaybeObject* maybe_scope_info = AllocateFixedArray(length, TENURED); 5700c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (!maybe_scope_info->To(&scope_info)) return maybe_scope_info; 570164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org scope_info->set_map_no_write_barrier(scope_info_map()); 57024acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org return scope_info; 57034acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org} 57044acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 57054acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 5706eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgMaybeObject* Heap::AllocateExternal(void* value) { 5707eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org Foreign* foreign; 5708eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org { MaybeObject* maybe_result = AllocateForeign(static_cast<Address>(value)); 5709eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!maybe_result->To(&foreign)) return maybe_result; 5710eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 5711eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org JSObject* external; 5712eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org { MaybeObject* maybe_result = AllocateJSObjectFromMap(external_map()); 5713eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!maybe_result->To(&external)) return maybe_result; 5714eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 5715eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org external->SetInternalField(0, foreign); 5716eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return external; 5717eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 5718eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 5719eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 5720303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.orgMaybeObject* Heap::AllocateStruct(InstanceType type) { 572143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Map* map; 572243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (type) { 5723ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define MAKE_CASE(NAME, Name, name) \ 5724ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case NAME##_TYPE: map = name##_map(); break; 572543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenSTRUCT_LIST(MAKE_CASE) 572643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MAKE_CASE 572743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 572843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 572943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Failure::InternalError(); 573043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 573143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int size = map->instance_size(); 57323d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); 5733303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* result; 5734ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { MaybeObject* maybe_result = Allocate(map, space); 5735303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_result->ToObject(&result)) return maybe_result; 5736303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 573743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Struct::cast(result)->InitializeBody(size); 573843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 573943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 574043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 574143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5742c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Heap::IsHeapIterable() { 5743c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return (!old_pointer_space()->was_swept_conservatively() && 5744c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com !old_data_space()->was_swept_conservatively()); 5745c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 5746c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 5747c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 5748c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::EnsureHeapIsIterable() { 574979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org ASSERT(AllowHeapAllocation::IsAllowed()); 5750c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!IsHeapIterable()) { 5751994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CollectAllGarbage(kMakeHeapIterableMask, "Heap::EnsureHeapIsIterable"); 5752c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 5753c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(IsHeapIterable()); 5754c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 5755c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 5756c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 57576ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.orgvoid Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) { 57587d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org incremental_marking()->Step(step_size, 57597d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org IncrementalMarking::NO_GC_VIA_STACK_GUARD); 57606ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 57616ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org if (incremental_marking()->IsComplete()) { 57626ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org bool uncommit = false; 57636ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org if (gc_count_at_last_idle_gc_ == gc_count_) { 57646ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org // No GC since the last full GC, the mutator is probably not active. 57656ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org isolate_->compilation_cache()->Clear(); 57666ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org uncommit = true; 57676ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 57686ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); 5769b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org mark_sweeps_since_idle_round_started_++; 57706ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org gc_count_at_last_idle_gc_ = gc_count_; 57716ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org if (uncommit) { 57726ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org new_space_.Shrink(); 57736ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org UncommitFromSpace(); 57746ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 57756ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 57766ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org} 57776ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 57786ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 5779ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.orgbool Heap::IdleNotification(int hint) { 5780de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // Hints greater than this value indicate that 5781de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // the embedder is requesting a lot of GC work. 578288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org const int kMaxHint = 1000; 5783b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org const int kMinHintForIncrementalMarking = 10; 5784de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // Minimal hint that allows to do full GC. 5785de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org const int kMinHintForFullGC = 100; 57862c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org intptr_t size_factor = Min(Max(hint, 20), kMaxHint) / 4; 57872c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org // The size factor is in range [5..250]. The numbers here are chosen from 57882c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org // experiments. If you changes them, make sure to test with 57892c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org // chrome/performance_ui_tests --gtest_filter="GeneralMixMemoryTest.* 579033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org intptr_t step_size = 579133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org size_factor * IncrementalMarking::kAllocatedThreshold; 57926ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 57936ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org if (contexts_disposed_ > 0) { 5794e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org contexts_disposed_ = 0; 57956ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org int mark_sweep_time = Min(TimeMarkSweepWouldTakeInMs(), 1000); 579683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (hint >= mark_sweep_time && !FLAG_expose_gc && 579783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org incremental_marking()->IsStopped()) { 57986ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org HistogramTimerScope scope(isolate_->counters()->gc_context()); 57996ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CollectAllGarbage(kReduceMemoryFootprintMask, 58006ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org "idle notification: contexts disposed"); 58016ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } else { 58026ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org AdvanceIdleIncrementalMarking(step_size); 58036ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 5804e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 58052c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org // After context disposal there is likely a lot of garbage remaining, reset 58062c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org // the idle notification counters in order to trigger more incremental GCs 58072c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org // on subsequent idle notifications. 58082c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org StartIdleRound(); 58096ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org return false; 58106ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org } 58116ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org 581283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org if (!FLAG_incremental_marking || FLAG_expose_gc || Serializer::enabled()) { 58136ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org return IdleGlobalGC(); 5814ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 5815ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 5816ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // By doing small chunks of GC work in each IdleNotification, 5817ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // perform a round of incremental GCs and after that wait until 5818ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // the mutator creates enough garbage to justify a new round. 5819ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // An incremental GC progresses as follows: 5820ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // 1. many incremental marking steps, 5821ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // 2. one old space mark-sweep-compact, 5822ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // 3. many lazy sweep steps. 5823ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org // Use mark-sweep-compact events to count incremental GCs in a round. 5824ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 5825ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org if (incremental_marking()->IsStopped()) { 5826e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org if (!mark_compact_collector()->AreSweeperThreadsActivated() && 5827e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org !IsSweepingComplete() && 5828ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org !AdvanceSweepers(static_cast<int>(step_size))) { 5829ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org return false; 5830ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 5831ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 5832ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 5833ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) { 5834ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org if (EnoughGarbageSinceLastIdleRound()) { 5835ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org StartIdleRound(); 5836ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } else { 5837ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org return true; 5838ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 5839ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 5840ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 5841de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org int remaining_mark_sweeps = kMaxMarkSweepsInIdleRound - 5842de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org mark_sweeps_since_idle_round_started_; 5843de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org 5844ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org if (incremental_marking()->IsStopped()) { 5845de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // If there are no more than two GCs left in this idle round and we are 5846de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // allowed to do a full GC, then make those GCs full in order to compact 5847de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // the code space. 5848de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // TODO(ulan): Once we enable code compaction for incremental marking, 5849de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org // we can get rid of this special case and always start incremental marking. 5850de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org if (remaining_mark_sweeps <= 2 && hint >= kMinHintForFullGC) { 5851de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org CollectAllGarbage(kReduceMemoryFootprintMask, 5852de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org "idle notification: finalize idle round"); 5853b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org mark_sweeps_since_idle_round_started_++; 5854b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org } else if (hint > kMinHintForIncrementalMarking) { 5855de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org incremental_marking()->Start(); 5856de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org } 5857de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org } 5858b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (!incremental_marking()->IsStopped() && 5859b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org hint > kMinHintForIncrementalMarking) { 5860de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org AdvanceIdleIncrementalMarking(step_size); 5861ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org } 5862b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 5863b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) { 5864b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org FinishIdleRound(); 5865b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org return true; 5866b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org } 5867b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 5868ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org return false; 5869ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org} 5870ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 5871ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org 5872ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.orgbool Heap::IdleGlobalGC() { 5873a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kIdlesBeforeScavenge = 4; 5874a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kIdlesBeforeMarkSweep = 7; 5875a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org static const int kIdlesBeforeMarkCompact = 8; 58765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org static const int kMaxIdleCount = kIdlesBeforeMarkCompact + 1; 58773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org static const unsigned int kGCsBetweenCleanup = 4; 5878ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 5879ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!last_idle_notification_gc_count_init_) { 5880ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_ = gc_count_; 5881ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_init_ = true; 5882ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 588396c75b57eba103edd76da075b60997bd1faf781eager@chromium.org 5884ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org bool uncommit = true; 588596c75b57eba103edd76da075b60997bd1faf781eager@chromium.org bool finished = false; 588696c75b57eba103edd76da075b60997bd1faf781eager@chromium.org 58875f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // Reset the number of idle notifications received when a number of 58885f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // GCs have taken place. This allows another round of cleanup based 58895f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // on idle notifications if enough work has been carried out to 58905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // provoke a number of garbage collections. 5891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (gc_count_ - last_idle_notification_gc_count_ < kGCsBetweenCleanup) { 5892ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org number_idle_notifications_ = 5893ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Min(number_idle_notifications_ + 1, kMaxIdleCount); 589496c75b57eba103edd76da075b60997bd1faf781eager@chromium.org } else { 5895ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org number_idle_notifications_ = 0; 5896ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_ = gc_count_; 589796c75b57eba103edd76da075b60997bd1faf781eager@chromium.org } 589896c75b57eba103edd76da075b60997bd1faf781eager@chromium.org 5899ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (number_idle_notifications_ == kIdlesBeforeScavenge) { 59006ff651481ed0a881f176f6d55e26679ca359792bulan@chromium.org CollectGarbage(NEW_SPACE, "idle notification"); 5901a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org new_space_.Shrink(); 5902ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_ = gc_count_; 5903ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else if (number_idle_notifications_ == kIdlesBeforeMarkSweep) { 5904ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // Before doing the mark-sweep collections we clear the 5905ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // compilation cache to avoid hanging on to source code and 5906ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org // generated code for cached functions. 5907ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->compilation_cache()->Clear(); 5908ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 5909994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CollectAllGarbage(kReduceMemoryFootprintMask, "idle notification"); 5910a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org new_space_.Shrink(); 5911ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_ = gc_count_; 5912a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org 5913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else if (number_idle_notifications_ == kIdlesBeforeMarkCompact) { 5914994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org CollectAllGarbage(kReduceMemoryFootprintMask, "idle notification"); 5915a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org new_space_.Shrink(); 5916ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org last_idle_notification_gc_count_ = gc_count_; 5917ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org number_idle_notifications_ = 0; 5918a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org finished = true; 5919ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else if (number_idle_notifications_ > kIdlesBeforeMarkCompact) { 59205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // If we have received more than kIdlesBeforeMarkCompact idle 59215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // notifications we do not perform any cleanup because we don't 59225f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // expect to gain much by doing so. 59235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org finished = true; 592496c75b57eba103edd76da075b60997bd1faf781eager@chromium.org } 592596c75b57eba103edd76da075b60997bd1faf781eager@chromium.org 5926ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (uncommit) UncommitFromSpace(); 5927c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 592896c75b57eba103edd76da075b60997bd1faf781eager@chromium.org return finished; 592996c75b57eba103edd76da075b60997bd1faf781eager@chromium.org} 593096c75b57eba103edd76da075b60997bd1faf781eager@chromium.org 593196c75b57eba103edd76da075b60997bd1faf781eager@chromium.org 593243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 593343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 593443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::Print() { 5935f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!HasBeenSetUp()) return; 5936bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org isolate()->PrintStack(stdout); 59377c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org AllSpaces spaces(this); 59387c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org for (Space* space = spaces.next(); space != NULL; space = spaces.next()) { 5939b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org space->Print(); 59407c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org } 594143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 594243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 594343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 594443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::ReportCodeStatistics(const char* title) { 594543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF(">>>>>> Code Stats (%s) >>>>>>\n", title); 59463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PagedSpace::ResetCodeStatistics(isolate()); 594743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // We do not look for code in new space, map space, or old space. If code 594843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // somehow ends up in those spaces, we would miss it here. 594943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_->CollectCodeStatistics(); 595043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lo_space_->CollectCodeStatistics(); 59513d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PagedSpace::ReportCodeStatistics(isolate()); 595243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 595343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 595443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 595543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This function expects that NewSpace's allocated objects histogram is 595643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// populated (via a call to CollectStatistics or else as a side effect of a 595743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// just-completed scavenge collection). 595843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::ReportHeapStatistics(const char* title) { 595943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen USE(title); 596043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF(">>>>>> =============== %s (%d) =============== >>>>>>\n", 596143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen title, gc_count_); 5962a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org PrintF("old_generation_allocation_limit_ %" V8_PTR_PREFIX "d\n", 5963a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org old_generation_allocation_limit_); 596443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 596543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("\n"); 596609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles(isolate_)); 5967ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->global_handles()->PrintStats(); 596843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("\n"); 596943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 597043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("Heap statistics : "); 5971ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->memory_allocator()->ReportStatistics(); 597243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("To space : "); 59735a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.ReportStatistics(); 59749258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org PrintF("Old pointer space : "); 59759258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_->ReportStatistics(); 59769258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org PrintF("Old data space : "); 59779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_->ReportStatistics(); 597843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("Code space : "); 597943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_->ReportStatistics(); 598043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("Map space : "); 598143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map_space_->ReportStatistics(); 5982defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org PrintF("Cell space : "); 5983defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org cell_space_->ReportStatistics(); 5984b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org PrintF("PropertyCell space : "); 598541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->ReportStatistics(); 598643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("Large object space : "); 598743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lo_space_->ReportStatistics(); 598843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF(">>>>>> ========================================= >>>>>>\n"); 598943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 599043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 599143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // DEBUG 599243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 599343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::Contains(HeapObject* value) { 599443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Contains(value->address()); 599543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 599643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 599743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 599843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::Contains(Address addr) { 59992c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false; 6000f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return HasBeenSetUp() && 60015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org (new_space_.ToSpaceContains(addr) || 60029258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_->Contains(addr) || 60039258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_->Contains(addr) || 600443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_->Contains(addr) || 600543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map_space_->Contains(addr) || 6006defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org cell_space_->Contains(addr) || 600741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->Contains(addr) || 600843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lo_space_->SlowContains(addr)); 600943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 601043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 601143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 601243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::InSpace(HeapObject* value, AllocationSpace space) { 601343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return InSpace(value->address(), space); 601443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 601543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 601643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 601743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Heap::InSpace(Address addr, AllocationSpace space) { 60182c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false; 6019f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!HasBeenSetUp()) return false; 602043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 602143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (space) { 602243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case NEW_SPACE: 60235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return new_space_.ToSpaceContains(addr); 60249258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_POINTER_SPACE: 60259258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return old_pointer_space_->Contains(addr); 60269258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_DATA_SPACE: 60279258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return old_data_space_->Contains(addr); 602843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case CODE_SPACE: 602943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return code_space_->Contains(addr); 603043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case MAP_SPACE: 603143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return map_space_->Contains(addr); 6032defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org case CELL_SPACE: 6033defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org return cell_space_->Contains(addr); 603441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case PROPERTY_CELL_SPACE: 603541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return property_cell_space_->Contains(addr); 603643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case LO_SPACE: 603743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return lo_space_->SlowContains(addr); 603843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 603943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 604043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 604143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 604243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 604343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6044c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 604543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::Verify() { 6046c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CHECK(HasBeenSetUp()); 604743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6048c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->Verify(); 6049c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 605043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VerifyPointersVisitor visitor; 6051c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org IterateRoots(&visitor, VISIT_ONLY_STRONG); 605243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6053defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org new_space_.Verify(); 6054defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 6055c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com old_pointer_space_->Verify(&visitor); 6056c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map_space_->Verify(&visitor); 605730ce411529579186181838984710b0b0980857aaricow@chromium.org 605830ce411529579186181838984710b0b0980857aaricow@chromium.org VerifyPointersVisitor no_dirty_regions_visitor; 605930ce411529579186181838984710b0b0980857aaricow@chromium.org old_data_space_->Verify(&no_dirty_regions_visitor); 606030ce411529579186181838984710b0b0980857aaricow@chromium.org code_space_->Verify(&no_dirty_regions_visitor); 606130ce411529579186181838984710b0b0980857aaricow@chromium.org cell_space_->Verify(&no_dirty_regions_visitor); 606241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->Verify(&no_dirty_regions_visitor); 6063defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 6064defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org lo_space_->Verify(); 6065f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org} 6066c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 606743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 606843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60694a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::InternalizeUtf8String(Vector<const char> string) { 60704a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result = NULL; 6071303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* new_table; 6072303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_new_table = 60734a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->LookupUtf8String(string, &result); 6074303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; 6075303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 60764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Can't use set_string_table because StringTable::cast knows that 60774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // StringTable is a singleton and checks for identity. 60784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[kStringTableRootIndex] = new_table; 60794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(result != NULL); 60804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 608143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 608243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 608343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::InternalizeOneByteString(Vector<const uint8_t> string) { 60854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result = NULL; 60869e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org Object* new_table; 60879e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org { MaybeObject* maybe_new_table = 60884a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->LookupOneByteString(string, &result); 60899e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; 60909e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 60914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Can't use set_string_table because StringTable::cast knows that 60924a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // StringTable is a singleton and checks for identity. 60934a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[kStringTableRootIndex] = new_table; 60944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(result != NULL); 60954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 60969e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org} 60979e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 60989e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 60994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::InternalizeOneByteString(Handle<SeqOneByteString> string, 610040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org int from, 610140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org int length) { 61024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result = NULL; 610340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org Object* new_table; 610440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org { MaybeObject* maybe_new_table = 61054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->LookupSubStringOneByteString(string, 610640cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org from, 610740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org length, 61084a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org &result); 610940cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; 611040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org } 61114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Can't use set_string_table because StringTable::cast knows that 61124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // StringTable is a singleton and checks for identity. 61134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[kStringTableRootIndex] = new_table; 61144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(result != NULL); 61154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 611640cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org} 611740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 611840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org 61194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::InternalizeTwoByteString(Vector<const uc16> string) { 61204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result = NULL; 61219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org Object* new_table; 61229e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org { MaybeObject* maybe_new_table = 61234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->LookupTwoByteString(string, &result); 61249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; 61259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org } 61264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Can't use set_string_table because StringTable::cast knows that 61274a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // StringTable is a singleton and checks for identity. 61284a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[kStringTableRootIndex] = new_table; 61294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(result != NULL); 61304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 61319e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org} 61329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 61339e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 61344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgMaybeObject* Heap::InternalizeString(String* string) { 61354a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (string->IsInternalizedString()) return string; 61364a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Object* result = NULL; 6137303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org Object* new_table; 6138303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org { MaybeObject* maybe_new_table = 61394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org string_table()->LookupString(string, &result); 6140303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; 6141303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 61424a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // Can't use set_string_table because StringTable::cast knows that 61434a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org // StringTable is a singleton and checks for identity. 61444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org roots_[kStringTableRootIndex] = new_table; 61454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(result != NULL); 61464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return result; 614743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 614843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 614943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Heap::InternalizeStringIfExists(String* string, String** result) { 61514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (string->IsInternalizedString()) { 61524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org *result = string; 61537c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org return true; 61547c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org } 61554a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return string_table()->LookupStringIfExists(string, result); 61567c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org} 61577c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org 6158e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 615943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::ZapFromSpace() { 6160c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NewSpacePageIterator it(new_space_.FromSpaceStart(), 6161c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com new_space_.FromSpaceEnd()); 6162c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (it.has_next()) { 6163c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NewSpacePage* page = it.next(); 6164ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org for (Address cursor = page->area_start(), limit = page->area_end(); 6165c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com cursor < limit; 6166c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com cursor += kPointerSize) { 6167c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Memory::Address_at(cursor) = kFromSpaceZapValue; 6168c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 616943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 617043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 617143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 617243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6173c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::IterateAndMarkPointersToFromSpace(Address start, 6174c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address end, 6175c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ObjectSlotCallback callback) { 617630ce411529579186181838984710b0b0980857aaricow@chromium.org Address slot_address = start; 6177c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 6178c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // We are not collecting slots on new space objects during mutation 6179c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // thus we have to scan for pointers to evacuation candidates when we 6180c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // promote objects. But we should not record any slots in non-black 6181c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // objects. Grey object's slots would be rescanned. 6182c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // White object might not survive until the end of collection 6183c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // it would be a violation of the invariant to record it's slots. 6184c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool record_slots = false; 6185c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (incremental_marking()->IsCompacting()) { 6186c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MarkBit mark_bit = Marking::MarkBitFrom(HeapObject::FromAddress(start)); 6187c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com record_slots = Marking::IsBlack(mark_bit); 6188c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 618930ce411529579186181838984710b0b0980857aaricow@chromium.org 619030ce411529579186181838984710b0b0980857aaricow@chromium.org while (slot_address < end) { 619130ce411529579186181838984710b0b0980857aaricow@chromium.org Object** slot = reinterpret_cast<Object**>(slot_address); 6192c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* object = *slot; 6193c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // If the store buffer becomes overfull we mark pages as being exempt from 6194c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // the store buffer. These pages are scanned to find pointers that point 6195c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // to the new space. In that case we may hit newly promoted objects and 6196c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // fix the pointers before the promotion queue gets to them. Thus the 'if'. 6197c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (object->IsHeapObject()) { 6198c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (Heap::InFromSpace(object)) { 6199c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com callback(reinterpret_cast<HeapObject**>(slot), 6200c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject::cast(object)); 6201c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* new_object = *slot; 6202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (InNewSpace(new_object)) { 6203394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT(Heap::InToSpace(new_object)); 6204394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT(new_object->IsHeapObject()); 6205c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_.EnterDirectlyIntoStoreBuffer( 6206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com reinterpret_cast<Address>(slot)); 6207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 6208394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com SLOW_ASSERT(!MarkCompactCollector::IsOnEvacuationCandidate(new_object)); 6209c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else if (record_slots && 6210c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MarkCompactCollector::IsOnEvacuationCandidate(object)) { 6211c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mark_compact_collector()->RecordSlot(slot, slot, object); 621243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 621330ce411529579186181838984710b0b0980857aaricow@chromium.org } 621430ce411529579186181838984710b0b0980857aaricow@chromium.org slot_address += kPointerSize; 621530ce411529579186181838984710b0b0980857aaricow@chromium.org } 621630ce411529579186181838984710b0b0980857aaricow@chromium.org} 621730ce411529579186181838984710b0b0980857aaricow@chromium.org 621830ce411529579186181838984710b0b0980857aaricow@chromium.org 6219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#ifdef DEBUG 6220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtypedef bool (*CheckStoreBufferFilter)(Object** addr); 622130ce411529579186181838984710b0b0980857aaricow@chromium.org 622230ce411529579186181838984710b0b0980857aaricow@chromium.org 6223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool IsAMapPointerAddress(Object** addr) { 6224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com uintptr_t a = reinterpret_cast<uintptr_t>(addr); 6225c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int mod = a % Map::kSize; 6226c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return mod >= Map::kPointerFieldsBeginOffset && 6227c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mod < Map::kPointerFieldsEndOffset; 622830ce411529579186181838984710b0b0980857aaricow@chromium.org} 622930ce411529579186181838984710b0b0980857aaricow@chromium.org 623030ce411529579186181838984710b0b0980857aaricow@chromium.org 6231c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool EverythingsAPointer(Object** addr) { 6232c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return true; 6233c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 623430ce411529579186181838984710b0b0980857aaricow@chromium.org 623530ce411529579186181838984710b0b0980857aaricow@chromium.org 6236c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic void CheckStoreBuffer(Heap* heap, 6237c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** current, 6238c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** limit, 6239c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object**** store_buffer_position, 6240c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_top, 6241c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CheckStoreBufferFilter filter, 6242c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address special_garbage_start, 6243c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address special_garbage_end) { 6244c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Map* free_space_map = heap->free_space_map(); 6245c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for ( ; current < limit; current++) { 6246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object* o = *current; 6247c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address current_address = reinterpret_cast<Address>(current); 6248c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Skip free space. 6249c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (o == free_space_map) { 6250c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Address current_address = reinterpret_cast<Address>(current); 6251c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FreeSpace* free_space = 6252c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com FreeSpace::cast(HeapObject::FromAddress(current_address)); 6253c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int skip = free_space->Size(); 6254c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(current_address + skip <= reinterpret_cast<Address>(limit)); 6255c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(skip > 0); 6256c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_address += skip - kPointerSize; 6257c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current = reinterpret_cast<Object**>(current_address); 6258c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com continue; 6259c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 6260c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Skip the current linear allocation space between top and limit which is 6261c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // unmarked with the free space map, but can contain junk. 6262c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (current_address == special_garbage_start && 6263c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com special_garbage_end != special_garbage_start) { 6264c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_address = special_garbage_end - kPointerSize; 6265c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current = reinterpret_cast<Object**>(current_address); 6266c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com continue; 6267c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 6268c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!(*filter)(current)) continue; 6269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(current_address < special_garbage_start || 6270c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current_address >= special_garbage_end); 6271c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(reinterpret_cast<uintptr_t>(o) != kFreeListZapValue); 6272c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // We have to check that the pointer does not point into new space 6273c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // without trying to cast it to a heap object since the hash field of 6274c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // a string can contain values like 1 and 3 which are tagged null 6275c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // pointers. 6276c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!heap->InNewSpace(o)) continue; 6277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (**store_buffer_position < current && 6278c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *store_buffer_position < store_buffer_top) { 6279c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (*store_buffer_position)++; 6280c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 6281c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (**store_buffer_position != current || 6282c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *store_buffer_position == store_buffer_top) { 6283c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** obj_start = current; 6284c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (!(*obj_start)->IsMap()) obj_start--; 6285c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com UNREACHABLE(); 628630ce411529579186181838984710b0b0980857aaricow@chromium.org } 628730ce411529579186181838984710b0b0980857aaricow@chromium.org } 628830ce411529579186181838984710b0b0980857aaricow@chromium.org} 628930ce411529579186181838984710b0b0980857aaricow@chromium.org 629030ce411529579186181838984710b0b0980857aaricow@chromium.org 6291c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Check that the store buffer contains all intergenerational pointers by 6292c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// scanning a page and ensuring that all pointers to young space are in the 6293c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// store buffer. 6294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::OldPointerSpaceCheckStoreBuffer() { 6295c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com OldSpace* space = old_pointer_space(); 6296c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PageIterator pages(space); 629730ce411529579186181838984710b0b0980857aaricow@chromium.org 6298c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->SortUniq(); 629930ce411529579186181838984710b0b0980857aaricow@chromium.org 6300c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (pages.has_next()) { 6301c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page* page = pages.next(); 6302ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Object** current = reinterpret_cast<Object**>(page->area_start()); 630330ce411529579186181838984710b0b0980857aaricow@chromium.org 6304ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Address end = page->area_end(); 630530ce411529579186181838984710b0b0980857aaricow@chromium.org 6306c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_position = store_buffer()->Start(); 6307c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_top = store_buffer()->Top(); 630830ce411529579186181838984710b0b0980857aaricow@chromium.org 6309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** limit = reinterpret_cast<Object**>(end); 6310c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CheckStoreBuffer(this, 6311c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current, 6312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com limit, 6313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &store_buffer_position, 6314c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_top, 6315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &EverythingsAPointer, 6316c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com space->top(), 6317c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com space->limit()); 631830ce411529579186181838984710b0b0980857aaricow@chromium.org } 631930ce411529579186181838984710b0b0980857aaricow@chromium.org} 632030ce411529579186181838984710b0b0980857aaricow@chromium.org 632130ce411529579186181838984710b0b0980857aaricow@chromium.org 6322c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::MapSpaceCheckStoreBuffer() { 6323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MapSpace* space = map_space(); 6324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PageIterator pages(space); 632530ce411529579186181838984710b0b0980857aaricow@chromium.org 6326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->SortUniq(); 632730ce411529579186181838984710b0b0980857aaricow@chromium.org 6328c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (pages.has_next()) { 6329c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page* page = pages.next(); 6330ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Object** current = reinterpret_cast<Object**>(page->area_start()); 633130ce411529579186181838984710b0b0980857aaricow@chromium.org 6332ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org Address end = page->area_end(); 633330ce411529579186181838984710b0b0980857aaricow@chromium.org 6334c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_position = store_buffer()->Start(); 6335c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_top = store_buffer()->Top(); 633630ce411529579186181838984710b0b0980857aaricow@chromium.org 6337c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** limit = reinterpret_cast<Object**>(end); 6338c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CheckStoreBuffer(this, 6339c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current, 6340c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com limit, 6341c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &store_buffer_position, 6342c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_top, 6343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &IsAMapPointerAddress, 6344c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com space->top(), 6345c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com space->limit()); 634630ce411529579186181838984710b0b0980857aaricow@chromium.org } 634743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 634843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 634943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::LargeObjectSpaceCheckStoreBuffer() { 6351c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LargeObjectIterator it(lo_space()); 6352c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) { 6353c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // We only have code, sequential strings, or fixed arrays in large 6354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // object space, and only fixed arrays can possibly contain pointers to 6355c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // the young generation. 6356c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (object->IsFixedArray()) { 6357c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_position = store_buffer()->Start(); 6358c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object*** store_buffer_top = store_buffer()->Top(); 6359c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** current = reinterpret_cast<Object**>(object->address()); 6360c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Object** limit = 6361c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com reinterpret_cast<Object**>(object->address() + object->Size()); 6362c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CheckStoreBuffer(this, 6363c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com current, 6364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com limit, 6365c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &store_buffer_position, 6366c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer_top, 6367c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &EverythingsAPointer, 6368c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NULL, 6369c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com NULL); 637071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 637143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 637243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 6373c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif 637443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 637543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6376c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Heap::IterateRoots(ObjectVisitor* v, VisitMode mode) { 6377c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org IterateStrongRoots(v, mode); 6378b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org IterateWeakRoots(v, mode); 6379b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 6380b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 6381b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 6382b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) { 63834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org v->VisitPointer(reinterpret_cast<Object**>(&roots_[kStringTableRootIndex])); 63844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org v->Synchronize(VisitorSynchronization::kStringTable); 6385c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org if (mode != VISIT_ALL_IN_SCAVENGE && 6386c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org mode != VISIT_ALL_IN_SWEEP_NEWSPACE) { 638713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Scavenge collections have special processing for this. 6388ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org external_string_table_.Iterate(v); 638913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 639064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kExternalStringsTable); 639143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 639243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 639343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6394c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Heap::IterateStrongRoots(ObjectVisitor* v, VisitMode mode) { 639568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org v->VisitPointers(&roots_[0], &roots_[kStrongRootListLength]); 639664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kStrongRootList); 639743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org v->VisitPointer(BitCast<Object**>(&hidden_string_)); 63994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org v->Synchronize(VisitorSynchronization::kInternalizedString); 640043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6401ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->bootstrapper()->Iterate(v); 640264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kBootstrapper); 6403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->Iterate(v); 640464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kTop); 64053d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Relocatable::Iterate(isolate_, v); 640664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kRelocatable); 640765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 640865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT 6409ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->debug()->Iterate(v); 64104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org if (isolate_->deoptimizer_data() != NULL) { 64114f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org isolate_->deoptimizer_data()->Iterate(v); 64124f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 641365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif 641464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kDebug); 6415ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->compilation_cache()->Iterate(v); 641664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kCompilationCache); 641743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 641843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterate over local handles in handle scopes. 6419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->handle_scope_implementer()->Iterate(v); 6420304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org isolate_->IterateDeferredHandles(v); 642164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kHandleScope); 642243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 642313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Iterate over the builtin code objects and code stubs in the 642413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // heap. Note that it is not necessary to iterate over code objects 642513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // on scavenge collections. 6426c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (mode != VISIT_ALL_IN_SCAVENGE) { 6427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->builtins()->IterateBuiltins(v); 642813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 642964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kBuiltins); 643043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 643143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterate over global handles. 6432c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org switch (mode) { 6433c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org case VISIT_ONLY_STRONG: 6434c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org isolate_->global_handles()->IterateStrongRoots(v); 6435c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org break; 6436c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org case VISIT_ALL_IN_SCAVENGE: 6437e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org isolate_->global_handles()->IterateNewSpaceStrongAndDependentRoots(v); 6438c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org break; 6439c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org case VISIT_ALL_IN_SWEEP_NEWSPACE: 6440c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org case VISIT_ALL: 6441c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org isolate_->global_handles()->IterateAllRoots(v); 6442c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org break; 6443c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 644464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kGlobalHandles); 644543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6446594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // Iterate over eternal handles. 6447594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if (mode == VISIT_ALL_IN_SCAVENGE) { 6448594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org isolate_->eternal_handles()->IterateNewSpaceRoots(v); 6449594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } else { 6450594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org isolate_->eternal_handles()->IterateAllRoots(v); 6451594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 6452594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org v->Synchronize(VisitorSynchronization::kEternalHandles); 6453594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 645443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Iterate over pointers being held by inactive threads. 6455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->thread_manager()->Iterate(v); 645664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org v->Synchronize(VisitorSynchronization::kThreadManager); 6457b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 6458b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Iterate over the pointers the Serialization/Deserialization code is 6459b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // holding. 6460b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // During garbage collection this keeps the partial snapshot cache alive. 6461b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // During deserialization of the startup snapshot this creates the partial 6462b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // snapshot cache and deserializes the objects it refers to. During 6463b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // serialization this does nothing, since the partial snapshot cache is 6464b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // empty. However the next thing we do is create the partial snapshot, 6465b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // filling up the partial snapshot cache with objects it needs as we go. 64663d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org SerializerDeserializer::Iterate(isolate_, v); 6467b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // We don't do a v->Synchronize call here, because in debug mode that will 6468b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // output a flag to the snapshot. However at this point the serializer and 6469b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // deserializer are deliberately a little unsynchronized (see above) so the 6470b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // checking of the sync flag in the snapshot would fail. 647143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 647243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 647343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 647443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// TODO(1236194): Since the heap size is configurable on the command line 647543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// and through the API, we should gracefully handle the case that the heap 647643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// size is not big enough to fit all the initial objects. 647701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgbool Heap::ConfigureHeap(int max_semispace_size, 6478c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t max_old_gen_size, 6479c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com intptr_t max_executable_size) { 6480f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (HasBeenSetUp()) return false; 648143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6482efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org if (FLAG_stress_compaction) { 6483efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org // This will cause more frequent GCs when stressing. 6484efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org max_semispace_size_ = Page::kPageSize; 6485efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org } 6486efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 6487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (max_semispace_size > 0) { 6488c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (max_semispace_size < Page::kPageSize) { 6489c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com max_semispace_size = Page::kPageSize; 6490c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_trace_gc) { 6491657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Max semispace size cannot be less than %dkbytes\n", 6492657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org Page::kPageSize >> 10); 6493c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 6494c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 6495c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com max_semispace_size_ = max_semispace_size; 6496c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 64973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 64983811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org if (Snapshot::IsEnabled()) { 64993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // If we are using a snapshot we always reserve the default amount 65003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // of memory for each semispace because code in the snapshot has 65013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // write-barrier code that relies on the size and alignment of new 65023811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // space. We therefore cannot use a larger max semispace size 65033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // than the default reserved semispace size. 65043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org if (max_semispace_size_ > reserved_semispace_size_) { 65053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org max_semispace_size_ = reserved_semispace_size_; 6506c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_trace_gc) { 6507657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("Max semispace size cannot be more than %dkbytes\n", 6508657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org reserved_semispace_size_ >> 10); 6509c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 65103811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 65113811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } else { 65123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // If we are not using snapshots we reserve space for the actual 65133811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // max semispace size. 65143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org reserved_semispace_size_ = max_semispace_size_; 65153811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 65163811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 65173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org if (max_old_gen_size > 0) max_old_generation_size_ = max_old_gen_size; 651801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (max_executable_size > 0) { 651901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org max_executable_size_ = RoundUp(max_executable_size, Page::kPageSize); 652001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 652101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 652201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // The max executable size must be less than or equal to the max old 652301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // generation size. 652401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (max_executable_size_ > max_old_generation_size_) { 652501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org max_executable_size_ = max_old_generation_size_; 652601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 652743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 652843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The new space size must be a power of two to support single-bit testing 652943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // for containment. 65303811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org max_semispace_size_ = RoundUpToPowerOf2(max_semispace_size_); 65313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org reserved_semispace_size_ = RoundUpToPowerOf2(reserved_semispace_size_); 65323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org initial_semispace_size_ = Min(initial_semispace_size_, max_semispace_size_); 65331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 65341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // The external allocation limit should be below 256 MB on all architectures 65351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // to avoid unnecessary low memory notifications, as that is the threshold 65361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // for some embedders. 65371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org external_allocation_limit_ = 12 * max_semispace_size_; 65381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ASSERT(external_allocation_limit_ <= 256 * MB); 653943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6540c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // The old generation is paged and needs at least one page for each space. 6541c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int paged_space_count = LAST_PAGED_SPACE - FIRST_PAGED_SPACE + 1; 6542c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com max_old_generation_size_ = Max(static_cast<intptr_t>(paged_space_count * 6543c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page::kPageSize), 6544c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RoundUp(max_old_generation_size_, 6545c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page::kPageSize)); 654643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6547e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org // We rely on being able to allocate new arrays in paged spaces. 6548e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org ASSERT(MaxRegularSpaceAllocationSize() >= 6549e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org (JSArray::kSize + 6550e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org FixedArray::SizeFor(JSObject::kInitialMaxFastElementArray) + 6551e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org AllocationMemento::kSize)); 6552e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org 6553ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org configured_ = true; 655443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 655543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 655643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 655743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65587276f14ca716596e0a0d17539516370c1f453847kasper.lundbool Heap::ConfigureHeapDefault() { 6559c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return ConfigureHeap(static_cast<intptr_t>(FLAG_max_new_space_size / 2) * KB, 6560c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static_cast<intptr_t>(FLAG_max_old_space_size) * MB, 6561c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static_cast<intptr_t>(FLAG_max_executable_size) * MB); 65627276f14ca716596e0a0d17539516370c1f453847kasper.lund} 65637276f14ca716596e0a0d17539516370c1f453847kasper.lund 65647276f14ca716596e0a0d17539516370c1f453847kasper.lund 6565c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgvoid Heap::RecordStats(HeapStats* stats, bool take_snapshot) { 65660b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org *stats->start_marker = HeapStats::kStartMarker; 65670b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org *stats->end_marker = HeapStats::kEndMarker; 6568f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org *stats->new_space_size = new_space_.SizeAsInt(); 6569f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org *stats->new_space_capacity = static_cast<int>(new_space_.Capacity()); 65702c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org *stats->old_pointer_space_size = old_pointer_space_->SizeOfObjects(); 6571ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org *stats->old_pointer_space_capacity = old_pointer_space_->Capacity(); 65722c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org *stats->old_data_space_size = old_data_space_->SizeOfObjects(); 6573ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org *stats->old_data_space_capacity = old_data_space_->Capacity(); 65742c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org *stats->code_space_size = code_space_->SizeOfObjects(); 6575ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org *stats->code_space_capacity = code_space_->Capacity(); 65762c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org *stats->map_space_size = map_space_->SizeOfObjects(); 6577ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org *stats->map_space_capacity = map_space_->Capacity(); 65782c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org *stats->cell_space_size = cell_space_->SizeOfObjects(); 6579ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org *stats->cell_space_capacity = cell_space_->Capacity(); 658041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org *stats->property_cell_space_size = property_cell_space_->SizeOfObjects(); 658141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org *stats->property_cell_space_capacity = property_cell_space_->Capacity(); 6582ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org *stats->lo_space_size = lo_space_->Size(); 6583ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->global_handles()->RecordStats(stats); 6584ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *stats->memory_allocator_size = isolate()->memory_allocator()->Size(); 6585c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org *stats->memory_allocator_capacity = 6586ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->memory_allocator()->Size() + 6587ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->memory_allocator()->Available(); 6588ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org *stats->os_error = OS::GetLastError(); 6589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate()->memory_allocator()->Available(); 6590c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org if (take_snapshot) { 65917c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org HeapIterator iterator(this); 6592c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org for (HeapObject* obj = iterator.next(); 6593c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org obj != NULL; 6594c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org obj = iterator.next()) { 6595c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org InstanceType type = obj->map()->instance_type(); 6596c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org ASSERT(0 <= type && type <= LAST_TYPE); 6597c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org stats->objects_per_type[type]++; 6598c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org stats->size_per_type[type] += obj->Size(); 6599c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 6600c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 66016012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org} 66026012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org 66036012123a2f016c2ab333c2de98d0debd3966056bager@chromium.org 6604659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgintptr_t Heap::PromotedSpaceSizeOfObjects() { 6605659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return old_pointer_space_->SizeOfObjects() 6606659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org + old_data_space_->SizeOfObjects() 6607659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org + code_space_->SizeOfObjects() 6608659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org + map_space_->SizeOfObjects() 6609659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org + cell_space_->SizeOfObjects() 661041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org + property_cell_space_->SizeOfObjects() 6611659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org + lo_space_->SizeOfObjects(); 6612659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org} 6613659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 6614659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 66159af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgbool Heap::AdvanceSweepers(int step_size) { 66169af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ASSERT(isolate()->num_sweeper_threads() == 0); 66179af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org bool sweeping_complete = old_data_space()->AdvanceSweeper(step_size); 66189af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeping_complete &= old_pointer_space()->AdvanceSweeper(step_size); 66199af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return sweeping_complete; 66209af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org} 66219af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 66229af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 66237ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgint64_t Heap::PromotedExternalMemorySize() { 66247276f14ca716596e0a0d17539516370c1f453847kasper.lund if (amount_of_external_allocated_memory_ 66257276f14ca716596e0a0d17539516370c1f453847kasper.lund <= amount_of_external_allocated_memory_at_last_global_gc_) return 0; 66267276f14ca716596e0a0d17539516370c1f453847kasper.lund return amount_of_external_allocated_memory_ 66277276f14ca716596e0a0d17539516370c1f453847kasper.lund - amount_of_external_allocated_memory_at_last_global_gc_; 66287276f14ca716596e0a0d17539516370c1f453847kasper.lund} 66297276f14ca716596e0a0d17539516370c1f453847kasper.lund 66307d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 6631b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgvoid Heap::EnableInlineAllocation() { 6632b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org ASSERT(inline_allocation_disabled_); 6633b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline_allocation_disabled_ = false; 6634b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 6635b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Update inline allocation limit for new space. 6636b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org new_space()->UpdateInlineAllocationLimit(0); 6637b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org} 6638b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 6639b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 6640b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgvoid Heap::DisableInlineAllocation() { 6641b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org ASSERT(!inline_allocation_disabled_); 6642b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org inline_allocation_disabled_ = true; 6643b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 6644b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Update inline allocation limit for new space. 6645b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org new_space()->UpdateInlineAllocationLimit(0); 6646b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 6647b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org // Update inline allocation limit for old spaces. 6648b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org PagedSpaces spaces(this); 6649b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org for (PagedSpace* space = spaces.next(); 6650b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org space != NULL; 6651b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org space = spaces.next()) { 6652b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org space->EmptyAllocationInfo(); 6653b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org } 6654b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org} 6655b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 6656b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org 66577d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgV8_DECLARE_ONCE(initialize_gc_once); 66587d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 66597d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgstatic void InitializeGCOnce() { 66607d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org InitializeScavengingVisitorsTables(); 66617d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org NewSpaceScavenger::Initialize(); 66627d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org MarkCompactCollector::Initialize(); 66637d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org} 66647d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 6665e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 666609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgbool Heap::SetUp() { 6667ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#ifdef DEBUG 6668394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com allocation_timeout_ = FLAG_gc_interval; 6669ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 6670ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 667143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize heap spaces and initial maps and objects. Whenever something 667243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // goes wrong, just return false. The caller should check the results and 667343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // call Heap::TearDown() to release allocated memory. 667443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 66752efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // If the heap is not yet configured (e.g. through the API), configure it. 667643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Configuration is based on the flags new-space-size (really the semispace 667743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // size) and old-space-size if set or the initial values of semispace_size_ 667843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // and old_generation_size_ otherwise. 6679ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!configured_) { 66807276f14ca716596e0a0d17539516370c1f453847kasper.lund if (!ConfigureHeapDefault()) return false; 668143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 668243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66837d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org CallOnce(&initialize_gc_once, &InitializeGCOnce); 6684ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 6685d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org MarkMapPointersAsEncoded(false); 6686d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 6687f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up memory allocator. 6688f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize())) 6689ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false; 6690c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 6691f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up new space. 6692f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!new_space_.SetUp(reserved_semispace_size_, max_semispace_size_)) { 66933811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return false; 66943811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 669543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6696a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // Initialize old pointer space. 66979258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_ = 6698ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org new OldSpace(this, 6699ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org max_old_generation_size_, 6700ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OLD_POINTER_SPACE, 6701ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NOT_EXECUTABLE); 67029258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (old_pointer_space_ == NULL) return false; 6703f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!old_pointer_space_->SetUp()) return false; 6704a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org 6705a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // Initialize old data space. 67069258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_ = 6707ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org new OldSpace(this, 6708ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org max_old_generation_size_, 6709ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org OLD_DATA_SPACE, 6710ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org NOT_EXECUTABLE); 67119258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (old_data_space_ == NULL) return false; 6712f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!old_data_space_->SetUp()) return false; 671343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 671443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the code space, set its maximum capacity to the old 67157276f14ca716596e0a0d17539516370c1f453847kasper.lund // generation size. It needs executable memory. 6716c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org // On 64-bit platform(s), we put all code objects in a 2 GB range of 6717c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org // virtual address space, so that they can call each other with near calls. 6718c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (code_range_size_ > 0) { 6719f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!isolate_->code_range()->SetUp(code_range_size_)) { 6720c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return false; 6721c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 6722c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 6723c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 67249258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org code_space_ = 6725ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org new OldSpace(this, max_old_generation_size_, CODE_SPACE, EXECUTABLE); 672643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (code_space_ == NULL) return false; 6727f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!code_space_->SetUp()) return false; 672843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 672943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize map space. 673078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org map_space_ = new MapSpace(this, max_old_generation_size_, MAP_SPACE); 673143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (map_space_ == NULL) return false; 6732f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!map_space_->SetUp()) return false; 673343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 673441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Initialize simple cell space. 6735ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org cell_space_ = new CellSpace(this, max_old_generation_size_, CELL_SPACE); 6736defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (cell_space_ == NULL) return false; 6737f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!cell_space_->SetUp()) return false; 6738defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 673941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org // Initialize global property cell space. 674041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_ = new PropertyCellSpace(this, max_old_generation_size_, 674141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org PROPERTY_CELL_SPACE); 674241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (property_cell_space_ == NULL) return false; 674341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (!property_cell_space_->SetUp()) return false; 674441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 67459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // The large object code space may contain code or data. We set the memory 67469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // to be non-executable here for safety, but this means we need to enable it 67479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // explicitly when allocating large code objects. 6748394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com lo_space_ = new LargeObjectSpace(this, max_old_generation_size_, LO_SPACE); 674943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (lo_space_ == NULL) return false; 6750f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (!lo_space_->SetUp()) return false; 6751fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 6752f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up the seed that is used to randomize the string hash function. 6753f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com ASSERT(hash_seed() == 0); 6754f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (FLAG_randomize_hashes) { 6755f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (FLAG_hash_seed == 0) { 6756c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int rnd = isolate()->random_number_generator()->NextInt(); 6757c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org set_hash_seed(Smi::FromInt(rnd & Name::kHashBitMask)); 6758fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } else { 6759f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com set_hash_seed(Smi::FromInt(FLAG_hash_seed)); 6760fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 6761fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org } 6762fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org 6763ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(isolate_, IntPtrTEvent("heap-capacity", Capacity())); 6764ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(isolate_, IntPtrTEvent("heap-available", Available())); 676543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6766f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com store_buffer()->SetUp(); 6767c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 6768dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org if (FLAG_concurrent_recompilation) relocation_mutex_ = new Mutex; 6769ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 677043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 677143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 677243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6773e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 677409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgbool Heap::CreateHeapObjects() { 677509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org // Create initial maps. 677609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org if (!CreateInitialMaps()) return false; 677709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org if (!CreateApiObjects()) return false; 677809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org 677909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org // Create initial objects 678009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org if (!CreateInitialObjects()) return false; 678109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org 678209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org native_contexts_list_ = undefined_value(); 678341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org array_buffers_list_ = undefined_value(); 6784ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org allocation_sites_list_ = undefined_value(); 678525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org weak_object_to_code_table_ = undefined_value(); 678609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org return true; 678709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org} 678809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org 678943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6790c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Heap::SetStackLimits() { 6791ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(isolate_ != NULL); 6792ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(isolate_ == isolate()); 679318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // On 64 bit machines, pointers are generally out of range of Smis. We write 679418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org // something that looks like an out of range Smi to the GC. 679518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 6796c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Set up the special root array entries containing the stack limits. 6797c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // These are actually addresses, but the tag makes the GC ignore it. 679818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org roots_[kStackLimitRootIndex] = 6799c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org reinterpret_cast<Object*>( 6800ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org (isolate_->stack_guard()->jslimit() & ~kSmiTagMask) | kSmiTag); 6801c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org roots_[kRealStackLimitRootIndex] = 6802c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org reinterpret_cast<Object*>( 6803ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org (isolate_->stack_guard()->real_jslimit() & ~kSmiTagMask) | kSmiTag); 680418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 680518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 680618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 680743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::TearDown() { 6808c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 68091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org if (FLAG_verify_heap) { 68101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org Verify(); 68111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org } 68121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org#endif 6813c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 6814057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org UpdateMaximumCommitted(); 6815057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 68169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (FLAG_print_cumulative_gc_stat) { 6817e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org PrintF("\n"); 68189dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF("gc_count=%d ", gc_count_); 68199dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF("mark_sweep_count=%d ", ms_count_); 6820c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("max_gc_pause=%.1f ", get_max_gc_pause()); 6821c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("total_gc_time=%.1f ", total_gc_time_ms_); 6822c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("min_in_mutator=%.1f ", get_min_in_mutator()); 6823f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org PrintF("max_alive_after_gc=%" V8_PTR_PREFIX "d ", 6824ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org get_max_alive_after_gc()); 6825c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("total_marking_time=%.1f ", marking_time()); 6826c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("total_sweeping_time=%.1f ", sweeping_time()); 68279dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF("\n\n"); 68289dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 68299dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 6830057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org if (FLAG_print_max_heap_committed) { 6831057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("\n"); 6832057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_heap=%" V8_PTR_PREFIX "d ", 6833057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org MaximumCommittedMemory()); 6834057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_new_space=%" V8_PTR_PREFIX "d ", 6835057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org new_space_.MaximumCommittedMemory()); 6836057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_old_pointer_space=%" V8_PTR_PREFIX "d ", 6837057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org old_data_space_->MaximumCommittedMemory()); 6838057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ", 6839057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org old_pointer_space_->MaximumCommittedMemory()); 6840057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ", 6841057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org old_pointer_space_->MaximumCommittedMemory()); 6842057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_code_space=%" V8_PTR_PREFIX "d ", 6843057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org code_space_->MaximumCommittedMemory()); 6844057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_map_space=%" V8_PTR_PREFIX "d ", 6845057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org map_space_->MaximumCommittedMemory()); 6846057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_cell_space=%" V8_PTR_PREFIX "d ", 6847057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org cell_space_->MaximumCommittedMemory()); 6848057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_property_space=%" V8_PTR_PREFIX "d ", 6849057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org property_cell_space_->MaximumCommittedMemory()); 6850057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", 6851057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org lo_space_->MaximumCommittedMemory()); 6852057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org PrintF("\n\n"); 6853057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org } 6854057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org 68551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org TearDownArrayBuffers(); 68561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6857ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->global_handles()->TearDown(); 685843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6859ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org external_string_table_.TearDown(); 686013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 6861d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org mark_compact_collector()->TearDown(); 6862d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 68635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org new_space_.TearDown(); 686443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68659258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (old_pointer_space_ != NULL) { 68669258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_->TearDown(); 68679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org delete old_pointer_space_; 68689258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_pointer_space_ = NULL; 68699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 68709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 68719258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (old_data_space_ != NULL) { 68729258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_->TearDown(); 68739258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org delete old_data_space_; 68749258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org old_data_space_ = NULL; 687543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 687643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 687743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (code_space_ != NULL) { 687843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_->TearDown(); 687943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen delete code_space_; 688043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen code_space_ = NULL; 688143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 688243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 688343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (map_space_ != NULL) { 688443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map_space_->TearDown(); 688543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen delete map_space_; 688643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map_space_ = NULL; 688743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 688843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6889defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org if (cell_space_ != NULL) { 6890defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org cell_space_->TearDown(); 6891defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org delete cell_space_; 6892defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org cell_space_ = NULL; 6893defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org } 6894defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org 689541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org if (property_cell_space_ != NULL) { 689641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_->TearDown(); 689741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org delete property_cell_space_; 689841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org property_cell_space_ = NULL; 689941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org } 690041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 690143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (lo_space_ != NULL) { 690243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lo_space_->TearDown(); 690343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen delete lo_space_; 690443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lo_space_ = NULL; 690543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 690643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6907c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com store_buffer()->TearDown(); 6908c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com incremental_marking()->TearDown(); 6909c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 6910ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->memory_allocator()->TearDown(); 6911ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 6912ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org delete relocation_mutex_; 69139af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org relocation_mutex_ = NULL; 691443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 691543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 691643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6917528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Heap::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback, 6918528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type, 6919528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate) { 69205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(callback != NULL); 6921528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCPrologueCallbackPair pair(callback, gc_type, pass_isolate); 69225d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(!gc_prologue_callbacks_.Contains(pair)); 69235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return gc_prologue_callbacks_.Add(pair); 69245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 69255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 69265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 6927528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Heap::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback) { 69285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(callback != NULL); 69295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) { 69305d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (gc_prologue_callbacks_[i].callback == callback) { 69315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org gc_prologue_callbacks_.Remove(i); 69325d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return; 69335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 69345d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 69355d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org UNREACHABLE(); 69365d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 69375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 69385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 6939528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Heap::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, 6940528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCType gc_type, 6941528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool pass_isolate) { 69425d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(callback != NULL); 6943528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org GCEpilogueCallbackPair pair(callback, gc_type, pass_isolate); 69445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(!gc_epilogue_callbacks_.Contains(pair)); 69455d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return gc_epilogue_callbacks_.Add(pair); 69465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 69475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 69485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 6949528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid Heap::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback) { 69505d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org ASSERT(callback != NULL); 69515d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) { 69525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (gc_epilogue_callbacks_[i].callback == callback) { 69535d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org gc_epilogue_callbacks_.Remove(i); 69545d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org return; 69555d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 69565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 69575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org UNREACHABLE(); 69585d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 69595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 69605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 696125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgMaybeObject* Heap::AddWeakObjectToCodeDependency(Object* obj, 696225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org DependentCode* dep) { 696325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org ASSERT(!InNewSpace(obj)); 696425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org ASSERT(!InNewSpace(dep)); 696525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org MaybeObject* maybe_obj = 696625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org WeakHashTable::cast(weak_object_to_code_table_)->Put(obj, dep); 696725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org WeakHashTable* table; 696825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org if (!maybe_obj->To(&table)) return maybe_obj; 6969dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org if (ShouldZapGarbage() && weak_object_to_code_table_ != table) { 6970dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org WeakHashTable::cast(weak_object_to_code_table_)->Zap(the_hole_value()); 6971dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org } 697225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org set_weak_object_to_code_table(table); 697325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org ASSERT_EQ(dep, WeakHashTable::cast(weak_object_to_code_table_)->Lookup(obj)); 697425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org return weak_object_to_code_table_; 697525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org} 697625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 697725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 697825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgDependentCode* Heap::LookupWeakObjectToCodeDependency(Object* obj) { 697925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org Object* dep = WeakHashTable::cast(weak_object_to_code_table_)->Lookup(obj); 698025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org if (dep->IsDependentCode()) return DependentCode::cast(dep); 698125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org return DependentCode::cast(empty_fixed_array()); 698225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org} 698325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 698425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 698525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgvoid Heap::EnsureWeakObjectToCodeTable() { 698625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org if (!weak_object_to_code_table()->IsHashTable()) { 698725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org set_weak_object_to_code_table(*isolate()->factory()->NewWeakHashTable(16)); 698825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org } 698925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org} 699025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 699125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org 699243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 699343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 699443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass PrintHandleVisitor: public ObjectVisitor { 699543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 699643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void VisitPointers(Object** start, Object** end) { 699743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (Object** p = start; p < end; p++) 6998f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org PrintF(" handle %p to %p\n", 6999f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org reinterpret_cast<void*>(p), 7000f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org reinterpret_cast<void*>(*p)); 700143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 700243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 700343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7004e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 700543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::PrintHandles() { 700643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("Handles:\n"); 700743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintHandleVisitor v; 7008ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate_->handle_scope_implementer()->Iterate(&v); 700943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 701043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 701143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 701243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 701343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70149258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgSpace* AllSpaces::next() { 70159258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org switch (counter_++) { 70169258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case NEW_SPACE: 70177c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->new_space(); 70189258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_POINTER_SPACE: 70197c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->old_pointer_space(); 70209258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_DATA_SPACE: 70217c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->old_data_space(); 70229258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case CODE_SPACE: 70237c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->code_space(); 70249258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case MAP_SPACE: 70257c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->map_space(); 7026defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org case CELL_SPACE: 70277c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->cell_space(); 702841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case PROPERTY_CELL_SPACE: 702941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return heap_->property_cell_space(); 70309258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case LO_SPACE: 70317c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->lo_space(); 70329258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org default: 70339258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return NULL; 70349258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 70359258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 70369258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70379258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70389258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgPagedSpace* PagedSpaces::next() { 70399258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org switch (counter_++) { 70409258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_POINTER_SPACE: 70417c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->old_pointer_space(); 70429258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_DATA_SPACE: 70437c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->old_data_space(); 70449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case CODE_SPACE: 70457c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->code_space(); 70469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case MAP_SPACE: 70477c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->map_space(); 7048defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org case CELL_SPACE: 70497c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->cell_space(); 705041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case PROPERTY_CELL_SPACE: 705141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org return heap_->property_cell_space(); 70529258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org default: 70539258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return NULL; 70549258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 70559258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 70569258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70579258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70589258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.orgOldSpace* OldSpaces::next() { 70609258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org switch (counter_++) { 70619258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_POINTER_SPACE: 70627c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->old_pointer_space(); 70639258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_DATA_SPACE: 70647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->old_data_space(); 70659258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case CODE_SPACE: 70667c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return heap_->code_space(); 70679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org default: 70689258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return NULL; 70699258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 70709258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org} 70719258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70729258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 70737c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgSpaceIterator::SpaceIterator(Heap* heap) 70747c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org : heap_(heap), 70757c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org current_space_(FIRST_SPACE), 70764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com iterator_(NULL), 70774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com size_func_(NULL) { 70784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 70794a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 70804a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 70817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgSpaceIterator::SpaceIterator(Heap* heap, HeapObjectCallback size_func) 70827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org : heap_(heap), 70837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org current_space_(FIRST_SPACE), 70844a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com iterator_(NULL), 70854a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com size_func_(size_func) { 70867276f14ca716596e0a0d17539516370c1f453847kasper.lund} 70877276f14ca716596e0a0d17539516370c1f453847kasper.lund 70887276f14ca716596e0a0d17539516370c1f453847kasper.lund 70897276f14ca716596e0a0d17539516370c1f453847kasper.lundSpaceIterator::~SpaceIterator() { 70907276f14ca716596e0a0d17539516370c1f453847kasper.lund // Delete active iterator if any. 70917276f14ca716596e0a0d17539516370c1f453847kasper.lund delete iterator_; 70927276f14ca716596e0a0d17539516370c1f453847kasper.lund} 70937276f14ca716596e0a0d17539516370c1f453847kasper.lund 70947276f14ca716596e0a0d17539516370c1f453847kasper.lund 70957276f14ca716596e0a0d17539516370c1f453847kasper.lundbool SpaceIterator::has_next() { 70967276f14ca716596e0a0d17539516370c1f453847kasper.lund // Iterate until no more spaces. 70977276f14ca716596e0a0d17539516370c1f453847kasper.lund return current_space_ != LAST_SPACE; 70987276f14ca716596e0a0d17539516370c1f453847kasper.lund} 70997276f14ca716596e0a0d17539516370c1f453847kasper.lund 71007276f14ca716596e0a0d17539516370c1f453847kasper.lund 71017276f14ca716596e0a0d17539516370c1f453847kasper.lundObjectIterator* SpaceIterator::next() { 71027276f14ca716596e0a0d17539516370c1f453847kasper.lund if (iterator_ != NULL) { 71037276f14ca716596e0a0d17539516370c1f453847kasper.lund delete iterator_; 71047276f14ca716596e0a0d17539516370c1f453847kasper.lund iterator_ = NULL; 71057276f14ca716596e0a0d17539516370c1f453847kasper.lund // Move to the next space 71067276f14ca716596e0a0d17539516370c1f453847kasper.lund current_space_++; 71077276f14ca716596e0a0d17539516370c1f453847kasper.lund if (current_space_ > LAST_SPACE) { 71087276f14ca716596e0a0d17539516370c1f453847kasper.lund return NULL; 71097276f14ca716596e0a0d17539516370c1f453847kasper.lund } 71107276f14ca716596e0a0d17539516370c1f453847kasper.lund } 71117276f14ca716596e0a0d17539516370c1f453847kasper.lund 71127276f14ca716596e0a0d17539516370c1f453847kasper.lund // Return iterator for the new current space. 71137276f14ca716596e0a0d17539516370c1f453847kasper.lund return CreateIterator(); 71147276f14ca716596e0a0d17539516370c1f453847kasper.lund} 71157276f14ca716596e0a0d17539516370c1f453847kasper.lund 71167276f14ca716596e0a0d17539516370c1f453847kasper.lund 71177276f14ca716596e0a0d17539516370c1f453847kasper.lund// Create an iterator for the space to iterate. 71187276f14ca716596e0a0d17539516370c1f453847kasper.lundObjectIterator* SpaceIterator::CreateIterator() { 71197276f14ca716596e0a0d17539516370c1f453847kasper.lund ASSERT(iterator_ == NULL); 71207276f14ca716596e0a0d17539516370c1f453847kasper.lund 71217276f14ca716596e0a0d17539516370c1f453847kasper.lund switch (current_space_) { 71227276f14ca716596e0a0d17539516370c1f453847kasper.lund case NEW_SPACE: 71237c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = new SemiSpaceIterator(heap_->new_space(), size_func_); 71247276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 71259258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_POINTER_SPACE: 71267c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = 71277c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org new HeapObjectIterator(heap_->old_pointer_space(), size_func_); 71289258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org break; 71299258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org case OLD_DATA_SPACE: 71307c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = new HeapObjectIterator(heap_->old_data_space(), size_func_); 71317276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 71327276f14ca716596e0a0d17539516370c1f453847kasper.lund case CODE_SPACE: 71337c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = new HeapObjectIterator(heap_->code_space(), size_func_); 71347276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 71357276f14ca716596e0a0d17539516370c1f453847kasper.lund case MAP_SPACE: 71367c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = new HeapObjectIterator(heap_->map_space(), size_func_); 71377276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 7138defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org case CELL_SPACE: 71397c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = new HeapObjectIterator(heap_->cell_space(), size_func_); 7140defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org break; 714141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org case PROPERTY_CELL_SPACE: 714241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org iterator_ = new HeapObjectIterator(heap_->property_cell_space(), 714341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org size_func_); 714441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org break; 71457276f14ca716596e0a0d17539516370c1f453847kasper.lund case LO_SPACE: 71467c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org iterator_ = new LargeObjectIterator(heap_->lo_space(), size_func_); 71477276f14ca716596e0a0d17539516370c1f453847kasper.lund break; 71487276f14ca716596e0a0d17539516370c1f453847kasper.lund } 71497276f14ca716596e0a0d17539516370c1f453847kasper.lund 71507276f14ca716596e0a0d17539516370c1f453847kasper.lund // Return the newly allocated iterator; 71517276f14ca716596e0a0d17539516370c1f453847kasper.lund ASSERT(iterator_ != NULL); 71527276f14ca716596e0a0d17539516370c1f453847kasper.lund return iterator_; 71537276f14ca716596e0a0d17539516370c1f453847kasper.lund} 71547276f14ca716596e0a0d17539516370c1f453847kasper.lund 71557276f14ca716596e0a0d17539516370c1f453847kasper.lund 7156023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.orgclass HeapObjectsFilter { 7157023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org public: 7158023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org virtual ~HeapObjectsFilter() {} 7159023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org virtual bool SkipObject(HeapObject* object) = 0; 7160023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org}; 7161023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7162023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7163023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.orgclass UnreachableObjectsFilter : public HeapObjectsFilter { 7164023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org public: 71653d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org explicit UnreachableObjectsFilter(Heap* heap) : heap_(heap) { 7166394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com MarkReachableObjects(); 7167394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 7168394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 7169394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ~UnreachableObjectsFilter() { 71703d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org heap_->mark_compact_collector()->ClearMarkbits(); 7171023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7172023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7173023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org bool SkipObject(HeapObject* object) { 7174394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com MarkBit mark_bit = Marking::MarkBitFrom(object); 7175394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return !mark_bit.Get(); 7176023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7177023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7178023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org private: 7179394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com class MarkingVisitor : public ObjectVisitor { 7180023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org public: 7181394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com MarkingVisitor() : marking_stack_(10) {} 7182023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7183023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org void VisitPointers(Object** start, Object** end) { 7184023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org for (Object** p = start; p < end; p++) { 7185023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org if (!(*p)->IsHeapObject()) continue; 7186023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org HeapObject* obj = HeapObject::cast(*p); 7187394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com MarkBit mark_bit = Marking::MarkBitFrom(obj); 7188394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (!mark_bit.Get()) { 7189394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com mark_bit.Set(); 7190394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com marking_stack_.Add(obj); 7191023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7192023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7193023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7194023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7195394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com void TransitiveClosure() { 7196394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com while (!marking_stack_.is_empty()) { 7197394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com HeapObject* obj = marking_stack_.RemoveLast(); 7198394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com obj->Iterate(this); 7199394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 7200023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7201023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7202023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org private: 7203394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com List<HeapObject*> marking_stack_; 7204023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org }; 7205023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7206394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com void MarkReachableObjects() { 7207394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com MarkingVisitor visitor; 72083d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org heap_->IterateRoots(&visitor, VISIT_ALL); 7209394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com visitor.TransitiveClosure(); 7210023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org } 7211023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 72123d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Heap* heap_; 721379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_allocation_; 7214023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org}; 7215023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 7216023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 72177c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgHeapIterator::HeapIterator(Heap* heap) 72187c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org : heap_(heap), 72197c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org filtering_(HeapIterator::kNoFiltering), 72204a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com filter_(NULL) { 72214a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Init(); 72224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 72234a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 72244a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 72257c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgHeapIterator::HeapIterator(Heap* heap, 72267c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org HeapIterator::HeapObjectsFiltering filtering) 72277c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org : heap_(heap), 72287c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org filtering_(filtering), 72294a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com filter_(NULL) { 723043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Init(); 723143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 723243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 723343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 723443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHeapIterator::~HeapIterator() { 723543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Shutdown(); 723643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 723743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 723843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 723943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapIterator::Init() { 724043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Start the iteration. 72417c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org space_iterator_ = new SpaceIterator(heap_); 7242023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org switch (filtering_) { 7243023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org case kFilterUnreachable: 72443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org filter_ = new UnreachableObjectsFilter(heap_); 7245023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org break; 7246023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org default: 7247023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org break; 72484a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 724943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_iterator_ = space_iterator_->next(); 725043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 725143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 725243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 725343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapIterator::Shutdown() { 72544a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#ifdef DEBUG 7255023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org // Assert that in filtering mode we have iterated through all 72564a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com // objects. Otherwise, heap will be left in an inconsistent state. 7257023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org if (filtering_ != kNoFiltering) { 72584a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com ASSERT(object_iterator_ == NULL); 72594a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 72604a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#endif 726143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Make sure the last iterator is deallocated. 726243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen delete space_iterator_; 726343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen space_iterator_ = NULL; 726443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_iterator_ = NULL; 72654a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com delete filter_; 72664a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com filter_ = NULL; 726743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 726843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 726943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7270b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgHeapObject* HeapIterator::next() { 72714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com if (filter_ == NULL) return NextObject(); 72724a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 72734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com HeapObject* obj = NextObject(); 7274023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org while (obj != NULL && filter_->SkipObject(obj)) obj = NextObject(); 72754a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com return obj; 72764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 72774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 72784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 72794a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comHeapObject* HeapIterator::NextObject() { 728043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // No iterator means we are done. 7281b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (object_iterator_ == NULL) return NULL; 728243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7283b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (HeapObject* obj = object_iterator_->next_object()) { 728443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the current iterator has more objects we are fine. 7285b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return obj; 728643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 728743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Go though the spaces looking for one that has objects. 728843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (space_iterator_->has_next()) { 728943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_iterator_ = space_iterator_->next(); 7290b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (HeapObject* obj = object_iterator_->next_object()) { 7291b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return obj; 729243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 729343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 729443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 729543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Done with the last space. 729643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen object_iterator_ = NULL; 7297b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return NULL; 729843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 729943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 730043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 730143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapIterator::reset() { 730243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Restart the iterator. 730343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Shutdown(); 730443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Init(); 730543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 730643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 730743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 730846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org#ifdef DEBUG 73093a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 7310ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgObject* const PathTracer::kAnyGlobalObject = NULL; 731143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass PathTracer::MarkVisitor: public ObjectVisitor { 73133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org public: 73143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org explicit MarkVisitor(PathTracer* tracer) : tracer_(tracer) {} 73153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void VisitPointers(Object** start, Object** end) { 73163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // Scan all HeapObject pointers in [start, end) 73173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org for (Object** p = start; !tracer_->found() && (p < end); p++) { 73183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if ((*p)->IsHeapObject()) 73193a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org tracer_->MarkRecursively(p, this); 73203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 73213a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 732243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org private: 73243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org PathTracer* tracer_; 73253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}; 732643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 732743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass PathTracer::UnmarkVisitor: public ObjectVisitor { 732943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 73303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org explicit UnmarkVisitor(PathTracer* tracer) : tracer_(tracer) {} 733143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void VisitPointers(Object** start, Object** end) { 73323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // Scan all HeapObject pointers in [start, end) 733343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (Object** p = start; p < end; p++) { 733443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((*p)->IsHeapObject()) 73353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org tracer_->UnmarkRecursively(p, this); 733643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 733743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 73383a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73393a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org private: 73403a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org PathTracer* tracer_; 734143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 734243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 734343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid PathTracer::VisitPointers(Object** start, Object** end) { 73453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org bool done = ((what_to_find_ == FIND_FIRST) && found_target_); 73463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // Visit all HeapObject pointers in [start, end) 73473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org for (Object** p = start; !done && (p < end); p++) { 73483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if ((*p)->IsHeapObject()) { 73493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org TracePathFrom(p); 73503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org done = ((what_to_find_ == FIND_FIRST) && found_target_); 73513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 73523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 73533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 73543a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid PathTracer::Reset() { 73573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org found_target_ = false; 73583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object_stack_.Clear(); 73593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 73603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73623a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid PathTracer::TracePathFrom(Object** root) { 73633a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org ASSERT((search_target_ == kAnyGlobalObject) || 73643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org search_target_->IsHeapObject()); 73653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org found_target_in_trace_ = false; 73665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Reset(); 73673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73683a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org MarkVisitor mark_visitor(this); 73693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org MarkRecursively(root, &mark_visitor); 73703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org UnmarkVisitor unmark_visitor(this); 73723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org UnmarkRecursively(root, &unmark_visitor); 73733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org ProcessResults(); 73753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 73763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 73773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 737846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgstatic bool SafeIsNativeContext(HeapObject* obj) { 737946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return obj->map() == obj->GetHeap()->raw_unchecked_native_context_map(); 7380c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 7381c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 7382c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 73833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid PathTracer::MarkRecursively(Object** p, MarkVisitor* mark_visitor) { 738443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!(*p)->IsHeapObject()) return; 738543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 738643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HeapObject* obj = HeapObject::cast(*p); 738743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 738843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* map = obj->map(); 738943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 739043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!map->IsHeapObject()) return; // visited before 739143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (found_target_in_trace_) return; // stop if target found 73933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object_stack_.Add(obj); 73943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (((search_target_ == kAnyGlobalObject) && obj->IsJSGlobalObject()) || 73953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org (obj == search_target_)) { 73963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org found_target_in_trace_ = true; 73973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org found_target_ = true; 739843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return; 739943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 740043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 740146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org bool is_native_context = SafeIsNativeContext(obj); 74023a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 740343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // not visited yet 740443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Map* map_p = reinterpret_cast<Map*>(HeapObject::cast(map)); 740543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 740643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Address map_addr = map_p->address(); 740743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 740864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org obj->set_map_no_write_barrier(reinterpret_cast<Map*>(map_addr + kMarkTag)); 740943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // Scan the object body. 741146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (is_native_context && (visit_mode_ == VISIT_ONLY_STRONG)) { 74123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // This is specialized to scan Context's properly. 74132ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** start = reinterpret_cast<Object**>(obj->address() + 74142ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Context::kHeaderSize); 74152ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org Object** end = reinterpret_cast<Object**>(obj->address() + 74163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org Context::kHeaderSize + Context::FIRST_WEAK_SLOT * kPointerSize); 74172ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org mark_visitor->VisitPointers(start, end); 74183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } else { 74193a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org obj->IterateBody(map_p->instance_type(), 74203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org obj->SizeFromMap(map_p), 74213a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org mark_visitor); 74223a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 742343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // Scan the map after the body because the body is a lot more interesting 74253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // when doing leak detection. 74263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org MarkRecursively(&map, mark_visitor); 742743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (!found_target_in_trace_) // don't pop if found the target 74293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object_stack_.RemoveLast(); 743043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 743143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 743243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid PathTracer::UnmarkRecursively(Object** p, UnmarkVisitor* unmark_visitor) { 743443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!(*p)->IsHeapObject()) return; 743543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 743643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HeapObject* obj = HeapObject::cast(*p); 743743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 743843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Object* map = obj->map(); 743943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 744043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (map->IsHeapObject()) return; // unmarked already 744143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 744243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Address map_addr = reinterpret_cast<Address>(map); 744343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 744443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen map_addr -= kMarkTag; 744543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 744643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT_TAG_ALIGNED(map_addr); 744743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 744843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HeapObject* map_p = HeapObject::FromAddress(map_addr); 744943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 745064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org obj->set_map_no_write_barrier(reinterpret_cast<Map*>(map_p)); 745143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org UnmarkRecursively(reinterpret_cast<Object**>(&map_p), unmark_visitor); 745343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 745443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->IterateBody(Map::cast(map_p)->instance_type(), 745543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->SizeFromMap(Map::cast(map_p)), 74563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org unmark_visitor); 745743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 745843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 745943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid PathTracer::ProcessResults() { 74613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (found_target_) { 746243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("=====================================\n"); 746343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("==== Path to object ====\n"); 746443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("=====================================\n\n"); 746543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org ASSERT(!object_stack_.is_empty()); 74673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org for (int i = 0; i < object_stack_.length(); i++) { 746843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (i > 0) PrintF("\n |\n |\n V\n\n"); 74693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org Object* obj = object_stack_[i]; 747043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen obj->Print(); 747143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 747243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintF("=====================================\n"); 747343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 747443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 747543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 747643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7477ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org// Triggers a depth-first traversal of reachable objects from one 7478ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org// given root object and finds a path to a specific heap object and 7479ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org// prints it. 7480ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.orgvoid Heap::TracePathToObjectFrom(Object* target, Object* root) { 7481ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org PathTracer tracer(target, PathTracer::FIND_ALL, VISIT_ALL); 7482ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org tracer.VisitPointer(&root); 7483ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org} 7484ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org 7485ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org 748643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Triggers a depth-first traversal of reachable objects from roots 748743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// and finds a path to a specific heap object and prints it. 748813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgvoid Heap::TracePathToObject(Object* target) { 74893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org PathTracer tracer(target, PathTracer::FIND_ALL, VISIT_ALL); 74903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org IterateRoots(&tracer, VISIT_ONLY_STRONG); 749143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 749243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 749343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 749443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Triggers a depth-first traversal of reachable objects from roots 749543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// and finds a path to any global object and prints it. Useful for 749643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// determining the source for leaks of global objects. 749743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Heap::TracePathToGlobal() { 74983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org PathTracer tracer(PathTracer::kAnyGlobalObject, 74993a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org PathTracer::FIND_ALL, 75003a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org VISIT_ALL); 75013a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org IterateRoots(&tracer, VISIT_ONLY_STRONG); 750243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 750343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 750443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 750543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75067c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgstatic intptr_t CountTotalHolesSize(Heap* heap) { 7507f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org intptr_t holes_size = 0; 75087c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org OldSpaces spaces(heap); 75099dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com for (OldSpace* space = spaces.next(); 75109dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com space != NULL; 75119dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com space = spaces.next()) { 7512c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com holes_size += space->Waste() + space->Available(); 75139dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 75149dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com return holes_size; 75159dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 75169dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 75179dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7518994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.orgGCTracer::GCTracer(Heap* heap, 7519994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* gc_reason, 7520994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org const char* collector_reason) 75217276f14ca716596e0a0d17539516370c1f453847kasper.lund : start_time_(0.0), 75221145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org start_object_size_(0), 75231145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org start_memory_size_(0), 75247276f14ca716596e0a0d17539516370c1f453847kasper.lund gc_count_(0), 75257276f14ca716596e0a0d17539516370c1f453847kasper.lund full_gc_count_(0), 75269dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com allocated_since_last_gc_(0), 75279dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com spent_in_mutator_(0), 7528ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org promoted_objects_size_(0), 7529cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org nodes_died_in_new_space_(0), 7530cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org nodes_copied_in_new_space_(0), 7531cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org nodes_promoted_(0), 7532994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org heap_(heap), 7533994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org gc_reason_(gc_reason), 7534994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org collector_reason_(collector_reason) { 75359dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return; 75367276f14ca716596e0a0d17539516370c1f453847kasper.lund start_time_ = OS::TimeCurrentMillis(); 75371145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org start_object_size_ = heap_->SizeOfObjects(); 75381145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org start_memory_size_ = heap_->isolate()->memory_allocator()->Size(); 75399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 75409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com for (int i = 0; i < Scope::kNumberOfScopes; i++) { 75419dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com scopes_[i] = 0; 75429dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 75439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 75447c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org in_free_list_or_wasted_before_gc_ = CountTotalHolesSize(heap); 75459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org allocated_since_last_gc_ = 7547ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->SizeOfObjects() - heap_->alive_after_last_gc_; 75489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7549ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (heap_->last_gc_end_timestamp_ > 0) { 7550ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org spent_in_mutator_ = Max(start_time_ - heap_->last_gc_end_timestamp_, 0.0); 75519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 7552c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 7553c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com steps_count_ = heap_->incremental_marking()->steps_count(); 7554c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com steps_took_ = heap_->incremental_marking()->steps_took(); 7555c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com longest_step_ = heap_->incremental_marking()->longest_step(); 7556c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com steps_count_since_last_gc_ = 7557c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap_->incremental_marking()->steps_count_since_last_gc(); 7558c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com steps_took_since_last_gc_ = 7559c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap_->incremental_marking()->steps_took_since_last_gc(); 75607276f14ca716596e0a0d17539516370c1f453847kasper.lund} 75617276f14ca716596e0a0d17539516370c1f453847kasper.lund 75627276f14ca716596e0a0d17539516370c1f453847kasper.lund 75637276f14ca716596e0a0d17539516370c1f453847kasper.lundGCTracer::~GCTracer() { 75647276f14ca716596e0a0d17539516370c1f453847kasper.lund // Printf ONE line iff flag is set. 75659dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return; 75669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool first_gc = (heap_->last_gc_end_timestamp_ == 0); 75689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7569ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->alive_after_last_gc_ = heap_->SizeOfObjects(); 7570ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->last_gc_end_timestamp_ = OS::TimeCurrentMillis(); 75719dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7572c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org double time = heap_->last_gc_end_timestamp_ - start_time_; 75739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 75749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com // Update cumulative GC statistics if required. 75759dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (FLAG_print_cumulative_gc_stat) { 7576471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org heap_->total_gc_time_ms_ += time; 7577ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->max_gc_pause_ = Max(heap_->max_gc_pause_, time); 7578ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->max_alive_after_gc_ = Max(heap_->max_alive_after_gc_, 7579ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->alive_after_last_gc_); 75809dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (!first_gc) { 7581ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->min_in_mutator_ = Min(heap_->min_in_mutator_, 7582c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org spent_in_mutator_); 75839dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 7584471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } else if (FLAG_trace_gc_verbose) { 7585471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org heap_->total_gc_time_ms_ += time; 75869dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 75879dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7588471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org if (collector_ == SCAVENGER && FLAG_trace_gc_ignore_scavenger) return; 7589471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 7590e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org heap_->AddMarkingTime(scopes_[Scope::MC_MARK]); 7591e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 7592e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org if (FLAG_print_cumulative_gc_stat && !FLAG_trace_gc) return; 7593657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init()); 7594994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 75959dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (!FLAG_trace_gc_nvp) { 75969dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com int external_time = static_cast<int>(scopes_[Scope::EXTERNAL]); 75979dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 75981145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org double end_memory_size_mb = 75991145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org static_cast<double>(heap_->isolate()->memory_allocator()->Size()) / MB; 76001145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org 76011145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", 76029dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com CollectorString(), 76031145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org static_cast<double>(start_object_size_) / MB, 76041145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org static_cast<double>(start_memory_size_) / MB, 76051145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org SizeOfHeapObjects(), 76061145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org end_memory_size_mb); 76079dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 76089dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com if (external_time > 0) PrintF("%d / ", external_time); 7609c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("%.1f ms", time); 7610c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (steps_count_ > 0) { 7611c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (collector_ == SCAVENGER) { 7612c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF(" (+ %.1f ms in %d steps since last GC)", 7613c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org steps_took_since_last_gc_, 7614c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com steps_count_since_last_gc_); 7615c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 7616c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF(" (+ %.1f ms in %d steps since start of marking, " 7617c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org "biggest step %.1f ms)", 7618c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org steps_took_, 7619c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com steps_count_, 7620c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com longest_step_); 7621c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7622c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7623994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 7624994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (gc_reason_ != NULL) { 7625994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org PrintF(" [%s]", gc_reason_); 7626994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 7627994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 7628994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (collector_reason_ != NULL) { 7629994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org PrintF(" [%s]", collector_reason_); 7630994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 7631994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org 7632c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF(".\n"); 76339dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } else { 7634c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("pause=%.1f ", time); 7635c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("mutator=%.1f ", spent_in_mutator_); 76369dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF("gc="); 76379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com switch (collector_) { 76389dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com case SCAVENGER: 76399dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF("s"); 76409dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com break; 76419dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com case MARK_COMPACTOR: 7642c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF("ms"); 76439dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com break; 76449dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com default: 76459dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com UNREACHABLE(); 76469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 76479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF(" "); 76489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7649c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("external=%.1f ", scopes_[Scope::EXTERNAL]); 7650c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("mark=%.1f ", scopes_[Scope::MC_MARK]); 7651c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("sweep=%.1f ", scopes_[Scope::MC_SWEEP]); 7652c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("sweepns=%.1f ", scopes_[Scope::MC_SWEEP_NEWSPACE]); 7653c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("evacuate=%.1f ", scopes_[Scope::MC_EVACUATE_PAGES]); 7654c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("new_new=%.1f ", scopes_[Scope::MC_UPDATE_NEW_TO_NEW_POINTERS]); 7655c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("root_new=%.1f ", scopes_[Scope::MC_UPDATE_ROOT_TO_NEW_POINTERS]); 7656c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("old_new=%.1f ", scopes_[Scope::MC_UPDATE_OLD_TO_NEW_POINTERS]); 7657c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("compaction_ptrs=%.1f ", 7658c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org scopes_[Scope::MC_UPDATE_POINTERS_TO_EVACUATED]); 7659c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("intracompaction_ptrs=%.1f ", 7660c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org scopes_[Scope::MC_UPDATE_POINTERS_BETWEEN_EVACUATED]); 7661c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("misc_compaction=%.1f ", scopes_[Scope::MC_UPDATE_MISC_POINTERS]); 7662ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org PrintF("weakcollection_process=%.1f ", 7663ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org scopes_[Scope::MC_WEAKCOLLECTION_PROCESS]); 7664ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org PrintF("weakcollection_clear=%.1f ", 7665ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org scopes_[Scope::MC_WEAKCOLLECTION_CLEAR]); 76669dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 76671145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org PrintF("total_size_before=%" V8_PTR_PREFIX "d ", start_object_size_); 7668ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PrintF("total_size_after=%" V8_PTR_PREFIX "d ", heap_->SizeOfObjects()); 7669f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org PrintF("holes_size_before=%" V8_PTR_PREFIX "d ", 7670f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org in_free_list_or_wasted_before_gc_); 76717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org PrintF("holes_size_after=%" V8_PTR_PREFIX "d ", CountTotalHolesSize(heap_)); 76729dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7673f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org PrintF("allocated=%" V8_PTR_PREFIX "d ", allocated_since_last_gc_); 7674f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org PrintF("promoted=%" V8_PTR_PREFIX "d ", promoted_objects_size_); 7675cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org PrintF("nodes_died_in_new=%d ", nodes_died_in_new_space_); 7676cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org PrintF("nodes_copied_in_new=%d ", nodes_copied_in_new_space_); 7677cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org PrintF("nodes_promoted=%d ", nodes_promoted_); 76789dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7679c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (collector_ == SCAVENGER) { 7680c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF("stepscount=%d ", steps_count_since_last_gc_); 7681c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("stepstook=%.1f ", steps_took_since_last_gc_); 7682c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 7683c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PrintF("stepscount=%d ", steps_count_); 7684c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("stepstook=%.1f ", steps_took_); 7685c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintF("longeststep=%.1f ", longest_step_); 7686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7687c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 76889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com PrintF("\n"); 76899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com } 7690e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 7691ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_->PrintShortHeapStatistics(); 76927276f14ca716596e0a0d17539516370c1f453847kasper.lund} 76937276f14ca716596e0a0d17539516370c1f453847kasper.lund 76947276f14ca716596e0a0d17539516370c1f453847kasper.lund 76957276f14ca716596e0a0d17539516370c1f453847kasper.lundconst char* GCTracer::CollectorString() { 76967276f14ca716596e0a0d17539516370c1f453847kasper.lund switch (collector_) { 76977276f14ca716596e0a0d17539516370c1f453847kasper.lund case SCAVENGER: 76987276f14ca716596e0a0d17539516370c1f453847kasper.lund return "Scavenge"; 76997276f14ca716596e0a0d17539516370c1f453847kasper.lund case MARK_COMPACTOR: 7700c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return "Mark-sweep"; 77017276f14ca716596e0a0d17539516370c1f453847kasper.lund } 77027276f14ca716596e0a0d17539516370c1f453847kasper.lund return "Unknown GC"; 77037276f14ca716596e0a0d17539516370c1f453847kasper.lund} 77047276f14ca716596e0a0d17539516370c1f453847kasper.lund 77057276f14ca716596e0a0d17539516370c1f453847kasper.lund 7706750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint KeyedLookupCache::Hash(Map* map, Name* name) { 77075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Uses only lower 32 bits if pointers are larger. 77085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org uintptr_t addr_hash = 770913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org static_cast<uint32_t>(reinterpret_cast<uintptr_t>(map)) >> kMapHashShift; 7710b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org return static_cast<uint32_t>((addr_hash ^ name->Hash()) & kCapacityMask); 77115aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 77125aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77135aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 7714750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint KeyedLookupCache::Lookup(Map* map, Name* name) { 771505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org int index = (Hash(map, name) & kHashMask); 7716659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org for (int i = 0; i < kEntriesPerBucket; i++) { 7717659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org Key& key = keys_[index + i]; 7718659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org if ((key.map == map) && key.name->Equals(name)) { 7719659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return field_offsets_[index + i]; 7720659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 772105ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org } 7722ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return kNotFound; 77235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 77245aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 7726750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgvoid KeyedLookupCache::Update(Map* map, Name* name, int field_offset) { 7727750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (!name->IsUniqueName()) { 7728750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org String* internalized_string; 7729c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (!map->GetIsolate()->heap()->InternalizeStringIfExists( 7730750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org String::cast(name), &internalized_string)) { 7731750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return; 7732659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org } 7733750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org name = internalized_string; 7734750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 7735f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // This cache is cleared only between mark compact passes, so we expect the 7736f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // cache to only contain old space names. 7737c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org ASSERT(!map->GetIsolate()->heap()->InNewSpace(name)); 7738659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 7739750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org int index = (Hash(map, name) & kHashMask); 7740750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // After a GC there will be free slots, so we use them in order (this may 7741750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // help to get the most frequently used one in position 0). 7742750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org for (int i = 0; i< kEntriesPerBucket; i++) { 7743659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org Key& key = keys_[index]; 7744750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Object* free_entry_indicator = NULL; 7745750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (key.map == free_entry_indicator) { 7746750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org key.map = map; 7747750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org key.name = name; 7748750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org field_offsets_[index + i] = field_offset; 7749750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return; 7750750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 77515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org } 7752750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // No free entry found in this bucket, so we move them all down one and 7753750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // put the new entry at position zero. 7754750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org for (int i = kEntriesPerBucket - 1; i > 0; i--) { 7755750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Key& key = keys_[index + i]; 7756750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Key& key2 = keys_[index + i - 1]; 7757750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org key = key2; 7758750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org field_offsets_[index + i] = field_offsets_[index + i - 1]; 7759750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 7760750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 7761750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Write the new first entry. 7762750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org Key& key = keys_[index]; 7763750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org key.map = map; 7764750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org key.name = name; 7765750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org field_offsets_[index] = field_offset; 77665aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 77675aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77685aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77695aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid KeyedLookupCache::Clear() { 77705aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org for (int index = 0; index < kLength; index++) keys_[index].map = NULL; 77715aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 77725aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77735aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77745aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgvoid DescriptorLookupCache::Clear() { 777506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org for (int index = 0; index < kLength; index++) keys_[index].source = NULL; 77765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 77775aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77785aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 77795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#ifdef DEBUG 77804a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgvoid Heap::GarbageCollectionGreedyCheck() { 77815a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org ASSERT(FLAG_gc_greedy); 7782ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (isolate_->bootstrapper()->IsActive()) return; 77834a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (disallow_allocation_failure()) return; 77844a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org CollectGarbage(NEW_SPACE); 77855a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org} 77865a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#endif 77875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 778818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 77893d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgTranscendentalCache::SubCache::SubCache(Isolate* isolate, Type t) 7790ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org : type_(t), 77913d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org isolate_(isolate) { 779218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org uint32_t in0 = 0xffffffffu; // Bit-pattern for a NaN that isn't 779318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org uint32_t in1 = 0xffffffffu; // generated by the FPU. 779418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org for (int i = 0; i < kCacheSize; i++) { 779518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org elements_[i].in[0] = in0; 779618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org elements_[i].in[1] = in1; 779718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org elements_[i].output = NULL; 779818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org } 779918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 780018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 780118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 780218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgvoid TranscendentalCache::Clear() { 780318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org for (int i = 0; i < kNumberOfCaches; i++) { 780418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org if (caches_[i] != NULL) { 780518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org delete caches_[i]; 780618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org caches_[i] = NULL; 780718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org } 780818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org } 780918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 781018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 781118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 781213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgvoid ExternalStringTable::CleanUp() { 781313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org int last = 0; 781413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org for (int i = 0; i < new_space_strings_.length(); ++i) { 781572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org if (new_space_strings_[i] == heap_->the_hole_value()) { 7816c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org continue; 7817c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 7818dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org ASSERT(new_space_strings_[i]->IsExternalString()); 7819ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (heap_->InNewSpace(new_space_strings_[i])) { 782013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org new_space_strings_[last++] = new_space_strings_[i]; 782113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } else { 782213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org old_space_strings_.Add(new_space_strings_[i]); 782313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 782413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 782513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org new_space_strings_.Rewind(last); 782646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org new_space_strings_.Trim(); 782746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 782813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org last = 0; 782913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org for (int i = 0; i < old_space_strings_.length(); ++i) { 783072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org if (old_space_strings_[i] == heap_->the_hole_value()) { 7831c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org continue; 7832c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 7833dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org ASSERT(old_space_strings_[i]->IsExternalString()); 7834ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ASSERT(!heap_->InNewSpace(old_space_strings_[i])); 783513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org old_space_strings_[last++] = old_space_strings_[i]; 783613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 783713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org old_space_strings_.Rewind(last); 783846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org old_space_strings_.Trim(); 7839c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 7840394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (FLAG_verify_heap) { 7841394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Verify(); 7842394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 7843c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 784413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org} 784513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 784613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 784713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgvoid ExternalStringTable::TearDown() { 7848f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org for (int i = 0; i < new_space_strings_.length(); ++i) { 7849f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org heap_->FinalizeExternalString(ExternalString::cast(new_space_strings_[i])); 7850f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } 785113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org new_space_strings_.Free(); 7852f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org for (int i = 0; i < old_space_strings_.length(); ++i) { 7853f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org heap_->FinalizeExternalString(ExternalString::cast(old_space_strings_[i])); 7854f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org } 785513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org old_space_strings_.Free(); 785613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org} 785713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 785813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 7859c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::QueueMemoryChunkForFree(MemoryChunk* chunk) { 7860c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com chunk->set_next_chunk(chunks_queued_for_free_); 7861c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com chunks_queued_for_free_ = chunk; 7862c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 7863c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 7864c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 7865c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Heap::FreeQueuedChunks() { 7866c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (chunks_queued_for_free_ == NULL) return; 7867c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* next; 7868c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* chunk; 7869c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { 7870c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next = chunk->next_chunk(); 7871c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com chunk->SetFlag(MemoryChunk::ABOUT_TO_BE_FREED); 7872c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 7873c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (chunk->owner()->identity() == LO_SPACE) { 7874c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // StoreBuffer::Filter relies on MemoryChunk::FromAnyPointerAddress. 7875c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // If FromAnyPointerAddress encounters a slot that belongs to a large 7876c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // chunk queued for deletion it will fail to find the chunk because 7877c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // it try to perform a search in the list of pages owned by of the large 7878c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // object space and queued chunks were detached from that list. 7879c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // To work around this we split large chunk into normal kPageSize aligned 78802c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // pieces and initialize size, owner and flags field of every piece. 78812c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org // If FromAnyPointerAddress encounters a slot that belongs to one of 7882c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // these smaller pieces it will treat it as a slot on a normal Page. 78839a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org Address chunk_end = chunk->address() + chunk->size(); 7884c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* inner = MemoryChunk::FromAddress( 7885c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com chunk->address() + Page::kPageSize); 78869a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org MemoryChunk* inner_last = MemoryChunk::FromAddress(chunk_end - 1); 7887c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (inner <= inner_last) { 7888c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Size of a large chunk is always a multiple of 788904e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org // OS::AllocateAlignment() so there is always 7890c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // enough space for a fake MemoryChunk header. 78919a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org Address area_end = Min(inner->address() + Page::kPageSize, chunk_end); 78929a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // Guard against overflow. 78939a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org if (area_end < inner->address()) area_end = chunk_end; 78949a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org inner->SetArea(inner->address(), area_end); 78952c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org inner->set_size(Page::kPageSize); 7896c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner->set_owner(lo_space()); 7897c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner->SetFlag(MemoryChunk::ABOUT_TO_BE_FREED); 7898c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner = MemoryChunk::FromAddress( 7899c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner->address() + Page::kPageSize); 7900c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7901c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7902c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7903c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com isolate_->heap()->store_buffer()->Compact(); 7904c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); 7905c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { 7906c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next = chunk->next_chunk(); 7907c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com isolate_->memory_allocator()->Free(chunk); 7908c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 7909c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com chunks_queued_for_free_ = NULL; 7910c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 7911c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 79122c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 79132c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgvoid Heap::RememberUnmappedPage(Address page, bool compacted) { 79142c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org uintptr_t p = reinterpret_cast<uintptr_t>(page); 79152c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org // Tag the page pointer to make it findable in the dump file. 79162c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org if (compacted) { 79172c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org p ^= 0xc1ead & (Page::kPageSize - 1); // Cleared. 79182c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org } else { 79192c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org p ^= 0x1d1ed & (Page::kPageSize - 1); // I died. 79202c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org } 79212c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org remembered_unmapped_pages_[remembered_unmapped_pages_index_] = 79222c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org reinterpret_cast<Address>(p); 79232c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org remembered_unmapped_pages_index_++; 79242c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org remembered_unmapped_pages_index_ %= kRememberedUnmappedPages; 79252c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org} 79262c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 792728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 792828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgvoid Heap::ClearObjectStats(bool clear_last_time_stats) { 792928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org memset(object_counts_, 0, sizeof(object_counts_)); 793028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org memset(object_sizes_, 0, sizeof(object_sizes_)); 793128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org if (clear_last_time_stats) { 793228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org memset(object_counts_last_time_, 0, sizeof(object_counts_last_time_)); 793328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org memset(object_sizes_last_time_, 0, sizeof(object_sizes_last_time_)); 793428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org } 793528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org} 793628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 793728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 793828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgstatic LazyMutex checkpoint_object_stats_mutex = LAZY_MUTEX_INITIALIZER; 793928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 794028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 794128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgvoid Heap::CheckpointObjectStats() { 7942dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org LockGuard<Mutex> lock_guard(checkpoint_object_stats_mutex.Pointer()); 794328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org Counters* counters = isolate()->counters(); 794428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \ 794528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org counters->count_of_##name()->Increment( \ 794628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static_cast<int>(object_counts_[name])); \ 794728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org counters->count_of_##name()->Decrement( \ 794828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static_cast<int>(object_counts_last_time_[name])); \ 794928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org counters->size_of_##name()->Increment( \ 795028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static_cast<int>(object_sizes_[name])); \ 795128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org counters->size_of_##name()->Decrement( \ 795228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org static_cast<int>(object_sizes_last_time_[name])); 795328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT) 795428583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org#undef ADJUST_LAST_TIME_OBJECT_COUNT 7955753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org int index; 7956753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \ 7957753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org index = FIRST_CODE_KIND_SUB_TYPE + Code::name; \ 7958753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org counters->count_of_CODE_TYPE_##name()->Increment( \ 7959753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(object_counts_[index])); \ 7960753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org counters->count_of_CODE_TYPE_##name()->Decrement( \ 7961753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(object_counts_last_time_[index])); \ 7962753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org counters->size_of_CODE_TYPE_##name()->Increment( \ 7963753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(object_sizes_[index])); \ 7964753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org counters->size_of_CODE_TYPE_##name()->Decrement( \ 7965753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org static_cast<int>(object_sizes_last_time_[index])); 7966753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org CODE_KIND_LIST(ADJUST_LAST_TIME_OBJECT_COUNT) 7967753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org#undef ADJUST_LAST_TIME_OBJECT_COUNT 7968304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \ 7969304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org index = FIRST_FIXED_ARRAY_SUB_TYPE + name; \ 7970304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org counters->count_of_FIXED_ARRAY_##name()->Increment( \ 7971304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static_cast<int>(object_counts_[index])); \ 7972304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org counters->count_of_FIXED_ARRAY_##name()->Decrement( \ 7973304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static_cast<int>(object_counts_last_time_[index])); \ 7974304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org counters->size_of_FIXED_ARRAY_##name()->Increment( \ 7975304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static_cast<int>(object_sizes_[index])); \ 7976304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org counters->size_of_FIXED_ARRAY_##name()->Decrement( \ 7977304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org static_cast<int>(object_sizes_last_time_[index])); 7978304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT) 7979304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#undef ADJUST_LAST_TIME_OBJECT_COUNT 7980057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \ 7981057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org index = \ 7982057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - Code::kFirstCodeAge; \ 7983057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org counters->count_of_CODE_AGE_##name()->Increment( \ 7984057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static_cast<int>(object_counts_[index])); \ 7985057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org counters->count_of_CODE_AGE_##name()->Decrement( \ 7986057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static_cast<int>(object_counts_last_time_[index])); \ 7987057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org counters->size_of_CODE_AGE_##name()->Increment( \ 7988057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org static_cast<int>(object_sizes_[index])); \ 7989057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org counters->size_of_CODE_AGE_##name()->Decrement( \ 7990e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org static_cast<int>(object_sizes_last_time_[index])); 7991057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 7992e94b5ff1e1e95fb2c8ef6bce66ce8533786d9792bmeurer@chromium.org#undef ADJUST_LAST_TIME_OBJECT_COUNT 7993753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org 7994e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 7995e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 799628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org ClearObjectStats(); 799728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org} 799828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 799943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 8000