blob: 90001ef293d5f630fe8132a782bd57253187e288 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 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_ITERATOR_H_
6#define V8_INTERPRETER_BYTECODE_ARRAY_ITERATOR_H_
7
8#include "src/handles.h"
9#include "src/interpreter/bytecodes.h"
10#include "src/objects.h"
Ben Murdoch61f157c2016-09-16 13:49:30 +010011#include "src/runtime/runtime.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012
13namespace v8 {
14namespace internal {
15namespace interpreter {
16
17class BytecodeArrayIterator {
18 public:
19 explicit BytecodeArrayIterator(Handle<BytecodeArray> bytecode_array);
20
21 void Advance();
22 bool done() const;
23 Bytecode current_bytecode() const;
24 int current_bytecode_size() const;
25 int current_offset() const { return bytecode_offset_; }
Ben Murdochda12d292016-06-02 14:46:10 +010026 OperandScale current_operand_scale() const { return operand_scale_; }
27 int current_prefix_offset() const { return prefix_offset_; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028 const Handle<BytecodeArray>& bytecode_array() const {
29 return bytecode_array_;
30 }
31
Ben Murdochda12d292016-06-02 14:46:10 +010032 uint32_t GetFlagOperand(int operand_index) const;
33 int32_t GetImmediateOperand(int operand_index) const;
34 uint32_t GetIndexOperand(int operand_index) const;
35 uint32_t GetRegisterCountOperand(int operand_index) const;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036 Register GetRegisterOperand(int operand_index) const;
Ben Murdoch097c5b22016-05-18 11:27:45 +010037 int GetRegisterOperandRange(int operand_index) const;
Ben Murdoch61f157c2016-09-16 13:49:30 +010038 Runtime::FunctionId GetRuntimeIdOperand(int operand_index) const;
39 Runtime::FunctionId GetIntrinsicIdOperand(int operand_index) const;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040 Handle<Object> GetConstantForIndexOperand(int operand_index) const;
41
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042 // Returns the absolute offset of the branch target at the current
43 // bytecode. It is an error to call this method if the bytecode is
44 // not for a jump or conditional jump.
45 int GetJumpTargetOffset() const;
46
47 private:
Ben Murdochda12d292016-06-02 14:46:10 +010048 uint32_t GetUnsignedOperand(int operand_index,
49 OperandType operand_type) const;
50 int32_t GetSignedOperand(int operand_index, OperandType operand_type) const;
51
52 void UpdateOperandScale();
53
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054 Handle<BytecodeArray> bytecode_array_;
55 int bytecode_offset_;
Ben Murdochda12d292016-06-02 14:46:10 +010056 OperandScale operand_scale_;
57 int prefix_offset_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000058
59 DISALLOW_COPY_AND_ASSIGN(BytecodeArrayIterator);
60};
61
62} // namespace interpreter
63} // namespace internal
64} // namespace v8
65
66#endif // V8_INTERPRETER_BYTECODE_GRAPH_ITERATOR_H_