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