| Index: src/interpreter/bytecodes.cc
|
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc
|
| index 89fcaf60e8e2339eb716ea9db5a900e134b94752..0787b66c317d1fa818cce77fae09287ae3a59e62 100644
|
| --- a/src/interpreter/bytecodes.cc
|
| +++ b/src/interpreter/bytecodes.cc
|
| @@ -8,12 +8,27 @@ namespace v8 {
|
| namespace internal {
|
| namespace interpreter {
|
|
|
| +// Maximum number of operands a bytecode may have.
|
| +static const int kMaxOperands = 3;
|
| +
|
| +// kBytecodeTable relies on kNone being the same as zero to detect length.
|
| +STATIC_ASSERT(static_cast<int>(OperandType::kNone) == 0);
|
| +
|
| +static const OperandType kBytecodeTable[][kMaxOperands] = {
|
| +#define DECLARE_OPERAND(_, ...) \
|
| + { __VA_ARGS__ } \
|
| + ,
|
| + BYTECODE_LIST(DECLARE_OPERAND)
|
| +#undef DECLARE_OPERAND
|
| +};
|
| +
|
| +
|
| // static
|
| const char* Bytecodes::ToString(Bytecode bytecode) {
|
| switch (bytecode) {
|
| -#define CASE(Name, _) \
|
| - case Bytecode::k##Name: \
|
| - return #Name;
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + return #Name;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| }
|
| @@ -23,29 +38,52 @@ const char* Bytecodes::ToString(Bytecode bytecode) {
|
|
|
|
|
| // static
|
| -const int Bytecodes::NumberOfArguments(Bytecode bytecode) {
|
| - switch (bytecode) {
|
| -#define CASE(Name, arg_count) \
|
| - case Bytecode::k##Name: \
|
| - return arg_count;
|
| - BYTECODE_LIST(CASE)
|
| -#undef CASE
|
| +uint8_t Bytecodes::ToByte(Bytecode bytecode) {
|
| + return static_cast<uint8_t>(bytecode);
|
| +}
|
| +
|
| +
|
| +// static
|
| +Bytecode Bytecodes::FromByte(uint8_t value) {
|
| + Bytecode bytecode = static_cast<Bytecode>(value);
|
| + DCHECK(bytecode <= Bytecode::kLast);
|
| + return bytecode;
|
| +}
|
| +
|
| +
|
| +// static
|
| +const int Bytecodes::NumberOfOperands(Bytecode bytecode) {
|
| + DCHECK(bytecode <= Bytecode::kLast);
|
| + int count;
|
| + uint8_t row = ToByte(bytecode);
|
| + for (count = 0; count < kMaxOperands; count++) {
|
| + if (kBytecodeTable[row][count] == OperandType::kNone) {
|
| + break;
|
| + }
|
| }
|
| - UNREACHABLE();
|
| - return 0;
|
| + return count;
|
| +}
|
| +
|
| +
|
| +// static
|
| +const OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) {
|
| + DCHECK(bytecode <= Bytecode::kLast && i < NumberOfOperands(bytecode));
|
| + return kBytecodeTable[ToByte(bytecode)][i];
|
| }
|
|
|
|
|
| // static
|
| const int Bytecodes::Size(Bytecode bytecode) {
|
| - return NumberOfArguments(bytecode) + 1;
|
| + return 1 + NumberOfOperands(bytecode);
|
| }
|
|
|
|
|
| -#define CHECK_SIZE(Name, arg_count) \
|
| - STATIC_ASSERT(arg_count <= Bytecodes::kMaximumNumberOfArguments);
|
| - BYTECODE_LIST(CHECK_SIZE)
|
| -#undef CHECK_SIZE
|
| +// static
|
| +const int Bytecodes::MaximumNumberOfOperands() { return kMaxOperands; }
|
| +
|
| +
|
| +// static
|
| +const int Bytecodes::MaximumSize() { return 1 + kMaxOperands; }
|
|
|
|
|
| std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) {
|
|
|