1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_DEPENDENCIES_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_DEPENDENCIES_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/handles.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/objects.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Collects dependencies for this compilation, e.g. assumptions about
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// stable maps, constant globals, etc.
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CompilationDependencies {
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CompilationDependencies(Isolate* isolate, Zone* zone)
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : isolate_(isolate),
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        zone_(zone),
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        object_wrapper_(Handle<Foreign>::null()),
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        aborted_(false) {
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    std::fill_n(groups_, DependentCode::kGroupCount, nullptr);
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Insert(DependentCode::DependencyGroup group, Handle<HeapObject> handle);
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumeInitialMapCantChange(Handle<Map> map) {
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Insert(DependentCode::kInitialMapChangedGroup, map);
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
31c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void AssumeFieldOwner(Handle<Map> map) {
32c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    Insert(DependentCode::kFieldOwnerGroup, map);
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumeMapStable(Handle<Map> map);
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumePrototypeMapsStable(
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Map> map,
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      MaybeHandle<JSReceiver> prototype = MaybeHandle<JSReceiver>());
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumeMapNotDeprecated(Handle<Map> map);
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumePropertyCell(Handle<PropertyCell> cell) {
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Insert(DependentCode::kPropertyCellChangedGroup, cell);
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumeTenuringDecision(Handle<AllocationSite> site) {
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Insert(DependentCode::kAllocationSiteTenuringChangedGroup, site);
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AssumeTransitionStable(Handle<AllocationSite> site);
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Commit(Handle<Code> code);
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Rollback();
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Abort() { aborted_ = true; }
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasAborted() const { return aborted_; }
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsEmpty() const {
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < DependentCode::kGroupCount; i++) {
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (groups_[i]) return false;
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return true;
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate_;
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* zone_;
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Foreign> object_wrapper_;
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool aborted_;
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ZoneList<Handle<HeapObject> >* groups_[DependentCode::kGroupCount];
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DependentCode* Get(Handle<Object> object);
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Set(Handle<Object> object, Handle<DependentCode> dep);
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_DEPENDENCIES_H_
73