|  | // Copyright 2017 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. | 
|  |  | 
|  | #include "src/snapshot/builtin-snapshot-utils.h" | 
|  |  | 
|  | namespace v8 { | 
|  | namespace internal { | 
|  |  | 
|  | // static | 
|  | bool BuiltinSnapshotUtils::IsBuiltinIndex(int maybe_index) { | 
|  | return (kFirstBuiltinIndex <= maybe_index && | 
|  | maybe_index < kFirstBuiltinIndex + kNumberOfBuiltins); | 
|  | } | 
|  |  | 
|  | // static | 
|  | bool BuiltinSnapshotUtils::IsHandlerIndex(int maybe_index) { | 
|  | return (kFirstHandlerIndex <= maybe_index && | 
|  | maybe_index < kFirstHandlerIndex + kNumberOfHandlers); | 
|  | } | 
|  |  | 
|  | // static | 
|  | int BuiltinSnapshotUtils::BytecodeToIndex(Bytecode bytecode, | 
|  | OperandScale operand_scale) { | 
|  | int index = | 
|  | BuiltinSnapshotUtils::kNumberOfBuiltins + static_cast<int>(bytecode); | 
|  | switch (operand_scale) {  // clang-format off | 
|  | case OperandScale::kSingle: return index; | 
|  | case OperandScale::kDouble: return index + Bytecodes::kBytecodeCount; | 
|  | case OperandScale::kQuadruple: return index + 2 * Bytecodes::kBytecodeCount; | 
|  | }  // clang-format on | 
|  | UNREACHABLE(); | 
|  | } | 
|  |  | 
|  | // static | 
|  | std::pair<interpreter::Bytecode, interpreter::OperandScale> | 
|  | BuiltinSnapshotUtils::BytecodeFromIndex(int index) { | 
|  | DCHECK(IsHandlerIndex(index)); | 
|  |  | 
|  | const int x = index - BuiltinSnapshotUtils::kNumberOfBuiltins; | 
|  | Bytecode bytecode = Bytecodes::FromByte(x % Bytecodes::kBytecodeCount); | 
|  | switch (x / Bytecodes::kBytecodeCount) {  // clang-format off | 
|  | case 0: return {bytecode, OperandScale::kSingle}; | 
|  | case 1: return {bytecode, OperandScale::kDouble}; | 
|  | case 2: return {bytecode, OperandScale::kQuadruple}; | 
|  | default: UNREACHABLE(); | 
|  | }  // clang-format on | 
|  | } | 
|  |  | 
|  | // static | 
|  | void BuiltinSnapshotUtils::ForEachBytecode( | 
|  | std::function<void(Bytecode, OperandScale)> f) { | 
|  | static const OperandScale kOperandScales[] = { | 
|  | #define VALUE(Name, _) OperandScale::k##Name, | 
|  | OPERAND_SCALE_LIST(VALUE) | 
|  | #undef VALUE | 
|  | }; | 
|  |  | 
|  | for (OperandScale operand_scale : kOperandScales) { | 
|  | for (int i = 0; i < Bytecodes::kBytecodeCount; i++) { | 
|  | f(Bytecodes::FromByte(i), operand_scale); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace v8 |