1fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Redistribution and use in source and binary forms, with or without
3750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// modification, are permitted provided that the following conditions are
4750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// met:
5750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
6750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions of source code must retain the above copyright
7750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       notice, this list of conditions and the following disclaimer.
8750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions in binary form must reproduce the above
9750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       copyright notice, this list of conditions and the following
10750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       disclaimer in the documentation and/or other materials provided
11750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       with the distribution.
12750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Neither the name of Google Inc. nor the names of its
13750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       contributors may be used to endorse or promote products derived
14750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       from this software without specific prior written permission.
15750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
16750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h>
294f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org#include <utility>
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compilation-cache.h"
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/execution.h"
35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/global-handles.h"
37a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#include "src/ic/ic.h"
38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h"
39196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void CheckMap(Map* map, int type, int instance_size) {
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(map->IsHeapObject());
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG
46528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->Contains(map));
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
48528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK_EQ(CcTest::heap()->meta_map(), map->map());
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(type, map->instance_type());
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(instance_size, map->instance_size());
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(HeapMaps) {
55e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
56528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Heap* heap = CcTest::heap();
57528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckMap(heap->meta_map(), MAP_TYPE, Map::kSize);
58528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckMap(heap->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize);
59528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckMap(heap->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel);
60528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CheckMap(heap->string_map(), STRING_TYPE, kVariableSizeSentinel);
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckOddball(Isolate* isolate, Object* obj, const char* string) {
659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(obj->IsOddball());
66e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  Handle<Object> handle(obj, isolate);
6709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Object* print_string =
682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      *Execution::ToString(isolate, handle).ToHandleChecked();
6959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string)));
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckSmi(Isolate* isolate, int value, const char* string) {
74e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  Handle<Object> handle(Smi::FromInt(value), isolate);
759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Object* print_string =
762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      *Execution::ToString(isolate, handle).ToHandleChecked();
7759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string)));
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckNumber(Isolate* isolate, double value, const char* string) {
82731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  Handle<Object> number = isolate->factory()->NewNumber(value);
83731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK(number->IsNumber());
84731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  Handle<Object> print_string =
85731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org      Execution::ToString(isolate, number).ToHandleChecked();
86731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK(String::cast(*print_string)->IsUtf8EqualTo(CStrVector(string)));
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckFindCodeObject(Isolate* isolate) {
919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Test FindCodeObject
929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#define __ assm.
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, NULL, 0);
959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ nop();  // supported on all architectures
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
1009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
1019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(code->IsCode());
1039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapObject* obj = HeapObject::cast(*code);
1059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Address obj_addr = obj->address();
1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int i = 0; i < obj->Size(); i += kPointerSize) {
108ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    Object* found = isolate->FindCodeObject(obj_addr + i);
1099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK_EQ(*code, found);
1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<Code> copy = isolate->factory()->NewCode(
1139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
1149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapObject* obj_copy = HeapObject::cast(*copy);
115ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Object* not_right = isolate->FindCodeObject(obj_copy->address() +
116ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                              obj_copy->Size() / 2);
1179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CHECK(not_right != *code);
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
12169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.orgTEST(HandleNull) {
12269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  CcTest::InitializeVM();
12369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
12469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  HandleScope outer_scope(isolate);
12569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  LocalContext context;
12669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  Handle<Object> n(reinterpret_cast<Object*>(NULL), isolate);
12769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  CHECK(!n.is_null());
12869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org}
12969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
13069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(HeapObjects) {
132e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
133528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
134d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
13509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Heap* heap = isolate->heap();
1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope sc(isolate);
138731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  Handle<Object> value = factory->NewNumber(1.000123);
1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsHeapNumber());
1409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(1.000123, value->Number());
1429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
143731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumber(1.0);
1449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(1.0, value->Number());
1479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
148731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumberFromInt(1024);
1499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(1024.0, value->Number());
1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
153731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumberFromInt(Smi::kMinValue);
1549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
156731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(Smi::kMinValue, Handle<Smi>::cast(value)->value());
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
158731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumberFromInt(Smi::kMaxValue);
1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
161731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK_EQ(Smi::kMaxValue, Handle<Smi>::cast(value)->value());
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#if !defined(V8_TARGET_ARCH_X64) && !defined(V8_TARGET_ARCH_ARM64) && \
16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    !defined(V8_TARGET_ARCH_MIPS64)
1659d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // TODO(lrn): We need a NumberFromIntptr function in order to test this.
166731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumberFromInt(Smi::kMinValue - 1);
1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsHeapNumber());
1689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(static_cast<double>(Smi::kMinValue - 1), value->Number());
1709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#endif
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
172731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1);
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsHeapNumber());
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  CHECK_EQ(static_cast<double>(static_cast<uint32_t>(Smi::kMaxValue) + 1),
1769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com           value->Number());
1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
178731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  value = factory->NewNumberFromUint(static_cast<uint32_t>(1) << 31);
17959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(value->IsHeapNumber());
18059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(value->IsNumber());
18159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK_EQ(static_cast<double>(static_cast<uint32_t>(1) << 31),
18259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org           value->Number());
18359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // nan oddball checks
185731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK(factory->nan_value()->IsNumber());
186731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  CHECK(std::isnan(factory->nan_value()->Number()));
1879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Handle<String> s = factory->NewStringFromStaticChars("fisk hest ");
189ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(s->IsString());
190ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(10, s->length());
1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
192528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<String> object_string = Handle<String>::cast(factory->Object_string());
193528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object());
194eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(global, object_string);
195eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
196eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check ToString for oddballs
19909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->true_value(), "true");
20009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->false_value(), "false");
20109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->null_value(), "null");
20209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->undefined_value(), "undefined");
2039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check ToString for Smis
20509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckSmi(isolate, 0, "0");
20609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckSmi(isolate, 42, "42");
20709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckSmi(isolate, -42, "-42");
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check ToString for Numbers
21009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckNumber(isolate, 1.1, "1.1");
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
21209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckFindCodeObject(isolate);
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Tagging) {
217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
21871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  int request = 24;
21930ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request)));
2209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Smi::FromInt(42)->IsSmi());
2219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi());
2229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi());
2239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(GarbageCollection) {
227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
228528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
229c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
230c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2322bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope sc(isolate);
233ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Check GC.
234c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
2359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
236528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object());
2374a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> name = factory->InternalizeUtf8String("theFunction");
2384a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
2394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> prop_namex = factory->InternalizeUtf8String("theSlotx");
2404a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> obj_name = factory->InternalizeUtf8String("theObject");
241528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> twenty_three(Smi::FromInt(23), isolate);
242528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> twenty_four(Smi::FromInt(24), isolate);
243ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
244ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
245c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
246ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    // Allocate a function and keep it in global object's property.
2473c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    Handle<JSFunction> function = factory->NewFunction(name);
2489bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    JSReceiver::SetProperty(global, name, function, SLOPPY).Check();
249ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    // Allocate an object.  Unrooted after leaving the scope.
250c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<JSObject> obj = factory->NewJSObject(function);
2519bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check();
2529bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    JSReceiver::SetProperty(obj, prop_namex, twenty_four, SLOPPY).Check();
253ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    CHECK_EQ(Smi::FromInt(23),
2552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org             *Object::GetProperty(obj, prop_name).ToHandleChecked());
2562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    CHECK_EQ(Smi::FromInt(24),
2572ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org             *Object::GetProperty(obj, prop_namex).ToHandleChecked());
258ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
260c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
2619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
262ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Function should be alive.
263eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(global, name);
264eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
265eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
266ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Check function is retained.
2672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> func_value =
2682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(global, name).ToHandleChecked();
2699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(func_value->IsJSFunction());
2705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
271ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
272ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
273c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
274ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    // Allocate another object, make it reachable from global.
275c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<JSObject> obj = factory->NewJSObject(function);
2769bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    JSReceiver::SetProperty(global, obj_name, obj, SLOPPY).Check();
2779bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check();
278ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
280ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // After gc, it should survive.
281c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
2829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
283eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(global, obj_name);
284eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
285eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
2862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> obj =
2872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(global, obj_name).ToHandleChecked();
2885b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CHECK(obj->IsJSObject());
2892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK_EQ(Smi::FromInt(23),
2902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           *Object::GetProperty(obj, prop_name).ToHandleChecked());
2919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2942bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgstatic void VerifyStringAllocation(Isolate* isolate, const char* string) {
2952bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
2968496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<String> s = isolate->factory()->NewStringFromUtf8(
2978496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org      CStrVector(string)).ToHandleChecked();
298c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(StrLength(string), s->length());
299bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  for (int index = 0; index < s->length(); index++) {
300ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index));
301ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
3029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(String) {
306e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
307e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
3089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3092bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "a");
3102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "ab");
3112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "abc");
3122bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "abcd");
3132bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "fiskerdrengen er paa havet");
3149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(LocalHandles) {
318e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
319528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
320d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
3219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* name = "Kasper the spunky";
3248496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<String> string = factory->NewStringFromAsciiChecked(name);
325c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(StrLength(name), string->length());
3269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(GlobalHandles) {
330e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
331528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
332c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
333c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
334c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
3359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
336ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h1;
337ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h2;
338ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h3;
339ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h4;
340ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
341ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
342c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
3439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<Object> i = factory->NewStringFromStaticChars("fisk");
345c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> u = factory->NewNumber(1.12344);
346ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
347ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h1 = global_handles->Create(*i);
348ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h2 = global_handles->Create(*u);
349ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h3 = global_handles->Create(*i);
350ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h4 = global_handles->Create(*u);
351ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
3529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // after gc, it should survive
354c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
3559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h1)->IsString());
3579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h2)->IsHeapNumber());
3589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h3)->IsString());
3599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h4)->IsHeapNumber());
3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(*h3, *h1);
3624f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h1.location());
3634f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h3.location());
3649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(*h4, *h2);
3664f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h2.location());
3674f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h4.location());
3689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic bool WeakPointerCleared = false;
3729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3734f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.orgstatic void TestWeakGlobalHandleCallback(
3744f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org    const v8::WeakCallbackData<v8::Value, void>& data) {
3754f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  std::pair<v8::Persistent<v8::Value>*, int>* p =
3764f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>(
3774f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org          data.GetParameter());
3784f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  if (p->second == 1234) WeakPointerCleared = true;
3794f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  p->first->Reset();
3809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(WeakGlobalHandlesScavenge) {
3841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
385e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
386528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
387c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
388c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
389c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
3909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  WeakPointerCleared = false;
3929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
393ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h1;
394ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h2;
395ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
396ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
397c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
3989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<Object> i = factory->NewStringFromStaticChars("fisk");
400c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> u = factory->NewNumber(1.12344);
401ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
402ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h1 = global_handles->Create(*i);
403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h2 = global_handles->Create(*u);
404ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
4059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4064f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234);
4074f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::MakeWeak(h2.location(),
4084f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                          reinterpret_cast<void*>(&handle_and_id),
4094f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                          &TestWeakGlobalHandleCallback);
4109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Scavenge treats weak pointers as normal roots.
412f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  heap->CollectGarbage(NEW_SPACE);
4139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h1)->IsString());
4159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h2)->IsHeapNumber());
4169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!WeakPointerCleared);
418ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(!global_handles->IsNearDeath(h2.location()));
419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(!global_handles->IsNearDeath(h1.location()));
4209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4214f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h1.location());
4224f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h2.location());
4239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
4249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(WeakGlobalHandlesMark) {
427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
428528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
429c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
430c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
431c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
4329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  WeakPointerCleared = false;
4349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
435ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h1;
436ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h2;
437ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
438ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
439c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
4409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<Object> i = factory->NewStringFromStaticChars("fisk");
442c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> u = factory->NewNumber(1.12344);
443ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h1 = global_handles->Create(*i);
445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h2 = global_handles->Create(*u);
446ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
4479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4485323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Make sure the objects are promoted.
449c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(OLD_POINTER_SPACE);
450c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
451c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2));
4529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4534f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234);
4544f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::MakeWeak(h2.location(),
4554f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                          reinterpret_cast<void*>(&handle_and_id),
4564f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                          &TestWeakGlobalHandleCallback);
4579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!GlobalHandles::IsNearDeath(h1.location()));
4589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!GlobalHandles::IsNearDeath(h2.location()));
4599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4605323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Incremental marking potentially marked handles before they turned weak.
461c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
4629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h1)->IsString());
4649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(WeakPointerCleared);
4669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!GlobalHandles::IsNearDeath(h1.location()));
4679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4684f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::Destroy(h1.location());
4699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
4709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
471471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
4729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DeleteWeakGlobalHandle) {
4731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
474e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
475528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
476c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
477c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
478c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
4799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  WeakPointerCleared = false;
4819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
482ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h;
483ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
484ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
485c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
486ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
4872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<Object> i = factory->NewStringFromStaticChars("fisk");
488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h = global_handles->Create(*i);
489ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
4909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4914f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  std::pair<Handle<Object>*, int> handle_and_id(&h, 1234);
4924f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  GlobalHandles::MakeWeak(h.location(),
4934f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                          reinterpret_cast<void*>(&handle_and_id),
4944f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                          &TestWeakGlobalHandleCallback);
4959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Scanvenge does not recognize weak reference.
497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  heap->CollectGarbage(NEW_SPACE);
4989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!WeakPointerCleared);
5009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Mark-compact treats weak reference properly.
502c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(OLD_POINTER_SPACE);
5039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(WeakPointerCleared);
5059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
5069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
507471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
5089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic const char* not_so_random_string_table[] = {
5099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "abstract",
5109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "boolean",
5119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "break",
5129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "byte",
5139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "case",
5149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "catch",
5159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "char",
5169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "class",
5179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "const",
5189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "continue",
5199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "debugger",
5209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "default",
5219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "delete",
5229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "do",
5239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "double",
5249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "else",
5259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "enum",
5269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "export",
5279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "extends",
5289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "false",
5299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "final",
5309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "finally",
5319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "float",
5329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "for",
5339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "function",
5349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "goto",
5359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "if",
5369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "implements",
5379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "import",
5389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "in",
5399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "instanceof",
5409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "int",
5419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "interface",
5429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "long",
5439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "native",
5449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "new",
5459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "null",
5469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "package",
5479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "private",
5489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "protected",
5499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "public",
5509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "return",
5519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "short",
5529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "static",
5539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "super",
5549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "switch",
5559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "synchronized",
5569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "this",
5579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "throw",
5589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "throws",
5599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "transient",
5609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "true",
5619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "try",
5629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "typeof",
5639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "var",
5649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "void",
5659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "volatile",
5669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "while",
5679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "with",
5689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  0
5699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
5709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgstatic void CheckInternalizedStrings(const char** strings) {
5733484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  Isolate* isolate = CcTest::i_isolate();
5743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  Factory* factory = isolate->factory();
5759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (const char* string = *strings; *strings != 0; string = *strings++) {
5763484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    HandleScope scope(isolate);
5773484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    Handle<String> a =
5783484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        isolate->factory()->InternalizeUtf8String(CStrVector(string));
5793484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    // InternalizeUtf8String may return a failure if a GC is needed.
5804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    CHECK(a->IsInternalizedString());
581b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org    Handle<String> b = factory->InternalizeUtf8String(string);
582b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org    CHECK_EQ(*b, *a);
5833484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    CHECK(b->IsUtf8EqualTo(CStrVector(string)));
5843484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    b = isolate->factory()->InternalizeUtf8String(CStrVector(string));
5853484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    CHECK_EQ(*b, *a);
5863484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    CHECK(b->IsUtf8EqualTo(CStrVector(string)));
5879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
5889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
5899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgTEST(StringTable) {
592e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
5939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
594b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  v8::HandleScope sc(CcTest::isolate());
5954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CheckInternalizedStrings(not_so_random_string_table);
5964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CheckInternalizedStrings(not_so_random_string_table);
5979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
5989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(FunctionAllocation) {
601e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
602528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
603d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
6049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
605e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
606d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> name = factory->InternalizeUtf8String("theFunction");
6073c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  Handle<JSFunction> function = factory->NewFunction(name);
608ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
609528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> twenty_three(Smi::FromInt(23), isolate);
610528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> twenty_four(Smi::FromInt(24), isolate);
611528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
612d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
613d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(function);
6149bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check();
6152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK_EQ(Smi::FromInt(23),
6162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           *Object::GetProperty(obj, prop_name).ToHandleChecked());
6179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check that we can add properties to function objects.
6189bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(function, prop_name, twenty_four, SLOPPY).Check();
6192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK_EQ(Smi::FromInt(24),
6202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           *Object::GetProperty(function, prop_name).ToHandleChecked());
6219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
6229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ObjectProperties) {
625e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
626528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
627d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
6289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
629e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
6305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<String> object_string(String::cast(CcTest::heap()->Object_string()));
6312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> object = Object::GetProperty(
6322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      CcTest::i_isolate()->global_object(), object_string).ToHandleChecked();
6335b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> constructor = Handle<JSFunction>::cast(object);
634d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(constructor);
635d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> first = factory->InternalizeUtf8String("first");
636d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> second = factory->InternalizeUtf8String("second");
6379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
638528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> one(Smi::FromInt(1), isolate);
639528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> two(Smi::FromInt(2), isolate);
640528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
6419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // check for empty
642eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(obj, first);
643eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
644eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(!maybe.value);
6459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // add first
6479bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, first, one, SLOPPY).Check();
648eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
649eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
650eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
6519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // delete first
6539e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::DeleteProperty(obj, first, JSReceiver::NORMAL_DELETION).Check();
654eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
655eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
656eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(!maybe.value);
6579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // add first and then second
6599bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, first, one, SLOPPY).Check();
6609bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, second, two, SLOPPY).Check();
661eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
662eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
663eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
664eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, second);
665eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
666eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
6679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // delete first and then second
6699e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::DeleteProperty(obj, first, JSReceiver::NORMAL_DELETION).Check();
670eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, second);
671eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
672eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
6739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::DeleteProperty(obj, second, JSReceiver::NORMAL_DELETION).Check();
674eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
675eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
676eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(!maybe.value);
677eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, second);
678eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
679eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(!maybe.value);
6809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // add first and then second
6829bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, first, one, SLOPPY).Check();
6839bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, second, two, SLOPPY).Check();
684eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
685eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
686eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
687eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, second);
688eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
689eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
6909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // delete second and then first
6929e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::DeleteProperty(obj, second, JSReceiver::NORMAL_DELETION).Check();
693eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
694eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
695eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
6969e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::DeleteProperty(obj, first, JSReceiver::NORMAL_DELETION).Check();
697eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, first);
698eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
699eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(!maybe.value);
700eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, second);
701eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
702eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(!maybe.value);
7039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // check string and internalized string match
705fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  const char* string1 = "fisk";
7068496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<String> s1 = factory->NewStringFromAsciiChecked(string1);
7079bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, s1, one, SLOPPY).Check();
708d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s1_string = factory->InternalizeUtf8String(string1);
709eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, s1_string);
710eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
711eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
7129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // check internalized string and string match
714fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  const char* string2 = "fugl";
715d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s2_string = factory->InternalizeUtf8String(string2);
7169bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, s2_string, one, SLOPPY).Check();
7178496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<String> s2 = factory->NewStringFromAsciiChecked(string2);
718eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  maybe = JSReceiver::HasOwnProperty(obj, s2);
719eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.has_value);
720eb81c479217278e101fc47fd29872a7e68f02402machenbach@chromium.org  CHECK(maybe.value);
7219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
7229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(JSObjectMaps) {
725e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
726528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
727d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
7289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
729e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
730d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> name = factory->InternalizeUtf8String("theFunction");
7313c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  Handle<JSFunction> function = factory->NewFunction(name);
732ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
733d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
734d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(function);
7353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  Handle<Map> initial_map(function->initial_map());
7369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Set a propery
738528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> twenty_three(Smi::FromInt(23), isolate);
7399bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check();
7402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK_EQ(Smi::FromInt(23),
7412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           *Object::GetProperty(obj, prop_name).ToHandleChecked());
7429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check the map has changed
744ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(*initial_map != obj->map());
7459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
7469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(JSArray) {
749e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
750528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
751d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
7529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
753e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
754d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> name = factory->InternalizeUtf8String("Array");
7552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> fun_obj = Object::GetProperty(
7562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      CcTest::i_isolate()->global_object(), name).ToHandleChecked();
7575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function = Handle<JSFunction>::cast(fun_obj);
7589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Allocate the object.
7608496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<Object> element;
761d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> object = factory->NewJSObject(function);
762ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSArray> array = Handle<JSArray>::cast(object);
763d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // We just initialized the VM, no heap allocation failure yet.
7644452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  JSArray::Initialize(array, 0);
7659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Set array length to 0.
7675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  JSArray::SetElementsLength(array, handle(Smi::FromInt(0), isolate)).Check();
7689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(Smi::FromInt(0), array->length());
769c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Must be in fast mode.
770830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  CHECK(array->HasFastSmiOrObjectElements());
7719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // array[length] = name.
7739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::SetElement(array, 0, name, NONE, SLOPPY).Check();
7749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(Smi::FromInt(1), array->length());
7758496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  element = i::Object::GetElement(isolate, array, 0).ToHandleChecked();
7768496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*element, *name);
7779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
778ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Set array length with larger than smi value.
779ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> length =
780d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1);
7815b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  JSArray::SetElementsLength(array, length).Check();
7829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  uint32_t int_length = 0;
78430ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK(length->ToArrayIndex(&int_length));
785ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(*length, array->length());
7860b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  CHECK(array->HasDictionaryElements());  // Must be in slow mode.
7879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // array[length] = name.
7899e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::SetElement(array, int_length, name, NONE, SLOPPY).Check();
7909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  uint32_t new_int_length = 0;
79130ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK(array->length()->ToArrayIndex(&new_int_length));
7929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(static_cast<double>(int_length), new_int_length - 1);
7938496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  element = Object::GetElement(isolate, array, int_length).ToHandleChecked();
7948496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*element, *name);
7958496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  element = Object::GetElement(isolate, array, 0).ToHandleChecked();
7968496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*element, *name);
7979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
7989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(JSObjectCopy) {
801e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
802528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
803d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
8049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
805e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
8065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<String> object_string(String::cast(CcTest::heap()->Object_string()));
8072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> object = Object::GetProperty(
8082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      CcTest::i_isolate()->global_object(), object_string).ToHandleChecked();
8095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> constructor = Handle<JSFunction>::cast(object);
810d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(constructor);
811d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> first = factory->InternalizeUtf8String("first");
812d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> second = factory->InternalizeUtf8String("second");
8139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
814528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> one(Smi::FromInt(1), isolate);
815528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Smi> two(Smi::FromInt(2), isolate);
816528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
8179bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, first, one, SLOPPY).Check();
8189bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(obj, second, two, SLOPPY).Check();
8199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8209e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::SetElement(obj, 0, first, NONE, SLOPPY).Check();
8219e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::SetElement(obj, 1, second, NONE, SLOPPY).Check();
8229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Make the clone.
8248496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  Handle<Object> value1, value2;
8253484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  Handle<JSObject> clone = factory->CopyJSObject(obj);
826ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!clone.is_identical_to(obj));
8279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8288496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetElement(isolate, obj, 0).ToHandleChecked();
8298496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetElement(isolate, clone, 0).ToHandleChecked();
8308496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8318496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetElement(isolate, obj, 1).ToHandleChecked();
8328496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetElement(isolate, clone, 1).ToHandleChecked();
8338496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8358496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetProperty(obj, first).ToHandleChecked();
8368496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetProperty(clone, first).ToHandleChecked();
8378496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8388496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetProperty(obj, second).ToHandleChecked();
8398496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetProperty(clone, second).ToHandleChecked();
8408496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Flip the values.
8439bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(clone, first, two, SLOPPY).Check();
8449bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(clone, second, one, SLOPPY).Check();
8459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8469e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::SetElement(clone, 0, second, NONE, SLOPPY).Check();
8479e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  JSReceiver::SetElement(clone, 1, first, NONE, SLOPPY).Check();
8489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8498496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetElement(isolate, obj, 1).ToHandleChecked();
8508496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetElement(isolate, clone, 0).ToHandleChecked();
8518496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8528496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetElement(isolate, obj, 0).ToHandleChecked();
8538496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetElement(isolate, clone, 1).ToHandleChecked();
8548496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8568496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetProperty(obj, second).ToHandleChecked();
8578496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetProperty(clone, first).ToHandleChecked();
8588496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8598496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value1 = Object::GetProperty(obj, first).ToHandleChecked();
8608496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  value2 = Object::GetProperty(clone, second).ToHandleChecked();
8618496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  CHECK_EQ(*value1, *value2);
8629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
8639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(StringAllocation) {
866e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
867528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
868d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
8699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 };
8719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int length = 0; length < 100; length++) {
872e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope scope(CcTest::isolate());
8732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    char* non_one_byte = NewArray<char>(3 * length + 1);
8742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    char* one_byte = NewArray<char>(length + 1);
8752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    non_one_byte[3 * length] = 0;
8762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    one_byte[length] = 0;
8779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    for (int i = 0; i < length; i++) {
8782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      one_byte[i] = 'a';
8792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      non_one_byte[3 * i] = chars[0];
8802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      non_one_byte[3 * i + 1] = chars[1];
8812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      non_one_byte[3 * i + 2] = chars[2];
8829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
8832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<String> non_one_byte_sym = factory->InternalizeUtf8String(
8842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org        Vector<const char>(non_one_byte, 3 * length));
8852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    CHECK_EQ(length, non_one_byte_sym->length());
8862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<String> one_byte_sym =
8872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org        factory->InternalizeOneByteString(OneByteVector(one_byte, length));
8882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    CHECK_EQ(length, one_byte_sym->length());
8892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<String> non_one_byte_str =
8902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org        factory->NewStringFromUtf8(Vector<const char>(non_one_byte, 3 * length))
8912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org            .ToHandleChecked();
8922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    non_one_byte_str->Hash();
8932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    CHECK_EQ(length, non_one_byte_str->length());
8942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Handle<String> one_byte_str =
8952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org        factory->NewStringFromUtf8(Vector<const char>(one_byte, length))
8962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org            .ToHandleChecked();
8972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    one_byte_str->Hash();
8982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    CHECK_EQ(length, one_byte_str->length());
8992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    DeleteArray(non_one_byte);
9002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    DeleteArray(one_byte);
9019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
9029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
9039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9057c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgstatic int ObjectsFoundInHeap(Heap* heap, Handle<Object> objs[], int size) {
9069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Count the number of objects found in the heap.
9079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int found_count = 0;
9087c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  HeapIterator iterator(heap);
909b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
9109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    for (int i = 0; i < size; i++) {
9119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      if (*objs[i] == obj) {
9129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        found_count++;
9139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      }
9149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
9159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
9169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return found_count;
9179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
9189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Iteration) {
921e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
922528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
923d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
924e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
9259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Array of objects to scan haep for.
9279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const int objs_count = 6;
9289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<Object> objs[objs_count];
9299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int next_objs_index = 0;
9309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9319258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE
932d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  objs[next_objs_index++] = factory->NewJSArray(10);
933d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  objs[next_objs_index++] = factory->NewJSArray(10,
934830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org                                                FAST_HOLEY_ELEMENTS,
935830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org                                                TENURED);
9369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9379258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE
9382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  objs[next_objs_index++] = factory->NewStringFromStaticChars("abcdefghij");
9399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  objs[next_objs_index++] =
9402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      factory->NewStringFromStaticChars("abcdefghij", TENURED);
9419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Allocate a large string (for large object space).
943ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org  int large_size = Page::kMaxRegularHeapObjectSize + 1;
9449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  char* str = new char[large_size];
9459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int i = 0; i < large_size - 1; ++i) str[i] = 'a';
9469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  str[large_size - 1] = '\0';
9478496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  objs[next_objs_index++] = factory->NewStringFromAsciiChecked(str, TENURED);
9489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  delete[] str;
9499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Add a Map object to look for.
9519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map());
9529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(objs_count, next_objs_index);
954528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK_EQ(objs_count, ObjectsFoundInHeap(CcTest::heap(), objs, objs_count));
9559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
956df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org
957df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org
958b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(EmptyHandleEscapeFrom) {
959e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
960b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
961e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
962b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Handle<JSObject> runaway;
963b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
964b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  {
965ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org      v8::EscapableHandleScope nested(CcTest::isolate());
966b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      Handle<JSObject> empty;
967b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      runaway = empty.EscapeFrom(&nested);
968b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  }
969b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
970b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(runaway.is_null());
971b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
972b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
973b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
974b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgstatic int LenFromSize(int size) {
975b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  return (size - FixedArray::kHeaderSize) / kPointerSize;
976b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
977b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
978b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
979b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(Regression39128) {
980b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Test case for crbug.com/39128.
981e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
982528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
9833484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  TestHeap* heap = CcTest::test_heap();
984b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
985b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Increase the chance of 'bump-the-pointer' allocation in old space.
986528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
987b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
988e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
989b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
990b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // The plan: create JSObject which references objects in new space.
991b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Then clone this object (forcing it to go into old space) and check
99230ce411529579186181838984710b0b0980857aaricow@chromium.org  // that region dirty marks are updated correctly.
993b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
994b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 1: prepare a map for the object.  We add 1 inobject property to it.
995b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Create a map with single inobject property.
996a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Handle<Map> my_map = Map::Create(CcTest::i_isolate(), 1);
997b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int n_properties = my_map->inobject_properties();
998b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK_GT(n_properties, 0);
999b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1000b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int object_size = my_map->instance_size();
1001b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1002b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 2: allocate a lot of objects so to almost fill new space: we need
1003b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // just enough room to allocate JSObject and thus fill the newspace.
1004b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1005b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int allocation_amount = Min(FixedArray::kMaxSize,
1006ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org                              Page::kMaxRegularHeapObjectSize + kPointerSize);
1007b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int allocation_len = LenFromSize(allocation_amount);
1008528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  NewSpace* new_space = heap->new_space();
1009b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Address* top_addr = new_space->allocation_top_address();
1010b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Address* limit_addr = new_space->allocation_limit_address();
1011b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  while ((*limit_addr - *top_addr) > allocation_amount) {
1012528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CHECK(!heap->always_allocate());
1013a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    Object* array = heap->AllocateFixedArray(allocation_len).ToObjectChecked();
1014b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org    CHECK(new_space->Contains(array));
1015b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  }
1016b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1017b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 3: now allocate fixed array and JSObject to fill the whole new space.
1018b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  int to_fill = static_cast<int>(*limit_addr - *top_addr - object_size);
1019b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int fixed_array_len = LenFromSize(to_fill);
1020b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(fixed_array_len < FixedArray::kMaxLength);
1021b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1022528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(!heap->always_allocate());
1023a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Object* array = heap->AllocateFixedArray(fixed_array_len).ToObjectChecked();
1024b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(new_space->Contains(array));
1025b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1026a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Object* object = heap->AllocateJSObjectFromMap(*my_map).ToObjectChecked();
1027b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(new_space->Contains(object));
1028b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  JSObject* jsobject = JSObject::cast(object);
102930ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK_EQ(0, FixedArray::cast(jsobject->elements())->length());
1030b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK_EQ(0, jsobject->properties()->length());
1031b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Create a reference to object in new space in jsobject.
1032e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  FieldIndex index = FieldIndex::ForInObjectOffset(
1033e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org      JSObject::kHeaderSize - kPointerSize);
1034e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  jsobject->FastPropertyAtPut(index, array);
1035b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1036b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr));
1037b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1038b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 4: clone jsobject, but force always allocate first to create a clone
1039b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // in old pointer space.
1040528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Address old_pointer_space_top = heap->old_pointer_space()->top();
10415697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  AlwaysAllocateScope aa_scope(isolate);
1042a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Object* clone_obj = heap->CopyJSObject(jsobject).ToObjectChecked();
1043b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  JSObject* clone = JSObject::cast(clone_obj);
1044b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  if (clone->address() != old_pointer_space_top) {
1045b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org    // Alas, got allocated from free list, we cannot do checks.
1046b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org    return;
1047b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  }
1048528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(heap->old_pointer_space()->Contains(clone->address()));
1049b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
10502356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
10514a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1052a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(TestCodeFlushing) {
1053fd0930e52d6c6ef28e65bc0dc2dc479da51b656aricow@chromium.org  // If we do not flush code this test is invalid.
1054fd0930e52d6c6ef28e65bc0dc2dc479da51b656aricow@chromium.org  if (!FLAG_flush_code) return;
1055e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
1056c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  i::FLAG_optimize_for_size = false;
1057a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate* isolate = v8::Isolate::New();
1058a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
1059a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  isolate->Enter();
1060a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Factory* factory = i_isolate->factory();
1061a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  {
1062a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::HandleScope scope(isolate);
1063a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Context::New(isolate)->Enter();
1064a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    const char* source =
1065a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        "function foo() {"
1066a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        "  var x = 42;"
1067a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        "  var y = 42;"
1068a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        "  var z = x + y;"
1069a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        "};"
1070a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        "foo()";
1071a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1072a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
1073a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // This compile will add the code to the compilation cache.
1074a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    {
1075a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::HandleScope scope(isolate);
1076a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CompileRun(source);
1077a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
10782356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
1079a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Check function is compiled.
1080a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Handle<Object> func_value = Object::GetProperty(i_isolate->global_object(),
1081a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                                    foo_name).ToHandleChecked();
1082a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(func_value->IsJSFunction());
1083a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
1084a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(function->shared()->is_compiled());
10852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
1086a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // The code will survive at least two GCs.
1087a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    i_isolate->heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1088a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    i_isolate->heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1089a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(function->shared()->is_compiled());
10902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
1091a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Simulate several GCs that use full marking.
1092a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    const int kAgingThreshold = 6;
1093a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
1094a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      i_isolate->heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1095a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
10960b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
1097a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // foo should no longer be in the compilation cache
1098a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1099a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(!function->is_compiled() || function->IsOptimized());
1100a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Call foo to get it recompiled.
1101a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CompileRun("foo()");
1102a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(function->shared()->is_compiled());
1103a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(function->is_compiled());
1104e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1105a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  isolate->Exit();
1106a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  isolate->Dispose();
11072356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org}
11084a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
11094a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1110c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgTEST(TestCodeFlushingPreAged) {
1111c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // If we do not flush code this test is invalid.
1112c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  if (!FLAG_flush_code) return;
1113c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  i::FLAG_allow_natives_syntax = true;
1114c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  i::FLAG_optimize_for_size = true;
1115c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CcTest::InitializeVM();
11165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1117c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  Factory* factory = isolate->factory();
1118c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  v8::HandleScope scope(CcTest::isolate());
1119c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  const char* source = "function foo() {"
1120c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org                       "  var x = 42;"
1121c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org                       "  var y = 42;"
1122c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org                       "  var z = x + y;"
1123c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org                       "};"
1124c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org                       "foo()";
1125c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1126c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1127c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // Compile foo, but don't run it.
1128c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1129c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CompileRun(source);
1130c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  }
1131c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1132c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // Check function is compiled.
11335b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> func_value =
11342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(isolate->global_object(), foo_name).ToHandleChecked();
1135c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(func_value->IsJSFunction());
11365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
1137c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(function->shared()->is_compiled());
1138c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1139c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // The code has been run so will survive at least one GC.
1140c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1141c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(function->shared()->is_compiled());
1142c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1143c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // The code was only run once, so it should be pre-aged and collected on the
1144c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // next GC.
1145c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1146c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1147c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1148c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // Execute the function again twice, and ensure it is reset to the young age.
1149c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1150c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CompileRun("foo();"
1151c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org               "foo();");
1152c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  }
1153c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1154c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // The code will survive at least two GC now that it is young again.
1155c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1156c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1157c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(function->shared()->is_compiled());
1158c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1159c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // Simulate several GCs that use full marking.
1160c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  const int kAgingThreshold = 6;
1161c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
1162c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1163c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  }
1164c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1165c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // foo should no longer be in the compilation cache
1166c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1167c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(!function->is_compiled() || function->IsOptimized());
1168c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  // Call foo to get it recompiled.
1169c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CompileRun("foo()");
1170c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(function->shared()->is_compiled());
1171c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  CHECK(function->is_compiled());
1172c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org}
1173c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1174c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
1175e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgTEST(TestCodeFlushingIncremental) {
1176e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // If we do not flush code this test is invalid.
1177e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1178e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
1179c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  i::FLAG_optimize_for_size = false;
1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1181528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1182d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1184e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const char* source = "function foo() {"
1185e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var x = 42;"
1186e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var y = 42;"
1187e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var z = x + y;"
1188e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "};"
1189e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "foo()";
1190d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1191e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1192e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // This compile will add the code to the compilation cache.
1193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1194e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun(source);
1195e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1196e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1197e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Check function is compiled.
11985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> func_value =
11992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(isolate->global_object(), foo_name).ToHandleChecked();
1200e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(func_value->IsJSFunction());
12015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
1202e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled());
1203e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1204e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // The code will survive at least two GCs.
1205528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1206528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1207e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled());
1208e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1209e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate several GCs that use incremental marking.
1210e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const int kAgingThreshold = 6;
1211e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
12123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    SimulateIncrementalMarking(CcTest::heap());
1213528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1214e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1215e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1216e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->is_compiled() || function->IsOptimized());
1217e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1218e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // This compile will compile the function again.
1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1220e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun("foo();");
1221e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1222e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1223e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate several GCs that use incremental marking but make sure
1224e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // the loop breaks once the function is enqueued as a candidate.
1225e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
12263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    SimulateIncrementalMarking(CcTest::heap());
1227e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    if (!function->next_function_link()->IsUndefined()) break;
1228528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1229e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1230e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1231e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Force optimization while incremental marking is active and while
1232e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // the function is enqueued as a candidate.
1233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1234e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(foo); foo();");
1235e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1236e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1237e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate one final GC to make sure the candidate queue is sane.
1238528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1239e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled() || !function->IsOptimized());
1240e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->is_compiled() || !function->IsOptimized());
1241e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1242e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1243e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1244e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgTEST(TestCodeFlushingIncrementalScavenge) {
1245e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // If we do not flush code this test is invalid.
1246e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1247e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
1248c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  i::FLAG_optimize_for_size = false;
1249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1250528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1251d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1253e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const char* source = "var foo = function() {"
1254e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var x = 42;"
1255e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var y = 42;"
1256e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var z = x + y;"
1257e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "};"
1258e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "foo();"
1259e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "var bar = function() {"
1260e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var x = 23;"
1261e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "};"
1262e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "bar();";
1263d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1264d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> bar_name = factory->InternalizeUtf8String("bar");
1265e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1266e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Perfrom one initial GC to enable code flushing.
1267528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1268e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1269e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // This compile will add the code to the compilation cache.
1270e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1271e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun(source);
1272e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1273e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1274e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Check functions are compiled.
12755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> func_value =
12762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(isolate->global_object(), foo_name).ToHandleChecked();
1277e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(func_value->IsJSFunction());
12785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
1279e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled());
12805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> func_value2 =
12812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(isolate->global_object(), bar_name).ToHandleChecked();
1282e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(func_value2->IsJSFunction());
12835b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function2 = Handle<JSFunction>::cast(func_value2);
1284e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function2->shared()->is_compiled());
1285e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1286e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Clear references to functions so that one of them can die.
1287e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1288e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun("foo = 0; bar = 0;");
1289e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1290e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1291e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Bump the code age so that flushing is triggered while the function
1292e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // object is still located in new-space.
1293e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const int kAgingThreshold = 6;
129449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
129549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
129649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
129749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
1298e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1299e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate incremental marking so that the functions are enqueued as
1300e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // code flushing candidates. Then kill one of the functions. Finally
1301e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // perform a scavenge while incremental marking is still running.
13023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
1303e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  *function2.location() = NULL;
1304528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectGarbage(NEW_SPACE, "test scavenge while marking");
1305e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1306e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate one final GC to make sure the candidate queue is sane.
1307528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1308e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1309e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->is_compiled() || function->IsOptimized());
1310e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1311e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1312e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1313e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgTEST(TestCodeFlushingIncrementalAbort) {
1314e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // If we do not flush code this test is invalid.
1315e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1316e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  i::FLAG_allow_natives_syntax = true;
1317c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  i::FLAG_optimize_for_size = false;
1318e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1319528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1320d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1321c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
1322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1323e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  const char* source = "function foo() {"
1324e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "  var x = 42;"
1325e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "  var y = 42;"
1326e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "  var z = x + y;"
1327e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "};"
1328e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "foo()";
1329d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1330e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1331e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // This compile will add the code to the compilation cache.
1332e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1333e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    CompileRun(source);
1334e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
1335e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1336e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Check function is compiled.
13375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> func_value =
13382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Object::GetProperty(isolate->global_object(), foo_name).ToHandleChecked();
1339e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(func_value->IsJSFunction());
13405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
1341e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->shared()->is_compiled());
1342e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1343e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // The code will survive at least two GCs.
1344c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1345c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1346e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->shared()->is_compiled());
1347e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1348e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Bump the code age so that flushing is triggered.
1349e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  const int kAgingThreshold = 6;
135049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
135149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
135249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
1353e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1354e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Simulate incremental marking so that the function is enqueued as
1355e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // code flushing candidate.
13563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(heap);
1357e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1358e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Enable the debugger and add a breakpoint while incremental marking
1359e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // is running so that incremental marking aborts and code flushing is
1360e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // disabled.
1361e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  int position = 0;
136209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> breakpoint_object(Smi::FromInt(0), isolate);
1363c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  isolate->debug()->SetBreakPoint(function, breakpoint_object, &position);
1364c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  isolate->debug()->ClearAllBreakPoints();
1365e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1366e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Force optimization now that code flushing is disabled.
1367e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1368e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(foo); foo();");
1369e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
1370e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1371e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Simulate one final GC to make sure the candidate queue is sane.
1372c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
1373e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->shared()->is_compiled() || !function->IsOptimized());
1374e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->is_compiled() || !function->IsOptimized());
1375e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
1376e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1377e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
137846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Count the number of native contexts in the weak list of native contexts.
137946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint CountNativeContexts() {
13804a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  int count = 0;
1381528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Object* object = CcTest::heap()->native_contexts_list();
13824a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  while (!object->IsUndefined()) {
13834a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    count++;
13844a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    object = Context::cast(object)->get(Context::NEXT_CONTEXT_LINK);
13854a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
13864a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return count;
13874a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
13884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
13894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Count the number of user functions in the weak list of optimized
139146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// functions attached to a native context.
1392a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic int CountOptimizedUserFunctions(v8::Handle<v8::Context> context) {
1393a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int count = 0;
1394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<Context> icontext = v8::Utils::OpenHandle(*context);
1395a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Object* object = icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST);
1396a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (object->IsJSFunction() && !JSFunction::cast(object)->IsBuiltin()) {
1397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    count++;
1398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    object = JSFunction::cast(object)->next_function_link();
1399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1400a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return count;
1401a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1402a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1403a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14044a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgTEST(TestInternalWeakLists) {
1405ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  v8::V8::Initialize();
1406ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
14075323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Some flags turn Scavenge collections into Mark-sweep collections
14085323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // and hence are incompatible with this test case.
14095323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  if (FLAG_gc_global || FLAG_stress_compaction) return;
14105323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org
14114a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  static const int kNumTestContexts = 10;
14124a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1413528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1414c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
14152bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
141657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Handle<v8::Context> ctx[kNumTestContexts];
14174a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
141846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK_EQ(0, CountNativeContexts());
14194a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14204a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Create a number of global contests which gets linked together.
14214a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < kNumTestContexts; i++) {
1422528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    ctx[i] = v8::Context::New(CcTest::isolate());
1423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1424bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    // Collect garbage that might have been created by one of the
1425bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    // installed extensions.
1426bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    isolate->compilation_cache()->Clear();
1427bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    heap->CollectAllGarbage(Heap::kNoGCFlags);
1428bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org
1429e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org    bool opt = (FLAG_always_opt && isolate->use_crankshaft());
1430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
143146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK_EQ(i + 1, CountNativeContexts());
14324a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14334a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ctx[i]->Enter();
1434a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Create a handle scope so no function objects get stuch in the outer
1436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // handle scope
14372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    HandleScope scope(isolate);
1438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    const char* source = "function f1() { };"
1439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f2() { };"
1440a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f3() { };"
1441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f4() { };"
1442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f5() { };";
1443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun(source);
1444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(0, CountOptimizedUserFunctions(ctx[i]));
1445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f1()");
1446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctions(ctx[i]));
1447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f2()");
1448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[i]));
1449a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f3()");
1450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1451a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f4()");
1452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f5()");
1454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1456a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Remove function f1, and
1457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f1=null");
1458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Scavenge treats these references as strong.
1460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < 10; j++) {
1461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      CcTest::heap()->CollectGarbage(NEW_SPACE);
1462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Mark compact handles the weak references.
1466c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    isolate->compilation_cache()->Clear();
1467c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    heap->CollectAllGarbage(Heap::kNoGCFlags);
1468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Get rid of f3 and f5 in the same way.
1471a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f3=null");
1472a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < 10; j++) {
1473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      CcTest::heap()->CollectGarbage(NEW_SPACE);
1474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1476528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f5=null");
1479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < 10; j++) {
1480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      CcTest::heap()->CollectGarbage(NEW_SPACE);
1481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1483528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[i]));
1485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14864a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ctx[i]->Exit();
14874a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
14884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Force compilation cache cleanup.
1490528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->NotifyContextDisposed();
1491528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
14924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
149346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Dispose the native contexts one by one.
14944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < kNumTestContexts; i++) {
149557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    // TODO(dcarney): is there a better way to do this?
149657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    i::Object** unsafe = reinterpret_cast<i::Object**>(*ctx[i]);
1497528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    *unsafe = CcTest::heap()->undefined_value();
14984a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ctx[i].Clear();
14994a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
15004a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    // Scavenge treats these references as strong.
15014a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    for (int j = 0; j < 10; j++) {
1502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      CcTest::heap()->CollectGarbage(i::NEW_SPACE);
150346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      CHECK_EQ(kNumTestContexts - i, CountNativeContexts());
15044a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    }
15054a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
15064a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    // Mark compact handles the weak references.
1507528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
150846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK_EQ(kNumTestContexts - i - 1, CountNativeContexts());
15094a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
15104a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
151146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK_EQ(0, CountNativeContexts());
15124a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
15134a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
15144a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
151546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Count the number of native contexts in the weak list of native contexts
15164a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org// causing a GC after the specified number of elements.
151709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic int CountNativeContextsWithGC(Isolate* isolate, int n) {
151809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Heap* heap = isolate->heap();
15194a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  int count = 0;
152009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(heap->native_contexts_list(), isolate);
15214a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  while (!object->IsUndefined()) {
15224a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    count++;
152309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    if (count == n) heap->CollectAllGarbage(Heap::kNoGCFlags);
15244a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    object =
152509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        Handle<Object>(Context::cast(*object)->get(Context::NEXT_CONTEXT_LINK),
152609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                       isolate);
15274a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
15284a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return count;
15294a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
15304a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
15314a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1532a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Count the number of user functions in the weak list of optimized
153346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// functions attached to a native context causing a GC after the
1534a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// specified number of elements.
1535a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic int CountOptimizedUserFunctionsWithGC(v8::Handle<v8::Context> context,
1536a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                             int n) {
1537a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int count = 0;
1538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<Context> icontext = v8::Utils::OpenHandle(*context);
153909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = icontext->GetIsolate();
154009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST),
154109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                        isolate);
1542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (object->IsJSFunction() &&
1543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org         !Handle<JSFunction>::cast(object)->IsBuiltin()) {
1544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    count++;
154509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    if (count == n) isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
1546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    object = Handle<Object>(
154709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        Object::cast(JSFunction::cast(*object)->next_function_link()),
154809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        isolate);
1549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return count;
1551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
15544a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgTEST(TestInternalWeakListsTraverseWithGC) {
1555ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  v8::V8::Initialize();
1556528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
1557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
15584a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  static const int kNumTestContexts = 10;
15594a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
15602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
156157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Handle<v8::Context> ctx[kNumTestContexts];
15624a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
156346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK_EQ(0, CountNativeContexts());
15644a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
15654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Create an number of contexts and check the length of the weak list both
15664a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // with and without GCs while iterating the list.
15674a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < kNumTestContexts; i++) {
1568528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    ctx[i] = v8::Context::New(CcTest::isolate());
156946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK_EQ(i + 1, CountNativeContexts());
157009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    CHECK_EQ(i + 1, CountNativeContextsWithGC(isolate, i / 2 + 1));
15714a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
1572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1573e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  bool opt = (FLAG_always_opt && isolate->use_crankshaft());
1574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Compile a number of functions the length of the weak list of optimized
1576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // functions both with and without GCs while iterating the list.
1577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ctx[0]->Enter();
1578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  const char* source = "function f1() { };"
1579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f2() { };"
1580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f3() { };"
1581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f4() { };"
1582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f5() { };";
1583a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun(source);
1584a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(0, CountOptimizedUserFunctions(ctx[0]));
1585a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f1()");
1586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctions(ctx[0]));
1587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 1));
1588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f2()");
1589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[0]));
1590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 1));
1591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f3()");
1592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[0]));
1593a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 1));
1594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f4()");
1595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[0]));
1596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 2));
1597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f5()");
1598a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[0]));
1599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 4));
1600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ctx[0]->Exit();
16024a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
16034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com
16044a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com
1605f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comTEST(TestSizeOfObjects) {
1606f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  v8::V8::Initialize();
1607f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1608f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Get initial heap size after several full GCs, which will stabilize
1609f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // the heap size and return with sweeping finished completely.
1610528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1611528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1612528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1613528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1614528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1615865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  MarkCompactCollector* collector = CcTest::heap()->mark_compact_collector();
1616d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  if (collector->sweeping_in_progress()) {
1617d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org    collector->EnsureSweepingCompleted();
1618865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
1619528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  int initial_size = static_cast<int>(CcTest::heap()->SizeOfObjects());
1620f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1621f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  {
1622f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    // Allocate objects on several different old-space pages so that
1623865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // concurrent sweeper threads will be busy sweeping the old space on
1624865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // subsequent GC runs.
16255697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AlwaysAllocateScope always_allocate(CcTest::i_isolate());
1626f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    int filler_size = static_cast<int>(FixedArray::SizeFor(8192));
1627f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    for (int i = 1; i <= 100; i++) {
1628a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      CcTest::test_heap()->AllocateFixedArray(8192, TENURED).ToObjectChecked();
1629f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      CHECK_EQ(initial_size + i * filler_size,
1630528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org               static_cast<int>(CcTest::heap()->SizeOfObjects()));
1631f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    }
1632f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1633f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1634f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // The heap size should go back to initial size after a full GC, even
1635f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // though sweeping didn't finish yet.
1636528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
16372c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
16382c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  // Normally sweeping would not be complete here, but no guarantees.
16392c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
1640528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK_EQ(initial_size, static_cast<int>(CcTest::heap()->SizeOfObjects()));
1641f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1642865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  // Waiting for sweeper threads should not change heap size.
1643d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  if (collector->sweeping_in_progress()) {
1644d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org    collector->EnsureSweepingCompleted();
1645f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1646865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  CHECK_EQ(initial_size, static_cast<int>(CcTest::heap()->SizeOfObjects()));
1647f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
1648f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1649f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
16504a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comTEST(TestSizeOfObjectsVsHeapIteratorPrecision) {
1651e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1652528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  HeapIterator iterator(CcTest::heap());
1653fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  intptr_t size_of_objects_1 = CcTest::heap()->SizeOfObjects();
16544a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  intptr_t size_of_objects_2 = 0;
16554a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  for (HeapObject* obj = iterator.next();
16564a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com       obj != NULL;
16574a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com       obj = iterator.next()) {
165856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    if (!obj->IsFreeSpace()) {
165956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      size_of_objects_2 += obj->Size();
166056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    }
16614a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  }
1662c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Delta must be within 5% of the larger result.
1663c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // TODO(gc): Tighten this up by distinguishing between byte
1664c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // arrays that are real and those that merely mark free space
1665c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // on the heap.
16664a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  if (size_of_objects_1 > size_of_objects_2) {
16674a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    intptr_t delta = size_of_objects_1 - size_of_objects_2;
16684a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    PrintF("Heap::SizeOfObjects: %" V8_PTR_PREFIX "d, "
16694a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "Iterator: %" V8_PTR_PREFIX "d, "
16704a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "delta: %" V8_PTR_PREFIX "d\n",
16714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           size_of_objects_1, size_of_objects_2, delta);
1672c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CHECK_GT(size_of_objects_1 / 20, delta);
16734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  } else {
16744a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    intptr_t delta = size_of_objects_2 - size_of_objects_1;
16754a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    PrintF("Heap::SizeOfObjects: %" V8_PTR_PREFIX "d, "
16764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "Iterator: %" V8_PTR_PREFIX "d, "
16774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "delta: %" V8_PTR_PREFIX "d\n",
16784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           size_of_objects_1, size_of_objects_2, delta);
1679c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CHECK_GT(size_of_objects_2 / 20, delta);
16804a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  }
16814a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com}
1682023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org
1683023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org
1684c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgstatic void FillUpNewSpace(NewSpace* new_space) {
1685c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // Fill up new space to the point that it is completely full. Make sure
1686c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // that the scavenger does not undo the filling.
16872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Heap* heap = new_space->heap();
16882bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Isolate* isolate = heap->isolate();
16892bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Factory* factory = isolate->factory();
16902bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
16915697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  AlwaysAllocateScope always_allocate(isolate);
1692a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  intptr_t available = new_space->Capacity() - new_space->Size();
16937d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1;
1694c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  for (intptr_t i = 0; i < number_of_fillers; i++) {
16952bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED)));
1696c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
1697c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
1698c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1699c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1700c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comTEST(GrowAndShrinkNewSpace) {
1701e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1702528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Heap* heap = CcTest::heap();
1703528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  NewSpace* new_space = heap->new_space();
1704c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1705528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() ||
1706528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) {
17071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // The max size cannot exceed the reserved size, since semispaces must be
17081044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // always within the reserved space.  We can't test new space growing and
17091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // shrinking if the reserved size is the same as the minimum (initial) size.
17101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return;
17111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
17121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1713c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Explicitly growing should double the space capacity.
1714c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  intptr_t old_capacity, new_capacity;
1715a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  old_capacity = new_space->TotalCapacity();
1716c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Grow();
1717a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1718c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(2 * old_capacity == new_capacity);
1719c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1720a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  old_capacity = new_space->TotalCapacity();
1721c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  FillUpNewSpace(new_space);
1722a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1723c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == new_capacity);
1724c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1725c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Explicitly shrinking should not affect space capacity.
1726a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  old_capacity = new_space->TotalCapacity();
1727c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1728a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1729c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == new_capacity);
1730c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1731c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Let the scavenger empty the new space.
1732528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  heap->CollectGarbage(NEW_SPACE);
1733c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK_LE(new_space->Size(), old_capacity);
1734c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1735c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Explicitly shrinking should halve the space capacity.
1736a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  old_capacity = new_space->TotalCapacity();
1737c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1738a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1739c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == 2 * new_capacity);
1740c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1741c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Consecutive shrinking should not affect space capacity.
1742a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  old_capacity = new_space->TotalCapacity();
1743c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1744c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1745c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1746a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1747c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == new_capacity);
1748023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org}
1749c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1750c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1751c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgTEST(CollectingAllAvailableGarbageShrinksNewSpace) {
1752e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1753528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Heap* heap = CcTest::heap();
1754528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() ||
1755528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) {
17561044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // The max size cannot exceed the reserved size, since semispaces must be
17571044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // always within the reserved space.  We can't test new space growing and
17581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // shrinking if the reserved size is the same as the minimum (initial) size.
17591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return;
17601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
17611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1762e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1763528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  NewSpace* new_space = heap->new_space();
1764c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  intptr_t old_capacity, new_capacity;
1765a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  old_capacity = new_space->TotalCapacity();
1766c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  new_space->Grow();
1767a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1768c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  CHECK(2 * old_capacity == new_capacity);
1769c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  FillUpNewSpace(new_space);
1770528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  heap->CollectAllAvailableGarbage();
1771a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  new_capacity = new_space->TotalCapacity();
1772c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  CHECK(old_capacity == new_capacity);
1773c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
1774ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org
17757ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17767ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.orgstatic int NumberOfGlobalObjects() {
17777ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  int count = 0;
1778528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  HeapIterator iterator(CcTest::heap());
17797ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
17807ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    if (obj->IsGlobalObject()) count++;
17817ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  }
17827ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  return count;
17837ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
17847ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17857ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17867ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// Test that we don't embed maps from foreign contexts into
17877ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// optimized code.
178846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaMap) {
1789e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
1790528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
179157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1792c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1793c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
179457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
179557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1796c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1797c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1798c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
179957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
18007ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
1801528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
18027ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
18037ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
18047ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  {
1805c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
18067ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CompileRun("var v = {x: 42}");
1807c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1808c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
18097ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
18107ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Enter();
18117ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
18127ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> res = CompileRun(
18137ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "function f() { return o.x; }"
1814e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f();"
1815e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
18167ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "f();");
18177ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CHECK_EQ(42, res->Int32Value());
18180f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(isolate, 0));
18197ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Exit();
1820c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1)->Exit();
1821f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    ctx1p.Reset();
1822f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    isolate->ContextDisposedNotification();
18237ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  }
1824528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
18257ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1826f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  ctx2p.Reset();
1827528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
18287ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
18297ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
18307ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
18317ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
18327ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// Test that we don't embed functions from foreign contexts into
18337ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// optimized code.
183446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaFunction) {
1835e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
1836528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
183757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1838c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1839c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
184057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
184157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1842c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1843c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1844c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
184557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
18467ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
1847528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
18487ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
18497ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
18507ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  {
1851c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
18527ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CompileRun("var v = function() { return 42; }");
1853c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1854c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
18557ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
18567ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Enter();
18577ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
18587ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> res = CompileRun(
18597ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "function f(x) { return x(); }"
1860e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f(o);"
1861e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
18627ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "f(o);");
18637ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CHECK_EQ(42, res->Int32Value());
18640f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(isolate, 0));
18657ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Exit();
18667ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx1->Exit();
1867f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    ctx1p.Reset();
1868f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    isolate->ContextDisposedNotification();
18697ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  }
1870528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
18717ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1872f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  ctx2p.Reset();
1873528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
18747ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
18757ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
1876e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1877e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
187846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaMapKeyed) {
1879e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
1880528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
188157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1882c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1883c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
188457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
188557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1886c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1887c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1888c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
188957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
1890e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1891528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
1892e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
1893e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1894e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  {
1895c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
1896e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CompileRun("var v = [42, 43]");
1897c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1898c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
1899e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
1900e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Enter();
1901e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
1902e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> res = CompileRun(
1903e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "function f() { return o[0]; }"
1904e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f();"
1905e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
1906e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "f();");
1907e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CHECK_EQ(42, res->Int32Value());
19080f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(isolate, 0));
1909e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Exit();
1910e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx1->Exit();
1911f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    ctx1p.Reset();
1912f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    isolate->ContextDisposedNotification();
1913e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  }
1914528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
1915e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1916f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  ctx2p.Reset();
1917528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
1918e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
1919e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org}
1920e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1921e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
192246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaMapProto) {
1923e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
1924528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
192557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1926c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1927c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
192857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
192957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1930c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1931c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1932c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
193357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
1934e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1935528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
1936e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
1937e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1938e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  {
1939c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
1940e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CompileRun("var v = { y: 42}");
1941c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1942c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
1943e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
1944e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Enter();
1945e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
1946e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> res = CompileRun(
1947e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "function f() {"
1948e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "  var p = {x: 42};"
1949e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "  p.__proto__ = o;"
1950e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "  return p.x;"
1951e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "}"
1952e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f();"
1953e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
1954e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "f();");
1955e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CHECK_EQ(42, res->Int32Value());
19560f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(isolate, 0));
1957e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Exit();
1958e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx1->Exit();
1959f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    ctx1p.Reset();
1960f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    isolate->ContextDisposedNotification();
1961e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  }
1962528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
1963e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1964f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  ctx2p.Reset();
1965528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllAvailableGarbage();
1966e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
1967e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org}
1968f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1969f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1970f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comTEST(InstanceOfStubWriteBarrier) {
1971f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  i::FLAG_allow_natives_syntax = true;
1972c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
1973f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  i::FLAG_verify_heap = true;
1974f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#endif
1975c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1976e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1977528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft()) return;
1978fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (i::FLAG_force_marking_deque_overflows) return;
1979528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::HandleScope outer_scope(CcTest::isolate());
1980f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1981f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  {
1982528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    v8::HandleScope scope(CcTest::isolate());
1983f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    CompileRun(
1984f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function foo () { }"
1985f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function mkbar () { return new (new Function(\"\")) (); }"
1986f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function f (x) { return (x instanceof foo); }"
1987f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function g () { f(mkbar()); }"
1988f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "f(new foo()); f(new foo());"
1989f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "%OptimizeFunctionOnNextCall(f);"
1990f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "f(new foo()); g();");
1991f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1992f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1993528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  IncrementalMarking* marking = CcTest::heap()->incremental_marking();
1994f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  marking->Abort();
1995f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  marking->Start();
1996f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1997f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  Handle<JSFunction> f =
1998f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      v8::Utils::OpenHandle(
1999f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com          *v8::Handle<v8::Function>::Cast(
2000528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
2001f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2002f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(f->IsOptimized());
2003f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2004f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) &&
2005f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com         !marking->IsStopped()) {
20067d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    // Discard any pending GC requests otherwise we will get GC when we enter
20077d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    // code below.
20087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
2009f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
2010f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2011f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(marking->IsMarking());
2012f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2013f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  {
2014528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    v8::HandleScope scope(CcTest::isolate());
2015528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    v8::Handle<v8::Object> global = CcTest::global();
2016f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    v8::Handle<v8::Function> g =
2017f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        v8::Handle<v8::Function>::Cast(global->Get(v8_str("g")));
2018f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    g->Call(global, 0, NULL);
2019f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
2020f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
2021528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->incremental_marking()->set_should_hurry(true);
2022528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectGarbage(OLD_POINTER_SPACE);
2023f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
20242efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
20252efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
20262efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.orgTEST(PrototypeTransitionClearing) {
2027c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  if (FLAG_never_compact) return;
2028e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2029528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
2030d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
2031e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
20322efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
203397b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  CompileRun("var base = {};");
203497b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  Handle<JSObject> baseObject =
203597b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org      v8::Utils::OpenHandle(
203697b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org          *v8::Handle<v8::Object>::Cast(
203797b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org              CcTest::global()->Get(v8_str("base"))));
203897b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  int initialTransitions = baseObject->map()->NumberOfProtoTransitions();
203997b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org
20402efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  CompileRun(
20412efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "var live = [];"
20422efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "for (var i = 0; i < 10; i++) {"
20432efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  var object = {};"
20442efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  var prototype = {};"
20452efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  object.__proto__ = prototype;"
20462efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  if (i >= 3) live.push(object, prototype);"
20472efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "}");
20482efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
2049f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org  // Verify that only dead prototype transitions are cleared.
205097b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  CHECK_EQ(initialTransitions + 10,
205197b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org      baseObject->map()->NumberOfProtoTransitions());
2052528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2053f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org  const int transitions = 10 - 3;
205497b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  CHECK_EQ(initialTransitions + transitions,
205597b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org      baseObject->map()->NumberOfProtoTransitions());
20562efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
20572efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  // Verify that prototype transitions array was compacted.
205881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  FixedArray* trans = baseObject->map()->GetPrototypeTransitions();
205997b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org  for (int i = initialTransitions; i < initialTransitions + transitions; i++) {
20602efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    int j = Map::kProtoTransitionHeaderSize +
20612efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org        i * Map::kProtoTransitionElementsPerEntry;
20622efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    CHECK(trans->get(j + Map::kProtoTransitionMapOffset)->IsMap());
20637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    Object* proto = trans->get(j + Map::kProtoTransitionPrototypeOffset);
206497b98c9169c85693801d4d59089450695ad82e2dmachenbach@chromium.org    CHECK(proto->IsJSObject());
20652efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  }
206605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org
206705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  // Make sure next prototype is placed on an old-space evacuation candidate.
206805ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  Handle<JSObject> prototype;
2069528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  PagedSpace* space = CcTest::heap()->old_pointer_space();
2070fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  {
20715697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AlwaysAllocateScope always_allocate(isolate);
2072fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    SimulateFullSpace(space);
2073d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    prototype = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED);
2074fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
207505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org
207605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  // Add a prototype on an evacuation candidate and verify that transition
207705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  // clearing correctly records slots in prototype transition array.
207805ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  i::FLAG_always_compact = true;
207905ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  Handle<Map> map(baseObject->map());
208081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  CHECK(!space->LastPage()->Contains(
208181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      map->GetPrototypeTransitions()->address()));
208205ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  CHECK(space->LastPage()->Contains(prototype->address()));
20832efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org}
20847d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20857d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20867d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgTEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) {
20871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
20887d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_allow_natives_syntax = true;
2089c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
20907d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_verify_heap = true;
20917d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org#endif
2092c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2093e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2094528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft()) return;
2095528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::HandleScope outer_scope(CcTest::isolate());
20967d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20977d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  {
2098528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    v8::HandleScope scope(CcTest::isolate());
20997d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    CompileRun(
21007d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "function f () {"
21017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  var s = 0;"
21027d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  for (var i = 0; i < 100; i++)  s += i;"
21037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  return s;"
21047d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "}"
21057d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f(); f();"
21067d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "%OptimizeFunctionOnNextCall(f);"
21077d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f();");
21087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
21097d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Handle<JSFunction> f =
21107d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      v8::Utils::OpenHandle(
21117d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org          *v8::Handle<v8::Function>::Cast(
2112528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
21137d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK(f->IsOptimized());
21147d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2115528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  IncrementalMarking* marking = CcTest::heap()->incremental_marking();
21167d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  marking->Abort();
21177d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  marking->Start();
21187d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2119528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  // The following two calls will increment CcTest::heap()->global_ic_age().
21207d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  const int kLongIdlePauseInMs = 1000;
2121f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  CcTest::isolate()->ContextDisposedNotification();
2122f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  CcTest::isolate()->IdleNotification(kLongIdlePauseInMs);
21237d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21247d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  while (!marking->IsStopped() && !marking->IsComplete()) {
21257d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
21267d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
21272c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  if (!marking->IsStopped() || marking->should_hurry()) {
21282c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // We don't normally finish a GC via Step(), we normally finish by
21292c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // setting the stack guard and then do the final steps in the stack
21302c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // guard interrupt.  But here we didn't ask for that, and there is no
21312c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // JS code running to trigger the interrupt, so we explicitly finalize
21322c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // here.
2133528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags,
21342c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org                            "Test finalizing incremental mark-sweep");
21352c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  }
21367d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2137528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age());
21387d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->opt_count());
21397d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->code()->profiler_ticks());
21407d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
21417d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21427d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21437d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgTEST(ResetSharedFunctionInfoCountersDuringMarkSweep) {
21441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
21457d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_allow_natives_syntax = true;
2146c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
21477d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_verify_heap = true;
21487d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org#endif
2149c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2151528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft()) return;
2152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope outer_scope(CcTest::isolate());
21537d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21547d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  {
2155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope scope(CcTest::isolate());
21567d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    CompileRun(
21577d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "function f () {"
21587d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  var s = 0;"
21597d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  for (var i = 0; i < 100; i++)  s += i;"
21607d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  return s;"
21617d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "}"
21627d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f(); f();"
21637d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "%OptimizeFunctionOnNextCall(f);"
21647d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f();");
21657d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
21667d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Handle<JSFunction> f =
21677d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      v8::Utils::OpenHandle(
21687d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org          *v8::Handle<v8::Function>::Cast(
2169528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
21707d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK(f->IsOptimized());
21717d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2172528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->incremental_marking()->Abort();
21737d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2174528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  // The following two calls will increment CcTest::heap()->global_ic_age().
21757d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  // Since incremental marking is off, IdleNotification will do full GC.
21767d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  const int kLongIdlePauseInMs = 1000;
2177f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  CcTest::isolate()->ContextDisposedNotification();
2178f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  CcTest::isolate()->IdleNotification(kLongIdlePauseInMs);
21797d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2180528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age());
21817d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->opt_count());
21827d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->code()->profiler_ticks());
21837d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
21847d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21857d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21867d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org// Test that HAllocateObject will always return an object in new-space.
21877d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgTEST(OptimizedAllocationAlwaysInNewSpace) {
21887d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_allow_natives_syntax = true;
2189e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2190528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
21915323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
21937d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2194528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  SimulateFullSpace(CcTest::heap()->new_space());
21955697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  AlwaysAllocateScope always_allocate(CcTest::i_isolate());
21967d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  v8::Local<v8::Value> res = CompileRun(
21977d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "function c(x) {"
21987d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "  this.x = x;"
21997d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "  for (var i = 0; i < 32; i++) {"
22007d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "    this['x' + i] = x;"
22017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "  }"
22027d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "}"
22037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "function f(x) { return new c(x); };"
22047d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "f(1); f(2); f(3);"
22057d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "%OptimizeFunctionOnNextCall(f);"
22067d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "f(4);");
22077d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(4, res->ToObject()->GetRealNamedProperty(v8_str("x"))->Int32Value());
22087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
22097d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Handle<JSObject> o =
22107d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
22117d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
2212528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InNewSpace(*o));
2213750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
2214750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2215750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2216cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.orgTEST(OptimizedPretenuringAllocationFolding) {
2217cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  i::FLAG_allow_natives_syntax = true;
2218d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
2219cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  CcTest::InitializeVM();
2220528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
2221cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2222cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  v8::HandleScope scope(CcTest::isolate());
2223cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
2224196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2225196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2226196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2227196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2228196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2229d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
223070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2231d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2232d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2233034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array();"
2234cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      "function f() {"
2235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2236d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "    elements[i] = [[{}], [1.1]];"
2237034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "  return elements[number_elements-1]"
2239cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      "};"
2240d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2241d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2242d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2243d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2244d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2245cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
2246d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
2247cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
2248d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> int_array = v8::Object::Cast(*res)->Get(v8_str("0"));
2249d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<JSObject> int_array_handle =
2250d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array));
2251d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> double_array = v8::Object::Cast(*res)->Get(v8_str("1"));
2252d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<JSObject> double_array_handle =
2253d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array));
2254cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
2255cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  Handle<JSObject> o =
2256cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2257d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2258d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle));
2259d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle->elements()));
2260d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle));
2261d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(double_array_handle->elements()));
2262cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org}
2263cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
2264cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
22651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringObjectArrayLiterals) {
2266750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  i::FLAG_allow_natives_syntax = true;
2267d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
2268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2269528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
2270750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2272750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2273196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2274196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2275196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2276196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2277196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2278d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
227970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2280d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2281d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2282034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
2283750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "function f() {"
2284034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2285034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = [{}, {}, {}];"
2286034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2287034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[number_elements - 1];"
2288750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "};"
2289d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2290d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2291d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2292d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2293d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2294d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2295d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
2296750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2297750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Handle<JSObject> o =
2298750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2299750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2300528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(o->elements()));
2301528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2302750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
2303750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2304750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
23051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringMixedInObjectProperties) {
2306e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
2307d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
2308e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2309528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
2310e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2311e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2312e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2313196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2314196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2315196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2316196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2317196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2318196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2319d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
232070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2321d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2322d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2323034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
2324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "function f() {"
2325034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2326034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = {a: {c: 2.2, d: {}}, b: 1.1};"
2327034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2328034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[number_elements - 1];"
2329e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "};"
2330d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2331d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2332d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2333d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2334d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2335d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2336d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
2337e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2338e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Handle<JSObject> o =
2339e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2340e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2341528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2342e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  FieldIndex idx1 = FieldIndex::ForPropertyIndex(o->map(), 0);
2343e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  FieldIndex idx2 = FieldIndex::ForPropertyIndex(o->map(), 1);
2344e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(idx1)));
2345e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(idx2)));
23461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2347e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  JSObject* inner_object =
2348e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org      reinterpret_cast<JSObject*>(o->RawFastPropertyAt(idx1));
2349528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(inner_object));
2350e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(inner_object->RawFastPropertyAt(idx1)));
2351e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(
2352e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org      inner_object->RawFastPropertyAt(idx2)));
2353e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
2354e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2355e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
23561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringDoubleArrayProperties) {
2357750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  i::FLAG_allow_natives_syntax = true;
2358d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
2359e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2360528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
2361750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2362e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2363750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2364196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2365196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2366196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2367196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2368196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2369d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
237070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2371d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2372d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2373034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
2374750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "function f() {"
2375034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2376034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = {a: 1.1, b: 2.2};"
2377034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2378034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[i - 1];"
2379750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "};"
2380d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2381d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2382d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2383d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2384d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2385d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2386d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
2387750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2388750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Handle<JSObject> o =
2389750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2390750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2391528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2392528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(o->properties()));
23937d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
23945f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
23955f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
23961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringdoubleArrayLiterals) {
23971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
2398d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
23991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
2400528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
24011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
24021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
24031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2404196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2405196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2406196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2407196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2408196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2409d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
241070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2411d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2412d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2413034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
24141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
2415034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2416034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = [1.1, 2.2, 3.3];"
2417034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2418034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[number_elements - 1];"
24191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
2420d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2421d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2422d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2423d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2424d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2425d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2426d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
24271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
24291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
24301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2431528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(o->elements()));
2432528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
24331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
24341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringNestedMixedArrayLiterals) {
2437d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
2438d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
2439d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  CcTest::InitializeVM();
2440528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
2441d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2442d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  v8::HandleScope scope(CcTest::isolate());
2443d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
2444196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2445196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2446196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2447196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2448196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2449d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
245070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2451d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2452d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = 100;"
2453034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
2454d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "function f() {"
2455034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2456034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = [[{}, {}, {}], [1.1, 2.2, 3.3]];"
2457034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2458034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[number_elements - 1];"
2459d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "};"
2460d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2461d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2462d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
246370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      "f();");
2464d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2465d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
2466d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
24671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> int_array = v8::Object::Cast(*res)->Get(v8_str("0"));
24681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> int_array_handle =
24691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array));
24701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> double_array = v8::Object::Cast(*res)->Get(v8_str("1"));
24711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> double_array_handle =
24721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array));
24731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2474d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> o =
2475d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2476528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2477528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle));
2478528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle->elements()));
2479528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle));
2480528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(double_array_handle->elements()));
2481d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
2482d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
24831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringNestedObjectLiterals) {
24851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
2486d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
24871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
2488528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
24891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
24901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
24911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2492196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2493196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2494196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2495196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2496196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2497d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
249870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2499d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2500d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2501034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
25021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
2503034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2504034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = [[{}, {}, {}],[{}, {}, {}]];"
2505034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2506034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[number_elements - 1];"
25071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
2508d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2509d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2510d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2511d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2512d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2513d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2514d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
25151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> int_array_1 = v8::Object::Cast(*res)->Get(v8_str("0"));
25171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> int_array_handle_1 =
25181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array_1));
25191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> int_array_2 = v8::Object::Cast(*res)->Get(v8_str("1"));
25201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> int_array_handle_2 =
25211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array_2));
25221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
25241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2525528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2526528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle_1));
2527528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle_1->elements()));
2528528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle_2));
2529528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle_2->elements()));
25301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
25311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringNestedDoubleLiterals) {
25341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
2535d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
25361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
2537528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
25381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
25391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
25401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2541196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2542196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2543196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2544196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2545196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2546d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
254770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2548d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2549d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
2550034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "var elements = new Array(number_elements);"
25511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
2552034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2553034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "    elements[i] = [[1.1, 1.2, 1.3],[2.1, 2.2, 2.3]];"
2554034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  }"
2555034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org      "  return elements[number_elements - 1];"
25561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
2557d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2558d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2559d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2560d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2561d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated);
2562d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2563d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
25641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> double_array_1 =
25661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Object::Cast(*res)->Get(v8_str("0"));
25671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> double_array_handle_1 =
25681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array_1));
25691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> double_array_2 =
25701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Object::Cast(*res)->Get(v8_str("1"));
25711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> double_array_handle_2 =
25721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array_2));
25731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
25751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2576528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
2577528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle_1));
2578528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(double_array_handle_1->elements()));
2579528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle_2));
2580528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(CcTest::heap()->InOldDataSpace(double_array_handle_2->elements()));
25811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
25821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
25831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
258469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org// Make sure pretenuring feedback is gathered for constructed objects as well
258569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org// as for literals.
258669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.orgTEST(OptimizedPretenuringConstructorCalls) {
2587d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (!i::FLAG_pretenuring_call_new) {
258869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    // FLAG_pretenuring_call_new needs to be synced with the snapshot.
258969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    return;
259069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  }
259169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
2592d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
259369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  CcTest::InitializeVM();
259469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
259569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
259669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
259769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
2598196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2599196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2600196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2601196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2602196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2603d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
2604e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // Call new is doing slack tracking for the first
2605e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // JSFunction::kGenerousAllocationCount allocations, and we can't find
2606e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // mementos during that time.
260770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2608d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2609d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var number_elements = %d;"
261069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "var elements = new Array(number_elements);"
261169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "function foo() {"
261269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "  this.a = 3;"
261369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "  this.b = {};"
261469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "}"
261569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "function f() {"
261669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
261769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "    elements[i] = new foo();"
261869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "  }"
261969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "  return elements[number_elements - 1];"
262069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      "};"
2621d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2622d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2623d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2624d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2625e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated +
2626e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org      JSFunction::kGenerousAllocationCount);
2627d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2628d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
262969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
263069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  Handle<JSObject> o =
263169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
263269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
263369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
263469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org}
263569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
263669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org
2637d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgTEST(OptimizedPretenuringCallNew) {
2638d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (!i::FLAG_pretenuring_call_new) {
2639d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // FLAG_pretenuring_call_new needs to be synced with the snapshot.
2640d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    return;
2641d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
26421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
2643d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::FLAG_expose_gc = true;
26441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
2645528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
26461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
26471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
26481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2649196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Grow new space unitl maximum capacity reached.
2650196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (!CcTest::heap()->new_space()->IsAtMaximumCapacity()) {
2651196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    CcTest::heap()->new_space()->Grow();
2652196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2653196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2654d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  i::ScopedVector<char> source(1024);
2655e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // Call new is doing slack tracking for the first
2656e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // JSFunction::kGenerousAllocationCount allocations, and we can't find
2657e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // mementos during that time.
265870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  i::SNPrintF(
2659d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      source,
2660e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org      "var number_elements = %d;"
2661d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "var elements = new Array(number_elements);"
2662d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "function g() { this.a = 0; }"
26631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
2664d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "  for (var i = 0; i < number_elements; i++) {"
2665d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "    elements[i] = new g();"
2666d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "  }"
2667d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "  return elements[number_elements - 1];"
26681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
2669d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); gc();"
2670d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f(); f();"
2671d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "%%OptimizeFunctionOnNextCall(f);"
2672d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "f();",
2673e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org      AllocationSite::kPretenureMinimumCreated +
2674e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org      JSFunction::kGenerousAllocationCount);
2675d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2676d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> res = CompileRun(source.start());
26771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
26781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
26791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2680d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InOldPointerSpace(*o));
26811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
26821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
26831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2684d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Test regular array literals allocation.
2685d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgTEST(OptimizedAllocationArrayLiterals) {
268610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  i::FLAG_allow_natives_syntax = true;
268710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  CcTest::InitializeVM();
2688528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return;
268910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
269010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  v8::HandleScope scope(CcTest::isolate());
269110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
269210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  v8::Local<v8::Value> res = CompileRun(
269310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "function f() {"
2694d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "  var numbers = new Array(1, 2, 3);"
2695d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "  numbers[0] = 3.14;"
2696d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      "  return numbers;"
269710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "};"
269810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "f(); f(); f();"
269910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "%OptimizeFunctionOnNextCall(f);"
270010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "f();");
2701d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK_EQ(static_cast<int>(3.14),
2702d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org           v8::Object::Cast(*res)->Get(v8_str("0"))->Int32Value());
270310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
270410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  Handle<JSObject> o =
270510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2706d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2707d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CHECK(CcTest::heap()->InNewSpace(o->elements()));
270810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org}
270910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
271010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
27115f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgstatic int CountMapTransitions(Map* map) {
271299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return map->transitions()->number_of_transitions();
27135f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
27145f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
27155f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
27165f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org// Test that map transitions are cleared and maps are collected with
27175f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org// incremental marking as well.
27185f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgTEST(Regress1465) {
2719b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  i::FLAG_stress_compaction = false;
27205f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
27215f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  i::FLAG_trace_incremental_marking = true;
2722e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2723e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2724471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  static const int transitions_count = 256;
27255f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
27269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("function F() {}");
2727471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
27285697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AlwaysAllocateScope always_allocate(CcTest::i_isolate());
2729471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    for (int i = 0; i < transitions_count; i++) {
2730471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      EmbeddedVector<char, 64> buffer;
273170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buffer, "var o = new F; o.prop%d = %d;", i, i);
2732471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      CompileRun(buffer.start());
2733471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
27349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CompileRun("var root = new F;");
27355f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
2736471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
27375f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  Handle<JSObject> root =
27385f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      v8::Utils::OpenHandle(
27395f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org          *v8::Handle<v8::Object>::Cast(
2740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("root"))));
27415f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
27425f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  // Count number of live transitions before marking.
27435f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  int transitions_before = CountMapTransitions(root->map());
27445f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  CompileRun("%DebugPrint(root);");
2745471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK_EQ(transitions_count, transitions_before);
27465f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
27473e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
2748528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
27495f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
27505f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  // Count number of live transitions after marking.  Note that one transition
27515f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  // is left, because 'o' still holds an instance of one transition target.
27525f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  int transitions_after = CountMapTransitions(root->map());
27535f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  CompileRun("%DebugPrint(root);");
27545f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  CHECK_EQ(1, transitions_after);
27555f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
275637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
275737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
275874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org#ifdef DEBUG
275974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgstatic void AddTransitions(int transitions_count) {
276074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AlwaysAllocateScope always_allocate(CcTest::i_isolate());
276174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  for (int i = 0; i < transitions_count; i++) {
276274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org    EmbeddedVector<char, 64> buffer;
276370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(buffer, "var o = new F; o.prop%d = %d;", i, i);
276474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org    CompileRun(buffer.start());
276574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  }
276674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
276774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
276874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
276974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgstatic Handle<JSObject> GetByName(const char* name) {
277074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  return v8::Utils::OpenHandle(
277174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org      *v8::Handle<v8::Object>::Cast(
277274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org          CcTest::global()->Get(v8_str(name))));
277374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
277474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
277574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
277674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgstatic void AddPropertyTo(
277774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org    int gc_count, Handle<JSObject> object, const char* property_name) {
277874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
277974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Factory* factory = isolate->factory();
278074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String(property_name);
278174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Handle<Smi> twenty_three(Smi::FromInt(23), isolate);
278274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_gc_interval = gc_count;
278374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_gc_global = true;
278474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CcTest::heap()->set_allocation_timeout(gc_count);
27859bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  JSReceiver::SetProperty(object, prop_name, twenty_three, SLOPPY).Check();
278674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
278774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
278874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
278974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgTEST(TransitionArrayShrinksDuringAllocToZero) {
279074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_stress_compaction = false;
279174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
279274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CcTest::InitializeVM();
279374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
279474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  static const int transitions_count = 10;
27959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("function F() { }");
279674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddTransitions(transitions_count);
27979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("var root = new F;");
279874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Handle<JSObject> root = GetByName("root");
279974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
280074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions before marking.
280174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_before = CountMapTransitions(root->map());
280274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(transitions_count, transitions_before);
280374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
280474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Get rid of o
28059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("o = new F;"
28069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org             "root = new F");
280774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  root = GetByName("root");
280874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddPropertyTo(2, root, "funny");
280974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
281074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions after marking.  Note that one transition
281174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // is left, because 'o' still holds an instance of one transition target.
281274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_after = CountMapTransitions(
281374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org      Map::cast(root->map()->GetBackPointer()));
281474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(1, transitions_after);
281574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
281674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
281774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
281874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgTEST(TransitionArrayShrinksDuringAllocToOne) {
281974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_stress_compaction = false;
282074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
282174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CcTest::InitializeVM();
282274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
282374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  static const int transitions_count = 10;
28249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("function F() {}");
282574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddTransitions(transitions_count);
28269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("var root = new F;");
282774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Handle<JSObject> root = GetByName("root");
282874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
282974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions before marking.
283074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_before = CountMapTransitions(root->map());
283174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(transitions_count, transitions_before);
283274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
283374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  root = GetByName("root");
283474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddPropertyTo(2, root, "funny");
283574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
283674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions after marking.  Note that one transition
283774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // is left, because 'o' still holds an instance of one transition target.
283874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_after = CountMapTransitions(
283974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org      Map::cast(root->map()->GetBackPointer()));
284074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(2, transitions_after);
284174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
284274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
284374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
284474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgTEST(TransitionArrayShrinksDuringAllocToOnePropertyFound) {
284574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_stress_compaction = false;
284674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
284774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CcTest::InitializeVM();
284874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
284974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  static const int transitions_count = 10;
28509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("function F() {}");
285174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddTransitions(transitions_count);
28529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("var root = new F;");
285374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Handle<JSObject> root = GetByName("root");
285474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
285574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions before marking.
285674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_before = CountMapTransitions(root->map());
285774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(transitions_count, transitions_before);
285874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
285974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  root = GetByName("root");
286074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddPropertyTo(0, root, "prop9");
2861a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  CcTest::i_isolate()->heap()->CollectGarbage(OLD_POINTER_SPACE);
286274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
286374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions after marking.  Note that one transition
286474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // is left, because 'o' still holds an instance of one transition target.
286574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_after = CountMapTransitions(
286674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org      Map::cast(root->map()->GetBackPointer()));
286774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(1, transitions_after);
286874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
286974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
287074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
287174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgTEST(TransitionArraySimpleToFull) {
287274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_stress_compaction = false;
287374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
287474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CcTest::InitializeVM();
287574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
287674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  static const int transitions_count = 1;
28779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("function F() {}");
287874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddTransitions(transitions_count);
28799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("var root = new F;");
288074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  Handle<JSObject> root = GetByName("root");
288174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
288274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions before marking.
288374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_before = CountMapTransitions(root->map());
288474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(transitions_count, transitions_before);
288574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
28869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CompileRun("o = new F;"
28879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org             "root = new F");
288874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  root = GetByName("root");
2889e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(root->map()->transitions()->IsSimpleTransition());
289074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  AddPropertyTo(2, root, "happy");
289174dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
289274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // Count number of live transitions after marking.  Note that one transition
289374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  // is left, because 'o' still holds an instance of one transition target.
289474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  int transitions_after = CountMapTransitions(
289574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org      Map::cast(root->map()->GetBackPointer()));
289674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  CHECK_EQ(1, transitions_after);
289774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
289874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org#endif  // DEBUG
289974dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
290074dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
290137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgTEST(Regress2143a) {
290237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_collect_maps = true;
290337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_incremental_marking = true;
2904e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2905e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
290637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
290737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Prepare a map transition from the root object together with a yet
290837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // untransitioned root object.
290937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("var root = new Object;"
291037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root.foo = 0;"
291137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root = new Object;");
291237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
29133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
291437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
291537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Compile a StoreIC that performs the prepared map transition. This
291637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // will restart incremental marking and should make sure the root is
291737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // marked grey again.
291837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("function f(o) {"
291937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "  o.foo = 0;"
292037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "}"
292137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(new Object);"
292237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(root);");
292337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
292437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // This bug only triggers with aggressive IC clearing.
2925528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->AgeInlineCaches();
292637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
292737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Explicitly request GC to perform final marking step and sweeping.
2928528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
292937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
293037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  Handle<JSObject> root =
293137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      v8::Utils::OpenHandle(
293237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org          *v8::Handle<v8::Object>::Cast(
2933528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("root"))));
293437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
293537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // The root object should be in a sane state.
293637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->IsJSObject());
293737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->map()->IsMap());
293837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org}
293937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
294037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
294137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgTEST(Regress2143b) {
294237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_collect_maps = true;
294337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_incremental_marking = true;
294437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
2945e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2946e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
294737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
294837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Prepare a map transition from the root object together with a yet
294937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // untransitioned root object.
295037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("var root = new Object;"
295137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root.foo = 0;"
295237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root = new Object;");
295337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
29543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
295537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
295637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Compile an optimized LStoreNamedField that performs the prepared
295737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // map transition. This will restart incremental marking and should
295837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // make sure the root is marked grey again.
295937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("function f(o) {"
296037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "  o.foo = 0;"
296137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "}"
296237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(new Object);"
296337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(new Object);"
296437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "%OptimizeFunctionOnNextCall(f);"
296537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(root);"
296637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "%DeoptimizeFunction(f);");
296737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
296837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // This bug only triggers with aggressive IC clearing.
2969528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->AgeInlineCaches();
297037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
297137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Explicitly request GC to perform final marking step and sweeping.
2972528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
297337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
297437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  Handle<JSObject> root =
297537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      v8::Utils::OpenHandle(
297637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org          *v8::Handle<v8::Object>::Cast(
2977528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("root"))));
297837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
297937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // The root object should be in a sane state.
298037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->IsJSObject());
298137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->map()->IsMap());
298237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org}
2983de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2984de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2985de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.orgTEST(ReleaseOverReservedPages) {
2986c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  if (FLAG_never_compact) return;
2987de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  i::FLAG_trace_gc = true;
2988000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  // The optimizer can allocate stuff, messing up the test.
2989000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  i::FLAG_crankshaft = false;
2990000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  i::FLAG_always_opt = false;
2991e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2992528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
2993d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
2994528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Heap* heap = isolate->heap();
2995e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2996de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  static const int number_of_test_pages = 20;
2997de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2998de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Prepare many pages with low live-bytes count.
2999528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  PagedSpace* old_pointer_space = heap->old_pointer_space();
3000de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_EQ(1, old_pointer_space->CountTotalPages());
3001de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  for (int i = 0; i < number_of_test_pages; i++) {
30025697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AlwaysAllocateScope always_allocate(isolate);
3003de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    SimulateFullSpace(old_pointer_space);
3004d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    factory->NewFixedArray(1, TENURED);
3005de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
3006de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_EQ(number_of_test_pages + 1, old_pointer_space->CountTotalPages());
3007de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
3008de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Triggering one GC will cause a lot of garbage to be discovered but
3009de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // even spread across all allocated pages.
3010cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask,
3011cdbcce18778eb3df29e0aebc9743531b2be9956dmachenbach@chromium.org                          "triggered for preparation");
30125323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages());
3013de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
3014de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Triggering subsequent GCs should cause at least half of the pages
3015de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // to be released to the OS after at most two cycles.
3016528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 1");
3017de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages());
3018528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 2");
3019de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages() * 2);
3020de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
302156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // Triggering a last-resort GC should cause all pages to be released to the
302256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // OS so that other processes can seize the memory.  If we get a failure here
302356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // where there are 2 pages left instead of 1, then we should increase the
302456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // size of the first page a little in SizeOfFirstPage in spaces.cc.  The
302556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // first page should be small in order to reduce memory used when the VM
302656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // boots, but if the 20 small arrays don't fit on the first page then that's
302756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // an indication that it is too small.
3028528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  heap->CollectAllAvailableGarbage("triggered really hard");
3029de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_EQ(1, old_pointer_space->CountTotalPages());
3030de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org}
3031304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
3032304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
3033304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgTEST(Regress2237) {
3034b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  i::FLAG_stress_compaction = false;
3035e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3036528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3037d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
3038e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3039528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<String> slice(CcTest::heap()->empty_string());
3040304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
3041304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  {
3042304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    // Generate a parent that lives in new-space.
3043e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope inner_scope(CcTest::isolate());
3044304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    const char* c = "This text is long enough to trigger sliced strings.";
30458496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org    Handle<String> s = factory->NewStringFromAsciiChecked(c);
3046fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    CHECK(s->IsSeqOneByteString());
3047528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CHECK(CcTest::heap()->InNewSpace(*s));
3048304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
3049304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    // Generate a sliced string that is based on the above parent and
3050304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    // lives in old-space.
3051528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    SimulateFullSpace(CcTest::heap()->new_space());
30525697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    AlwaysAllocateScope always_allocate(isolate);
3053d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    Handle<String> t = factory->NewProperSubString(s, 5, 35);
3054304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    CHECK(t->IsSlicedString());
3055528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CHECK(!CcTest::heap()->InNewSpace(*t));
3056304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    *slice.location() = *t.location();
3057304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  }
3058304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
3059fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString());
3060528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
3061fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString());
3062304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
3063ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
3064ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
3065ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org#ifdef OBJECT_PRINT
3066ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.orgTEST(PrintSharedFunctionInfo) {
3067e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3068e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3069ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  const char* source = "f = function() { return 987654321; }\n"
3070ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org                       "g = function() { return 123456789; }\n";
3071ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  CompileRun(source);
3072ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  Handle<JSFunction> g =
3073ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org      v8::Utils::OpenHandle(
3074ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org          *v8::Handle<v8::Function>::Cast(
3075528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("g"))));
3076ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
3077f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OFStream os(stdout);
3078f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  g->shared()->Print(os);
3079f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << endl;
3080ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org}
3081ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org#endif  // OBJECT_PRINT
3082000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3083000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3084000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.orgTEST(Regress2211) {
3085e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3086e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3087000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3088000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  v8::Handle<v8::String> value = v8_str("val string");
3089000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  Smi* hash = Smi::FromInt(321);
30903484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  Factory* factory = CcTest::i_isolate()->factory();
3091000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3092000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  for (int i = 0; i < 2; i++) {
3093000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // Store identity hash first and common hidden property second.
30940f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    v8::Handle<v8::Object> obj = v8::Object::New(CcTest::isolate());
3095000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    Handle<JSObject> internal_obj = v8::Utils::OpenHandle(*obj);
3096000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK(internal_obj->HasFastProperties());
3097000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3098000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // In the first iteration, set hidden value first and identity hash second.
3099000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // In the second iteration, reverse the order.
3100000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    if (i == 0) obj->SetHiddenValue(v8_str("key string"), value);
3101057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    JSObject::SetIdentityHash(internal_obj, handle(hash, CcTest::i_isolate()));
3102000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    if (i == 1) obj->SetHiddenValue(v8_str("key string"), value);
3103000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3104000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // Check values.
3105000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK_EQ(hash,
31063484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org             internal_obj->GetHiddenProperty(factory->identity_hash_string()));
3107000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK(value->Equals(obj->GetHiddenValue(v8_str("key string"))));
3108000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
3109000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // Check size.
3110e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    FieldIndex index = FieldIndex::ForDescriptor(internal_obj->map(), 0);
3111000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    ObjectHashTable* hashtable = ObjectHashTable::cast(
3112e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org        internal_obj->RawFastPropertyAt(index));
3113000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // HashTable header (5) and 4 initial entries (8).
3114000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize);
3115000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  }
3116000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org}
3117471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3118471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(IncrementalMarkingClearsTypeFeedbackInfo) {
3120471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
3121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3122e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3123471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Local<v8::Value> fun1, fun2;
3124471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3125471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
3126471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
3127471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() {};");
3128471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    fun1 = env->Global()->Get(v8_str("fun"));
3129471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
3130471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3131471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
3132471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
3133471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() {};");
3134471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    fun2 = env->Global()->Get(v8_str("fun"));
3135471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
3136471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3137471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains type feedback for closures
313846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from two different native contexts.
3139528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::global()->Set(v8_str("fun1"), fun1);
3140528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::global()->Set(v8_str("fun2"), fun2);
31413a9c5d9b20b1897a1acd41dbad9e724c504a4db9machenbach@chromium.org  CompileRun("function f(a, b) { a(); b(); } f(fun1, fun2);");
3142f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
3143471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
3144471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
3145471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
3146528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
3147471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3148a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
3149f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
31509d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  int expected_length = FLAG_vector_ics ? 4 : 2;
31519d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK_EQ(expected_length, feedback_vector->length());
31529d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  for (int i = 0; i < expected_length; i++) {
31539d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    if ((i % 2) == 1) {
31549d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      CHECK(feedback_vector->get(i)->IsJSFunction());
31559d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    }
31569d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
3157471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
31583e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
3159528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
3160471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
31619d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  CHECK_EQ(expected_length, feedback_vector->length());
31629d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  for (int i = 0; i < expected_length; i++) {
31639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    CHECK_EQ(feedback_vector->get(i),
3164a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org             *TypeFeedbackVector::UninitializedSentinel(CcTest::i_isolate()));
31659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
3166471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
3167471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3168471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3169471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgstatic Code* FindFirstIC(Code* code, Code::Kind kind) {
3170471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
3171471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) |
31729cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org             RelocInfo::ModeMask(RelocInfo::CODE_TARGET_WITH_ID);
3173471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  for (RelocIterator it(code, mask); !it.done(); it.next()) {
3174471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    RelocInfo* info = it.rinfo();
3175471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Code* target = Code::GetCodeFromTargetAddress(info->target_address());
3176471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    if (target->is_inline_cache_stub() && target->kind() == kind) {
3177471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      return target;
3178471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
3179471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
3180471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  return NULL;
3181471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
3182471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3183471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
31849cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.orgTEST(IncrementalMarkingPreservesMonomorphicIC) {
3185471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
3186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3188471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3189471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains a monomorphic IC for object
319046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from the same native context.
3191471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
3192471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             "function f(o) { return o.x; } f(obj); f(obj);");
3193471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
3194471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
3195471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
3196528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
3197471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3198471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3199471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_before->ic_state() == MONOMORPHIC);
3200471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
32013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
3202528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
3203471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3204471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3205471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_after->ic_state() == MONOMORPHIC);
3206471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
3207471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3208471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
32099cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.orgTEST(IncrementalMarkingClearsMonomorphicIC) {
3210471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
3211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3213471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Local<v8::Value> obj1;
3214471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3215471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
3216471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
3217471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3218471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    obj1 = env->Global()->Get(v8_str("obj"));
3219471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
3220471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3221471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains a monomorphic IC for object
322246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from a different native context.
3223528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::global()->Set(v8_str("obj1"), obj1);
3224471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);");
3225471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
3226471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
3227471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
3228528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
3229471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3230471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
3231471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_before->ic_state() == MONOMORPHIC);
3232471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3233471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Fire context dispose notification.
3234f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  CcTest::isolate()->ContextDisposedNotification();
32353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
3236528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
3237471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3238471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
32398e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  CHECK(IC::IsCleared(ic_after));
3240471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
3241471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3242471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
32439cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.orgTEST(IncrementalMarkingClearsPolymorphicIC) {
3244471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
3245e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3246e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3247471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Local<v8::Value> obj1, obj2;
3248471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3249471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
3250471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
3251471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
3252471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    obj1 = env->Global()->Get(v8_str("obj"));
3253471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
3254471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3255471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
3256471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
3257471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() { this.x = 2; }; var obj = new fun();");
3258471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    obj2 = env->Global()->Get(v8_str("obj"));
3259471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
3260471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3261471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains a polymorphic IC for objects
326246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from two different native contexts.
3263528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::global()->Set(v8_str("obj1"), obj1);
3264528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::global()->Set(v8_str("obj2"), obj2);
3265471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);");
3266471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
3267471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
3268471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
3269528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org              CcTest::global()->Get(v8_str("f"))));
3270471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3271471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
32724a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CHECK(ic_before->ic_state() == POLYMORPHIC);
3273471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3274471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Fire context dispose notification.
3275f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  CcTest::isolate()->ContextDisposedNotification();
32763e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(CcTest::heap());
3277528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
3278471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
3279471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
32808e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  CHECK(IC::IsCleared(ic_after));
3281471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
3282355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3283355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
32842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgclass SourceResource : public v8::String::ExternalOneByteStringResource {
3285355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org public:
3286355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  explicit SourceResource(const char* data)
3287355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    : data_(data), length_(strlen(data)) { }
3288355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3289355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  virtual void Dispose() {
3290355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    i::DeleteArray(data_);
3291355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    data_ = NULL;
3292355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
3293355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3294355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  const char* data() const { return data_; }
3295355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3296355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  size_t length() const { return length_; }
3297355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3298355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  bool IsDisposed() { return data_ == NULL; }
3299355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3300355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org private:
3301355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  const char* data_;
3302355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  size_t length_;
3303355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org};
3304355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3305355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3306a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid ReleaseStackTraceDataTest(v8::Isolate* isolate, const char* source,
3307a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                               const char* accessor) {
3308355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Test that the data retained by the Error.stack accessor is released
3309355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // after the first time the accessor is fired.  We use external string
3310355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // to check whether the data is being released since the external string
3311355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // resource's callback is fired when the external string is GC'ed.
3312a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
3313a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::HandleScope scope(isolate);
3314355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  SourceResource* resource = new SourceResource(i::StrDup(source));
3315355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  {
3316a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::HandleScope scope(isolate);
33179f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    v8::Handle<v8::String> source_string =
3318a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::String::NewExternal(isolate, resource);
3319a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    i_isolate->heap()->CollectAllAvailableGarbage();
3320355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    v8::Script::Compile(source_string)->Run();
3321355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    CHECK(!resource->IsDisposed());
3322355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
3323a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  // i_isolate->heap()->CollectAllAvailableGarbage();
3324fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  CHECK(!resource->IsDisposed());
3325fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
3326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  CompileRun(accessor);
3327a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  i_isolate->heap()->CollectAllAvailableGarbage();
3328355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
3329355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // External source has been released.
3330355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  CHECK(resource->IsDisposed());
3331355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  delete resource;
3332355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}
333333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
333433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3335a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(ReleaseStackTraceData) {
3336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (i::FLAG_always_opt) {
3337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // TODO(ulan): Remove this once the memory leak via code_next_link is fixed.
3338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // See: https://codereview.chromium.org/181833004/
3339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return;
3340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
33419af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  FLAG_use_ic = false;  // ICs retain objects.
33429af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  FLAG_concurrent_recompilation = false;
3343a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate* isolate = v8::Isolate::New();
3344a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  {
3345a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::Scope isolate_scope(isolate);
3346a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::HandleScope handle_scope(isolate);
3347a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Context::New(isolate)->Enter();
3348a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    static const char* source1 = "var error = null;            "
3349a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /* Normal Error */           "try {                        "
3350a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  throw new Error();         "
3351a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "} catch (e) {                "
3352a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  error = e;                 "
3353a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "}                            ";
3354a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    static const char* source2 = "var error = null;            "
3355a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /* Stack overflow */         "try {                        "
3356a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  (function f() { f(); })(); "
3357a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "} catch (e) {                "
3358a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  error = e;                 "
3359a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "}                            ";
3360a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    static const char* source3 = "var error = null;            "
3361a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /* Normal Error */           "try {                        "
3362a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /* as prototype */           "  throw new Error();         "
3363a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "} catch (e) {                "
3364a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  error = {};                "
3365a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  error.__proto__ = e;       "
3366a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "}                            ";
3367a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    static const char* source4 = "var error = null;            "
3368a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /* Stack overflow */         "try {                        "
3369a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    /* as prototype   */         "  (function f() { f(); })(); "
3370a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "} catch (e) {                "
3371a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  error = {};                "
3372a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "  error.__proto__ = e;       "
3373a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                 "}                            ";
3374a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    static const char* getter = "error.stack";
3375a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    static const char* setter = "error.stack = 0";
3376a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
3377a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ReleaseStackTraceDataTest(isolate, source1, setter);
3378a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ReleaseStackTraceDataTest(isolate, source2, setter);
3379a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // We do not test source3 and source4 with setter, since the setter is
3380a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // supposed to (untypically) write to the receiver, not the holder.  This is
3381a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // to emulate the behavior of a data property.
3382a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
3383a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ReleaseStackTraceDataTest(isolate, source1, getter);
3384a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ReleaseStackTraceDataTest(isolate, source2, getter);
3385a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ReleaseStackTraceDataTest(isolate, source3, getter);
3386a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ReleaseStackTraceDataTest(isolate, source4, getter);
3387a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
3388a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  isolate->Dispose();
3389eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
3390eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
3391eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
339232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgTEST(Regress159140) {
339332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
339432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  i::FLAG_flush_code_incrementally = true;
3395e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3396528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3397c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
33982bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
339932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
340032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Perform one initial GC to enable code flushing.
3401c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
340232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
340332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Prepare several closures that are all eligible for code flushing
340432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // because all reachable ones are not optimized. Make sure that the
340532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // optimized code object is directly reachable through a handle so
340632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // that it is marked black during incremental marking.
340732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  Handle<Code> code;
340832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  {
3409c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
341032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CompileRun("function h(x) {}"
341132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "function mkClosure() {"
341232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "  return function(x) { return x + 1; };"
341332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "}"
341432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "var f = mkClosure();"
341532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "var g = mkClosure();"
341632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "f(1); f(2);"
341732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "g(1); g(2);"
341832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "h(1); h(2);"
341932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "%OptimizeFunctionOnNextCall(f); f(3);"
342032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "%OptimizeFunctionOnNextCall(h); h(3);");
342132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
342232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    Handle<JSFunction> f =
342332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        v8::Utils::OpenHandle(
342432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org            *v8::Handle<v8::Function>::Cast(
3425528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("f"))));
342632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CHECK(f->is_compiled());
342732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CompileRun("f = null;");
342832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
342932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    Handle<JSFunction> g =
343032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        v8::Utils::OpenHandle(
343132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org            *v8::Handle<v8::Function>::Cast(
3432528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("g"))));
343332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CHECK(g->is_compiled());
343432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    const int kAgingThreshold = 6;
343532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
343632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      g->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
343732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    }
343832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
343932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    code = inner_scope.CloseAndEscape(Handle<Code>(f->code()));
344032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  }
344132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
344232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Simulate incremental marking so that the functions are enqueued as
344332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // code flushing candidates. Then optimize one function. Finally
344432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // finish the GC to complete code flushing.
34453e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(heap);
344632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  CompileRun("%OptimizeFunctionOnNextCall(g); g(3);");
3447c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
344832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
344932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Unoptimized code is missing and the deoptimizer will go ballistic.
345032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  CompileRun("g('bozo');");
345132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
3452a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3453a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3454a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgTEST(Regress165495) {
3455a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
3456a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  i::FLAG_flush_code_incrementally = true;
3457e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3458528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3459c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
34602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3461a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3462a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Perform one initial GC to enable code flushing.
3463c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
3464a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3465a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Prepare an optimized closure that the optimized code map will get
3466a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // populated. Then age the unoptimized code to trigger code flushing
3467a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // but make sure the optimized code is unreachable.
3468a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  {
3469c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
3470a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CompileRun("function mkClosure() {"
3471a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "  return function(x) { return x + 1; };"
3472a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "}"
3473a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "var f = mkClosure();"
3474a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "f(1); f(2);"
3475a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "%OptimizeFunctionOnNextCall(f); f(3);");
3476a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3477a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    Handle<JSFunction> f =
3478a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        v8::Utils::OpenHandle(
3479a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org            *v8::Handle<v8::Function>::Cast(
3480528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("f"))));
3481a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CHECK(f->is_compiled());
3482a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    const int kAgingThreshold = 6;
3483a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
3484a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
3485a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    }
3486a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3487a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CompileRun("f = null;");
3488a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
3489a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3490a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Simulate incremental marking so that unoptimized code is flushed
3491a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // even though it still is cached in the optimized code map.
34923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(heap);
3493c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3494a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3495a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Make a new closure that will get code installed from the code map.
3496a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Unoptimized code is missing and the deoptimizer will go ballistic.
3497a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  CompileRun("var g = mkClosure(); g('bozo');");
3498a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}
34999768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35009768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35019768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.orgTEST(Regress169209) {
35022f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org  i::FLAG_stress_compaction = false;
35039768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
35049768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  i::FLAG_flush_code_incrementally = true;
3505906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
3506e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3507528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3508c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
35092bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
35109768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35119768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Perform one initial GC to enable code flushing.
3512c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
35139768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35149768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Prepare a shared function info eligible for code flushing for which
35159768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // the unoptimized code will be replaced during optimization.
35169768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  Handle<SharedFunctionInfo> shared1;
35179768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  {
3518c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
35199768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CompileRun("function f() { return 'foobar'; }"
35209768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "function g(x) { if (x) f(); }"
35219768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "f();"
35229768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "g(false);"
35239768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "g(false);");
35249768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35259768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    Handle<JSFunction> f =
35269768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org        v8::Utils::OpenHandle(
35279768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org            *v8::Handle<v8::Function>::Cast(
3528528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("f"))));
35299768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CHECK(f->is_compiled());
35309768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    const int kAgingThreshold = 6;
35319768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
35329768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
35339768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    }
35349768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
3535c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    shared1 = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
35369768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  }
35379768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35389768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Prepare a shared function info eligible for code flushing that will
35399768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // represent the dangling tail of the candidate list.
35409768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  Handle<SharedFunctionInfo> shared2;
35419768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  {
3542c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
35439768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CompileRun("function flushMe() { return 0; }"
35449768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "flushMe(1);");
35459768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35469768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    Handle<JSFunction> f =
35479768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org        v8::Utils::OpenHandle(
35489768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org            *v8::Handle<v8::Function>::Cast(
3549528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("flushMe"))));
35509768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CHECK(f->is_compiled());
35519768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    const int kAgingThreshold = 6;
35529768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
35539768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
35549768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    }
35559768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
3556c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    shared2 = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
35579768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  }
35589768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35599768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Simulate incremental marking and collect code flushing candidates.
35603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(heap);
35619768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  CHECK(shared1->code()->gc_metadata() != NULL);
35629768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35639768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Optimize function and make sure the unoptimized code is replaced.
35649768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org#ifdef DEBUG
35659768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  FLAG_stop_at = "f";
35669768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org#endif
35679768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  CompileRun("%OptimizeFunctionOnNextCall(g);"
35689768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org             "g(false);");
35699768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
35709768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Finish garbage collection cycle.
3571c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
35729768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  CHECK(shared1->code()->gc_metadata() == NULL);
35739768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org}
357428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
357528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
357628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org// Helper function that simulates a fill new-space in the heap.
357728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.orgstatic inline void AllocateAllButNBytes(v8::internal::NewSpace* space,
357828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                                        int extra_bytes) {
357928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  int space_remaining = static_cast<int>(
358028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org      *space->allocation_limit_address() - *space->allocation_top_address());
358128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK(space_remaining >= extra_bytes);
358228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  int new_linear_size = space_remaining - extra_bytes;
3583a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  v8::internal::AllocationResult allocation =
3584a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      space->AllocateRaw(new_linear_size);
3585a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  v8::internal::FreeListNode* node =
3586a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      v8::internal::FreeListNode::cast(allocation.ToObjectChecked());
358728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  node->set_size(space->heap(), new_linear_size);
358828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org}
358928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
359028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
359128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.orgTEST(Regress169928) {
359228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
359328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  i::FLAG_crankshaft = false;
3594e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3595528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3596d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
3597e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
359828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
359928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Some flags turn Scavenge collections into Mark-sweep collections
360028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // and hence are incompatible with this test case.
360128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  if (FLAG_gc_global || FLAG_stress_compaction) return;
360228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
360328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Prepare the environment
360428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CompileRun("function fastliteralcase(literal, value) {"
360528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    literal[0] = value;"
360628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    return literal;"
360728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "}"
360828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "function get_standard_literal() {"
360928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    var literal = [1, 2, 3];"
361028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    return literal;"
361128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "}"
361228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "obj = fastliteralcase(get_standard_literal(), 1);"
361328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "obj = fastliteralcase(get_standard_literal(), 1.5);"
361428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "obj = fastliteralcase(get_standard_literal(), 2);");
361528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
361628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // prepare the heap
361728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Local<v8::String> mote_code_string =
361828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org      v8_str("fastliteralcase(mote, 2.5);");
361928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
362028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Local<v8::String> array_name = v8_str("mote");
36210f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  CcTest::global()->Set(array_name, v8::Int32::New(CcTest::isolate(), 0));
362228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
362328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // First make sure we flip spaces
3624528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::heap()->CollectGarbage(NEW_SPACE);
362528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
362628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Allocate the object.
3627d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<FixedArray> array_data = factory->NewFixedArray(2, NOT_TENURED);
362828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  array_data->set(0, Smi::FromInt(1));
362928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  array_data->set(1, Smi::FromInt(2));
363028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
3631528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  AllocateAllButNBytes(CcTest::heap()->new_space(),
3632ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                       JSArray::kSize + AllocationMemento::kSize +
363328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                       kPointerSize);
363428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
3635d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSArray> array = factory->NewJSArrayWithElements(array_data,
363628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                                                          FAST_SMI_ELEMENTS,
363728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                                                          NOT_TENURED);
363828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
363928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK_EQ(Smi::FromInt(2), array->length());
364028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK(array->HasFastSmiOrObjectElements());
364128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
3642ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  // We need filler the size of AllocationMemento object, plus an extra
364328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // fill pointer value.
3644a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  HeapObject* obj = NULL;
3645a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  AllocationResult allocation = CcTest::heap()->new_space()->AllocateRaw(
36468496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org      AllocationMemento::kSize + kPointerSize);
3647a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(allocation.To(&obj));
3648a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Address addr_obj = obj->address();
3649a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CcTest::heap()->CreateFillerObjectAt(
3650a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      addr_obj, AllocationMemento::kSize + kPointerSize);
365128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
365228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Give the array a name, making sure not to allocate strings.
365328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array);
3654528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::global()->Set(array_name, array_obj);
365528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
365628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // This should crash with a protection violation if we are running a build
365728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // with the bug.
36585697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  AlwaysAllocateScope aa_scope(isolate);
365928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Script::Compile(mote_code_string)->Run();
366028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org}
3661c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3662c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3663c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.orgTEST(Regress168801) {
3664c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  if (i::FLAG_never_compact) return;
3665c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_always_compact = true;
3666c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_cache_optimized_code = false;
3667c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_allow_natives_syntax = true;
3668c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_flush_code_incrementally = true;
3669e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3670528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3671c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
36722bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3673c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3674c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Perform one initial GC to enable code flushing.
3675c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
3676c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3677c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Ensure the code ends up on an evacuation candidate.
3678c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  SimulateFullSpace(heap->code_space());
3679c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3680c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Prepare an unoptimized function that is eligible for code flushing.
3681c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  Handle<JSFunction> function;
3682c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  {
3683c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
3684c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    CompileRun("function mkClosure() {"
3685c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "  return function(x) { return x + 1; };"
3686c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "}"
3687c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "var f = mkClosure();"
3688c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "f(1); f(2);");
3689c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3690c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    Handle<JSFunction> f =
3691c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org        v8::Utils::OpenHandle(
3692c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org            *v8::Handle<v8::Function>::Cast(
3693528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("f"))));
3694c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    CHECK(f->is_compiled());
3695c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    const int kAgingThreshold = 6;
3696c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
3697c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
3698c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    }
3699c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3700c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    function = inner_scope.CloseAndEscape(handle(*f, isolate));
3701c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  }
3702c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3703c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Simulate incremental marking so that unoptimized function is enqueued as a
3704c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // candidate for code flushing. The shared function info however will not be
3705c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // explicitly enqueued.
37063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(heap);
3707c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3708c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Now optimize the function so that it is taken off the candidate list.
3709c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  {
3710c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
3711c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(f); f(3);");
3712c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  }
3713c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3714c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // This cycle will bust the heap and subsequent cycles will go ballistic.
3715c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3716c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3717c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org}
37187c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37197c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37207c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgTEST(Regress173458) {
3721c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  if (i::FLAG_never_compact) return;
37227c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_always_compact = true;
37237c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_cache_optimized_code = false;
37247c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_allow_natives_syntax = true;
37257c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_flush_code_incrementally = true;
3726e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3727528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3728c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
37292bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
37307c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37317c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Perform one initial GC to enable code flushing.
3732c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
37337c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37347c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Ensure the code ends up on an evacuation candidate.
3735c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  SimulateFullSpace(heap->code_space());
37367c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37377c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Prepare an unoptimized function that is eligible for code flushing.
37387c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Handle<JSFunction> function;
37397c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  {
3740c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
37417c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    CompileRun("function mkClosure() {"
37427c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "  return function(x) { return x + 1; };"
37437c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "}"
37447c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "var f = mkClosure();"
37457c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "f(1); f(2);");
37467c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37477c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    Handle<JSFunction> f =
37487c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org        v8::Utils::OpenHandle(
37497c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org            *v8::Handle<v8::Function>::Cast(
3750528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                CcTest::global()->Get(v8_str("f"))));
37517c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    CHECK(f->is_compiled());
37527c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    const int kAgingThreshold = 6;
37537c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
37547c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
37557c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    }
37567c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
3757c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    function = inner_scope.CloseAndEscape(handle(*f, isolate));
37587c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  }
37597c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37607c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Simulate incremental marking so that unoptimized function is enqueued as a
37617c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // candidate for code flushing. The shared function info however will not be
37627c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // explicitly enqueued.
37633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  SimulateIncrementalMarking(heap);
37647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37657c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Now enable the debugger which in turn will disable code flushing.
3766c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  CHECK(isolate->debug()->Load());
37677c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
37687c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // This cycle will bust the heap and subsequent cycles will go ballistic.
3769c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3770c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
37717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
3772876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3773876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3774876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgclass DummyVisitor : public ObjectVisitor {
3775876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org public:
3776876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  void VisitPointers(Object** start, Object** end) { }
3777876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org};
3778876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3779876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3780876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgTEST(DeferredHandles) {
3781e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3782528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3783876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  Heap* heap = isolate->heap();
3784c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate));
378526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  HandleScopeData* data = isolate->handle_scope_data();
3786876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  Handle<Object> init(heap->empty_string(), isolate);
3787876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  while (data->next < data->limit) {
3788876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    Handle<Object> obj(heap->empty_string(), isolate);
3789876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
3790876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  // An entire block of handles has been filled.
3791876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  // Next handle would require a new block.
3792e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(data->next == data->limit);
3793876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3794876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  DeferredHandleScope deferred(isolate);
3795876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  DummyVisitor visitor;
3796876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  isolate->handle_scope_implementer()->Iterate(&visitor);
379725530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  delete deferred.Detach();
3798876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
3799b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
3800b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
3801b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgTEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) {
3802b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  CcTest::InitializeVM();
3803b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  v8::HandleScope scope(CcTest::isolate());
3804b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  CompileRun("function f(n) {"
3805b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "    var a = new Array(n);"
3806b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "    for (var i = 0; i < n; i += 100) a[i] = i;"
3807b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "};"
3808b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "f(10 * 1024 * 1024);");
3809528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  IncrementalMarking* marking = CcTest::heap()->incremental_marking();
3810b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (marking->IsStopped()) marking->Start();
3811b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // This big step should be sufficient to mark the whole array.
3812b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
3813e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(marking->IsComplete());
3814b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org}
3815b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
3816b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
3817b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgTEST(DisableInlineAllocation) {
3818b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
3819b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CcTest::InitializeVM();
3820b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
3821b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CompileRun("function test() {"
3822b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "  var x = [];"
3823b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "  for (var i = 0; i < 10; i++) {"
3824b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "    x[i] = [ {}, [1,2,3], [1,x,3] ];"
3825b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "  }"
3826b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "}"
3827b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "function run() {"
3828b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "  %OptimizeFunctionOnNextCall(test);"
3829b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "  test();"
3830b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "  %DeoptimizeFunction(test);"
3831b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org             "}");
3832b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
3833b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // Warm-up with inline allocation enabled.
3834b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CompileRun("test(); test(); run();");
3835b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
3836b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // Run test with inline allocation disabled.
3837b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CcTest::heap()->DisableInlineAllocation();
3838b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CompileRun("run()");
3839b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
3840b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  // Run test with inline allocation re-enabled.
3841b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CcTest::heap()->EnableInlineAllocation();
3842b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  CompileRun("run()");
3843b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org}
38449af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38459af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38469af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgstatic int AllocationSitesCount(Heap* heap) {
38479af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  int count = 0;
38489af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  for (Object* site = heap->allocation_sites_list();
38499af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org       !(site->IsUndefined());
38509af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org       site = AllocationSite::cast(site)->weak_next()) {
38519af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    count++;
38529af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
38539af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return count;
38549af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org}
38559af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38569af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38579af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgTEST(EnsureAllocationSiteDependentCodesProcessed) {
38589af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
38599af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
38609af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  CcTest::InitializeVM();
38619af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
38629af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  v8::internal::Heap* heap = CcTest::heap();
38639af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
38649af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38657ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  if (!isolate->use_crankshaft()) return;
38667ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
38679af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  // The allocation site at the head of the list is ours.
38689af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  Handle<AllocationSite> site;
38699af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  {
38709af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    LocalContext context;
38719af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    v8::HandleScope scope(context->GetIsolate());
38729af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38739af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    int count = AllocationSitesCount(heap);
38749af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    CompileRun("var bar = function() { return (new Array()); };"
38759af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org               "var a = bar();"
38769af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org               "bar();"
38779af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org               "bar();");
38789af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38799af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    // One allocation site should have been created.
38809af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    int new_count = AllocationSitesCount(heap);
38819af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    CHECK_EQ(new_count, (count + 1));
38829af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    site = Handle<AllocationSite>::cast(
38839af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org        global_handles->Create(
38849af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org            AllocationSite::cast(heap->allocation_sites_list())));
38859af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38869af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(bar); bar();");
38879af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
38889af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    DependentCode::GroupStartIndexes starts(site->dependent_code());
38899af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    CHECK_GE(starts.number_of_entries(), 1);
38909af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    int index = starts.at(DependentCode::kAllocationSiteTransitionChangedGroup);
38919af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    CHECK(site->dependent_code()->is_code_at(index));
38929af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    Code* function_bar = site->dependent_code()->code_at(index);
38939af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    Handle<JSFunction> bar_handle =
38949af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org        v8::Utils::OpenHandle(
38959af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org            *v8::Handle<v8::Function>::Cast(
38969af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org                CcTest::global()->Get(v8_str("bar"))));
38979af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    CHECK_EQ(bar_handle->code(), function_bar);
38989af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
38999af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
39009af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  // Now make sure that a gc should get rid of the function, even though we
39019af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  // still have the allocation site alive.
39029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  for (int i = 0; i < 4; i++) {
3903e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org    heap->CollectAllGarbage(Heap::kNoGCFlags);
39049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
39059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
39069af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  // The site still exists because of our global handle, but the code is no
39079af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  // longer referred to by dependent_code().
39089af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  DependentCode::GroupStartIndexes starts(site->dependent_code());
39099af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  int index = starts.at(DependentCode::kAllocationSiteTransitionChangedGroup);
39109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  CHECK(!(site->dependent_code()->is_code_at(index)));
39119af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org}
391226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
391326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
391426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgTEST(CellsInOptimizedCodeAreWeak) {
391526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
391626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  i::FLAG_weak_embedded_objects_in_optimized_code = true;
391726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
391826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  CcTest::InitializeVM();
391926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
392026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  v8::internal::Heap* heap = CcTest::heap();
392126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
392226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  if (!isolate->use_crankshaft()) return;
392326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  HandleScope outer_scope(heap->isolate());
392426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  Handle<Code> code;
392526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  {
392626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LocalContext context;
392726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HandleScope scope(heap->isolate());
392826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
392926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    CompileRun("bar = (function() {"
393026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  function bar() {"
393126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "    return foo(1);"
393226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  };"
393326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  var foo = function(x) { with (x) { return 1 + x; } };"
393426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  bar(foo);"
393526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  bar(foo);"
393626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  bar(foo);"
393726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  %OptimizeFunctionOnNextCall(bar);"
393826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  bar(foo);"
393926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  return bar;})();");
394026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
394126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    Handle<JSFunction> bar =
394226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org        v8::Utils::OpenHandle(
394326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org            *v8::Handle<v8::Function>::Cast(
394426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                CcTest::global()->Get(v8_str("bar"))));
394526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    code = scope.CloseAndEscape(Handle<Code>(bar->code()));
394626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
394726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
394826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Now make sure that a gc should get rid of the function
394926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 0; i < 4; i++) {
395026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
395126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
395226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
3953e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(code->marked_for_deoptimization());
395426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
395526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
395626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
395726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgTEST(ObjectsInOptimizedCodeAreWeak) {
395826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
395926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  i::FLAG_weak_embedded_objects_in_optimized_code = true;
396026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
396126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  CcTest::InitializeVM();
396226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
396326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  v8::internal::Heap* heap = CcTest::heap();
396426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
396526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  if (!isolate->use_crankshaft()) return;
396626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  HandleScope outer_scope(heap->isolate());
396726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  Handle<Code> code;
396826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  {
396926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LocalContext context;
397026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HandleScope scope(heap->isolate());
397126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
397226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    CompileRun("function bar() {"
397326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "  return foo(1);"
397426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "};"
397526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "function foo(x) { with (x) { return 1 + x; } };"
397626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "bar();"
397726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "bar();"
397826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "bar();"
397926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "%OptimizeFunctionOnNextCall(bar);"
398026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org               "bar();");
398126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
398226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    Handle<JSFunction> bar =
398326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org        v8::Utils::OpenHandle(
398426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org            *v8::Handle<v8::Function>::Cast(
398526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                CcTest::global()->Get(v8_str("bar"))));
398626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    code = scope.CloseAndEscape(Handle<Code>(bar->code()));
398726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
398826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
398926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Now make sure that a gc should get rid of the function
399026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 0; i < 4; i++) {
399126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
399226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
399326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
3994e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(code->marked_for_deoptimization());
399526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
3996486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
3997486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
3998aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.orgTEST(NoWeakHashTableLeakWithIncrementalMarking) {
3999aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
4000aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  if (!i::FLAG_incremental_marking) return;
4001aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  i::FLAG_weak_embedded_objects_in_optimized_code = true;
4002aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
4003aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  i::FLAG_compilation_cache = false;
4004aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  CcTest::InitializeVM();
4005aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4006aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  v8::internal::Heap* heap = CcTest::heap();
4007aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org
4008aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  if (!isolate->use_crankshaft()) return;
4009aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  HandleScope outer_scope(heap->isolate());
4010aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  for (int i = 0; i < 3; i++) {
40113e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    SimulateIncrementalMarking(heap);
4012aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    {
4013aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org      LocalContext context;
4014aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org      HandleScope scope(heap->isolate());
4015aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org      EmbeddedVector<char, 256> source;
401670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(source,
401770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "function bar%d() {"
401870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "  return foo%d(1);"
401970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "};"
402070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "function foo%d(x) { with (x) { return 1 + x; } };"
402170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "bar%d();"
402270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "bar%d();"
402370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "bar%d();"
402470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "%%OptimizeFunctionOnNextCall(bar%d);"
402570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org               "bar%d();", i, i, i, i, i, i, i, i);
4026aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org      CompileRun(source.start());
4027aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    }
4028aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    heap->CollectAllGarbage(i::Heap::kNoGCFlags);
4029aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  }
4030aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  int elements = 0;
4031aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  if (heap->weak_object_to_code_table()->IsHashTable()) {
4032aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    WeakHashTable* t = WeakHashTable::cast(heap->weak_object_to_code_table());
4033aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org    elements = t->NumberOfElements();
4034aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  }
4035aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  CHECK_EQ(0, elements);
4036aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org}
4037aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org
4038895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4039895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgstatic Handle<JSFunction> OptimizeDummyFunction(const char* name) {
4040895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  EmbeddedVector<char, 256> source;
404170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  SNPrintF(source,
404270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org          "function %s() { return 0; }"
404370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org          "%s(); %s();"
404470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org          "%%OptimizeFunctionOnNextCall(%s);"
404570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org          "%s();", name, name, name, name, name);
4046895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CompileRun(source.start());
4047895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<JSFunction> fun =
4048895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org      v8::Utils::OpenHandle(
4049895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org          *v8::Handle<v8::Function>::Cast(
4050895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org              CcTest::global()->Get(v8_str(name))));
4051895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return fun;
4052895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
4053895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4054895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4055895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgstatic int GetCodeChainLength(Code* code) {
4056895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  int result = 0;
4057895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  while (code->next_code_link()->IsCode()) {
4058895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    result++;
4059895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    code = Code::cast(code->next_code_link());
4060895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  }
4061895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return result;
4062895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
4063895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4064895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4065895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgTEST(NextCodeLinkIsWeak) {
4066895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
40676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org  i::FLAG_turbo_deoptimization = true;
4068895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CcTest::InitializeVM();
4069895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4070895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  v8::internal::Heap* heap = CcTest::heap();
4071895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4072895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (!isolate->use_crankshaft()) return;
4073895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  HandleScope outer_scope(heap->isolate());
4074895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<Code> code;
4075895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  heap->CollectAllAvailableGarbage();
4076895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  int code_chain_length_before, code_chain_length_after;
4077895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  {
4078895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    HandleScope scope(heap->isolate());
4079895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    Handle<JSFunction> mortal = OptimizeDummyFunction("mortal");
4080895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    Handle<JSFunction> immortal = OptimizeDummyFunction("immortal");
4081895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    CHECK_EQ(immortal->code()->next_code_link(), mortal->code());
4082895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    code_chain_length_before = GetCodeChainLength(immortal->code());
4083895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    // Keep the immortal code and let the mortal code die.
4084895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    code = scope.CloseAndEscape(Handle<Code>(immortal->code()));
4085895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    CompileRun("mortal = null; immortal = null;");
4086895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  }
4087895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  heap->CollectAllAvailableGarbage();
4088895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  // Now mortal code should be dead.
4089895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  code_chain_length_after = GetCodeChainLength(*code);
4090895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CHECK_EQ(code_chain_length_before - 1, code_chain_length_after);
4091895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
4092895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4093895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4094895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgstatic Handle<Code> DummyOptimizedCode(Isolate* isolate) {
4095895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  i::byte buffer[i::Assembler::kMinimalBufferSize];
4096895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  MacroAssembler masm(isolate, buffer, sizeof(buffer));
4097895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CodeDesc desc;
4098a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org  masm.Push(isolate->factory()->undefined_value());
4099a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org  masm.Drop(1);
4100895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  masm.GetCode(&desc);
4101895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<Object> undefined(isolate->heap()->undefined_value(), isolate);
4102895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<Code> code = isolate->factory()->NewCode(
4103895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org      desc, Code::ComputeFlags(Code::OPTIMIZED_FUNCTION), undefined);
4104895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CHECK(code->IsCode());
4105895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return code;
4106895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
4107895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4108895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4109895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgTEST(NextCodeLinkIsWeak2) {
4110895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  i::FLAG_allow_natives_syntax = true;
4111895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CcTest::InitializeVM();
4112895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4113895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  v8::internal::Heap* heap = CcTest::heap();
4114895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4115895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (!isolate->use_crankshaft()) return;
4116895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  HandleScope outer_scope(heap->isolate());
4117895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  heap->CollectAllAvailableGarbage();
4118895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<Context> context(Context::cast(heap->native_contexts_list()), isolate);
4119895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<Code> new_head;
4120895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  Handle<Object> old_head(context->get(Context::OPTIMIZED_CODE_LIST), isolate);
4121895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  {
4122895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    HandleScope scope(heap->isolate());
4123895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    Handle<Code> immortal = DummyOptimizedCode(isolate);
4124895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    Handle<Code> mortal = DummyOptimizedCode(isolate);
4125895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    mortal->set_next_code_link(*old_head);
4126895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    immortal->set_next_code_link(*mortal);
4127895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    context->set(Context::OPTIMIZED_CODE_LIST, *immortal);
4128895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    new_head = scope.CloseAndEscape(immortal);
4129895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  }
4130895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  heap->CollectAllAvailableGarbage();
4131895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  // Now mortal code should be dead.
4132895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  CHECK_EQ(*old_head, new_head->next_code_link());
4133895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
4134895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
4135895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
41362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstatic bool weak_ic_cleared = false;
41372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstatic void ClearWeakIC(const v8::WeakCallbackData<v8::Object, void>& data) {
41392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  printf("clear weak is called\n");
41402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  weak_ic_cleared = true;
41412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  v8::Persistent<v8::Value>* p =
41422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      reinterpret_cast<v8::Persistent<v8::Value>*>(data.GetParameter());
41432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK(p->IsNearDeath());
41442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  p->Reset();
41452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
41462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41472ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org// Checks that the value returned by execution of the source is weak.
41492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid CheckWeakness(const char* source) {
41502ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  i::FLAG_stress_compaction = false;
41512ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CcTest::InitializeVM();
41522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
41532ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  v8::HandleScope scope(isolate);
41542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  v8::Persistent<v8::Object> garbage;
41552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  {
41562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    v8::HandleScope scope(isolate);
41572ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    garbage.Reset(isolate, CompileRun(source)->ToObject());
41582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  }
41592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  weak_ic_cleared = false;
41602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  garbage.SetWeak(static_cast<void*>(&garbage), &ClearWeakIC);
41612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Heap* heap = CcTest::i_isolate()->heap();
41622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
41632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CHECK(weak_ic_cleared);
41642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
41652ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41662ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org// Each of the following "weak IC" tests creates an IC that embeds a map with
41682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org// the prototype pointing to _proto_ and checks that the _proto_ dies on GC.
41692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgTEST(WeakMapInMonomorphicLoadIC) {
41702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CheckWeakness("function loadIC(obj) {"
41712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "  return obj.name;"
41722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "}"
41732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " (function() {"
41742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var proto = {'name' : 'weak'};"
41752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var obj = Object.create(proto);"
41762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   loadIC(obj);"
41772ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   loadIC(obj);"
41782ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   loadIC(obj);"
41792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   return proto;"
41802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " })();");
41812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
41822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgTEST(WeakMapInMonomorphicKeyedLoadIC) {
41852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CheckWeakness("function keyedLoadIC(obj, field) {"
41862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "  return obj[field];"
41872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "}"
41882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " (function() {"
41892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var proto = {'name' : 'weak'};"
41902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var obj = Object.create(proto);"
41912ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   keyedLoadIC(obj, 'name');"
41922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   keyedLoadIC(obj, 'name');"
41932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   keyedLoadIC(obj, 'name');"
41942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   return proto;"
41952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " })();");
41962ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
41972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
41992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgTEST(WeakMapInMonomorphicStoreIC) {
42002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CheckWeakness("function storeIC(obj, value) {"
42012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "  obj.name = value;"
42022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "}"
42032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " (function() {"
42042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var proto = {'name' : 'weak'};"
42052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var obj = Object.create(proto);"
42062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   storeIC(obj, 'x');"
42072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   storeIC(obj, 'x');"
42082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   storeIC(obj, 'x');"
42092ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   return proto;"
42102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " })();");
42112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
42122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
42132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
42142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgTEST(WeakMapInMonomorphicKeyedStoreIC) {
42152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CheckWeakness("function keyedStoreIC(obj, field, value) {"
42162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "  obj[field] = value;"
42172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "}"
42182ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " (function() {"
42192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var proto = {'name' : 'weak'};"
42202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var obj = Object.create(proto);"
42212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   keyedStoreIC(obj, 'x');"
42222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   keyedStoreIC(obj, 'x');"
42232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   keyedStoreIC(obj, 'x');"
42242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   return proto;"
42252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " })();");
42262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
42272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
42282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
42292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgTEST(WeakMapInMonomorphicCompareNilIC) {
42302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  CheckWeakness("function compareNilIC(obj) {"
42312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "  return obj == null;"
42322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "}"
42332ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " (function() {"
42342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var proto = {'name' : 'weak'};"
42352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   var obj = Object.create(proto);"
42362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   compareNilIC(obj);"
42372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   compareNilIC(obj);"
42382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   compareNilIC(obj);"
42392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                "   return proto;"
42402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                " })();");
42412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
42422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
42432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
4244486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org#ifdef DEBUG
4245486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgTEST(AddInstructionChangesNewSpacePromotion) {
4246486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  i::FLAG_allow_natives_syntax = true;
4247486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  i::FLAG_expose_gc = true;
4248486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  i::FLAG_stress_compaction = true;
4249486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  i::FLAG_gc_interval = 1000;
4250486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  CcTest::InitializeVM();
4251486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (!i::FLAG_allocation_site_pretenuring) return;
4252486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  v8::HandleScope scope(CcTest::isolate());
4253486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  Isolate* isolate = CcTest::i_isolate();
4254486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  Heap* heap = isolate->heap();
4255486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
4256486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  CompileRun(
4257486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "function add(a, b) {"
4258486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "  return a + b;"
4259486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "}"
4260486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "add(1, 2);"
4261486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "add(\"a\", \"b\");"
4262486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "var oldSpaceObject;"
4263486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "gc();"
4264486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "function crash(x) {"
4265486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "  var object = {a: null, b: null};"
4266486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "  var result = add(1.5, x | 0);"
4267486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "  object.a = result;"
4268486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "  oldSpaceObject = object;"
4269486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "  return object;"
4270486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "}"
4271486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "crash(1);"
4272486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "crash(1);"
4273486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "%OptimizeFunctionOnNextCall(crash);"
4274486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      "crash(1);");
4275486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
4276486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  v8::Handle<v8::Object> global = CcTest::global();
4277486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    v8::Handle<v8::Function> g =
4278486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org        v8::Handle<v8::Function>::Cast(global->Get(v8_str("crash")));
4279486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  v8::Handle<v8::Value> args1[] = { v8_num(1) };
4280486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  heap->DisableInlineAllocation();
4281486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  heap->set_allocation_timeout(1);
4282486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  g->Call(global, 1, args1);
4283486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
4284486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org}
4285a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4286a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4287a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.orgvoid OnFatalErrorExpectOOM(const char* location, const char* message) {
4288a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  // Exit with 0 if the location matches our expectation.
4289a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  exit(strcmp(location, "CALL_AND_RETRY_LAST"));
4290a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org}
4291a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4292a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4293a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.orgTEST(CEntryStubOOM) {
4294a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  i::FLAG_allow_natives_syntax = true;
4295a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  CcTest::InitializeVM();
4296a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  v8::HandleScope scope(CcTest::isolate());
4297a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  v8::V8::SetFatalErrorHandler(OnFatalErrorExpectOOM);
4298a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4299a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  v8::Handle<v8::Value> result = CompileRun(
4300a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org      "%SetFlags('--gc-interval=1');"
4301a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org      "var a = [];"
4302a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org      "a.__proto__ = [];"
4303a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org      "a.unshift(1)");
4304a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4305a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org  CHECK(result->IsNumber());
4306a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org}
4307a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org
4308a87904f0c75c5dd48d8fee355e5c67237c9e0606svenpanne@chromium.org#endif  // DEBUG
430963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
431063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
431163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgstatic void InterruptCallback357137(v8::Isolate* isolate, void* data) { }
431263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
431363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
431463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgstatic void RequestInterrupt(const v8::FunctionCallbackInfo<v8::Value>& args) {
431563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  CcTest::isolate()->RequestInterrupt(&InterruptCallback357137, NULL);
431663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
431763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
431863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
431963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgTEST(Regress357137) {
432063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  CcTest::InitializeVM();
432163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
432263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  v8::HandleScope hscope(isolate);
432363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  v8::Handle<v8::ObjectTemplate> global =v8::ObjectTemplate::New(isolate);
432463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  global->Set(v8::String::NewFromUtf8(isolate, "interrupt"),
432563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org              v8::FunctionTemplate::New(isolate, RequestInterrupt));
432663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  v8::Local<v8::Context> context = v8::Context::New(isolate, NULL, global);
4327e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!context.IsEmpty());
432863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  v8::Context::Scope cscope(context);
432963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
433063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  v8::Local<v8::Value> result = CompileRun(
433163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      "var locals = '';"
433263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      "for (var i = 0; i < 512; i++) locals += 'var v' + i + '= 42;';"
433363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      "eval('function f() {' + locals + 'return function() { return v0; }; }');"
433463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      "interrupt();"  // This triggers a fake stack overflow in f.
433563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      "f()()");
433663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  CHECK_EQ(42.0, result->ToNumber()->Value());
433763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
4338f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
4339f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
4340865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgTEST(ArrayShiftSweeping) {
4341f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  i::FLAG_expose_gc = true;
4342f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  CcTest::InitializeVM();
4343f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
4344f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
4345f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  Heap* heap = isolate->heap();
4346f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
4347f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  v8::Local<v8::Value> result = CompileRun(
4348f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org      "var array = new Array(40000);"
4349f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org      "var tmp = new Array(100000);"
43503484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org      "array[0] = 10;"
4351f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org      "gc();"
4352975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org      "gc();"
4353f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org      "array.shift();"
4354f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org      "array;");
4355f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
4356f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  Handle<JSObject> o =
4357f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(result));
4358f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  CHECK(heap->InOldPointerSpace(o->elements()));
4359f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  CHECK(heap->InOldPointerSpace(*o));
4360f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  Page* page = Page::FromAddress(o->elements()->address());
4361474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org  CHECK(page->parallel_sweeping() <= MemoryChunk::SWEEPING_FINALIZE ||
4362f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org        Marking::IsBlack(Marking::MarkBitFrom(o->elements())));
4363f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org}
4364d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
4365d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
4366a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(PromotionQueue) {
436758a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  i::FLAG_expose_gc = true;
436858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  i::FLAG_max_semi_space_size = 2;
4369a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate* isolate = v8::Isolate::New();
4370a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
4371a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  {
4372a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::Scope isolate_scope(isolate);
4373a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::HandleScope handle_scope(isolate);
4374a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Context::New(isolate)->Enter();
4375a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Heap* heap = i_isolate->heap();
4376a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    NewSpace* new_space = heap->new_space();
4377a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4378a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // In this test we will try to overwrite the promotion queue which is at the
4379a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // end of to-space. To actually make that possible, we need at least two
4380a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // semi-space pages and take advantage of fragmentation.
4381a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // (1) Grow semi-space to two pages.
4382a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // (2) Create a few small long living objects and call the scavenger to
4383a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // move them to the other semi-space.
4384a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // (3) Create a huge object, i.e., remainder of first semi-space page and
4385a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // create another huge object which should be of maximum allocatable memory
4386a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // size of the second semi-space page.
4387a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // (4) Call the scavenger again.
4388a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // What will happen is: the scavenger will promote the objects created in
4389a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // (2) and will create promotion queue entries at the end of the second
4390a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // semi-space page during the next scavenge when it promotes the objects to
4391a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // the old generation. The first allocation of (3) will fill up the first
4392a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // semi-space page. The second allocation in (3) will not fit into the
4393a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // first semi-space page, but it will overwrite the promotion queue which
4394a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // are in the second semi-space page. If the right guards are in place, the
4395a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // promotion queue will be evacuated in that case.
4396a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4397a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Grow the semi-space to two pages to make semi-space copy overwrite the
4398a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // promotion queue, which will be at the end of the second page.
4399a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    intptr_t old_capacity = new_space->TotalCapacity();
4400a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4401a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // If we are in a low memory config, we can't grow to two pages and we can't
4402a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // run this test. This also means the issue we are testing cannot arise, as
4403a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // there is no fragmentation.
4404a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    if (new_space->IsAtMaximumCapacity()) return;
4405a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4406a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    new_space->Grow();
4407a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(new_space->IsAtMaximumCapacity());
4408a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(2 * old_capacity == new_space->TotalCapacity());
4409a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4410a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Call the scavenger two times to get an empty new space
4411a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    heap->CollectGarbage(NEW_SPACE);
4412a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    heap->CollectGarbage(NEW_SPACE);
4413a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4414a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // First create a few objects which will survive a scavenge, and will get
4415a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // promoted to the old generation later on. These objects will create
4416a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // promotion queue entries at the end of the second semi-space page.
4417a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    const int number_handles = 12;
4418a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Handle<FixedArray> handles[number_handles];
4419a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    for (int i = 0; i < number_handles; i++) {
4420a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      handles[i] = i_isolate->factory()->NewFixedArray(1, NOT_TENURED);
4421a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
4422a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    heap->CollectGarbage(NEW_SPACE);
4423a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4424a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Create the first huge object which will exactly fit the first semi-space
4425a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // page.
4426a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    int new_linear_size =
4427a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        static_cast<int>(*heap->new_space()->allocation_limit_address() -
4428a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                         *heap->new_space()->allocation_top_address());
4429a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    int length = new_linear_size / kPointerSize - FixedArray::kHeaderSize;
4430a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Handle<FixedArray> first =
4431a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        i_isolate->factory()->NewFixedArray(length, NOT_TENURED);
4432a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(heap->InNewSpace(*first));
4433a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4434a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // Create the second huge object of maximum allocatable second semi-space
4435a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // page size.
4436a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    new_linear_size =
4437a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        static_cast<int>(*heap->new_space()->allocation_limit_address() -
4438a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                         *heap->new_space()->allocation_top_address());
4439a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    length = Page::kMaxRegularHeapObjectSize / kPointerSize -
4440a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org             FixedArray::kHeaderSize;
4441a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Handle<FixedArray> second =
4442a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        i_isolate->factory()->NewFixedArray(length, NOT_TENURED);
4443a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(heap->InNewSpace(*second));
4444a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
4445a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // This scavenge will corrupt memory if the promotion queue is not
4446a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    // evacuated.
4447a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    heap->CollectGarbage(NEW_SPACE);
444858a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org  }
4449a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  isolate->Dispose();
445058a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org}
445158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
445258a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org
44532b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.orgTEST(Regress388880) {
44542b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  i::FLAG_expose_gc = true;
44552b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  CcTest::InitializeVM();
44562b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
44572b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
44582b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  Factory* factory = isolate->factory();
44592b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  Heap* heap = isolate->heap();
44602b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
4461a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Handle<Map> map1 = Map::Create(isolate, 1);
44622b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  Handle<Map> map2 =
44632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      Map::CopyWithField(map1, factory->NewStringFromStaticChars("foo"),
44642b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org                         HeapType::Any(isolate), NONE, Representation::Tagged(),
44652b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org                         OMIT_TRANSITION).ToHandleChecked();
44662b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44672b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  int desired_offset = Page::kPageSize - map1->instance_size();
44682b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44692b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // Allocate fixed array in old pointer space so, that object allocated
44702b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // afterwards would end at the end of the page.
44712b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  {
44722b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org    SimulateFullSpace(heap->old_pointer_space());
44732b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org    int padding_size = desired_offset - Page::kObjectStartOffset;
44742b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org    int padding_array_length =
44752b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org        (padding_size - FixedArray::kHeaderSize) / kPointerSize;
44762b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44772b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org    Handle<FixedArray> temp2 =
44782b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org        factory->NewFixedArray(padding_array_length, TENURED);
44792b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org    Page* page = Page::FromAddress(temp2->address());
44802b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org    CHECK_EQ(Page::kObjectStartOffset, page->Offset(temp2->address()));
44812b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  }
44822b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44832b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  Handle<JSObject> o = factory->NewJSObjectFromMap(map1, TENURED, false);
44842b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  o->set_properties(*factory->empty_fixed_array());
44852b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44862b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // Ensure that the object allocated where we need it.
44872b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  Page* page = Page::FromAddress(o->address());
44882b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  CHECK_EQ(desired_offset, page->Offset(o->address()));
44892b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44902b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // Now we have an object right at the end of the page.
44912b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44922b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // Enable incremental marking to trigger actions in Heap::AdjustLiveBytes()
44932b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // that would cause crash.
44942b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  IncrementalMarking* marking = CcTest::heap()->incremental_marking();
44952b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  marking->Abort();
44962b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  marking->Start();
44972b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  CHECK(marking->IsMarking());
44982b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
44992b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // Now everything is set up for crashing in JSObject::MigrateFastToFast()
45002b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  // when it calls heap->AdjustLiveBytes(...).
45012b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org  JSObject::MigrateToMap(o, map2);
45022b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org}
45032b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
45042b995c4171e67960088466af11110c6f6aeea4fcmachenbach@chromium.org
4505d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#ifdef DEBUG
4506d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgTEST(PathTracer) {
4507d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CcTest::InitializeVM();
4508d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
4509d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
4510d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Local<v8::Value> result = CompileRun("'abc'");
4511d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<Object> o = v8::Utils::OpenHandle(*result);
4512d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CcTest::i_isolate()->heap()->TracePathToObject(*o);
4513d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
4514d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org#endif  // DEBUG
4515