• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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_ARRAY_ACCESSOR_H_
6 #define V8_INTERPRETER_BYTECODE_ARRAY_ACCESSOR_H_
7 
8 #include "src/globals.h"
9 #include "src/handles.h"
10 #include "src/interpreter/bytecode-register.h"
11 #include "src/interpreter/bytecodes.h"
12 #include "src/objects.h"
13 #include "src/runtime/runtime.h"
14 
15 namespace v8 {
16 namespace internal {
17 namespace interpreter {
18 
19 class V8_EXPORT_PRIVATE BytecodeArrayAccessor {
20  public:
21   BytecodeArrayAccessor(Handle<BytecodeArray> bytecode_array,
22                         int initial_offset);
23 
24   void SetOffset(int offset);
25 
26   Bytecode current_bytecode() const;
27   int current_bytecode_size() const;
current_offset()28   int current_offset() const { return bytecode_offset_; }
current_operand_scale()29   OperandScale current_operand_scale() const { return operand_scale_; }
current_prefix_offset()30   int current_prefix_offset() const { return prefix_offset_; }
bytecode_array()31   const Handle<BytecodeArray>& bytecode_array() const {
32     return bytecode_array_;
33   }
34 
35   uint32_t GetFlagOperand(int operand_index) const;
36   uint32_t GetUnsignedImmediateOperand(int operand_index) const;
37   int32_t GetImmediateOperand(int operand_index) const;
38   uint32_t GetIndexOperand(int operand_index) const;
39   uint32_t GetRegisterCountOperand(int operand_index) const;
40   Register GetRegisterOperand(int operand_index) const;
41   int GetRegisterOperandRange(int operand_index) const;
42   Runtime::FunctionId GetRuntimeIdOperand(int operand_index) const;
43   Runtime::FunctionId GetIntrinsicIdOperand(int operand_index) const;
44   Handle<Object> GetConstantForIndexOperand(int operand_index) const;
45 
46   // Returns the absolute offset of the branch target at the current
47   // bytecode. It is an error to call this method if the bytecode is
48   // not for a jump or conditional jump.
49   int GetJumpTargetOffset() const;
50 
51   bool OffsetWithinBytecode(int offset) const;
52 
53   std::ostream& PrintTo(std::ostream& os) const;
54 
55  private:
56   bool OffsetInBounds() const;
57 
58   uint32_t GetUnsignedOperand(int operand_index,
59                               OperandType operand_type) const;
60   int32_t GetSignedOperand(int operand_index, OperandType operand_type) const;
61 
62   void UpdateOperandScale();
63 
64   Handle<BytecodeArray> bytecode_array_;
65   int bytecode_offset_;
66   OperandScale operand_scale_;
67   int prefix_offset_;
68 
69   DISALLOW_COPY_AND_ASSIGN(BytecodeArrayAccessor);
70 };
71 
72 }  // namespace interpreter
73 }  // namespace internal
74 }  // namespace v8
75 
76 #endif  // V8_INTERPRETER_BYTECODE_GRAPH_ACCESSOR_H_
77