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