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