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>
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "v8.h"
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "compilation-cache.h"
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "execution.h"
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "factory.h"
359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "macro-assembler.h"
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "global-handles.h"
3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#include "stub-cache.h"
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cctest.h"
399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
43e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org// Go through all incremental marking steps in one swoop.
44e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgstatic void SimulateIncrementalMarking() {
456e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  MarkCompactCollector* collector = HEAP->mark_compact_collector();
46e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  IncrementalMarking* marking = HEAP->incremental_marking();
476e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  if (collector->IsConcurrentSweepingInProgress()) {
486e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    collector->WaitUntilSweepingCompleted();
496e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
505323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  CHECK(marking->IsMarking() || marking->IsStopped());
515323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  if (marking->IsStopped()) {
525323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org    marking->Start();
535323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  }
54e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(marking->IsMarking());
55e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  while (!marking->IsComplete()) {
56e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
57e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
58e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(marking->IsComplete());
59e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
60e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
61e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void CheckMap(Map* map, int type, int instance_size) {
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(map->IsHeapObject());
649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifdef DEBUG
65ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(HEAP->Contains(map));
669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
67ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK_EQ(HEAP->meta_map(), map->map());
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(type, map->instance_type());
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(instance_size, map->instance_size());
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(HeapMaps) {
74e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
75ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckMap(HEAP->meta_map(), MAP_TYPE, Map::kSize);
76ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckMap(HEAP->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize);
77ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckMap(HEAP->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel);
78ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CheckMap(HEAP->string_map(), STRING_TYPE, kVariableSizeSentinel);
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckOddball(Isolate* isolate, Object* obj, const char* string) {
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(obj->IsOddball());
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool exc;
8509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Object* print_string =
8609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      *Execution::ToString(Handle<Object>(obj, isolate), &exc);
8759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string)));
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckSmi(Isolate* isolate, int value, const char* string) {
929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool exc;
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Object* print_string =
9409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      *Execution::ToString(Handle<Object>(Smi::FromInt(value), isolate), &exc);
9559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string)));
969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckNumber(Isolate* isolate, double value, const char* string) {
100ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Object* obj = HEAP->NumberFromDouble(value)->ToObjectChecked();
1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(obj->IsNumber());
1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  bool exc;
10309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Object* print_string =
10409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      *Execution::ToString(Handle<Object>(obj, isolate), &exc);
10559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(String::cast(print_string)->IsUtf8EqualTo(CStrVector(string)));
1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
10909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic void CheckFindCodeObject(Isolate* isolate) {
1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Test FindCodeObject
1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#define __ assm.
1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
11309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Assembler assm(isolate, NULL, 0);
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  __ nop();  // supported on all architectures
1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CodeDesc desc;
1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  assm.GetCode(&desc);
11909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Heap* heap = isolate->heap();
12009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Object* code = heap->CreateCode(
121303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org      desc,
122303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org      Code::ComputeFlags(Code::STUB),
12309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      Handle<Code>())->ToObjectChecked();
1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(code->IsCode());
1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  HeapObject* obj = HeapObject::cast(code);
1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Address obj_addr = obj->address();
1289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int i = 0; i < obj->Size(); i += kPointerSize) {
130ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    Object* found = isolate->FindCodeObject(obj_addr + i);
1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(code, found);
1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
1339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
13409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Object* copy = heap->CreateCode(
135303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org      desc,
136303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org      Code::ComputeFlags(Code::STUB),
13709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      Handle<Code>())->ToObjectChecked();
1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(copy->IsCode());
1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  HeapObject* obj_copy = HeapObject::cast(copy);
140ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Object* not_right = isolate->FindCodeObject(obj_copy->address() +
141ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                              obj_copy->Size() / 2);
1429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(not_right != code);
1439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(HeapObjects) {
147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
14809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = Isolate::Current();
149d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
15009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Heap* heap = isolate->heap();
1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope sc(isolate);
15309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked();
1549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsHeapNumber());
1559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(1.000123, value->Number());
1579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
15809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  value = heap->NumberFromDouble(1.0)->ToObjectChecked();
1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(1.0, value->Number());
1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
16309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  value = heap->NumberFromInt32(1024)->ToObjectChecked();
1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(1024.0, value->Number());
1679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
16809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  value = heap->NumberFromInt32(Smi::kMinValue)->ToObjectChecked();
1699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(Smi::kMinValue, Smi::cast(value)->value());
1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
17309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  value = heap->NumberFromInt32(Smi::kMaxValue)->ToObjectChecked();
1749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsSmi());
1759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(Smi::kMaxValue, Smi::cast(value)->value());
1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#ifndef V8_TARGET_ARCH_X64
1799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // TODO(lrn): We need a NumberFromIntptr function in order to test this.
18009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  value = heap->NumberFromInt32(Smi::kMinValue - 1)->ToObjectChecked();
1819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsHeapNumber());
1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(static_cast<double>(Smi::kMinValue - 1), value->Number());
1849d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#endif
1859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
186303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  MaybeObject* maybe_value =
18709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      heap->NumberFromUint32(static_cast<uint32_t>(Smi::kMaxValue) + 1);
188303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  value = maybe_value->ToObjectChecked();
1899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsHeapNumber());
1909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(value->IsNumber());
1919d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  CHECK_EQ(static_cast<double>(static_cast<uint32_t>(Smi::kMaxValue) + 1),
1929d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com           value->Number());
1939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
19409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  maybe_value = heap->NumberFromUint32(static_cast<uint32_t>(1) << 31);
19559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  value = maybe_value->ToObjectChecked();
19659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(value->IsHeapNumber());
19759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK(value->IsNumber());
19859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  CHECK_EQ(static_cast<double>(static_cast<uint32_t>(1) << 31),
19959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org           value->Number());
20059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
2019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // nan oddball checks
20209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CHECK(heap->nan_value()->IsNumber());
20377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  CHECK(std::isnan(heap->nan_value()->Number()));
2049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
205d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s = factory->NewStringFromAscii(CStrVector("fisk hest "));
206ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(s->IsString());
207ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(10, s->length());
2089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  String* object_string = String::cast(heap->Object_string());
210ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(
21146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      Isolate::Current()->context()->global_object()->HasLocalProperty(
2124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org          object_string));
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check ToString for oddballs
21509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->true_value(), "true");
21609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->false_value(), "false");
21709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->null_value(), "null");
21809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckOddball(isolate, heap->undefined_value(), "undefined");
2199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check ToString for Smis
22109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckSmi(isolate, 0, "0");
22209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckSmi(isolate, 42, "42");
22309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckSmi(isolate, -42, "-42");
2249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check ToString for Numbers
22609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckNumber(isolate, 1.1, "1.1");
2279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
22809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  CheckFindCodeObject(isolate);
2299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Tagging) {
233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
23471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  int request = 24;
23530ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request)));
2369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Smi::FromInt(42)->IsSmi());
2374a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  CHECK(Failure::RetryAfterGC(NEW_SPACE)->IsFailure());
23871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  CHECK_EQ(NEW_SPACE,
2394a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org           Failure::RetryAfterGC(NEW_SPACE)->allocation_space());
2409258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  CHECK_EQ(OLD_POINTER_SPACE,
2414a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org           Failure::RetryAfterGC(OLD_POINTER_SPACE)->allocation_space());
2429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Failure::Exception()->IsFailure());
2439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi());
2449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi());
2459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(GarbageCollection) {
249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
250c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
251c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
252c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
2539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope sc(isolate);
255ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Check GC.
256c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
2579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2584a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> name = factory->InternalizeUtf8String("theFunction");
2594a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
2604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> prop_namex = factory->InternalizeUtf8String("theSlotx");
2614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> obj_name = factory->InternalizeUtf8String("theObject");
262ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
263ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
264c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
265ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    // Allocate a function and keep it in global object's property.
266ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    Handle<JSFunction> function =
267c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        factory->NewFunction(name, factory->undefined_value());
268ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    Handle<Map> initial_map =
269c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org        factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
270ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    function->set_initial_map(*initial_map);
27146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    Isolate::Current()->context()->global_object()->SetProperty(
2729ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        *name, *function, NONE, kNonStrictMode)->ToObjectChecked();
273ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    // Allocate an object.  Unrooted after leaving the scope.
274c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<JSObject> obj = factory->NewJSObject(function);
2759ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    obj->SetProperty(
2769ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
2779ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    obj->SetProperty(
2789ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        *prop_namex, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked();
279ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
280ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
281ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex));
282ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
284c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
2859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
286ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Function should be alive.
28746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK(Isolate::Current()->context()->global_object()->
28846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        HasLocalProperty(*name));
289ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Check function is retained.
29046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* func_value = Isolate::Current()->context()->global_object()->
291ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      GetProperty(*name)->ToObjectChecked();
2929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(func_value->IsJSFunction());
293ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSFunction> function(JSFunction::cast(func_value));
294ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
295ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
296c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
297ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    // Allocate another object, make it reachable from global.
298c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<JSObject> obj = factory->NewJSObject(function);
29946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    Isolate::Current()->context()->global_object()->SetProperty(
3009ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        *obj_name, *obj, NONE, kNonStrictMode)->ToObjectChecked();
3019ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org    obj->SetProperty(
3029ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org        *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
303ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
3049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
305ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // After gc, it should survive.
306c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
3079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
30846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK(Isolate::Current()->context()->global_object()->
30946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        HasLocalProperty(*obj_name));
31046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK(Isolate::Current()->context()->global_object()->
311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        GetProperty(*obj_name)->ToObjectChecked()->IsJSObject());
31246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* obj = Isolate::Current()->context()->global_object()->
313ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      GetProperty(*obj_name)->ToObjectChecked();
314303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  JSObject* js_obj = JSObject::cast(obj);
315303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name));
3169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgstatic void VerifyStringAllocation(Isolate* isolate, const char* string) {
3202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3212bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Handle<String> s = isolate->factory()->NewStringFromUtf8(CStrVector(string));
322c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(StrLength(string), s->length());
323bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  for (int index = 0; index < s->length(); index++) {
324ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index));
325ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
3269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(String) {
330e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
331e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
3329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "a");
3342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "ab");
3352bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "abc");
3362bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "abcd");
3372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  VerifyStringAllocation(isolate, "fiskerdrengen er paa havet");
3389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(LocalHandles) {
342e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
343d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
344d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
3459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
346e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
3479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const char* name = "Kasper the spunky";
348d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> string = factory->NewStringFromAscii(CStrVector(name));
349c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  CHECK_EQ(StrLength(name), string->length());
3509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(GlobalHandles) {
354e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
355c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
356c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
357c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
358c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
3599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
360ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h1;
361ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h2;
362ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h3;
363ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h4;
364ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
365ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
366c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
3679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
368c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk"));
369c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> u = factory->NewNumber(1.12344);
370ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
371ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h1 = global_handles->Create(*i);
372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h2 = global_handles->Create(*u);
373ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h3 = global_handles->Create(*i);
374ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h4 = global_handles->Create(*u);
375ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
3769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // after gc, it should survive
378c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
3799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h1)->IsString());
3819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h2)->IsHeapNumber());
3829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h3)->IsString());
3839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h4)->IsHeapNumber());
3849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(*h3, *h1);
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h1.location());
387ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h3.location());
3889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(*h4, *h2);
390ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h2.location());
391ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h4.location());
3929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic bool WeakPointerCleared = false;
3969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
397d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgstatic void TestWeakGlobalHandleCallback(v8::Isolate* isolate,
39857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                         v8::Persistent<v8::Value>* handle,
3999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com                                         void* id) {
40071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true;
40157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  handle->Dispose(isolate);
4029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
4039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(WeakGlobalHandlesScavenge) {
4061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
407e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
408c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
409c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
410c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
411c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
4129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  WeakPointerCleared = false;
4149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
415ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h1;
416ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h2;
417ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
418ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
419c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
4209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
421c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk"));
422c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> u = factory->NewNumber(1.12344);
423ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
424ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h1 = global_handles->Create(*i);
425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h2 = global_handles->Create(*u);
426ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
4279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->MakeWeak(h2.location(),
429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                           reinterpret_cast<void*>(1234),
43079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                           &TestWeakGlobalHandleCallback);
4319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Scavenge treats weak pointers as normal roots.
433c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->PerformScavenge();
4349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h1)->IsString());
4369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h2)->IsHeapNumber());
4379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!WeakPointerCleared);
439ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(!global_handles->IsNearDeath(h2.location()));
440ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(!global_handles->IsNearDeath(h1.location()));
4419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h1.location());
443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h2.location());
4449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
4459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(WeakGlobalHandlesMark) {
448e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
449c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
450c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
451c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
452c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
4539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  WeakPointerCleared = false;
4559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
456ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h1;
457ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h2;
458ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
459ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
460c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
4619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
462c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk"));
463c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> u = factory->NewNumber(1.12344);
464ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h1 = global_handles->Create(*i);
466ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h2 = global_handles->Create(*u);
467ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
4689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4695323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Make sure the objects are promoted.
470c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(OLD_POINTER_SPACE);
471c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(NEW_SPACE);
472c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2));
4739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->MakeWeak(h2.location(),
475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                           reinterpret_cast<void*>(1234),
47679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                           &TestWeakGlobalHandleCallback);
4779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!GlobalHandles::IsNearDeath(h1.location()));
4789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!GlobalHandles::IsNearDeath(h2.location()));
4799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4805323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Incremental marking potentially marked handles before they turned weak.
481c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
4829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK((*h1)->IsString());
4849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(WeakPointerCleared);
4869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!GlobalHandles::IsNearDeath(h1.location()));
4879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->Destroy(h1.location());
4899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
4909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
491471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
4929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DeleteWeakGlobalHandle) {
4931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
494e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
495c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
496c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
497c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Factory* factory = isolate->factory();
498c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  GlobalHandles* global_handles = isolate->global_handles();
4999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  WeakPointerCleared = false;
5019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
502ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> h;
503ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
504ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  {
505c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
506ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
507c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk"));
508ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    h = global_handles->Create(*i);
509ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
5109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
511ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  global_handles->MakeWeak(h.location(),
512ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                           reinterpret_cast<void*>(1234),
51379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                           &TestWeakGlobalHandleCallback);
5149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Scanvenge does not recognize weak reference.
516c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->PerformScavenge();
5179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!WeakPointerCleared);
5199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Mark-compact treats weak reference properly.
521c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectGarbage(OLD_POINTER_SPACE);
5229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(WeakPointerCleared);
5249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
5259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
526471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
5279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic const char* not_so_random_string_table[] = {
5289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "abstract",
5299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "boolean",
5309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "break",
5319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "byte",
5329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "case",
5339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "catch",
5349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "char",
5359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "class",
5369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "const",
5379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "continue",
5389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "debugger",
5399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "default",
5409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "delete",
5419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "do",
5429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "double",
5439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "else",
5449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "enum",
5459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "export",
5469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "extends",
5479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "false",
5489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "final",
5499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "finally",
5509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "float",
5519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "for",
5529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "function",
5539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "goto",
5549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "if",
5559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "implements",
5569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "import",
5579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "in",
5589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "instanceof",
5599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "int",
5609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "interface",
5619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "long",
5629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "native",
5639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "new",
5649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "null",
5659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "package",
5669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "private",
5679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "protected",
5689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "public",
5699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "return",
5709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "short",
5719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "static",
5729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "super",
5739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "switch",
5749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "synchronized",
5759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "this",
5769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "throw",
5779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "throws",
5789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "transient",
5799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "true",
5809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "try",
5819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "typeof",
5829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "var",
5839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "void",
5849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "volatile",
5859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "while",
5869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  "with",
5879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  0
5889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
5899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
5914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgstatic void CheckInternalizedStrings(const char** strings) {
5929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (const char* string = *strings; *strings != 0; string = *strings++) {
593303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    Object* a;
5944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    MaybeObject* maybe_a = HEAP->InternalizeUtf8String(string);
5954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    // InternalizeUtf8String may return a failure if a GC is needed.
596303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    if (!maybe_a->ToObject(&a)) continue;
5974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    CHECK(a->IsInternalizedString());
598303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    Object* b;
5994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    MaybeObject* maybe_b = HEAP->InternalizeUtf8String(string);
600303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    if (!maybe_b->ToObject(&b)) continue;
6019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(b, a);
60259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    CHECK(String::cast(b)->IsUtf8EqualTo(CStrVector(string)));
6039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
6049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
6059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgTEST(StringTable) {
608e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
6099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CheckInternalizedStrings(not_so_random_string_table);
6114a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CheckInternalizedStrings(not_so_random_string_table);
6129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
6139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(FunctionAllocation) {
616e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
617d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
618d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
6199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
620e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
621d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> name = factory->InternalizeUtf8String("theFunction");
622ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSFunction> function =
623d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewFunction(name, factory->undefined_value());
624ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Map> initial_map =
625d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
626ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  function->set_initial_map(*initial_map);
627ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
628d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
629d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(function);
6309ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
6319ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
632ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
6339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check that we can add properties to function objects.
6349ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  function->SetProperty(
6359ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked();
636ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name));
6379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
6389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ObjectProperties) {
641e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
642d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
643d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
6449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
645e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
6464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  String* object_string = String::cast(HEAP->Object_string());
64746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* raw_object = Isolate::Current()->context()->global_object()->
6484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      GetProperty(object_string)->ToObjectChecked();
649303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  JSFunction* object_function = JSFunction::cast(raw_object);
650ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSFunction> constructor(object_function);
651d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(constructor);
652d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> first = factory->InternalizeUtf8String("first");
653d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> second = factory->InternalizeUtf8String("second");
6549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // check for empty
656ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!obj->HasLocalProperty(*first));
6579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // add first
6599ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
6609ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
661ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*first));
6629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // delete first
664ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JSReceiver::DeleteProperty(obj, first, JSReceiver::NORMAL_DELETION);
665ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!obj->HasLocalProperty(*first));
6669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // add first and then second
6689ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
6699ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
6709ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
6719ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked();
672ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*first));
673ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*second));
6749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // delete first and then second
676ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JSReceiver::DeleteProperty(obj, first, JSReceiver::NORMAL_DELETION);
677ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*second));
678ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JSReceiver::DeleteProperty(obj, second, JSReceiver::NORMAL_DELETION);
679ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!obj->HasLocalProperty(*first));
680ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!obj->HasLocalProperty(*second));
6819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // add first and then second
6839ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
6849ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
6859ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
6869ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked();
687ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*first));
688ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*second));
6899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // delete second and then first
691ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JSReceiver::DeleteProperty(obj, second, JSReceiver::NORMAL_DELETION);
692ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*first));
693ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  JSReceiver::DeleteProperty(obj, first, JSReceiver::NORMAL_DELETION);
694ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!obj->HasLocalProperty(*first));
695ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!obj->HasLocalProperty(*second));
6969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
6974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // check string and internalized string match
698fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  const char* string1 = "fisk";
699d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s1 = factory->NewStringFromAscii(CStrVector(string1));
7009ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
7019ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *s1, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
702d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s1_string = factory->InternalizeUtf8String(string1);
7034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CHECK(obj->HasLocalProperty(*s1_string));
7049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // check internalized string and string match
706fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  const char* string2 = "fugl";
707d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s2_string = factory->InternalizeUtf8String(string2);
7089ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
7094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
710d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> s2 = factory->NewStringFromAscii(CStrVector(string2));
711ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(obj->HasLocalProperty(*s2));
7129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
7139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(JSObjectMaps) {
716e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
717d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
718d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
7199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
720e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
721d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> name = factory->InternalizeUtf8String("theFunction");
722ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSFunction> function =
723d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewFunction(name, factory->undefined_value());
724ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Map> initial_map =
725d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
726ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  function->set_initial_map(*initial_map);
727ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
728d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
729d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(function);
7309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Set a propery
7329ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
7339ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
734ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
7359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Check the map has changed
737ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(*initial_map != obj->map());
7389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
7399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(JSArray) {
742e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
743d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
744d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
7459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
746e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
747d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> name = factory->InternalizeUtf8String("Array");
74846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* raw_object = Isolate::Current()->context()->global_object()->
749ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      GetProperty(*name)->ToObjectChecked();
750ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSFunction> function = Handle<JSFunction>(
751303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org      JSFunction::cast(raw_object));
7529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Allocate the object.
754d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> object = factory->NewJSObject(function);
755ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSArray> array = Handle<JSArray>::cast(object);
756d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // We just initialized the VM, no heap allocation failure yet.
757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  array->Initialize(0)->ToObjectChecked();
7589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Set array length to 0.
760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  array->SetElementsLength(Smi::FromInt(0))->ToObjectChecked();
7619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(Smi::FromInt(0), array->length());
762c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Must be in fast mode.
763830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  CHECK(array->HasFastSmiOrObjectElements());
7649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // array[length] = name.
766ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  array->SetElement(0, *name, NONE, kNonStrictMode)->ToObjectChecked();
7679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(Smi::FromInt(1), array->length());
768ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(array->GetElement(0), *name);
7699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
770ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  // Set array length with larger than smi value.
771ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<Object> length =
772d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1);
773c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  array->SetElementsLength(*length)->ToObjectChecked();
7749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  uint32_t int_length = 0;
77630ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK(length->ToArrayIndex(&int_length));
777ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(*length, array->length());
7780b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  CHECK(array->HasDictionaryElements());  // Must be in slow mode.
7799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // array[length] = name.
781ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked();
7829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  uint32_t new_int_length = 0;
78330ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK(array->length()->ToArrayIndex(&new_int_length));
7849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(static_cast<double>(int_length), new_int_length - 1);
785ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(array->GetElement(int_length), *name);
786ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(array->GetElement(0), *name);
7879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
7889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
7909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(JSObjectCopy) {
791e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
792d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
793d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
7949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
795e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope sc(CcTest::isolate());
7964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  String* object_string = String::cast(HEAP->Object_string());
79746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* raw_object = Isolate::Current()->context()->global_object()->
7984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      GetProperty(object_string)->ToObjectChecked();
799303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  JSFunction* object_function = JSFunction::cast(raw_object);
800ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSFunction> constructor(object_function);
801d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> obj = factory->NewJSObject(constructor);
802d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> first = factory->InternalizeUtf8String("first");
803d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> second = factory->InternalizeUtf8String("second");
8049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8059ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
8069ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
8079ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  obj->SetProperty(
8089ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked();
8099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
810ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  obj->SetElement(0, *first, NONE, kNonStrictMode)->ToObjectChecked();
811ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  obj->SetElement(1, *second, NONE, kNonStrictMode)->ToObjectChecked();
8129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Make the clone.
814ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  Handle<JSObject> clone = Copy(obj);
815ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK(!clone.is_identical_to(obj));
8169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(obj->GetElement(0), clone->GetElement(0));
8189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(obj->GetElement(1), clone->GetElement(1));
8199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
820ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*first));
821ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*second));
8229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Flip the values.
8249ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  clone->SetProperty(
8259ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *first, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked();
8269ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  clone->SetProperty(
8279ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      *second, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
8289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
829ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  clone->SetElement(0, *second, NONE, kNonStrictMode)->ToObjectChecked();
830ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  clone->SetElement(1, *first, NONE, kNonStrictMode)->ToObjectChecked();
8319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(obj->GetElement(1), clone->GetElement(0));
8339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(obj->GetElement(0), clone->GetElement(1));
8349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
835ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first));
836ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second));
8379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
8389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(StringAllocation) {
841e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
842d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
843d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
8449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 };
8469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int length = 0; length < 100; length++) {
847e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope scope(CcTest::isolate());
8489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    char* non_ascii = NewArray<char>(3 * length + 1);
8499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    char* ascii = NewArray<char>(length + 1);
8509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    non_ascii[3 * length] = 0;
8519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    ascii[length] = 0;
8529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    for (int i = 0; i < length; i++) {
8539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      ascii[i] = 'a';
8549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      non_ascii[3 * i] = chars[0];
8559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      non_ascii[3 * i + 1] = chars[1];
8569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      non_ascii[3 * i + 2] = chars[2];
8579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
8589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    Handle<String> non_ascii_sym =
859d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org        factory->InternalizeUtf8String(
8604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org            Vector<const char>(non_ascii, 3 * length));
8619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(length, non_ascii_sym->length());
8629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    Handle<String> ascii_sym =
863d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org        factory->InternalizeOneByteString(OneByteVector(ascii, length));
8649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(length, ascii_sym->length());
8659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    Handle<String> non_ascii_str =
866d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org        factory->NewStringFromUtf8(Vector<const char>(non_ascii, 3 * length));
8679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    non_ascii_str->Hash();
8689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(length, non_ascii_str->length());
8699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    Handle<String> ascii_str =
870d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org        factory->NewStringFromUtf8(Vector<const char>(ascii, length));
8719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    ascii_str->Hash();
8729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(length, ascii_str->length());
8739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    DeleteArray(non_ascii);
8749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    DeleteArray(ascii);
8759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
8769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
8779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8797c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgstatic int ObjectsFoundInHeap(Heap* heap, Handle<Object> objs[], int size) {
8809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Count the number of objects found in the heap.
8819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int found_count = 0;
882b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  heap->EnsureHeapIsIterable();
8837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  HeapIterator iterator(heap);
884b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
8859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    for (int i = 0; i < size; i++) {
8869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      if (*objs[i] == obj) {
8879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        found_count++;
8889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      }
8899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
8909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
8919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return found_count;
8929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
8939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
8959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Iteration) {
896e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
897d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
898d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
899e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
9009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Array of objects to scan haep for.
9029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  const int objs_count = 6;
9039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Handle<Object> objs[objs_count];
9049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int next_objs_index = 0;
9059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9069258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE
907d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  objs[next_objs_index++] = factory->NewJSArray(10);
908d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  objs[next_objs_index++] = factory->NewJSArray(10,
909830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org                                                FAST_HOLEY_ELEMENTS,
910830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org                                                TENURED);
9119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9129258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE
9139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  objs[next_objs_index++] =
914d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewStringFromAscii(CStrVector("abcdefghij"));
9159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  objs[next_objs_index++] =
916d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewStringFromAscii(CStrVector("abcdefghij"), TENURED);
9179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Allocate a large string (for large object space).
919ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  int large_size = Page::kMaxNonCodeHeapObjectSize + 1;
9209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  char* str = new char[large_size];
9219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int i = 0; i < large_size - 1; ++i) str[i] = 'a';
9229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  str[large_size - 1] = '\0';
9239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  objs[next_objs_index++] =
924d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewStringFromAscii(CStrVector(str), TENURED);
9259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  delete[] str;
9269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Add a Map object to look for.
9289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map());
9299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(objs_count, next_objs_index);
9317c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count));
9329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
933df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org
934df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org
935b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(EmptyHandleEscapeFrom) {
936e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
937b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
938e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
939b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Handle<JSObject> runaway;
940b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
941b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  {
942e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      v8::HandleScope nested(CcTest::isolate());
943b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      Handle<JSObject> empty;
944b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      runaway = empty.EscapeFrom(&nested);
945b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  }
946b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
947b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(runaway.is_null());
948b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
949b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
950b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
951b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgstatic int LenFromSize(int size) {
952b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  return (size - FixedArray::kHeaderSize) / kPointerSize;
953b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
954b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
955b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
956b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(Regression39128) {
957b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Test case for crbug.com/39128.
958e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
959d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
960d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
961b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
962b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Increase the chance of 'bump-the-pointer' allocation in old space.
963594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
964b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
965e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
966b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
967b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // The plan: create JSObject which references objects in new space.
968b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Then clone this object (forcing it to go into old space) and check
96930ce411529579186181838984710b0b0980857aaricow@chromium.org  // that region dirty marks are updated correctly.
970b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
971b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 1: prepare a map for the object.  We add 1 inobject property to it.
972ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Handle<JSFunction> object_ctor(
97346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      Isolate::Current()->native_context()->object_function());
974b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(object_ctor->has_initial_map());
975b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Handle<Map> object_map(object_ctor->initial_map());
976b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Create a map with single inobject property.
977d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Map> my_map = factory->CopyMap(object_map, 1);
978b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int n_properties = my_map->inobject_properties();
979b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK_GT(n_properties, 0);
980b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
981b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int object_size = my_map->instance_size();
982b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
983b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 2: allocate a lot of objects so to almost fill new space: we need
984b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // just enough room to allocate JSObject and thus fill the newspace.
985b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
986b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int allocation_amount = Min(FixedArray::kMaxSize,
987594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                              Page::kMaxNonCodeHeapObjectSize + kPointerSize);
988b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int allocation_len = LenFromSize(allocation_amount);
989ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  NewSpace* new_space = HEAP->new_space();
990b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Address* top_addr = new_space->allocation_top_address();
991b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  Address* limit_addr = new_space->allocation_limit_address();
992b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  while ((*limit_addr - *top_addr) > allocation_amount) {
993ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    CHECK(!HEAP->always_allocate());
994ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Object* array = HEAP->AllocateFixedArray(allocation_len)->ToObjectChecked();
995ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    CHECK(!array->IsFailure());
996b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org    CHECK(new_space->Contains(array));
997b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  }
998b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
999b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 3: now allocate fixed array and JSObject to fill the whole new space.
1000b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  int to_fill = static_cast<int>(*limit_addr - *top_addr - object_size);
1001b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  int fixed_array_len = LenFromSize(to_fill);
1002b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(fixed_array_len < FixedArray::kMaxLength);
1003b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1004ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(!HEAP->always_allocate());
1005ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Object* array = HEAP->AllocateFixedArray(fixed_array_len)->ToObjectChecked();
1006ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(!array->IsFailure());
1007b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(new_space->Contains(array));
1008b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1009ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Object* object = HEAP->AllocateJSObjectFromMap(*my_map)->ToObjectChecked();
1010b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK(new_space->Contains(object));
1011b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  JSObject* jsobject = JSObject::cast(object);
101230ce411529579186181838984710b0b0980857aaricow@chromium.org  CHECK_EQ(0, FixedArray::cast(jsobject->elements())->length());
1013b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK_EQ(0, jsobject->properties()->length());
1014b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Create a reference to object in new space in jsobject.
1015b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  jsobject->FastPropertyAtPut(-1, array);
1016b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1017b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr));
1018b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
1019b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Step 4: clone jsobject, but force always allocate first to create a clone
1020b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // in old pointer space.
1021ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Address old_pointer_space_top = HEAP->old_pointer_space()->top();
1022b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  AlwaysAllocateScope aa_scope;
1023ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Object* clone_obj = HEAP->CopyJSObject(jsobject)->ToObjectChecked();
1024b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  JSObject* clone = JSObject::cast(clone_obj);
1025b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  if (clone->address() != old_pointer_space_top) {
1026b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org    // Alas, got allocated from free list, we cannot do checks.
1027b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org    return;
1028b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  }
1029ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK(HEAP->old_pointer_space()->Contains(clone->address()));
1030b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
10312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
10324a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
10332356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(TestCodeFlushing) {
1034fd0930e52d6c6ef28e65bc0dc2dc479da51b656aricow@chromium.org  // If we do not flush code this test is invalid.
1035fd0930e52d6c6ef28e65bc0dc2dc479da51b656aricow@chromium.org  if (!FLAG_flush_code) return;
1036e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
1037e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1038d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
1039d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1040e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
10412356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  const char* source = "function foo() {"
10422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                       "  var x = 42;"
10432356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                       "  var y = 42;"
10442356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                       "  var z = x + y;"
10452356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                       "};"
10462356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org                       "foo()";
1047d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
10482356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
10492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // This compile will add the code to the compilation cache.
1050e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1051a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun(source);
1052a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
10532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
10542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // Check function is compiled.
105546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* func_value = Isolate::Current()->context()->global_object()->
1056ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      GetProperty(*foo_name)->ToObjectChecked();
10572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  CHECK(func_value->IsJSFunction());
10582356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  Handle<JSFunction> function(JSFunction::cast(func_value));
10592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  CHECK(function->shared()->is_compiled());
10602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
1061e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // The code will survive at least two GCs.
10625323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
10635323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
10642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  CHECK(function->shared()->is_compiled());
10650b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
1066e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate several GCs that use full marking.
1067e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const int kAgingThreshold = 6;
1068e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
1069e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1070e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
10712356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
10722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // foo should no longer be in the compilation cache
1073a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1074a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK(!function->is_compiled() || function->IsOptimized());
10752356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  // Call foo to get it recompiled.
10762356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  CompileRun("foo()");
10772356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  CHECK(function->shared()->is_compiled());
10780b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org  CHECK(function->is_compiled());
10792356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org}
10804a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
10814a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1082e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgTEST(TestCodeFlushingIncremental) {
1083e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // If we do not flush code this test is invalid.
1084e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1085e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
1086e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1087d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
1088d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1089e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1090e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const char* source = "function foo() {"
1091e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var x = 42;"
1092e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var y = 42;"
1093e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var z = x + y;"
1094e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "};"
1095e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "foo()";
1096d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1097e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1098e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // This compile will add the code to the compilation cache.
1099e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1100e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun(source);
1101e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1102e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1103e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Check function is compiled.
1104e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  Object* func_value = Isolate::Current()->context()->global_object()->
1105e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org      GetProperty(*foo_name)->ToObjectChecked();
1106e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(func_value->IsJSFunction());
1107e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  Handle<JSFunction> function(JSFunction::cast(func_value));
1108e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled());
1109e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1110e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // The code will survive at least two GCs.
11115323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
11125323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1113e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled());
1114e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1115e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate several GCs that use incremental marking.
1116e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const int kAgingThreshold = 6;
1117e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
1118e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    SimulateIncrementalMarking();
1119e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1120e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1121e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1122e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->is_compiled() || function->IsOptimized());
1123e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1124e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // This compile will compile the function again.
1125e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1126e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun("foo();");
1127e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1128e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1129e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate several GCs that use incremental marking but make sure
1130e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // the loop breaks once the function is enqueued as a candidate.
1131e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
1132e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    SimulateIncrementalMarking();
1133e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    if (!function->next_function_link()->IsUndefined()) break;
1134e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1135e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1136e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1137e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Force optimization while incremental marking is active and while
1138e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // the function is enqueued as a candidate.
1139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1140e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(foo); foo();");
1141e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1142e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1143e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate one final GC to make sure the candidate queue is sane.
1144e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1145e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled() || !function->IsOptimized());
1146e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->is_compiled() || !function->IsOptimized());
1147e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1148e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1149e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1150e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgTEST(TestCodeFlushingIncrementalScavenge) {
1151e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // If we do not flush code this test is invalid.
1152e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1153e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1155d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
1156d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1158e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const char* source = "var foo = function() {"
1159e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var x = 42;"
1160e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var y = 42;"
1161e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var z = x + y;"
1162e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "};"
1163e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "foo();"
1164e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "var bar = function() {"
1165e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "  var x = 23;"
1166e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "};"
1167e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org                       "bar();";
1168d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1169d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> bar_name = factory->InternalizeUtf8String("bar");
1170e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1171e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Perfrom one initial GC to enable code flushing.
11725323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1173e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1174e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // This compile will add the code to the compilation cache.
1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1176e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun(source);
1177e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1178e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1179e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Check functions are compiled.
1180e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  Object* func_value = Isolate::Current()->context()->global_object()->
1181e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org      GetProperty(*foo_name)->ToObjectChecked();
1182e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(func_value->IsJSFunction());
1183e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  Handle<JSFunction> function(JSFunction::cast(func_value));
1184e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function->shared()->is_compiled());
1185e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  Object* func_value2 = Isolate::Current()->context()->global_object()->
1186e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org      GetProperty(*bar_name)->ToObjectChecked();
1187e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(func_value2->IsJSFunction());
1188e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  Handle<JSFunction> function2(JSFunction::cast(func_value2));
1189e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(function2->shared()->is_compiled());
1190e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1191e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Clear references to functions so that one of them can die.
1192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1193e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    CompileRun("foo = 0; bar = 0;");
1194e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
1195e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1196e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Bump the code age so that flushing is triggered while the function
1197e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // object is still located in new-space.
1198e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  const int kAgingThreshold = 6;
119949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
120049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
120149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
120249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
1203e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1204e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate incremental marking so that the functions are enqueued as
1205e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // code flushing candidates. Then kill one of the functions. Finally
1206e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // perform a scavenge while incremental marking is still running.
1207e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  SimulateIncrementalMarking();
1208e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  *function2.location() = NULL;
1209e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  HEAP->CollectGarbage(NEW_SPACE, "test scavenge while marking");
1210e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1211e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  // Simulate one final GC to make sure the candidate queue is sane.
1212e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1213e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1214e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  CHECK(!function->is_compiled() || function->IsOptimized());
1215e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1216e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1217e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1218e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgTEST(TestCodeFlushingIncrementalAbort) {
1219e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // If we do not flush code this test is invalid.
1220e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1221e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  i::FLAG_allow_natives_syntax = true;
1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1223c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
1224d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1225c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
1226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1227e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  const char* source = "function foo() {"
1228e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "  var x = 42;"
1229e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "  var y = 42;"
1230e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "  var z = x + y;"
1231e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "};"
1232e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org                       "foo()";
1233d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> foo_name = factory->InternalizeUtf8String("foo");
1234e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1235e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // This compile will add the code to the compilation cache.
1236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1237e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    CompileRun(source);
1238e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
1239e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1240e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Check function is compiled.
1241e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  Object* func_value = Isolate::Current()->context()->global_object()->
1242e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      GetProperty(*foo_name)->ToObjectChecked();
1243e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(func_value->IsJSFunction());
1244e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  Handle<JSFunction> function(JSFunction::cast(func_value));
1245e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->shared()->is_compiled());
1246e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1247e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // The code will survive at least two GCs.
1248c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1249c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1250e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->shared()->is_compiled());
1251e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1252e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Bump the code age so that flushing is triggered.
1253e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  const int kAgingThreshold = 6;
125449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  for (int i = 0; i < kAgingThreshold; i++) {
125549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
125649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
1257e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1258e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Simulate incremental marking so that the function is enqueued as
1259e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // code flushing candidate.
1260e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  SimulateIncrementalMarking();
1261e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1262c99cd48a7a41dae45e3b166f9d71a3dd1f76fa27danno@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
1263e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Enable the debugger and add a breakpoint while incremental marking
1264e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // is running so that incremental marking aborts and code flushing is
1265e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // disabled.
1266e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  int position = 0;
126709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> breakpoint_object(Smi::FromInt(0), isolate);
1268c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  isolate->debug()->SetBreakPoint(function, breakpoint_object, &position);
1269c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  isolate->debug()->ClearAllBreakPoints();
1270c99cd48a7a41dae45e3b166f9d71a3dd1f76fa27danno@chromium.org#endif  // ENABLE_DEBUGGER_SUPPORT
1271e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1272e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Force optimization now that code flushing is disabled.
1273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  { v8::HandleScope scope(CcTest::isolate());
1274e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(foo); foo();");
1275e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
1276e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1277e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Simulate one final GC to make sure the candidate queue is sane.
1278c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
1279e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->shared()->is_compiled() || !function->IsOptimized());
1280e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  CHECK(function->is_compiled() || !function->IsOptimized());
1281e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
1282e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
1283e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
128446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Count the number of native contexts in the weak list of native contexts.
128546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint CountNativeContexts() {
12864a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  int count = 0;
128746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Object* object = HEAP->native_contexts_list();
12884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  while (!object->IsUndefined()) {
12894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    count++;
12904a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    object = Context::cast(object)->get(Context::NEXT_CONTEXT_LINK);
12914a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
12924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return count;
12934a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
12944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
12954a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1296a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Count the number of user functions in the weak list of optimized
129746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// functions attached to a native context.
1298a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic int CountOptimizedUserFunctions(v8::Handle<v8::Context> context) {
1299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int count = 0;
1300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<Context> icontext = v8::Utils::OpenHandle(*context);
1301a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Object* object = icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST);
1302a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (object->IsJSFunction() && !JSFunction::cast(object)->IsBuiltin()) {
1303a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    count++;
1304a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    object = JSFunction::cast(object)->next_function_link();
1305a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1306a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return count;
1307a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1308a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1309a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
13104a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgTEST(TestInternalWeakLists) {
1311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  v8::V8::Initialize();
1312ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
13135323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Some flags turn Scavenge collections into Mark-sweep collections
13145323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // and hence are incompatible with this test case.
13155323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  if (FLAG_gc_global || FLAG_stress_compaction) return;
13165323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org
13174a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  static const int kNumTestContexts = 10;
13184a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1319c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
1320c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
13212bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
132257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Handle<v8::Context> ctx[kNumTestContexts];
13234a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
132446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK_EQ(0, CountNativeContexts());
13254a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
13264a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Create a number of global contests which gets linked together.
13274a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < kNumTestContexts; i++) {
132857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    ctx[i] = v8::Context::New(v8::Isolate::GetCurrent());
1329a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1330bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    // Collect garbage that might have been created by one of the
1331bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    // installed extensions.
1332bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    isolate->compilation_cache()->Clear();
1333bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    heap->CollectAllGarbage(Heap::kNoGCFlags);
1334bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org
1335a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    bool opt = (FLAG_always_opt && i::V8::UseCrankshaft());
1336a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
133746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK_EQ(i + 1, CountNativeContexts());
13384a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
13394a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ctx[i]->Enter();
1340a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Create a handle scope so no function objects get stuch in the outer
1342a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // handle scope
13432bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    HandleScope scope(isolate);
1344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    const char* source = "function f1() { };"
1345a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f2() { };"
1346a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f3() { };"
1347a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f4() { };"
1348a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         "function f5() { };";
1349a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun(source);
1350a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(0, CountOptimizedUserFunctions(ctx[i]));
1351a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f1()");
1352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctions(ctx[i]));
1353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f2()");
1354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[i]));
1355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f3()");
1356a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f4()");
1358a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1359a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f5()");
1360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Remove function f1, and
1363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f1=null");
1364a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Scavenge treats these references as strong.
1366a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < 10; j++) {
1367ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      HEAP->PerformScavenge();
1368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Mark compact handles the weak references.
1372c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    isolate->compilation_cache()->Clear();
1373c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    heap->CollectAllGarbage(Heap::kNoGCFlags);
1374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1375a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1376a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Get rid of f3 and f5 in the same way.
1377a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f3=null");
1378a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < 10; j++) {
1379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      HEAP->PerformScavenge();
1380a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1382c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1384a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CompileRun("f5=null");
1385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int j = 0; j < 10; j++) {
1386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      HEAP->PerformScavenge();
1387a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1388a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1389c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[i]));
1391a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
13924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ctx[i]->Exit();
13934a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
13944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
13954a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Force compilation cache cleanup.
1396bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  HEAP->NotifyContextDisposed();
1397c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
13984a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
139946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Dispose the native contexts one by one.
14004a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < kNumTestContexts; i++) {
140157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    // TODO(dcarney): is there a better way to do this?
140257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    i::Object** unsafe = reinterpret_cast<i::Object**>(*ctx[i]);
140357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    *unsafe = HEAP->undefined_value();
14044a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    ctx[i].Clear();
14054a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14064a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    // Scavenge treats these references as strong.
14074a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    for (int j = 0; j < 10; j++) {
1408ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      HEAP->PerformScavenge();
140946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      CHECK_EQ(kNumTestContexts - i, CountNativeContexts());
14104a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    }
14114a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14124a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    // Mark compact handles the weak references.
1413c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    HEAP->CollectAllGarbage(Heap::kNoGCFlags);
141446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK_EQ(kNumTestContexts - i - 1, CountNativeContexts());
14154a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
14164a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
141746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK_EQ(0, CountNativeContexts());
14184a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
14194a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14204a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
142146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// Count the number of native contexts in the weak list of native contexts
14224a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org// causing a GC after the specified number of elements.
142309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgstatic int CountNativeContextsWithGC(Isolate* isolate, int n) {
142409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Heap* heap = isolate->heap();
14254a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  int count = 0;
142609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(heap->native_contexts_list(), isolate);
14274a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  while (!object->IsUndefined()) {
14284a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    count++;
142909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    if (count == n) heap->CollectAllGarbage(Heap::kNoGCFlags);
14304a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    object =
143109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        Handle<Object>(Context::cast(*object)->get(Context::NEXT_CONTEXT_LINK),
143209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                       isolate);
14334a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
14344a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return count;
14354a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
14364a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14374a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
1438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Count the number of user functions in the weak list of optimized
143946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org// functions attached to a native context causing a GC after the
1440a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// specified number of elements.
1441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic int CountOptimizedUserFunctionsWithGC(v8::Handle<v8::Context> context,
1442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                             int n) {
1443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int count = 0;
1444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Handle<Context> icontext = v8::Utils::OpenHandle(*context);
144509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = icontext->GetIsolate();
144609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> object(icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST),
144709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                        isolate);
1448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (object->IsJSFunction() &&
1449a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org         !Handle<JSFunction>::cast(object)->IsBuiltin()) {
1450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    count++;
145109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    if (count == n) isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
1452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    object = Handle<Object>(
145309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        Object::cast(JSFunction::cast(*object)->next_function_link()),
145409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        isolate);
1455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1456a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return count;
1457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14604a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgTEST(TestInternalWeakListsTraverseWithGC) {
1461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  v8::V8::Initialize();
146209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Isolate* isolate = Isolate::Current();
1463ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
14644a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  static const int kNumTestContexts = 10;
14654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14662bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
146757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Handle<v8::Context> ctx[kNumTestContexts];
14684a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
146946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  CHECK_EQ(0, CountNativeContexts());
14704a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
14714a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // Create an number of contexts and check the length of the weak list both
14724a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  // with and without GCs while iterating the list.
14734a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < kNumTestContexts; i++) {
147457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    ctx[i] = v8::Context::New(v8::Isolate::GetCurrent());
147546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    CHECK_EQ(i + 1, CountNativeContexts());
147609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    CHECK_EQ(i + 1, CountNativeContextsWithGC(isolate, i / 2 + 1));
14774a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
1478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool opt = (FLAG_always_opt && i::V8::UseCrankshaft());
1480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Compile a number of functions the length of the weak list of optimized
1482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // functions both with and without GCs while iterating the list.
1483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ctx[0]->Enter();
1484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  const char* source = "function f1() { };"
1485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f2() { };"
1486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f3() { };"
1487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f4() { };"
1488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       "function f5() { };";
1489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun(source);
1490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(0, CountOptimizedUserFunctions(ctx[0]));
1491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f1()");
1492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctions(ctx[0]));
1493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 1 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 1));
1494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f2()");
1495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[0]));
1496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 1));
1497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f3()");
1498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[0]));
1499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 1));
1500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f4()");
1501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[0]));
1502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 2));
1503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompileRun("f5()");
1504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[0]));
1505a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 4));
1506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ctx[0]->Exit();
15084a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
15094a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com
15104a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com
1511f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comTEST(TestSizeOfObjects) {
1512f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  v8::V8::Initialize();
1513f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1514f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Get initial heap size after several full GCs, which will stabilize
1515f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // the heap size and return with sweeping finished completely.
1516f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
15175a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1518f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1519f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1520f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
15212f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org  CHECK(HEAP->old_pointer_space()->IsLazySweepingComplete());
1522f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  int initial_size = static_cast<int>(HEAP->SizeOfObjects());
1523f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1524f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  {
1525f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    // Allocate objects on several different old-space pages so that
1526f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    // lazy sweeping kicks in for subsequent GC runs.
1527f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    AlwaysAllocateScope always_allocate;
1528f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    int filler_size = static_cast<int>(FixedArray::SizeFor(8192));
1529f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    for (int i = 1; i <= 100; i++) {
1530f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      HEAP->AllocateFixedArray(8192, TENURED)->ToObjectChecked();
1531f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      CHECK_EQ(initial_size + i * filler_size,
1532f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com               static_cast<int>(HEAP->SizeOfObjects()));
1533f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    }
1534f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1535f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1536f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // The heap size should go back to initial size after a full GC, even
1537f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // though sweeping didn't finish yet.
1538f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
15392c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
15402c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  // Normally sweeping would not be complete here, but no guarantees.
15412c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
1542f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK_EQ(initial_size, static_cast<int>(HEAP->SizeOfObjects()));
1543f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1544f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // Advancing the sweeper step-wise should not change the heap size.
15452f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org  while (!HEAP->old_pointer_space()->IsLazySweepingComplete()) {
1546f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    HEAP->old_pointer_space()->AdvanceSweeper(KB);
1547f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    CHECK_EQ(initial_size, static_cast<int>(HEAP->SizeOfObjects()));
1548f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1549f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
1550f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1551f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
15524a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comTEST(TestSizeOfObjectsVsHeapIteratorPrecision) {
1553e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1554c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  HEAP->EnsureHeapIsIterable();
1555ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  intptr_t size_of_objects_1 = HEAP->SizeOfObjects();
15567c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  HeapIterator iterator(HEAP);
15574a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  intptr_t size_of_objects_2 = 0;
15584a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  for (HeapObject* obj = iterator.next();
15594a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com       obj != NULL;
15604a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com       obj = iterator.next()) {
156156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    if (!obj->IsFreeSpace()) {
156256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      size_of_objects_2 += obj->Size();
156356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    }
15644a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  }
1565c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Delta must be within 5% of the larger result.
1566c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // TODO(gc): Tighten this up by distinguishing between byte
1567c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // arrays that are real and those that merely mark free space
1568c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // on the heap.
15694a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  if (size_of_objects_1 > size_of_objects_2) {
15704a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    intptr_t delta = size_of_objects_1 - size_of_objects_2;
15714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    PrintF("Heap::SizeOfObjects: %" V8_PTR_PREFIX "d, "
15724a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "Iterator: %" V8_PTR_PREFIX "d, "
15734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "delta: %" V8_PTR_PREFIX "d\n",
15744a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           size_of_objects_1, size_of_objects_2, delta);
1575c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CHECK_GT(size_of_objects_1 / 20, delta);
15764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  } else {
15774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    intptr_t delta = size_of_objects_2 - size_of_objects_1;
15784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    PrintF("Heap::SizeOfObjects: %" V8_PTR_PREFIX "d, "
15794a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "Iterator: %" V8_PTR_PREFIX "d, "
15804a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           "delta: %" V8_PTR_PREFIX "d\n",
15814a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com           size_of_objects_1, size_of_objects_2, delta);
1582c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CHECK_GT(size_of_objects_2 / 20, delta);
15834a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  }
15844a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com}
1585023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org
1586023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org
1587c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgstatic void FillUpNewSpace(NewSpace* new_space) {
1588c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // Fill up new space to the point that it is completely full. Make sure
1589c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // that the scavenger does not undo the filling.
15902bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Heap* heap = new_space->heap();
15912bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Isolate* isolate = heap->isolate();
15922bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Factory* factory = isolate->factory();
15932bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
1594c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  AlwaysAllocateScope always_allocate;
1595c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  intptr_t available = new_space->EffectiveCapacity() - new_space->Size();
15967d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1;
1597c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  for (intptr_t i = 0; i < number_of_fillers; i++) {
15982bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED)));
1599c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
1600c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
1601c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1602c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1603c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comTEST(GrowAndShrinkNewSpace) {
1604e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1605c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  NewSpace* new_space = HEAP->new_space();
1606c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1607471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() ||
1608471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) {
16091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // The max size cannot exceed the reserved size, since semispaces must be
16101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // always within the reserved space.  We can't test new space growing and
16111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // shrinking if the reserved size is the same as the minimum (initial) size.
16121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return;
16131044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
16141044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1615c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Explicitly growing should double the space capacity.
1616c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  intptr_t old_capacity, new_capacity;
1617c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  old_capacity = new_space->Capacity();
1618c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Grow();
1619c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_capacity = new_space->Capacity();
1620c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(2 * old_capacity == new_capacity);
1621c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1622c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  old_capacity = new_space->Capacity();
1623c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  FillUpNewSpace(new_space);
1624c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_capacity = new_space->Capacity();
1625c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == new_capacity);
1626c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1627c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Explicitly shrinking should not affect space capacity.
1628c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  old_capacity = new_space->Capacity();
1629c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1630c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_capacity = new_space->Capacity();
1631c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == new_capacity);
1632c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1633c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Let the scavenger empty the new space.
1634c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  HEAP->CollectGarbage(NEW_SPACE);
1635c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK_LE(new_space->Size(), old_capacity);
1636c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1637c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Explicitly shrinking should halve the space capacity.
1638c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  old_capacity = new_space->Capacity();
1639c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1640c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_capacity = new_space->Capacity();
1641c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == 2 * new_capacity);
1642c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1643c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Consecutive shrinking should not affect space capacity.
1644c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  old_capacity = new_space->Capacity();
1645c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1646c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1647c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_space->Shrink();
1648c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  new_capacity = new_space->Capacity();
1649c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(old_capacity == new_capacity);
1650023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org}
1651c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1652c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1653c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgTEST(CollectingAllAvailableGarbageShrinksNewSpace) {
1654e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
16551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1656471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() ||
1657471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) {
16581044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // The max size cannot exceed the reserved size, since semispaces must be
16591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // always within the reserved space.  We can't test new space growing and
16601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // shrinking if the reserved size is the same as the minimum (initial) size.
16611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return;
16621044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
16631044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1664e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
1665c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  NewSpace* new_space = HEAP->new_space();
1666c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  intptr_t old_capacity, new_capacity;
1667c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  old_capacity = new_space->Capacity();
1668c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  new_space->Grow();
1669c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  new_capacity = new_space->Capacity();
1670c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  CHECK(2 * old_capacity == new_capacity);
1671c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  FillUpNewSpace(new_space);
1672c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1673c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  new_capacity = new_space->Capacity();
1674c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  CHECK(old_capacity == new_capacity);
1675c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
1676ecb9dd69014d1d8aad1a08bd8b593fbf94107324svenpanne@chromium.org
16777ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
16787ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.orgstatic int NumberOfGlobalObjects() {
16797ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  int count = 0;
16807c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  HeapIterator iterator(HEAP);
16817ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
16827ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    if (obj->IsGlobalObject()) count++;
16837ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  }
16847ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  return count;
16857ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
16867ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
16877ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
16887ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// Test that we don't embed maps from foreign contexts into
16897ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// optimized code.
169046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaMap) {
1691e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
169257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Isolate* isolate = v8::Isolate::GetCurrent();
169357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1694c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1695c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
169657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
169757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1698c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1699c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1700c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
170157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
17027ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17037ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HEAP->CollectAllAvailableGarbage();
17047ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
17057ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17067ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  {
1707c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
17087ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CompileRun("var v = {x: 42}");
1709c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1710c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
17117ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
17127ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Enter();
17137ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
17147ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> res = CompileRun(
17157ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "function f() { return o.x; }"
1716e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f();"
1717e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
17187ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "f();");
17197ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CHECK_EQ(42, res->Int32Value());
17207ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
17217ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Exit();
1722c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1)->Exit();
1723c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Dispose(isolate);
1724c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    v8::V8::ContextDisposedNotification();
17257ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  }
17267ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HEAP->CollectAllAvailableGarbage();
17277ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1728c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ctx2p.Dispose(isolate);
17297ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HEAP->CollectAllAvailableGarbage();
17307ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
17317ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
17327ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17337ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17347ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// Test that we don't embed functions from foreign contexts into
17357ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org// optimized code.
173646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaFunction) {
1737e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
173857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Isolate* isolate = v8::Isolate::GetCurrent();
173957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1740c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1741c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
174257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
174357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1744c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1745c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1746c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
174757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
17487ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17497ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HEAP->CollectAllAvailableGarbage();
17507ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
17517ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
17527ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  {
1753c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
17547ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CompileRun("var v = function() { return 42; }");
1755c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1756c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
17577ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
17587ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Enter();
17597ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
17607ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    v8::Local<v8::Value> res = CompileRun(
17617ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "function f(x) { return x(); }"
1762e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f(o);"
1763e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
17647ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org        "f(o);");
17657ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    CHECK_EQ(42, res->Int32Value());
17667ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
17677ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx2->Exit();
17687ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org    ctx1->Exit();
1769c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Dispose(ctx1->GetIsolate());
1770c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    v8::V8::ContextDisposedNotification();
17717ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  }
17727ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HEAP->CollectAllAvailableGarbage();
17737ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1774c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ctx2p.Dispose(isolate);
17757ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  HEAP->CollectAllAvailableGarbage();
17767ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
17777ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
1778e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1779e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
178046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaMapKeyed) {
1781e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
178257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Isolate* isolate = v8::Isolate::GetCurrent();
178357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1784c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1785c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
178657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
178757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1788c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1789c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1790c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
179157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
1792e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1793e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1794e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
1795e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1796e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  {
1797c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
1798e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CompileRun("var v = [42, 43]");
1799c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1800c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
1801e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
1802e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Enter();
1803e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
1804e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> res = CompileRun(
1805e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "function f() { return o[0]; }"
1806e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f();"
1807e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
1808e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "f();");
1809e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CHECK_EQ(42, res->Int32Value());
1810e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
1811e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Exit();
1812e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx1->Exit();
1813c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Dispose(ctx1->GetIsolate());
1814c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    v8::V8::ContextDisposedNotification();
1815e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  }
1816e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1817e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1818c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ctx2p.Dispose(isolate);
1819e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1820e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
1821e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org}
1822e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1823e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
182446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgTEST(LeakNativeContextViaMapProto) {
1825e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  i::FLAG_allow_natives_syntax = true;
182657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::Isolate* isolate = v8::Isolate::GetCurrent();
182757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope outer_scope(isolate);
1828c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx1p;
1829c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Persistent<v8::Context> ctx2p;
183057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
183157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
1832c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Reset(isolate, v8::Context::New(isolate));
1833c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx2p.Reset(isolate, v8::Context::New(isolate));
1834c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context>::New(isolate, ctx1p)->Enter();
183557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
1836e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1837e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1838e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(4, NumberOfGlobalObjects());
1839e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org
1840e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  {
1841c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::HandleScope inner_scope(isolate);
1842e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CompileRun("var v = { y: 42}");
1843c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx1 = v8::Local<v8::Context>::New(isolate, ctx1p);
1844c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    v8::Local<v8::Context> ctx2 = v8::Local<v8::Context>::New(isolate, ctx2p);
1845e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> v = ctx1->Global()->Get(v8_str("v"));
1846e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Enter();
1847e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Global()->Set(v8_str("o"), v);
1848e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    v8::Local<v8::Value> res = CompileRun(
1849e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "function f() {"
1850e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "  var p = {x: 42};"
1851e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "  p.__proto__ = o;"
1852e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "  return p.x;"
1853e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "}"
1854e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "for (var i = 0; i < 10; ++i) f();"
1855e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "%OptimizeFunctionOnNextCall(f);"
1856e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org        "f();");
1857e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    CHECK_EQ(42, res->Int32Value());
1858e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Global()->Set(v8_str("o"), v8::Int32::New(0));
1859e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx2->Exit();
1860e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    ctx1->Exit();
1861c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    ctx1p.Dispose(isolate);
1862c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    v8::V8::ContextDisposedNotification();
1863e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  }
1864e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1865e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(2, NumberOfGlobalObjects());
1866c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  ctx2p.Dispose(isolate);
1867e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  HEAP->CollectAllAvailableGarbage();
1868e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  CHECK_EQ(0, NumberOfGlobalObjects());
1869e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org}
1870f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1871f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1872f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comTEST(InstanceOfStubWriteBarrier) {
1873f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  i::FLAG_allow_natives_syntax = true;
1874c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
1875f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  i::FLAG_verify_heap = true;
1876f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com#endif
1877c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1878e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1879f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  if (!i::V8::UseCrankshaft()) return;
1880fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (i::FLAG_force_marking_deque_overflows) return;
18812bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope outer_scope(v8::Isolate::GetCurrent());
1882f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1883f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  {
18842bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    v8::HandleScope scope(v8::Isolate::GetCurrent());
1885f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    CompileRun(
1886f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function foo () { }"
1887f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function mkbar () { return new (new Function(\"\")) (); }"
1888f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function f (x) { return (x instanceof foo); }"
1889f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "function g () { f(mkbar()); }"
1890f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "f(new foo()); f(new foo());"
1891f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "%OptimizeFunctionOnNextCall(f);"
1892f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        "f(new foo()); g();");
1893f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1894f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1895f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  IncrementalMarking* marking = HEAP->incremental_marking();
1896f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  marking->Abort();
1897f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  marking->Start();
1898f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1899f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  Handle<JSFunction> f =
1900f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      v8::Utils::OpenHandle(
1901f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com          *v8::Handle<v8::Function>::Cast(
1902f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
1903f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1904f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(f->IsOptimized());
1905f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1906f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) &&
1907f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com         !marking->IsStopped()) {
19087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    // Discard any pending GC requests otherwise we will get GC when we enter
19097d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    // code below.
19107d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
1911f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1912f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1913f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(marking->IsMarking());
1914f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1915f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  {
19162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    v8::HandleScope scope(v8::Isolate::GetCurrent());
1917f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    v8::Handle<v8::Object> global = v8::Context::GetCurrent()->Global();
1918f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    v8::Handle<v8::Function> g =
1919f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        v8::Handle<v8::Function>::Cast(global->Get(v8_str("g")));
1920f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    g->Call(global, 0, NULL);
1921f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1922f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1923f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->incremental_marking()->set_should_hurry(true);
1924f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HEAP->CollectGarbage(OLD_POINTER_SPACE);
1925f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
19262efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
19272efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
19282efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.orgTEST(PrototypeTransitionClearing) {
1929e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
1930d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
1931d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
1932e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
19332efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
19342efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  CompileRun(
19352efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "var base = {};"
19362efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "var live = [];"
19372efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "for (var i = 0; i < 10; i++) {"
19382efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  var object = {};"
19392efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  var prototype = {};"
19402efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  object.__proto__ = prototype;"
19412efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "  if (i >= 3) live.push(object, prototype);"
19422efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      "}");
19432efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
19442efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  Handle<JSObject> baseObject =
19452efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      v8::Utils::OpenHandle(
19462efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org          *v8::Handle<v8::Object>::Cast(
19472efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("base"))));
19482efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
1949f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org  // Verify that only dead prototype transitions are cleared.
1950f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org  CHECK_EQ(10, baseObject->map()->NumberOfProtoTransitions());
1951ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1952f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org  const int transitions = 10 - 3;
19537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  CHECK_EQ(transitions, baseObject->map()->NumberOfProtoTransitions());
19542efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org
19552efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  // Verify that prototype transitions array was compacted.
195681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  FixedArray* trans = baseObject->map()->GetPrototypeTransitions();
19577028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (int i = 0; i < transitions; i++) {
19582efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    int j = Map::kProtoTransitionHeaderSize +
19592efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org        i * Map::kProtoTransitionElementsPerEntry;
19602efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    CHECK(trans->get(j + Map::kProtoTransitionMapOffset)->IsMap());
19617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    Object* proto = trans->get(j + Map::kProtoTransitionPrototypeOffset);
19627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    CHECK(proto->IsTheHole() || proto->IsJSObject());
19632efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  }
196405ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org
196505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  // Make sure next prototype is placed on an old-space evacuation candidate.
196605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  Handle<JSObject> prototype;
196705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  PagedSpace* space = HEAP->old_pointer_space();
1968fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  {
1969fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    AlwaysAllocateScope always_allocate;
1970fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    SimulateFullSpace(space);
1971d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    prototype = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED);
1972fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
197305ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org
197405ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  // Add a prototype on an evacuation candidate and verify that transition
197505ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  // clearing correctly records slots in prototype transition array.
197605ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  i::FLAG_always_compact = true;
197705ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  Handle<Map> map(baseObject->map());
197881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  CHECK(!space->LastPage()->Contains(
197981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      map->GetPrototypeTransitions()->address()));
198005ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  CHECK(space->LastPage()->Contains(prototype->address()));
1981c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  JSObject::SetPrototype(baseObject, prototype, false);
1982c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  CHECK(Map::GetPrototypeTransition(map, prototype)->IsMap());
198305ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1984c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org  CHECK(Map::GetPrototypeTransition(map, prototype)->IsMap());
19852efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org}
19867d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
19877d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
19887d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgTEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) {
19891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
19907d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_allow_natives_syntax = true;
1991c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
19927d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_verify_heap = true;
19937d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org#endif
1994c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1995e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
19967d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  if (!i::V8::UseCrankshaft()) return;
19972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope outer_scope(v8::Isolate::GetCurrent());
19987d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
19997d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  {
20002bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    v8::HandleScope scope(v8::Isolate::GetCurrent());
20017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    CompileRun(
20027d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "function f () {"
20037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  var s = 0;"
20047d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  for (var i = 0; i < 100; i++)  s += i;"
20057d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  return s;"
20067d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "}"
20077d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f(); f();"
20087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "%OptimizeFunctionOnNextCall(f);"
20097d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f();");
20107d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
20117d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Handle<JSFunction> f =
20127d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      v8::Utils::OpenHandle(
20137d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org          *v8::Handle<v8::Function>::Cast(
20147d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
20157d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK(f->IsOptimized());
20167d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20177d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  IncrementalMarking* marking = HEAP->incremental_marking();
20187d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  marking->Abort();
20197d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  marking->Start();
20207d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20217d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  // The following two calls will increment HEAP->global_ic_age().
20227d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  const int kLongIdlePauseInMs = 1000;
20237d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  v8::V8::ContextDisposedNotification();
20247d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  v8::V8::IdleNotification(kLongIdlePauseInMs);
20257d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20267d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  while (!marking->IsStopped() && !marking->IsComplete()) {
20277d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
20287d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
20292c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  if (!marking->IsStopped() || marking->should_hurry()) {
20302c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // We don't normally finish a GC via Step(), we normally finish by
20312c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // setting the stack guard and then do the final steps in the stack
20322c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // guard interrupt.  But here we didn't ask for that, and there is no
20332c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // JS code running to trigger the interrupt, so we explicitly finalize
20342c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    // here.
20352c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org    HEAP->CollectAllGarbage(Heap::kNoGCFlags,
20362c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org                            "Test finalizing incremental mark-sweep");
20372c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org  }
20387d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20397d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age());
20407d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->opt_count());
20417d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->code()->profiler_ticks());
20427d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
20437d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20447d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20457d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgTEST(ResetSharedFunctionInfoCountersDuringMarkSweep) {
20461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_stress_compaction = false;
20477d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_allow_natives_syntax = true;
2048c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
20497d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_verify_heap = true;
20507d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org#endif
2051c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2052e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
20537d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  if (!i::V8::UseCrankshaft()) return;
2054e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope outer_scope(CcTest::isolate());
20557d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20567d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  {
2057e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope scope(CcTest::isolate());
20587d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    CompileRun(
20597d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "function f () {"
20607d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  var s = 0;"
20617d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  for (var i = 0; i < 100; i++)  s += i;"
20627d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "  return s;"
20637d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "}"
20647d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f(); f();"
20657d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "%OptimizeFunctionOnNextCall(f);"
20667d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org        "f();");
20677d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
20687d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Handle<JSFunction> f =
20697d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      v8::Utils::OpenHandle(
20707d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org          *v8::Handle<v8::Function>::Cast(
20717d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
20727d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK(f->IsOptimized());
20737d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20747d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  HEAP->incremental_marking()->Abort();
20757d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20767d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  // The following two calls will increment HEAP->global_ic_age().
20777d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  // Since incremental marking is off, IdleNotification will do full GC.
20787d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  const int kLongIdlePauseInMs = 1000;
20797d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  v8::V8::ContextDisposedNotification();
20807d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  v8::V8::IdleNotification(kLongIdlePauseInMs);
20817d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20827d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age());
20837d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->opt_count());
20847d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(0, f->shared()->code()->profiler_ticks());
20857d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
20867d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20877d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
20887d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org// Test that HAllocateObject will always return an object in new-space.
20897d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgTEST(OptimizedAllocationAlwaysInNewSpace) {
20907d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  i::FLAG_allow_natives_syntax = true;
2091e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
20927d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
20935323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2094e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
20957d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
209683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  SimulateFullSpace(HEAP->new_space());
20977d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  AlwaysAllocateScope always_allocate;
20987d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  v8::Local<v8::Value> res = CompileRun(
20997d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "function c(x) {"
21007d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "  this.x = x;"
21017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "  for (var i = 0; i < 32; i++) {"
21027d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "    this['x' + i] = x;"
21037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "  }"
21047d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "}"
21057d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "function f(x) { return new c(x); };"
21067d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "f(1); f(2); f(3);"
21077d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "%OptimizeFunctionOnNextCall(f);"
21087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      "f(4);");
21097d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK_EQ(4, res->ToObject()->GetRealNamedProperty(v8_str("x"))->Int32Value());
21107d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21117d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Handle<JSObject> o =
21127d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
21137d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
21147d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  CHECK(HEAP->InNewSpace(*o));
2115750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
2116750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2117750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
21188dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.orgTEST(OptimizedPretenuringAllocationFolding) {
21198dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  i::FLAG_allow_natives_syntax = true;
21208dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CcTest::InitializeVM();
21218dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
21228dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
21238dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  v8::HandleScope scope(CcTest::isolate());
21248dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
21258dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21268dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  v8::Local<v8::Value> res = CompileRun(
21278dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "function DataObject() {"
21288dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.a = 1.1;"
21298dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.b = [{}];"
21308dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.c = 1.2;"
21318dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.d = [{}];"
21328dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.e = 1.3;"
21338dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.f = [{}];"
21348dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "}"
21358dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "function f() {"
21368dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  return new DataObject();"
21378dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "};"
21388dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "f(); f(); f();"
21398dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "%OptimizeFunctionOnNextCall(f);"
21408dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "f();");
21418dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21428dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  Handle<JSObject> o =
21438dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
21448dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21458dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(0)));
21468dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(1)));
21478dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(2)));
21488dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(3)));
21498dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(4)));
21508dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(5)));
21518dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org}
21528dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21538dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21548dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.orgTEST(OptimizedPretenuringAllocationFoldingBlocks) {
21558dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  i::FLAG_allow_natives_syntax = true;
21568dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CcTest::InitializeVM();
21578dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
21588dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
21598dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  v8::HandleScope scope(CcTest::isolate());
21608dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
21618dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21628dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  v8::Local<v8::Value> res = CompileRun(
21638dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "function DataObject() {"
21648dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.a = [{}];"
21658dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.b = [{}];"
21668dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.c = 1.1;"
21678dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.d = 1.2;"
21688dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.e = [{}];"
21698dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  this.f = 1.3;"
21708dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "}"
21718dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "function f() {"
21728dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "  return new DataObject();"
21738dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "};"
21748dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "f(); f(); f();"
21758dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "%OptimizeFunctionOnNextCall(f);"
21768dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      "f();");
21778dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21788dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  Handle<JSObject> o =
21798dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
21808dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21818dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(0)));
21828dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(1)));
21838dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(2)));
21848dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(3)));
21858dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(4)));
21868dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(5)));
21878dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org}
21888dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21898dec82379e3dc6c6a3292879ba64f8bee40d2d98jkummerow@chromium.org
21901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringObjectArrayLiterals) {
2191750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  i::FLAG_allow_natives_syntax = true;
2192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2193750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2194750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2196a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
2197750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2198750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Local<v8::Value> res = CompileRun(
2199750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "function f() {"
22001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = [{}, {}, {}];"
2201750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "  return numbers;"
2202750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "};"
2203750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "f(); f(); f();"
2204750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "%OptimizeFunctionOnNextCall(f);"
2205750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "f();");
2206750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2207750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Handle<JSObject> o =
2208750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2209750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
22102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  CHECK(HEAP->InOldPointerSpace(o->elements()));
22111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
2212750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
2213750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2214750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
22151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringMixedInObjectProperties) {
2216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
2217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
22211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
2222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::Local<v8::Value> res = CompileRun(
2224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "function f() {"
22251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = {a: {c: 2.2, d: {}}, b: 1.1};"
22261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  return numbers;"
2227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "};"
2228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "f(); f(); f();"
2229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "%OptimizeFunctionOnNextCall(f);"
2230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      "f();");
2231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Handle<JSObject> o =
2233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
22351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
22361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(o->RawFastPropertyAt(0)));
22371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(o->RawFastPropertyAt(1)));
22381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
22391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  JSObject* inner_object = reinterpret_cast<JSObject*>(o->RawFastPropertyAt(0));
22401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(inner_object));
22411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(inner_object->RawFastPropertyAt(0)));
22421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(inner_object->RawFastPropertyAt(1)));
2243e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
2244e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2245e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
22461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringDoubleArrayProperties) {
2247750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  i::FLAG_allow_natives_syntax = true;
2248e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2249750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2250750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2251e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
22521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
2253750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2254750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Local<v8::Value> res = CompileRun(
2255750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "function f() {"
22561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = {a: 1.1, b: 2.2};"
2257750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "  return numbers;"
2258750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "};"
2259750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "f(); f(); f();"
2260750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "%OptimizeFunctionOnNextCall(f);"
2261750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      "f();");
2262750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
2263750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  Handle<JSObject> o =
2264750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2265750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
22661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
22671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(o->properties()));
22687d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org}
22695f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
22705f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
22711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringdoubleArrayLiterals) {
22721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
22731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
22741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
22751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
22761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
22771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
22781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
22791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> res = CompileRun(
22801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
22811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = [1.1, 2.2, 3.3];"
22821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  return numbers;"
22831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
22841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f(); f(); f();"
22851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "%OptimizeFunctionOnNextCall(f);"
22861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f();");
22871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
22881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
22891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
22901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
22911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(o->elements()));
22921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
22931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
22941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
22951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
22961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringNestedMixedArrayLiterals) {
2297d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
2298d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  CcTest::InitializeVM();
2299d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2300d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2301d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  v8::HandleScope scope(CcTest::isolate());
2302d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
2303d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
2304d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  v8::Local<v8::Value> res = CompileRun(
2305d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "function f() {"
23061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = [[{}, {}, {}],[1.1, 2.2, 3.3]];"
23071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  return numbers;"
2308d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "};"
2309d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "f(); f(); f();"
2310d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "%OptimizeFunctionOnNextCall(f);"
2311d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      "f();");
2312d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
23131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> int_array = v8::Object::Cast(*res)->Get(v8_str("0"));
23141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> int_array_handle =
23151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array));
23161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> double_array = v8::Object::Cast(*res)->Get(v8_str("1"));
23171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> double_array_handle =
23181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array));
23191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2320d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSObject> o =
2321d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2322d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
23231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*int_array_handle));
23241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(int_array_handle->elements()));
23251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*double_array_handle));
23261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(double_array_handle->elements()));
2327d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
2328d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
23291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringNestedObjectLiterals) {
23311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
23321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
23331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
23341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
23351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
23361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
23371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> res = CompileRun(
23391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
23401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = [[{}, {}, {}],[{}, {}, {}]];"
23411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  return numbers;"
23421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
23431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f(); f(); f();"
23441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "%OptimizeFunctionOnNextCall(f);"
23451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f();");
23461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> int_array_1 = v8::Object::Cast(*res)->Get(v8_str("0"));
23481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> int_array_handle_1 =
23491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array_1));
23501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> int_array_2 = v8::Object::Cast(*res)->Get(v8_str("1"));
23511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> int_array_handle_2 =
23521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(int_array_2));
23531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
23551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
23561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
23571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*int_array_handle_1));
23581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(int_array_handle_1->elements()));
23591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*int_array_handle_2));
23601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(int_array_handle_2->elements()));
23611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
23621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedPretenuringNestedDoubleLiterals) {
23651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
23661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
23671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
23681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
23691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
23701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
23711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> res = CompileRun(
23731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
23741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = [[1.1, 1.2, 1.3],[2.1, 2.2, 2.3]];"
23751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  return numbers;"
23761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
23771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f(); f(); f();"
23781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "%OptimizeFunctionOnNextCall(f);"
23791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f();");
23801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> double_array_1 =
23821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Object::Cast(*res)->Get(v8_str("0"));
23831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> double_array_handle_1 =
23841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array_1));
23851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> double_array_2 =
23861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Object::Cast(*res)->Get(v8_str("1"));
23871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> double_array_handle_2 =
23881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(double_array_2));
23891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
23911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
23921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
23931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*double_array_handle_1));
23941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(double_array_handle_1->elements()));
23951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldPointerSpace(*double_array_handle_2));
23961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InOldDataSpace(double_array_handle_2->elements()));
23971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
23981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
23991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Test regular array literals allocation.
24011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTEST(OptimizedAllocationArrayLiterals) {
24021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
24031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
24041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
24051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
24061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
24071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  v8::Local<v8::Value> res = CompileRun(
24091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "function f() {"
24101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  var numbers = new Array(1, 2, 3);"
24111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  numbers[0] = 3.14;"
24121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "  return numbers;"
24131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "};"
24141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f(); f(); f();"
24151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "%OptimizeFunctionOnNextCall(f);"
24161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      "f();");
24171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK_EQ(static_cast<int>(3.14),
24181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org           v8::Object::Cast(*res)->Get(v8_str("0"))->Int32Value());
24191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Handle<JSObject> o =
24211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
24221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CHECK(HEAP->InNewSpace(o->elements()));
24241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
24251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
242710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgTEST(OptimizedPretenuringCallNew) {
242810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  i::FLAG_allow_natives_syntax = true;
242910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  i::FLAG_pretenuring_call_new = true;
243010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  CcTest::InitializeVM();
243110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
243210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
243310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  v8::HandleScope scope(CcTest::isolate());
243410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  HEAP->SetNewSpaceHighPromotionModeActive(true);
243510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
243610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  AlwaysAllocateScope always_allocate;
243710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  v8::Local<v8::Value> res = CompileRun(
243810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "function g() { this.a = 0; }"
243910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "function f() {"
244010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "  return new g();"
244110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "};"
244210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "f(); f(); f();"
244310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "%OptimizeFunctionOnNextCall(f);"
244410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      "f();");
244510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
244610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  Handle<JSObject> o =
244710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
244810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  CHECK(HEAP->InOldPointerSpace(*o));
244910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org}
245010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
245110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
24525f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgstatic int CountMapTransitions(Map* map) {
245399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return map->transitions()->number_of_transitions();
24545f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
24555f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
24565f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
24575f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org// Test that map transitions are cleared and maps are collected with
24585f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org// incremental marking as well.
24595f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgTEST(Regress1465) {
2460b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  i::FLAG_stress_compaction = false;
24615f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
24625f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  i::FLAG_trace_incremental_marking = true;
2463e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2464e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2465471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  static const int transitions_count = 256;
24665f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
2467471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
2468471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    AlwaysAllocateScope always_allocate;
2469471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    for (int i = 0; i < transitions_count; i++) {
2470471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      EmbeddedVector<char, 64> buffer;
2471471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i);
2472471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      CompileRun(buffer.start());
2473471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
2474471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("var root = new Object;");
24755f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
2476471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
24775f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  Handle<JSObject> root =
24785f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      v8::Utils::OpenHandle(
24795f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org          *v8::Handle<v8::Object>::Cast(
24805f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("root"))));
24815f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
24825f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  // Count number of live transitions before marking.
24835f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  int transitions_before = CountMapTransitions(root->map());
24845f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  CompileRun("%DebugPrint(root);");
2485471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK_EQ(transitions_count, transitions_before);
24865f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
2487471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
24885f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
24895f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
24905f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  // Count number of live transitions after marking.  Note that one transition
24915f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  // is left, because 'o' still holds an instance of one transition target.
24925f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  int transitions_after = CountMapTransitions(root->map());
24935f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  CompileRun("%DebugPrint(root);");
24945f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  CHECK_EQ(1, transitions_after);
24955f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
249637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
249737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
249837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgTEST(Regress2143a) {
249937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_collect_maps = true;
250037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_incremental_marking = true;
2501e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2502e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
250337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
250437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Prepare a map transition from the root object together with a yet
250537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // untransitioned root object.
250637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("var root = new Object;"
250737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root.foo = 0;"
250837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root = new Object;");
250937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
2510471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
251137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
251237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Compile a StoreIC that performs the prepared map transition. This
251337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // will restart incremental marking and should make sure the root is
251437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // marked grey again.
251537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("function f(o) {"
251637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "  o.foo = 0;"
251737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "}"
251837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(new Object);"
251937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(root);");
252037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
252137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // This bug only triggers with aggressive IC clearing.
252237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  HEAP->AgeInlineCaches();
252337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
252437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Explicitly request GC to perform final marking step and sweeping.
252537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
252637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
252737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  Handle<JSObject> root =
252837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      v8::Utils::OpenHandle(
252937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org          *v8::Handle<v8::Object>::Cast(
253037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("root"))));
253137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
253237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // The root object should be in a sane state.
253337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->IsJSObject());
253437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->map()->IsMap());
253537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org}
253637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
253737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
253837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgTEST(Regress2143b) {
253937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_collect_maps = true;
254037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_incremental_marking = true;
254137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  i::FLAG_allow_natives_syntax = true;
2542e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2543e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
254437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
254537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Prepare a map transition from the root object together with a yet
254637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // untransitioned root object.
254737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("var root = new Object;"
254837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root.foo = 0;"
254937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "root = new Object;");
255037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
2551471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
255237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
255337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Compile an optimized LStoreNamedField that performs the prepared
255437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // map transition. This will restart incremental marking and should
255537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // make sure the root is marked grey again.
255637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CompileRun("function f(o) {"
255737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "  o.foo = 0;"
255837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "}"
255937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(new Object);"
256037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(new Object);"
256137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "%OptimizeFunctionOnNextCall(f);"
256237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "f(root);"
256337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org             "%DeoptimizeFunction(f);");
256437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
256537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // This bug only triggers with aggressive IC clearing.
256637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  HEAP->AgeInlineCaches();
256737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
256837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // Explicitly request GC to perform final marking step and sweeping.
256937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
257037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
257137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  Handle<JSObject> root =
257237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      v8::Utils::OpenHandle(
257337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org          *v8::Handle<v8::Object>::Cast(
257437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("root"))));
257537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
257637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // The root object should be in a sane state.
257737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->IsJSObject());
257837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  CHECK(root->map()->IsMap());
257937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org}
2580de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2581de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2582de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.orgTEST(ReleaseOverReservedPages) {
2583de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  i::FLAG_trace_gc = true;
2584000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  // The optimizer can allocate stuff, messing up the test.
2585000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  i::FLAG_crankshaft = false;
2586000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  i::FLAG_always_opt = false;
2587e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2588d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
2589d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
2590e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2591de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  static const int number_of_test_pages = 20;
2592de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2593de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Prepare many pages with low live-bytes count.
2594de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  PagedSpace* old_pointer_space = HEAP->old_pointer_space();
2595de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_EQ(1, old_pointer_space->CountTotalPages());
2596de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  for (int i = 0; i < number_of_test_pages; i++) {
2597de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    AlwaysAllocateScope always_allocate;
2598de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org    SimulateFullSpace(old_pointer_space);
2599d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    factory->NewFixedArray(1, TENURED);
2600de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
2601de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_EQ(number_of_test_pages + 1, old_pointer_space->CountTotalPages());
2602de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2603de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Triggering one GC will cause a lot of garbage to be discovered but
2604de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // even spread across all allocated pages.
2605de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered for preparation");
26065323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages());
2607de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
2608de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // Triggering subsequent GCs should cause at least half of the pages
2609de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  // to be released to the OS after at most two cycles.
2610de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 1");
2611de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages());
2612de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags, "triggered by test 2");
2613de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_GE(number_of_test_pages + 1, old_pointer_space->CountTotalPages() * 2);
2614de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
261556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // Triggering a last-resort GC should cause all pages to be released to the
261656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // OS so that other processes can seize the memory.  If we get a failure here
261756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // where there are 2 pages left instead of 1, then we should increase the
261856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // size of the first page a little in SizeOfFirstPage in spaces.cc.  The
261956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // first page should be small in order to reduce memory used when the VM
262056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // boots, but if the 20 small arrays don't fit on the first page then that's
262156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // an indication that it is too small.
2622de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  HEAP->CollectAllAvailableGarbage("triggered really hard");
2623de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  CHECK_EQ(1, old_pointer_space->CountTotalPages());
2624de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org}
2625304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
2626304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
2627304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgTEST(Regress2237) {
2628b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  i::FLAG_stress_compaction = false;
2629e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2630d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
2631d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
2632e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2633304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  Handle<String> slice(HEAP->empty_string());
2634304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
2635304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  {
2636304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    // Generate a parent that lives in new-space.
2637e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope inner_scope(CcTest::isolate());
2638304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    const char* c = "This text is long enough to trigger sliced strings.";
2639d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    Handle<String> s = factory->NewStringFromAscii(CStrVector(c));
2640fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    CHECK(s->IsSeqOneByteString());
2641304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    CHECK(HEAP->InNewSpace(*s));
2642304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
2643304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    // Generate a sliced string that is based on the above parent and
2644304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    // lives in old-space.
264583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    SimulateFullSpace(HEAP->new_space());
2646304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    AlwaysAllocateScope always_allocate;
2647d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    Handle<String> t = factory->NewProperSubString(s, 5, 35);
2648304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    CHECK(t->IsSlicedString());
2649304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    CHECK(!HEAP->InNewSpace(*t));
2650304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    *slice.location() = *t.location();
2651304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  }
2652304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
2653fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString());
2654304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2655fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString());
2656304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
2657ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
2658ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
2659ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org#ifdef OBJECT_PRINT
2660ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.orgTEST(PrintSharedFunctionInfo) {
2661e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2662e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2663ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  const char* source = "f = function() { return 987654321; }\n"
2664ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org                       "g = function() { return 123456789; }\n";
2665ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  CompileRun(source);
2666ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  Handle<JSFunction> g =
2667ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org      v8::Utils::OpenHandle(
2668ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org          *v8::Handle<v8::Function>::Cast(
2669ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("g"))));
2670ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org
267179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_allocation;
2672ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org  g->shared()->PrintLn();
2673ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org}
2674ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org#endif  // OBJECT_PRINT
2675000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2676000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2677000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.orgTEST(Regress2211) {
2678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2680000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2681000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  v8::Handle<v8::String> value = v8_str("val string");
2682000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  Smi* hash = Smi::FromInt(321);
2683000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  Heap* heap = Isolate::Current()->heap();
2684000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2685000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  for (int i = 0; i < 2; i++) {
2686000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // Store identity hash first and common hidden property second.
2687000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    v8::Handle<v8::Object> obj = v8::Object::New();
2688000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    Handle<JSObject> internal_obj = v8::Utils::OpenHandle(*obj);
2689000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK(internal_obj->HasFastProperties());
2690000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2691000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // In the first iteration, set hidden value first and identity hash second.
2692000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // In the second iteration, reverse the order.
2693000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    if (i == 0) obj->SetHiddenValue(v8_str("key string"), value);
2694000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    MaybeObject* maybe_obj = internal_obj->SetIdentityHash(hash,
2695000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org                                                           ALLOW_CREATION);
2696000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK(!maybe_obj->IsFailure());
2697000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    if (i == 1) obj->SetHiddenValue(v8_str("key string"), value);
2698000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2699000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // Check values.
2700000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK_EQ(hash,
27014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org             internal_obj->GetHiddenProperty(heap->identity_hash_string()));
2702000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK(value->Equals(obj->GetHiddenValue(v8_str("key string"))));
2703000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org
2704000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // Check size.
2705000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    DescriptorArray* descriptors = internal_obj->map()->instance_descriptors();
2706000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    ObjectHashTable* hashtable = ObjectHashTable::cast(
270757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org        internal_obj->RawFastPropertyAt(descriptors->GetFieldIndex(0)));
2708000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    // HashTable header (5) and 4 initial entries (8).
2709000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org    CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize);
2710000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org  }
2711000f7fbc1dfa59e414332fd2898b5da4d44eedd6jkummerow@chromium.org}
2712471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2713471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2714471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgTEST(IncrementalMarkingClearsTypeFeedbackCells) {
2715471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
2716e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2717e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2718471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Local<v8::Value> fun1, fun2;
2719471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2720471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
2721471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
2722471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() {};");
2723471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    fun1 = env->Global()->Get(v8_str("fun"));
2724471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2725471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2726471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
2727471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
2728471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() {};");
2729471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    fun2 = env->Global()->Get(v8_str("fun"));
2730471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2731471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2732471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains type feedback for closures
273346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from two different native contexts.
2734471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Context::GetCurrent()->Global()->Set(v8_str("fun1"), fun1);
2735471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Context::GetCurrent()->Global()->Set(v8_str("fun2"), fun2);
2736471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function f(a, b) { a(); b(); } f(fun1, fun2);");
2737471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
2738471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
2739471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
2740471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
2741471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<TypeFeedbackCells> cells(TypeFeedbackInfo::cast(
2742471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      f->shared()->code()->type_feedback_info())->type_feedback_cells());
2743471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2744471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK_EQ(2, cells->CellCount());
274541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  CHECK(cells->GetCell(0)->value()->IsJSFunction());
274641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  CHECK(cells->GetCell(1)->value()->IsJSFunction());
2747471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2748471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
2749471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2750471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2751471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK_EQ(2, cells->CellCount());
275241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  CHECK(cells->GetCell(0)->value()->IsTheHole());
275341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  CHECK(cells->GetCell(1)->value()->IsTheHole());
2754471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2755471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2756471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2757471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgstatic Code* FindFirstIC(Code* code, Code::Kind kind) {
2758471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
2759471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) |
2760471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             RelocInfo::ModeMask(RelocInfo::CODE_TARGET_WITH_ID) |
2761471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             RelocInfo::ModeMask(RelocInfo::CODE_TARGET_CONTEXT);
2762471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  for (RelocIterator it(code, mask); !it.done(); it.next()) {
2763471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    RelocInfo* info = it.rinfo();
2764471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Code* target = Code::GetCodeFromTargetAddress(info->target_address());
2765471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    if (target->is_inline_cache_stub() && target->kind() == kind) {
2766471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      return target;
2767471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
2768471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2769471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  return NULL;
2770471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2771471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2772471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2773471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgTEST(IncrementalMarkingPreservesMonomorhpicIC) {
2774471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
2775e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2776e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2777471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2778471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains a monomorphic IC for object
277946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from the same native context.
2780471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
2781471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             "function f(o) { return o.x; } f(obj); f(obj);");
2782471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
2783471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
2784471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
2785471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
2786471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2787471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2788471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_before->ic_state() == MONOMORPHIC);
2789471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2790471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
2791471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2792471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2793471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2794471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_after->ic_state() == MONOMORPHIC);
2795471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2796471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2797471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2798471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgTEST(IncrementalMarkingClearsMonomorhpicIC) {
2799471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
2800e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2801e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2802471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Local<v8::Value> obj1;
2803471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2804471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
2805471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
2806471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
2807471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    obj1 = env->Global()->Get(v8_str("obj"));
2808471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2809471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2810471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains a monomorphic IC for object
281146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from a different native context.
2812471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Context::GetCurrent()->Global()->Set(v8_str("obj1"), obj1);
2813471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function f(o) { return o.x; } f(obj1); f(obj1);");
2814471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
2815471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
2816471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
2817471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
2818471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2819471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2820471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_before->ic_state() == MONOMORPHIC);
2821471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2822471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Fire context dispose notification.
2823471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::V8::ContextDisposedNotification();
2824471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
2825471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2826471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2827471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2828471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_after->ic_state() == UNINITIALIZED);
2829471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2830471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2831471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2832471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgTEST(IncrementalMarkingClearsPolymorhpicIC) {
2833471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (i::FLAG_always_opt) return;
2834e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2835e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2836471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Local<v8::Value> obj1, obj2;
2837471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2838471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
2839471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
2840471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
2841471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    obj1 = env->Global()->Get(v8_str("obj"));
2842471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2843471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2844471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  {
2845471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    LocalContext env;
2846471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    CompileRun("function fun() { this.x = 2; }; var obj = new fun();");
2847471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    obj2 = env->Global()->Get(v8_str("obj"));
2848471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2849471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2850471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Prepare function f that contains a polymorphic IC for objects
285146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // originating from two different native contexts.
2852471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Context::GetCurrent()->Global()->Set(v8_str("obj1"), obj1);
2853471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::Context::GetCurrent()->Global()->Set(v8_str("obj2"), obj2);
2854471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);");
2855471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Handle<JSFunction> f =
2856471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      v8::Utils::OpenHandle(
2857471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org          *v8::Handle<v8::Function>::Cast(
2858471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org              v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
2859471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2860471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
28614a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  CHECK(ic_before->ic_state() == POLYMORPHIC);
2862471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2863471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  // Fire context dispose notification.
2864471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v8::V8::ContextDisposedNotification();
2865471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  SimulateIncrementalMarking();
2866471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2867471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2868471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2869471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  CHECK(ic_after->ic_state() == UNINITIALIZED);
2870471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2871355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2872355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2873355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgclass SourceResource: public v8::String::ExternalAsciiStringResource {
2874355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org public:
2875355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  explicit SourceResource(const char* data)
2876355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    : data_(data), length_(strlen(data)) { }
2877355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2878355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  virtual void Dispose() {
2879355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    i::DeleteArray(data_);
2880355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    data_ = NULL;
2881355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
2882355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2883355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  const char* data() const { return data_; }
2884355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2885355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  size_t length() const { return length_; }
2886355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2887355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  bool IsDisposed() { return data_ == NULL; }
2888355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2889355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org private:
2890355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  const char* data_;
2891355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  size_t length_;
2892355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org};
2893355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2894355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2895fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid ReleaseStackTraceDataTest(const char* source, const char* accessor) {
2896355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // Test that the data retained by the Error.stack accessor is released
2897355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // after the first time the accessor is fired.  We use external string
2898355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // to check whether the data is being released since the external string
2899355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // resource's callback is fired when the external string is GC'ed.
2900fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  FLAG_use_ic = false;  // ICs retain objects.
2901594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  FLAG_parallel_recompilation = false;
2902e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2903e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
2904355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  SourceResource* resource = new SourceResource(i::StrDup(source));
2905355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  {
2906e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    v8::HandleScope scope(CcTest::isolate());
2907355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    v8::Handle<v8::String> source_string = v8::String::NewExternal(resource);
2908fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HEAP->CollectAllAvailableGarbage();
2909355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    v8::Script::Compile(source_string)->Run();
2910355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    CHECK(!resource->IsDisposed());
2911355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
2912fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // HEAP->CollectAllAvailableGarbage();
2913fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  CHECK(!resource->IsDisposed());
2914fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2915fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  CompileRun(accessor);
2916355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  HEAP->CollectAllAvailableGarbage();
2917355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
2918355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  // External source has been released.
2919355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  CHECK(resource->IsDisposed());
2920355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  delete resource;
2921355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}
292233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
292333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2924eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgTEST(ReleaseStackTraceData) {
2925eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  static const char* source1 = "var error = null;            "
2926eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /* Normal Error */           "try {                        "
2927eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "  throw new Error();         "
2928eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "} catch (e) {                "
2929eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "  error = e;                 "
2930eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "}                            ";
2931eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  static const char* source2 = "var error = null;            "
2932eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  /* Stack overflow */         "try {                        "
2933eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "  (function f() { f(); })(); "
2934eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "} catch (e) {                "
2935eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "  error = e;                 "
2936eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org                               "}                            ";
2937fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  static const char* source3 = "var error = null;            "
2938fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  /* Normal Error */           "try {                        "
2939fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  /* as prototype */           "  throw new Error();         "
2940fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "} catch (e) {                "
2941fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "  error = {};                "
2942fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "  error.__proto__ = e;       "
2943fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "}                            ";
2944fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  static const char* source4 = "var error = null;            "
2945fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  /* Stack overflow */         "try {                        "
2946fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  /* as prototype   */         "  (function f() { f(); })(); "
2947fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "} catch (e) {                "
2948fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "  error = {};                "
2949fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "  error.__proto__ = e;       "
2950fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "}                            ";
2951fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  static const char* getter = "error.stack";
2952fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  static const char* setter = "error.stack = 0";
2953fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2954fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ReleaseStackTraceDataTest(source1, setter);
2955fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ReleaseStackTraceDataTest(source2, setter);
2956fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // We do not test source3 and source4 with setter, since the setter is
2957fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // supposed to (untypically) write to the receiver, not the holder.  This is
2958fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // to emulate the behavior of a data property.
2959fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2960fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ReleaseStackTraceDataTest(source1, getter);
2961fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ReleaseStackTraceDataTest(source2, getter);
2962fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ReleaseStackTraceDataTest(source3, getter);
2963fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ReleaseStackTraceDataTest(source4, getter);
2964eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
2965eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2966eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
296733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgTEST(Regression144230) {
2968f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  i::FLAG_stress_compaction = false;
2969e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
2970c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
297109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Heap* heap = isolate->heap();
29722bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
297333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
297433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // First make sure that the uninitialized CallIC stub is on a single page
297533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // that will later be selected as an evacuation candidate.
297633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  {
29772bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    HandleScope inner_scope(isolate);
297833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    AlwaysAllocateScope always_allocate;
297909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    SimulateFullSpace(heap->code_space());
2980c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    isolate->stub_cache()->ComputeCallInitialize(9, RelocInfo::CODE_TARGET);
298133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
298233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
298333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // Second compile a CallIC and execute it once so that it gets patched to
298433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // the pre-monomorphic stub. These code objects are on yet another page.
298533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  {
29862bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    HandleScope inner_scope(isolate);
298733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    AlwaysAllocateScope always_allocate;
298809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    SimulateFullSpace(heap->code_space());
298933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    CompileRun("var o = { f:function(a,b,c,d,e,f,g,h,i) {}};"
299033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org               "function call() { o.f(1,2,3,4,5,6,7,8,9); };"
299133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org               "call();");
299233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
299333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
299433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // Third we fill up the last page of the code space so that it does not get
299533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // chosen as an evacuation candidate.
299633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  {
29972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    HandleScope inner_scope(isolate);
299833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    AlwaysAllocateScope always_allocate;
299933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    CompileRun("for (var i = 0; i < 2000; i++) {"
300033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org               "  eval('function f' + i + '() { return ' + i +'; };' +"
300133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org               "       'f' + i + '();');"
300233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org               "}");
300333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
300409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
300533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
300633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // Fourth is the tricky part. Make sure the code containing the CallIC is
300733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // visited first without clearing the IC. The shared function info is then
300833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // visited later, causing the CallIC to be cleared.
30094a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<String> name = isolate->factory()->InternalizeUtf8String("call");
3010c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Handle<GlobalObject> global(isolate->context()->global_object());
301133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  MaybeObject* maybe_call = global->GetProperty(*name);
301233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  JSFunction* call = JSFunction::cast(maybe_call->ToObjectChecked());
301333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  USE(global->SetProperty(*name, Smi::FromInt(0), NONE, kNonStrictMode));
3014c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  isolate->compilation_cache()->Clear();
301509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  call->shared()->set_ic_age(heap->global_ic_age() + 1);
301609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> call_code(call->code(), isolate);
301709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> call_function(call, isolate);
301833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
301933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // Now we are ready to mess up the heap.
302009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  heap->CollectAllGarbage(Heap::kReduceMemoryFootprintMask);
302133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
302233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // Either heap verification caught the problem already or we go kaboom once
302333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // the CallIC is executed the next time.
302433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  USE(global->SetProperty(*name, *call_function, NONE, kNonStrictMode));
302533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  CompileRun("call();");
302633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
302732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
302832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
302932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgTEST(Regress159140) {
303032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  i::FLAG_allow_natives_syntax = true;
303132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  i::FLAG_flush_code_incrementally = true;
3032e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3033c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
3034c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
30352bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
303632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
303732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Perform one initial GC to enable code flushing.
3038c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
303932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
304032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Prepare several closures that are all eligible for code flushing
304132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // because all reachable ones are not optimized. Make sure that the
304232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // optimized code object is directly reachable through a handle so
304332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // that it is marked black during incremental marking.
304432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  Handle<Code> code;
304532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  {
3046c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
304732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CompileRun("function h(x) {}"
304832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "function mkClosure() {"
304932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "  return function(x) { return x + 1; };"
305032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "}"
305132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "var f = mkClosure();"
305232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "var g = mkClosure();"
305332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "f(1); f(2);"
305432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "g(1); g(2);"
305532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "h(1); h(2);"
305632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "%OptimizeFunctionOnNextCall(f); f(3);"
305732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org               "%OptimizeFunctionOnNextCall(h); h(3);");
305832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
305932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    Handle<JSFunction> f =
306032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        v8::Utils::OpenHandle(
306132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org            *v8::Handle<v8::Function>::Cast(
306232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
306332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CHECK(f->is_compiled());
306432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CompileRun("f = null;");
306532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
306632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    Handle<JSFunction> g =
306732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        v8::Utils::OpenHandle(
306832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org            *v8::Handle<v8::Function>::Cast(
306932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("g"))));
307032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    CHECK(g->is_compiled());
307132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    const int kAgingThreshold = 6;
307232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
307332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      g->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
307432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    }
307532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
307632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    code = inner_scope.CloseAndEscape(Handle<Code>(f->code()));
307732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  }
307832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
307932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Simulate incremental marking so that the functions are enqueued as
308032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // code flushing candidates. Then optimize one function. Finally
308132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // finish the GC to complete code flushing.
308232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  SimulateIncrementalMarking();
308332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  CompileRun("%OptimizeFunctionOnNextCall(g); g(3);");
3084c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
308532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
308632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  // Unoptimized code is missing and the deoptimizer will go ballistic.
308732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  CompileRun("g('bozo');");
308832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
3089a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3090a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3091a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgTEST(Regress165495) {
3092a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
3093a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  i::FLAG_flush_code_incrementally = true;
3094e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3095c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
3096c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
30972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3098a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3099a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Perform one initial GC to enable code flushing.
3100c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
3101a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3102a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Prepare an optimized closure that the optimized code map will get
3103a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // populated. Then age the unoptimized code to trigger code flushing
3104a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // but make sure the optimized code is unreachable.
3105a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  {
3106c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
3107a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CompileRun("function mkClosure() {"
3108a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "  return function(x) { return x + 1; };"
3109a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "}"
3110a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "var f = mkClosure();"
3111a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "f(1); f(2);"
3112a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org               "%OptimizeFunctionOnNextCall(f); f(3);");
3113a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3114a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    Handle<JSFunction> f =
3115a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        v8::Utils::OpenHandle(
3116a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org            *v8::Handle<v8::Function>::Cast(
3117a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
3118a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CHECK(f->is_compiled());
3119a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    const int kAgingThreshold = 6;
3120a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
3121a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
3122a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    }
3123a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3124a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CompileRun("f = null;");
3125a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
3126a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3127a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Simulate incremental marking so that unoptimized code is flushed
3128a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // even though it still is cached in the optimized code map.
3129a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  SimulateIncrementalMarking();
3130c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3131a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3132a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Make a new closure that will get code installed from the code map.
3133a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Unoptimized code is missing and the deoptimizer will go ballistic.
3134a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  CompileRun("var g = mkClosure(); g('bozo');");
3135a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}
31369768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31379768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31389768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.orgTEST(Regress169209) {
31392f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org  i::FLAG_stress_compaction = false;
31409768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
31419768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  i::FLAG_flush_code_incrementally = true;
3142906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
3143906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  // Experimental natives are compiled during snapshot deserialization.
3144906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  // This test breaks because heap layout changes in a way that closure
3145906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  // is visited before shared function info.
3146906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  i::FLAG_harmony_typed_arrays = false;
3147906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  i::FLAG_harmony_array_buffer = false;
3148906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
3149bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  // Disable loading the i18n extension which breaks the assumptions of this
3150bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  // test about the heap layout.
3151bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  i::FLAG_enable_i18n = false;
3152bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org
3153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3154c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
3155c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
31562bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
31579768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31589768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Perform one initial GC to enable code flushing.
3159c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
31609768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31619768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Prepare a shared function info eligible for code flushing for which
31629768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // the unoptimized code will be replaced during optimization.
31639768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  Handle<SharedFunctionInfo> shared1;
31649768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  {
3165c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
31669768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CompileRun("function f() { return 'foobar'; }"
31679768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "function g(x) { if (x) f(); }"
31689768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "f();"
31699768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "g(false);"
31709768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "g(false);");
31719768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31729768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    Handle<JSFunction> f =
31739768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org        v8::Utils::OpenHandle(
31749768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org            *v8::Handle<v8::Function>::Cast(
31759768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
31769768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CHECK(f->is_compiled());
31779768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    const int kAgingThreshold = 6;
31789768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
31799768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
31809768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    }
31819768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
3182c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    shared1 = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
31839768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  }
31849768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31859768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Prepare a shared function info eligible for code flushing that will
31869768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // represent the dangling tail of the candidate list.
31879768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  Handle<SharedFunctionInfo> shared2;
31889768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  {
3189c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
31909768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CompileRun("function flushMe() { return 0; }"
31919768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org               "flushMe(1);");
31929768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
31939768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    Handle<JSFunction> f =
31949768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org        v8::Utils::OpenHandle(
31959768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org            *v8::Handle<v8::Function>::Cast(
31969768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("flushMe"))));
31979768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CHECK(f->is_compiled());
31989768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    const int kAgingThreshold = 6;
31999768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
32009768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
32019768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    }
32029768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
3203c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    shared2 = inner_scope.CloseAndEscape(handle(f->shared(), isolate));
32049768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  }
32059768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
32069768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Simulate incremental marking and collect code flushing candidates.
32079768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  SimulateIncrementalMarking();
32089768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  CHECK(shared1->code()->gc_metadata() != NULL);
32099768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
32109768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Optimize function and make sure the unoptimized code is replaced.
32119768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org#ifdef DEBUG
32129768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  FLAG_stop_at = "f";
32139768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org#endif
32149768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  CompileRun("%OptimizeFunctionOnNextCall(g);"
32159768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org             "g(false);");
32169768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
32179768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // Finish garbage collection cycle.
3218c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
32199768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  CHECK(shared1->code()->gc_metadata() == NULL);
32209768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org}
322128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
322228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
322328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org// Helper function that simulates a fill new-space in the heap.
322428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.orgstatic inline void AllocateAllButNBytes(v8::internal::NewSpace* space,
322528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                                        int extra_bytes) {
322628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  int space_remaining = static_cast<int>(
322728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org      *space->allocation_limit_address() - *space->allocation_top_address());
322828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK(space_remaining >= extra_bytes);
322928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  int new_linear_size = space_remaining - extra_bytes;
323028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size);
323128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe);
323228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  node->set_size(space->heap(), new_linear_size);
323328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org}
323428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
323528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
323628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.orgTEST(Regress169928) {
323728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  i::FLAG_allow_natives_syntax = true;
323828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  i::FLAG_crankshaft = false;
3239e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3240d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
3241d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
3242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  v8::HandleScope scope(CcTest::isolate());
324328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
324428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Some flags turn Scavenge collections into Mark-sweep collections
324528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // and hence are incompatible with this test case.
324628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  if (FLAG_gc_global || FLAG_stress_compaction) return;
324728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
324828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Prepare the environment
324928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CompileRun("function fastliteralcase(literal, value) {"
325028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    literal[0] = value;"
325128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    return literal;"
325228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "}"
325328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "function get_standard_literal() {"
325428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    var literal = [1, 2, 3];"
325528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "    return literal;"
325628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "}"
325728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "obj = fastliteralcase(get_standard_literal(), 1);"
325828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "obj = fastliteralcase(get_standard_literal(), 1.5);"
325928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org             "obj = fastliteralcase(get_standard_literal(), 2);");
326028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
326128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // prepare the heap
326228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Local<v8::String> mote_code_string =
326328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org      v8_str("fastliteralcase(mote, 2.5);");
326428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
326528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Local<v8::String> array_name = v8_str("mote");
326628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Context::GetCurrent()->Global()->Set(array_name, v8::Int32::New(0));
326728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
326828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // First make sure we flip spaces
326928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  HEAP->CollectGarbage(NEW_SPACE);
327028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
327128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Allocate the object.
3272d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<FixedArray> array_data = factory->NewFixedArray(2, NOT_TENURED);
327328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  array_data->set(0, Smi::FromInt(1));
327428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  array_data->set(1, Smi::FromInt(2));
327528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
327628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  AllocateAllButNBytes(HEAP->new_space(),
3277ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                       JSArray::kSize + AllocationMemento::kSize +
327828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                       kPointerSize);
327928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
3280d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<JSArray> array = factory->NewJSArrayWithElements(array_data,
328128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                                                          FAST_SMI_ELEMENTS,
328228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org                                                          NOT_TENURED);
328328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
328428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK_EQ(Smi::FromInt(2), array->length());
328528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK(array->HasFastSmiOrObjectElements());
328628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
3287ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  // We need filler the size of AllocationMemento object, plus an extra
328828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // fill pointer value.
328928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  MaybeObject* maybe_object = HEAP->AllocateRaw(
3290ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      AllocationMemento::kSize + kPointerSize, NEW_SPACE, OLD_POINTER_SPACE);
329128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  Object* obj = NULL;
329228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  CHECK(maybe_object->ToObject(&obj));
329328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  Address addr_obj = reinterpret_cast<Address>(
329428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org      reinterpret_cast<byte*>(obj - kHeapObjectTag));
329528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  HEAP->CreateFillerObjectAt(addr_obj,
3296ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                             AllocationMemento::kSize + kPointerSize);
329728381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
329828381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // Give the array a name, making sure not to allocate strings.
329928381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array);
330028381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Context::GetCurrent()->Global()->Set(array_name, array_obj);
330128381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org
330228381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // This should crash with a protection violation if we are running a build
330328381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  // with the bug.
330428381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  AlwaysAllocateScope aa_scope;
330528381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org  v8::Script::Compile(mote_code_string)->Run();
330628381b491d5ea9f256a3937000de7953639ef93fyangguo@chromium.org}
3307c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3308c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3309c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.orgTEST(Regress168801) {
3310c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_always_compact = true;
3311c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_cache_optimized_code = false;
3312c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_allow_natives_syntax = true;
3313c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  i::FLAG_flush_code_incrementally = true;
3314e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3315c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
3316c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
33172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
3318c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3319c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Perform one initial GC to enable code flushing.
3320c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
3321c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3322c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Ensure the code ends up on an evacuation candidate.
3323c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  SimulateFullSpace(heap->code_space());
3324c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3325c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Prepare an unoptimized function that is eligible for code flushing.
3326c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  Handle<JSFunction> function;
3327c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  {
3328c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
3329c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    CompileRun("function mkClosure() {"
3330c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "  return function(x) { return x + 1; };"
3331c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "}"
3332c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "var f = mkClosure();"
3333c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org               "f(1); f(2);");
3334c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3335c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    Handle<JSFunction> f =
3336c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org        v8::Utils::OpenHandle(
3337c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org            *v8::Handle<v8::Function>::Cast(
3338c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
3339c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    CHECK(f->is_compiled());
3340c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    const int kAgingThreshold = 6;
3341c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
3342c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
3343c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    }
3344c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3345c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    function = inner_scope.CloseAndEscape(handle(*f, isolate));
3346c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  }
3347c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3348c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Simulate incremental marking so that unoptimized function is enqueued as a
3349c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // candidate for code flushing. The shared function info however will not be
3350c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // explicitly enqueued.
3351c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  SimulateIncrementalMarking();
3352c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3353c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // Now optimize the function so that it is taken off the candidate list.
3354c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  {
3355c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
3356c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org    CompileRun("%OptimizeFunctionOnNextCall(f); f(3);");
3357c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  }
3358c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org
3359c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org  // This cycle will bust the heap and subsequent cycles will go ballistic.
3360c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3361c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3362c47dff5fc3b12ecc3a7a9fc61fbd02868548dde6mvstanton@chromium.org}
33637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
33647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
33657c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgTEST(Regress173458) {
33667c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_always_compact = true;
33677c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_cache_optimized_code = false;
33687c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_allow_natives_syntax = true;
33697c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  i::FLAG_flush_code_incrementally = true;
3370e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3371c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Isolate* isolate = Isolate::Current();
3372c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  Heap* heap = isolate->heap();
33732bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  HandleScope scope(isolate);
33747c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
33757c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Perform one initial GC to enable code flushing.
3376c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
33777c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
33787c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Ensure the code ends up on an evacuation candidate.
3379c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  SimulateFullSpace(heap->code_space());
33807c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
33817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Prepare an unoptimized function that is eligible for code flushing.
33827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  Handle<JSFunction> function;
33837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  {
3384c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope inner_scope(isolate);
33857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    CompileRun("function mkClosure() {"
33867c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "  return function(x) { return x + 1; };"
33877c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "}"
33887c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "var f = mkClosure();"
33897c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org               "f(1); f(2);");
33907c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
33917c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    Handle<JSFunction> f =
33927c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org        v8::Utils::OpenHandle(
33937c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org            *v8::Handle<v8::Function>::Cast(
33947c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org                v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
33957c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    CHECK(f->is_compiled());
33967c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    const int kAgingThreshold = 6;
33977c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    for (int i = 0; i < kAgingThreshold; i++) {
33987c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org      f->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
33997c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    }
34007c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
3401c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    function = inner_scope.CloseAndEscape(handle(*f, isolate));
34027c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  }
34037c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
34047c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Simulate incremental marking so that unoptimized function is enqueued as a
34057c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // candidate for code flushing. The shared function info however will not be
34067c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // explicitly enqueued.
34077c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  SimulateIncrementalMarking();
34087c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
3409c99cd48a7a41dae45e3b166f9d71a3dd1f76fa27danno@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
34107c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Now enable the debugger which in turn will disable code flushing.
3411c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  CHECK(isolate->debug()->Load());
3412c99cd48a7a41dae45e3b166f9d71a3dd1f76fa27danno@chromium.org#endif  // ENABLE_DEBUGGER_SUPPORT
34137c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
34147c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // This cycle will bust the heap and subsequent cycles will go ballistic.
3415c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
3416c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  heap->CollectAllGarbage(Heap::kNoGCFlags);
34177c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
3418876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3419876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3420876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgclass DummyVisitor : public ObjectVisitor {
3421876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org public:
3422876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  void VisitPointers(Object** start, Object** end) { }
3423876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org};
3424876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3425876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3426876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgTEST(DeferredHandles) {
3427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  CcTest::InitializeVM();
3428876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  Isolate* isolate = Isolate::Current();
3429876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  Heap* heap = isolate->heap();
3430876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  v8::HandleScope scope;
3431876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  v8::ImplementationUtilities::HandleScopeData* data =
3432876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      isolate->handle_scope_data();
3433876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  Handle<Object> init(heap->empty_string(), isolate);
3434876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  while (data->next < data->limit) {
3435876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    Handle<Object> obj(heap->empty_string(), isolate);
3436876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
3437876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  // An entire block of handles has been filled.
3438876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  // Next handle would require a new block.
3439876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  ASSERT(data->next == data->limit);
3440876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
3441876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  DeferredHandleScope deferred(isolate);
3442876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  DummyVisitor visitor;
3443876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  isolate->handle_scope_implementer()->Iterate(&visitor);
3444876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  deferred.Detach();
3445876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
3446b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
3447b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
3448b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.orgTEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) {
3449b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  CcTest::InitializeVM();
3450b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  v8::HandleScope scope(CcTest::isolate());
3451b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  CompileRun("function f(n) {"
3452b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "    var a = new Array(n);"
3453b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "    for (var i = 0; i < n; i += 100) a[i] = i;"
3454b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "};"
3455b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org             "f(10 * 1024 * 1024);");
3456b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  IncrementalMarking* marking = HEAP->incremental_marking();
3457b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (marking->IsStopped()) marking->Start();
3458b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  // This big step should be sufficient to mark the whole array.
3459b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD);
3460b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  ASSERT(marking->IsComplete());
3461b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org}
3462