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

          Line data    Source code
       1             : // Copyright 2012 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_TYPE_INFO_H_
       6             : #define V8_TYPE_INFO_H_
       7             : 
       8             : #include "src/allocation.h"
       9             : #include "src/ast/ast-types.h"
      10             : #include "src/contexts.h"
      11             : #include "src/globals.h"
      12             : #include "src/parsing/token.h"
      13             : #include "src/zone/zone.h"
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : 
      18             : // Forward declarations.
      19             : class SmallMapList;
      20             : class FeedbackNexus;
      21             : class StubCache;
      22             : 
      23             : class TypeFeedbackOracle: public ZoneObject {
      24             :  public:
      25             :   TypeFeedbackOracle(Isolate* isolate, Zone* zone, Handle<Code> code,
      26             :                      Handle<FeedbackVector> feedback_vector,
      27             :                      Handle<Context> native_context);
      28             : 
      29             :   InlineCacheState LoadInlineCacheState(FeedbackSlot slot);
      30             :   bool StoreIsUninitialized(FeedbackSlot slot);
      31             :   bool CallIsUninitialized(FeedbackSlot slot);
      32             :   bool CallIsMonomorphic(FeedbackSlot slot);
      33             :   bool CallNewIsMonomorphic(FeedbackSlot slot);
      34             : 
      35             :   // TODO(1571) We can't use ForInStatement::ForInType as the return value due
      36             :   // to various cycles in our headers.
      37             :   // TODO(rossberg): once all oracle access is removed from ast.cc, it should
      38             :   // be possible.
      39             :   byte ForInType(FeedbackSlot feedback_vector_slot);
      40             : 
      41             :   void GetStoreModeAndKeyType(FeedbackSlot slot,
      42             :                               KeyedAccessStoreMode* store_mode,
      43             :                               IcCheckType* key_type);
      44             : 
      45             :   void PropertyReceiverTypes(FeedbackSlot slot, Handle<Name> name,
      46             :                              SmallMapList* receiver_types);
      47             :   void KeyedPropertyReceiverTypes(FeedbackSlot slot,
      48             :                                   SmallMapList* receiver_types, bool* is_string,
      49             :                                   IcCheckType* key_type);
      50             :   void AssignmentReceiverTypes(FeedbackSlot slot, Handle<Name> name,
      51             :                                SmallMapList* receiver_types);
      52             :   void KeyedAssignmentReceiverTypes(FeedbackSlot slot,
      53             :                                     SmallMapList* receiver_types,
      54             :                                     KeyedAccessStoreMode* store_mode,
      55             :                                     IcCheckType* key_type);
      56             :   void CountReceiverTypes(FeedbackSlot slot, SmallMapList* receiver_types);
      57             : 
      58             :   void CollectReceiverTypes(FeedbackSlot slot, SmallMapList* types);
      59             :   void CollectReceiverTypes(FeedbackNexus* nexus, SmallMapList* types);
      60             : 
      61      197403 :   static bool IsRelevantFeedback(Map* map, Context* native_context) {
      62      197403 :     Object* constructor = map->GetConstructor();
      63      375543 :     return !constructor->IsJSFunction() ||
      64             :            JSFunction::cast(constructor)->context()->native_context() ==
      65      197403 :                native_context;
      66             :   }
      67             : 
      68             :   Handle<JSFunction> GetCallTarget(FeedbackSlot slot);
      69             :   Handle<AllocationSite> GetCallAllocationSite(FeedbackSlot slot);
      70             :   Handle<JSFunction> GetCallNewTarget(FeedbackSlot slot);
      71             :   Handle<AllocationSite> GetCallNewAllocationSite(FeedbackSlot slot);
      72             : 
      73             :   // TODO(1571) We can't use ToBooleanICStub::Types as the return value because
      74             :   // of various cycles in our headers. Death to tons of implementations in
      75             :   // headers!! :-P
      76             :   uint16_t ToBooleanTypes(TypeFeedbackId id);
      77             : 
      78             :   // Get type information for arithmetic operations and compares.
      79             :   void BinaryType(TypeFeedbackId id, FeedbackSlot slot, AstType** left,
      80             :                   AstType** right, AstType** result,
      81             :                   Maybe<int>* fixed_right_arg,
      82             :                   Handle<AllocationSite>* allocation_site,
      83             :                   Token::Value operation);
      84             : 
      85             :   void CompareType(TypeFeedbackId id, FeedbackSlot slot, AstType** left,
      86             :                    AstType** right, AstType** combined);
      87             : 
      88             :   AstType* CountType(TypeFeedbackId id, FeedbackSlot slot);
      89             : 
      90             :   Zone* zone() const { return zone_; }
      91             :   Isolate* isolate() const { return isolate_; }
      92             : 
      93             :  private:
      94             :   void CollectReceiverTypes(StubCache* stub_cache, FeedbackSlot slot,
      95             :                             Handle<Name> name, SmallMapList* types);
      96             :   void CollectReceiverTypes(StubCache* stub_cache, FeedbackNexus* nexus,
      97             :                             Handle<Name> name, SmallMapList* types);
      98             : 
      99             :   // Returns true if there is at least one string map and if
     100             :   // all maps are string maps.
     101             :   bool HasOnlyStringMaps(SmallMapList* receiver_types);
     102             : 
     103             :   void SetInfo(TypeFeedbackId id, Object* target);
     104             : 
     105             :   void BuildDictionary(Handle<Code> code);
     106             :   void GetRelocInfos(Handle<Code> code, ZoneList<RelocInfo>* infos);
     107             :   void CreateDictionary(Handle<Code> code, ZoneList<RelocInfo>* infos);
     108             :   void RelocateRelocInfos(ZoneList<RelocInfo>* infos,
     109             :                           Code* old_code,
     110             :                           Code* new_code);
     111             :   void ProcessRelocInfos(ZoneList<RelocInfo>* infos);
     112             : 
     113             :   // Returns an element from the backing store. Returns undefined if
     114             :   // there is no information.
     115             :   Handle<Object> GetInfo(TypeFeedbackId id);
     116             : 
     117             :   // Returns an element from the type feedback vector. Returns undefined
     118             :   // if there is no information.
     119             :   Handle<Object> GetInfo(FeedbackSlot slot);
     120             : 
     121             :  private:
     122             :   Handle<Context> native_context_;
     123             :   Isolate* isolate_;
     124             :   Zone* zone_;
     125             :   Handle<UnseededNumberDictionary> dictionary_;
     126             :   Handle<FeedbackVector> feedback_vector_;
     127             : 
     128             :   DISALLOW_COPY_AND_ASSIGN(TypeFeedbackOracle);
     129             : };
     130             : 
     131             : }  // namespace internal
     132             : }  // namespace v8
     133             : 
     134             : #endif  // V8_TYPE_INFO_H_

Generated by: LCOV version 1.10