1// Copyright 2013 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "src/allocation-site-scopes.h" 6 7namespace v8 { 8namespace internal { 9 10 11Handle<AllocationSite> AllocationSiteCreationContext::EnterNewScope() { 12 Handle<AllocationSite> scope_site; 13 if (top().is_null()) { 14 // We are creating the top level AllocationSite as opposed to a nested 15 // AllocationSite. 16 InitializeTraversal(isolate()->factory()->NewAllocationSite()); 17 scope_site = Handle<AllocationSite>(*top(), isolate()); 18 if (FLAG_trace_creation_allocation_sites) { 19 PrintF("*** Creating top level AllocationSite %p\n", 20 static_cast<void*>(*scope_site)); 21 } 22 } else { 23 ASSERT(!current().is_null()); 24 scope_site = isolate()->factory()->NewAllocationSite(); 25 if (FLAG_trace_creation_allocation_sites) { 26 PrintF("Creating nested site (top, current, new) (%p, %p, %p)\n", 27 static_cast<void*>(*top()), 28 static_cast<void*>(*current()), 29 static_cast<void*>(*scope_site)); 30 } 31 current()->set_nested_site(*scope_site); 32 update_current_site(*scope_site); 33 } 34 ASSERT(!scope_site.is_null()); 35 return scope_site; 36} 37 38 39void AllocationSiteCreationContext::ExitScope( 40 Handle<AllocationSite> scope_site, 41 Handle<JSObject> object) { 42 if (!object.is_null()) { 43 bool top_level = !scope_site.is_null() && 44 top().is_identical_to(scope_site); 45 46 scope_site->set_transition_info(*object); 47 if (FLAG_trace_creation_allocation_sites) { 48 if (top_level) { 49 PrintF("*** Setting AllocationSite %p transition_info %p\n", 50 static_cast<void*>(*scope_site), 51 static_cast<void*>(*object)); 52 } else { 53 PrintF("Setting AllocationSite (%p, %p) transition_info %p\n", 54 static_cast<void*>(*top()), 55 static_cast<void*>(*scope_site), 56 static_cast<void*>(*object)); 57 } 58 } 59 } 60} 61 62 63bool AllocationSiteUsageContext::ShouldCreateMemento(Handle<JSObject> object) { 64 if (activated_ && AllocationSite::CanTrack(object->map()->instance_type())) { 65 if (FLAG_allocation_site_pretenuring || 66 AllocationSite::GetMode(object->GetElementsKind()) == 67 TRACK_ALLOCATION_SITE) { 68 if (FLAG_trace_creation_allocation_sites) { 69 PrintF("*** Creating Memento for %s %p\n", 70 object->IsJSArray() ? "JSArray" : "JSObject", 71 static_cast<void*>(*object)); 72 } 73 return true; 74 } 75 } 76 return false; 77} 78 79} } // namespace v8::internal 80