LCOV - code coverage report
Current view: top level - src/compiler - ast-loop-assignment-analyzer.h (source / functions) Hit Total Coverage
Test: app.info Lines: 5 6 83.3 %
Date: 2017-04-26 Functions: 3 3 100.0 %

          Line data    Source code
       1             : // Copyright 2014 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_COMPILER_AST_LOOP_ASSIGNMENT_ANALYZER_H_
       6             : #define V8_COMPILER_AST_LOOP_ASSIGNMENT_ANALYZER_H_
       7             : 
       8             : #include "src/ast/ast.h"
       9             : #include "src/bit-vector.h"
      10             : #include "src/zone/zone-containers.h"
      11             : 
      12             : namespace v8 {
      13             : namespace internal {
      14             : 
      15             : class CompilationInfo;
      16             : class Scope;
      17             : class Variable;
      18             : 
      19             : namespace compiler {
      20             : 
      21             : // The result of analyzing loop assignments.
      22             : class LoopAssignmentAnalysis : public ZoneObject {
      23             :  public:
      24         834 :   BitVector* GetVariablesAssignedInLoop(IterationStatement* loop) {
      25       12680 :     for (size_t i = 0; i < list_.size(); i++) {
      26             :       // TODO(turbofan): hashmap or binary search for loop assignments.
      27       12680 :       if (list_[i].first == loop) return list_[i].second;
      28             :     }
      29           0 :     UNREACHABLE();  // should never ask for loops that aren't here!
      30             :     return nullptr;
      31             :   }
      32             : 
      33             :   int GetAssignmentCountForTesting(DeclarationScope* scope, Variable* var);
      34             : 
      35             :  private:
      36             :   friend class AstLoopAssignmentAnalyzer;
      37             :   explicit LoopAssignmentAnalysis(Zone* zone) : list_(zone) {}
      38             :   ZoneVector<std::pair<IterationStatement*, BitVector*>> list_;
      39             : };
      40             : 
      41             : 
      42             : // The class that performs loop assignment analysis by walking the AST.
      43             : class AstLoopAssignmentAnalyzer final
      44             :     : public AstVisitor<AstLoopAssignmentAnalyzer> {
      45             :  public:
      46             :   AstLoopAssignmentAnalyzer(Zone* zone, CompilationInfo* info);
      47             : 
      48             :   LoopAssignmentAnalysis* Analyze();
      49             : 
      50             : #define DECLARE_VISIT(type) void Visit##type(type* node);
      51             :   AST_NODE_LIST(DECLARE_VISIT)
      52             : #undef DECLARE_VISIT
      53             : 
      54             :   static int GetVariableIndex(DeclarationScope* scope, Variable* var);
      55             : 
      56             :  private:
      57             :   CompilationInfo* info_;
      58             :   Zone* zone_;
      59             :   ZoneDeque<BitVector*> loop_stack_;
      60             :   LoopAssignmentAnalysis* result_;
      61             : 
      62             :   CompilationInfo* info() { return info_; }
      63             : 
      64             :   void Enter(IterationStatement* loop);
      65             :   void Exit(IterationStatement* loop);
      66             : 
      67             :   void VisitIfNotNull(AstNode* node) {
      68         201 :     if (node != nullptr) Visit(node);
      69             :   }
      70             : 
      71             :   void AnalyzeAssignment(Variable* var);
      72             : 
      73      992015 :   DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
      74             :   DISALLOW_COPY_AND_ASSIGN(AstLoopAssignmentAnalyzer);
      75             : };
      76             : }  // namespace compiler
      77             : }  // namespace internal
      78             : }  // namespace v8
      79             : 
      80             : #endif  // V8_COMPILER_AST_LOOP_ASSIGNMENT_ANALYZER_H_

Generated by: LCOV version 1.10