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#ifndef V8_ALLOCATION_SITE_SCOPES_H_
6#define V8_ALLOCATION_SITE_SCOPES_H_
7
8#include "src/handles.h"
9#include "src/objects.h"
10#include "src/objects/allocation-site.h"
11#include "src/objects/map.h"
12
13namespace v8 {
14namespace internal {
15
16// AllocationSiteContext is the base class for walking and copying a nested
17// boilerplate with AllocationSite and AllocationMemento support.
18class AllocationSiteContext {
19 public:
20 explicit AllocationSiteContext(Isolate* isolate) {
21 isolate_ = isolate;
22 }
23
24 Handle<AllocationSite> top() { return top_; }
25 Handle<AllocationSite> current() { return current_; }
26
27 bool ShouldCreateMemento(Handle<JSObject> object) { return false; }
28
29 Isolate* isolate() { return isolate_; }
30
31 protected:
32 void update_current_site(AllocationSite site) {
33 *(current_.location()) = site->ptr();
34 }
35
36 inline void InitializeTraversal(Handle<AllocationSite> site);
37
38 private:
39 Isolate* isolate_;
40 Handle<AllocationSite> top_;
41 Handle<AllocationSite> current_;
42};
43
44
45// AllocationSiteUsageContext aids in the creation of AllocationMementos placed
46// behind some/all components of a copied object literal.
47class AllocationSiteUsageContext : public AllocationSiteContext {
48 public:
49 AllocationSiteUsageContext(Isolate* isolate, Handle<AllocationSite> site,
50 bool activated)
51 : AllocationSiteContext(isolate),
52 top_site_(site),
53 activated_(activated) { }
54
55 inline Handle<AllocationSite> EnterNewScope();
56
57 inline void ExitScope(Handle<AllocationSite> scope_site,
58 Handle<JSObject> object);
59
60 inline bool ShouldCreateMemento(Handle<JSObject> object);
61
62 static const bool kCopying = true;
63
64 private:
65 Handle<AllocationSite> top_site_;
66 bool activated_;
67};
68
69
70} // namespace internal
71} // namespace v8
72
73#endif // V8_ALLOCATION_SITE_SCOPES_H_
74