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.
5 #ifndef V8_ALLOCATION_SITE_SCOPES_H_
6 #define V8_ALLOCATION_SITE_SCOPES_H_
9 #include "src/handles.h"
10 #include "src/objects.h"
17 // AllocationSiteContext is the base class for walking and copying a nested
18 // boilerplate with AllocationSite and AllocationMemento support.
19 class AllocationSiteContext {
21 explicit AllocationSiteContext(Isolate* isolate) {
25 Handle<AllocationSite> top() { return top_; }
26 Handle<AllocationSite> current() { return current_; }
28 bool ShouldCreateMemento(Handle<JSObject> object) { return false; }
30 Isolate* isolate() { return isolate_; }
33 void update_current_site(AllocationSite* site) {
34 *(current_.location()) = site;
37 void InitializeTraversal(Handle<AllocationSite> site) {
39 current_ = Handle<AllocationSite>(*top_, isolate());
44 Handle<AllocationSite> top_;
45 Handle<AllocationSite> current_;
49 // AllocationSiteCreationContext aids in the creation of AllocationSites to
50 // accompany object literals.
51 class AllocationSiteCreationContext : public AllocationSiteContext {
53 explicit AllocationSiteCreationContext(Isolate* isolate)
54 : AllocationSiteContext(isolate) { }
56 Handle<AllocationSite> EnterNewScope();
57 void ExitScope(Handle<AllocationSite> site, Handle<JSObject> object);
61 // AllocationSiteUsageContext aids in the creation of AllocationMementos placed
62 // behind some/all components of a copied object literal.
63 class AllocationSiteUsageContext : public AllocationSiteContext {
65 AllocationSiteUsageContext(Isolate* isolate, Handle<AllocationSite> site,
67 : AllocationSiteContext(isolate),
69 activated_(activated) { }
71 inline Handle<AllocationSite> EnterNewScope() {
72 if (top().is_null()) {
73 InitializeTraversal(top_site_);
75 // Advance current site
76 Object* nested_site = current()->nested_site();
77 // Something is wrong if we advance to the end of the list here.
78 update_current_site(AllocationSite::cast(nested_site));
80 return Handle<AllocationSite>(*current(), isolate());
83 inline void ExitScope(Handle<AllocationSite> scope_site,
84 Handle<JSObject> object) {
85 // This assert ensures that we are pointing at the right sub-object in a
86 // recursive walk of a nested literal.
87 DCHECK(object.is_null() || *object == scope_site->transition_info());
90 bool ShouldCreateMemento(Handle<JSObject> object);
93 Handle<AllocationSite> top_site_;
98 } // namespace internal
101 #endif // V8_ALLOCATION_SITE_SCOPES_H_