LCOV - code coverage report
Current view: top level - src/interpreter - bytecode-jump-table.h (source / functions) Hit Total Coverage
Test: app.info Lines: 3 3 100.0 %
Date: 2019-04-17 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2017 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_INTERPRETER_BYTECODE_JUMP_TABLE_H_
       6             : #define V8_INTERPRETER_BYTECODE_JUMP_TABLE_H_
       7             : 
       8             : #include "src/bit-vector.h"
       9             : #include "src/zone/zone.h"
      10             : 
      11             : namespace v8 {
      12             : namespace internal {
      13             : namespace interpreter {
      14             : 
      15             : class ConstantArrayBuilder;
      16             : 
      17             : // A jump table for a set of targets in a bytecode array. When an entry in the
      18             : // table is bound, it represents a known position in the bytecode array. If no
      19             : // entries match, the switch falls through.
      20             : class V8_EXPORT_PRIVATE BytecodeJumpTable final : public ZoneObject {
      21             :  public:
      22             :   // Constructs a new BytecodeJumpTable starting at |constant_pool_index|, with
      23             :   // the given |size|, where the case values of the table start at
      24             :   // |case_value_base|.
      25             :   BytecodeJumpTable(size_t constant_pool_index, int size, int case_value_base,
      26             :                     Zone* zone)
      27             :       :
      28             : #ifdef DEBUG
      29             :         bound_(size, zone),
      30             : #endif
      31             :         constant_pool_index_(constant_pool_index),
      32             :         switch_bytecode_offset_(kInvalidOffset),
      33             :         size_(size),
      34       20229 :         case_value_base_(case_value_base) {
      35             :   }
      36             : 
      37             :   size_t constant_pool_index() const { return constant_pool_index_; }
      38             :   size_t switch_bytecode_offset() const { return switch_bytecode_offset_; }
      39             :   int case_value_base() const { return case_value_base_; }
      40             :   int size() const { return size_; }
      41             : #ifdef DEBUG
      42             :   bool is_bound(int case_value) const {
      43             :     DCHECK_GE(case_value, case_value_base_);
      44             :     DCHECK_LT(case_value, case_value_base_ + size());
      45             :     return bound_.Contains(case_value - case_value_base_);
      46             :   }
      47             : #endif
      48             : 
      49             :   size_t ConstantPoolEntryFor(int case_value) {
      50             :     DCHECK_GE(case_value, case_value_base_);
      51       46832 :     return constant_pool_index_ + case_value - case_value_base_;
      52             :   }
      53             : 
      54             :  private:
      55             :   static const size_t kInvalidIndex = static_cast<size_t>(-1);
      56             :   static const size_t kInvalidOffset = static_cast<size_t>(-1);
      57             : 
      58             :   void mark_bound(int case_value) {
      59             : #ifdef DEBUG
      60             :     DCHECK_GE(case_value, case_value_base_);
      61             :     DCHECK_LT(case_value, case_value_base_ + size());
      62             :     bound_.Add(case_value - case_value_base_);
      63             : #endif
      64             :   }
      65             : 
      66             :   void set_switch_bytecode_offset(size_t offset) {
      67             :     DCHECK_EQ(switch_bytecode_offset_, kInvalidOffset);
      68       19845 :     switch_bytecode_offset_ = offset;
      69             :   }
      70             : 
      71             : #ifdef DEBUG
      72             :   // This bit vector is only used for DCHECKS, so only store the field in debug
      73             :   // builds.
      74             :   BitVector bound_;
      75             : #endif
      76             :   size_t constant_pool_index_;
      77             :   size_t switch_bytecode_offset_;
      78             :   int size_;
      79             :   int case_value_base_;
      80             : 
      81             :   friend class BytecodeArrayWriter;
      82             : };
      83             : 
      84             : }  // namespace interpreter
      85             : }  // namespace internal
      86             : }  // namespace v8
      87             : 
      88             : #endif  // V8_INTERPRETER_BYTECODE_JUMP_TABLE_H_

Generated by: LCOV version 1.10