// Copyright 2016 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_INTERPRETER_BYTECODE_ARRAY_ACCESSOR_H_
|
#define V8_INTERPRETER_BYTECODE_ARRAY_ACCESSOR_H_
|
|
#include "src/globals.h"
|
#include "src/handles.h"
|
#include "src/interpreter/bytecode-register.h"
|
#include "src/interpreter/bytecodes.h"
|
#include "src/objects.h"
|
#include "src/runtime/runtime.h"
|
|
namespace v8 {
|
namespace internal {
|
|
class BytecodeArray;
|
|
namespace interpreter {
|
|
class BytecodeArrayAccessor;
|
|
struct V8_EXPORT_PRIVATE JumpTableTargetOffset {
|
int case_value;
|
int target_offset;
|
};
|
|
class V8_EXPORT_PRIVATE JumpTableTargetOffsets final {
|
public:
|
// Minimal iterator implementation for use in ranged-for.
|
class V8_EXPORT_PRIVATE iterator final {
|
public:
|
iterator(int case_value, int table_offset, int table_end,
|
const BytecodeArrayAccessor* accessor);
|
|
JumpTableTargetOffset operator*();
|
iterator& operator++();
|
bool operator!=(const iterator& other);
|
|
private:
|
void UpdateAndAdvanceToValid();
|
|
const BytecodeArrayAccessor* accessor_;
|
Smi* current_;
|
int index_;
|
int table_offset_;
|
int table_end_;
|
};
|
|
JumpTableTargetOffsets(const BytecodeArrayAccessor* accessor, int table_start,
|
int table_size, int case_value_base);
|
|
iterator begin() const;
|
iterator end() const;
|
|
int size() const;
|
|
private:
|
const BytecodeArrayAccessor* accessor_;
|
int table_start_;
|
int table_size_;
|
int case_value_base_;
|
};
|
|
class V8_EXPORT_PRIVATE BytecodeArrayAccessor {
|
public:
|
BytecodeArrayAccessor(Handle<BytecodeArray> bytecode_array,
|
int initial_offset);
|
|
void SetOffset(int offset);
|
|
void ApplyDebugBreak();
|
|
Bytecode current_bytecode() const;
|
int current_bytecode_size() const;
|
int current_offset() const { return bytecode_offset_; }
|
OperandScale current_operand_scale() const { return operand_scale_; }
|
int current_prefix_offset() const { return prefix_offset_; }
|
const Handle<BytecodeArray>& bytecode_array() const {
|
return bytecode_array_;
|
}
|
|
uint32_t GetFlagOperand(int operand_index) const;
|
uint32_t GetUnsignedImmediateOperand(int operand_index) const;
|
int32_t GetImmediateOperand(int operand_index) const;
|
uint32_t GetIndexOperand(int operand_index) const;
|
FeedbackSlot GetSlotOperand(int operand_index) const;
|
uint32_t GetRegisterCountOperand(int operand_index) const;
|
Register GetRegisterOperand(int operand_index) const;
|
int GetRegisterOperandRange(int operand_index) const;
|
Runtime::FunctionId GetRuntimeIdOperand(int operand_index) const;
|
Runtime::FunctionId GetIntrinsicIdOperand(int operand_index) const;
|
uint32_t GetNativeContextIndexOperand(int operand_index) const;
|
Object* GetConstantAtIndex(int offset) const;
|
Object* GetConstantForIndexOperand(int operand_index) const;
|
|
// Returns the absolute offset of the branch target at the current bytecode.
|
// It is an error to call this method if the bytecode is not for a jump or
|
// conditional jump.
|
int GetJumpTargetOffset() const;
|
// Returns an iterator over the absolute offsets of the targets of the current
|
// switch bytecode's jump table. It is an error to call this method if the
|
// bytecode is not a switch.
|
JumpTableTargetOffsets GetJumpTableTargetOffsets() const;
|
|
// Returns the absolute offset of the bytecode at the given relative offset
|
// from the current bytecode.
|
int GetAbsoluteOffset(int relative_offset) const;
|
|
bool OffsetWithinBytecode(int offset) const;
|
|
std::ostream& PrintTo(std::ostream& os) const;
|
|
private:
|
bool OffsetInBounds() const;
|
|
uint32_t GetUnsignedOperand(int operand_index,
|
OperandType operand_type) const;
|
int32_t GetSignedOperand(int operand_index, OperandType operand_type) const;
|
|
void UpdateOperandScale();
|
|
Handle<BytecodeArray> bytecode_array_;
|
int bytecode_offset_;
|
OperandScale operand_scale_;
|
int prefix_offset_;
|
|
DISALLOW_COPY_AND_ASSIGN(BytecodeArrayAccessor);
|
};
|
|
} // namespace interpreter
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_INTERPRETER_BYTECODE_ARRAY_ACCESSOR_H_
|