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