Home | History | Annotate | Download | only in src
      1 // Copyright 2015 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_DEPENDENCIES_H_
      6 #define V8_DEPENDENCIES_H_
      7 
      8 #include "src/handles.h"
      9 #include "src/objects.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 // Collects dependencies for this compilation, e.g. assumptions about
     15 // stable maps, constant globals, etc.
     16 class CompilationDependencies {
     17  public:
     18   CompilationDependencies(Isolate* isolate, Zone* zone)
     19       : isolate_(isolate),
     20         zone_(zone),
     21         object_wrapper_(Handle<Foreign>::null()),
     22         aborted_(false) {
     23     std::fill_n(groups_, DependentCode::kGroupCount, nullptr);
     24   }
     25 
     26   void Insert(DependentCode::DependencyGroup group, Handle<HeapObject> handle);
     27 
     28   void AssumeInitialMapCantChange(Handle<Map> map) {
     29     Insert(DependentCode::kInitialMapChangedGroup, map);
     30   }
     31   void AssumeFieldOwner(Handle<Map> map) {
     32     Insert(DependentCode::kFieldOwnerGroup, map);
     33   }
     34   void AssumeMapStable(Handle<Map> map);
     35   void AssumePrototypeMapsStable(
     36       Handle<Map> map,
     37       MaybeHandle<JSReceiver> prototype = MaybeHandle<JSReceiver>());
     38   void AssumeMapNotDeprecated(Handle<Map> map);
     39   void AssumePropertyCell(Handle<PropertyCell> cell) {
     40     Insert(DependentCode::kPropertyCellChangedGroup, cell);
     41   }
     42   void AssumeTenuringDecision(Handle<AllocationSite> site) {
     43     Insert(DependentCode::kAllocationSiteTenuringChangedGroup, site);
     44   }
     45   void AssumeTransitionStable(Handle<AllocationSite> site);
     46 
     47   void Commit(Handle<Code> code);
     48   void Rollback();
     49   void Abort() { aborted_ = true; }
     50   bool HasAborted() const { return aborted_; }
     51 
     52   bool IsEmpty() const {
     53     for (int i = 0; i < DependentCode::kGroupCount; i++) {
     54       if (groups_[i]) return false;
     55     }
     56     return true;
     57   }
     58 
     59  private:
     60   Isolate* isolate_;
     61   Zone* zone_;
     62   Handle<Foreign> object_wrapper_;
     63   bool aborted_;
     64   ZoneList<Handle<HeapObject> >* groups_[DependentCode::kGroupCount];
     65 
     66   DependentCode* Get(Handle<Object> object);
     67   void Set(Handle<Object> object, Handle<DependentCode> dep);
     68 };
     69 }  // namespace internal
     70 }  // namespace v8
     71 
     72 #endif  // V8_DEPENDENCIES_H_
     73