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