1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ALLOCATION_SITE_SCOPES_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ALLOCATION_SITE_SCOPES_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ast.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/objects.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// AllocationSiteContext is the base class for walking and copying a nested 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// boilerplate with AllocationSite and AllocationMemento support. 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteContext { 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AllocationSiteContext(Isolate* isolate) { 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_ = isolate; 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> top() { return top_; } 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> current() { return current_; } 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ShouldCreateMemento(Handle<JSObject> object) { return false; } 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate() { return isolate_; } 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void update_current_site(AllocationSite* site) { 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *(current_.location()) = site; 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InitializeTraversal(Handle<AllocationSite> site) { 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch top_ = site; 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch current_ = Handle<AllocationSite>(*top_, isolate()); 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> top_; 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> current_; 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// AllocationSiteCreationContext aids in the creation of AllocationSites to 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// accompany object literals. 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteCreationContext : public AllocationSiteContext { 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AllocationSiteCreationContext(Isolate* isolate) 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AllocationSiteContext(isolate) { } 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> EnterNewScope(); 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ExitScope(Handle<AllocationSite> site, Handle<JSObject> object); 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// AllocationSiteUsageContext aids in the creation of AllocationMementos placed 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// behind some/all components of a copied object literal. 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteUsageContext : public AllocationSiteContext { 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteUsageContext(Isolate* isolate, Handle<AllocationSite> site, 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool activated) 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : AllocationSiteContext(isolate), 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch top_site_(site), 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch activated_(activated) { } 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Handle<AllocationSite> EnterNewScope() { 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (top().is_null()) { 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InitializeTraversal(top_site_); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Advance current site 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* nested_site = current()->nested_site(); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Something is wrong if we advance to the end of the list here. 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(nested_site->IsAllocationSite()); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch update_current_site(AllocationSite::cast(nested_site)); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<AllocationSite>(*current(), isolate()); 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void ExitScope(Handle<AllocationSite> scope_site, 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object) { 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This assert ensures that we are pointing at the right sub-object in a 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // recursive walk of a nested literal. 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(object.is_null() || *object == scope_site->transition_info()); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ShouldCreateMemento(Handle<JSObject> object); 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> top_site_; 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool activated_; 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} } // namespace v8::internal 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_ALLOCATION_SITE_SCOPES_H_ 102