Line data Source code
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 :
14 1225888 : Handle<AllocationSite> AllocationSiteCreationContext::EnterNewScope() {
15 : Handle<AllocationSite> scope_site;
16 2451777 : if (top().is_null()) {
17 : // We are creating the top level AllocationSite as opposed to a nested
18 : // AllocationSite.
19 920834 : 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 305054 : 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 305054 : current()->set_nested_site(*scope_site);
35 : update_current_site(*scope_site);
36 : }
37 : DCHECK(!scope_site.is_null());
38 1225889 : return scope_site;
39 : }
40 :
41 :
42 1225758 : void AllocationSiteCreationContext::ExitScope(
43 : Handle<AllocationSite> scope_site,
44 : Handle<JSObject> object) {
45 1225758 : if (!object.is_null()) {
46 : bool top_level = !scope_site.is_null() &&
47 : top().is_identical_to(scope_site);
48 :
49 1225758 : 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 1225758 : }
64 :
65 :
66 8940785 : bool AllocationSiteUsageContext::ShouldCreateMemento(Handle<JSObject> object) {
67 16063968 : if (activated_ && AllocationSite::CanTrack(object->map()->instance_type())) {
68 7123183 : 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
|