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 #include "src/factory.h"
7 #include "src/isolate.h"
8 #include "src/objects-inl.h"
9
10 namespace v8 {
11 namespace internal {
12
13
EnterNewScope()14 Handle<AllocationSite> AllocationSiteCreationContext::EnterNewScope() {
15 Handle<AllocationSite> scope_site;
16 if (top().is_null()) {
17 // We are creating the top level AllocationSite as opposed to a nested
18 // AllocationSite.
19 InitializeTraversal(isolate()->factory()->NewAllocationSite());
20 scope_site = Handle<AllocationSite>(*top(), isolate());
21 if (FLAG_trace_creation_allocation_sites) {
22 PrintF("*** Creating top level AllocationSite %p\n",
23 static_cast<void*>(*scope_site));
24 }
25 } else {
26 DCHECK(!current().is_null());
27 scope_site = isolate()->factory()->NewAllocationSite();
28 if (FLAG_trace_creation_allocation_sites) {
29 PrintF("Creating nested site (top, current, new) (%p, %p, %p)\n",
30 static_cast<void*>(*top()),
31 static_cast<void*>(*current()),
32 static_cast<void*>(*scope_site));
33 }
34 current()->set_nested_site(*scope_site);
35 update_current_site(*scope_site);
36 }
37 DCHECK(!scope_site.is_null());
38 return scope_site;
39 }
40
41
ExitScope(Handle<AllocationSite> scope_site,Handle<JSObject> object)42 void AllocationSiteCreationContext::ExitScope(
43 Handle<AllocationSite> scope_site,
44 Handle<JSObject> object) {
45 if (!object.is_null()) {
46 bool top_level = !scope_site.is_null() &&
47 top().is_identical_to(scope_site);
48
49 scope_site->set_transition_info(*object);
50 if (FLAG_trace_creation_allocation_sites) {
51 if (top_level) {
52 PrintF("*** Setting AllocationSite %p transition_info %p\n",
53 static_cast<void*>(*scope_site),
54 static_cast<void*>(*object));
55 } else {
56 PrintF("Setting AllocationSite (%p, %p) transition_info %p\n",
57 static_cast<void*>(*top()),
58 static_cast<void*>(*scope_site),
59 static_cast<void*>(*object));
60 }
61 }
62 }
63 }
64
65
ShouldCreateMemento(Handle<JSObject> object)66 bool AllocationSiteUsageContext::ShouldCreateMemento(Handle<JSObject> object) {
67 if (activated_ && AllocationSite::CanTrack(object->map()->instance_type())) {
68 if (FLAG_allocation_site_pretenuring ||
69 AllocationSite::GetMode(object->GetElementsKind()) ==
70 TRACK_ALLOCATION_SITE) {
71 if (FLAG_trace_creation_allocation_sites) {
72 PrintF("*** Creating Memento for %s %p\n",
73 object->IsJSArray() ? "JSArray" : "JSObject",
74 static_cast<void*>(*object));
75 }
76 return true;
77 }
78 }
79 return false;
80 }
81
82 } // namespace internal
83 } // namespace v8
84