LCOV - code coverage report
Current view: top level - src - allocation-site-scopes.h (source / functions) Hit Total Coverage
Test: app.info Lines: 14 14 100.0 %
Date: 2017-04-26 Functions: 4 4 100.0 %

          Line data    Source code
       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             : 
      11             : namespace v8 {
      12             : namespace internal {
      13             : 
      14             : 
      15             : // AllocationSiteContext is the base class for walking and copying a nested
      16             : // boilerplate with AllocationSite and AllocationMemento support.
      17             : class AllocationSiteContext {
      18             :  public:
      19             :   explicit AllocationSiteContext(Isolate* isolate) {
      20     8280525 :     isolate_ = isolate;
      21             :   }
      22             : 
      23             :   Handle<AllocationSite> top() { return top_; }
      24             :   Handle<AllocationSite> current() { return current_; }
      25             : 
      26             :   bool ShouldCreateMemento(Handle<JSObject> object) { return false; }
      27             : 
      28             :   Isolate* isolate() { return isolate_; }
      29             : 
      30             :  protected:
      31             :   void update_current_site(AllocationSite* site) {
      32     1901499 :     *(current_.location()) = site;
      33             :   }
      34             : 
      35    16561048 :   void InitializeTraversal(Handle<AllocationSite> site) {
      36     8280524 :     top_ = site;
      37     8280524 :     current_ = Handle<AllocationSite>::New(*top_, isolate());
      38     8280524 :   }
      39             : 
      40             :  private:
      41             :   Isolate* isolate_;
      42             :   Handle<AllocationSite> top_;
      43             :   Handle<AllocationSite> current_;
      44             : };
      45             : 
      46             : 
      47             : // AllocationSiteCreationContext aids in the creation of AllocationSites to
      48             : // accompany object literals.
      49             : class AllocationSiteCreationContext : public AllocationSiteContext {
      50             :  public:
      51      605250 :   explicit AllocationSiteCreationContext(Isolate* isolate)
      52      605250 :       : AllocationSiteContext(isolate) { }
      53             : 
      54             :   Handle<AllocationSite> EnterNewScope();
      55             :   void ExitScope(Handle<AllocationSite> site, Handle<JSObject> object);
      56             : };
      57             : 
      58             : 
      59             : // AllocationSiteUsageContext aids in the creation of AllocationMementos placed
      60             : // behind some/all components of a copied object literal.
      61             : class AllocationSiteUsageContext : public AllocationSiteContext {
      62             :  public:
      63     5419819 :   AllocationSiteUsageContext(Isolate* isolate, Handle<AllocationSite> site,
      64             :                              bool activated)
      65             :       : AllocationSiteContext(isolate),
      66             :         top_site_(site),
      67     7359690 :         activated_(activated) { }
      68             : 
      69     8956134 :   inline Handle<AllocationSite> EnterNewScope() {
      70    17912267 :     if (top().is_null()) {
      71     7359689 :       InitializeTraversal(top_site_);
      72             :     } else {
      73             :       // Advance current site
      74             :       Object* nested_site = current()->nested_site();
      75             :       // Something is wrong if we advance to the end of the list here.
      76             :       update_current_site(AllocationSite::cast(nested_site));
      77             :     }
      78     8956133 :     return Handle<AllocationSite>(*current(), isolate());
      79             :   }
      80             : 
      81             :   inline void ExitScope(Handle<AllocationSite> scope_site,
      82             :                         Handle<JSObject> object) {
      83             :     // This assert ensures that we are pointing at the right sub-object in a
      84             :     // recursive walk of a nested literal.
      85             :     DCHECK(object.is_null() || *object == scope_site->transition_info());
      86             :   }
      87             : 
      88             :   bool ShouldCreateMemento(Handle<JSObject> object);
      89             : 
      90             :  private:
      91             :   Handle<AllocationSite> top_site_;
      92             :   bool activated_;
      93             : };
      94             : 
      95             : 
      96             : }  // namespace internal
      97             : }  // namespace v8
      98             : 
      99             : #endif  // V8_ALLOCATION_SITE_SCOPES_H_

Generated by: LCOV version 1.10