// Copyright 2015 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/compiler/frame-states.h" #include "src/base/functional.h" #include "src/handles-inl.h" namespace v8 { namespace internal { namespace compiler { size_t hash_value(OutputFrameStateCombine const& sc) { return base::hash_combine(sc.kind_, sc.parameter_); } std::ostream& operator<<(std::ostream& os, OutputFrameStateCombine const& sc) { switch (sc.kind_) { case OutputFrameStateCombine::kPushOutput: if (sc.parameter_ == 0) return os << "Ignore"; return os << "Push(" << sc.parameter_ << ")"; case OutputFrameStateCombine::kPokeAt: return os << "PokeAt(" << sc.parameter_ << ")"; } UNREACHABLE(); return os; } bool operator==(FrameStateInfo const& lhs, FrameStateInfo const& rhs) { return lhs.type() == rhs.type() && lhs.bailout_id() == rhs.bailout_id() && lhs.state_combine() == rhs.state_combine() && lhs.function_info() == rhs.function_info(); } bool operator!=(FrameStateInfo const& lhs, FrameStateInfo const& rhs) { return !(lhs == rhs); } size_t hash_value(FrameStateInfo const& info) { return base::hash_combine(static_cast(info.type()), info.bailout_id(), info.state_combine()); } std::ostream& operator<<(std::ostream& os, FrameStateType type) { switch (type) { case FrameStateType::kJavaScriptFunction: os << "JS_FRAME"; break; case FrameStateType::kInterpretedFunction: os << "INTERPRETED_FRAME"; break; case FrameStateType::kArgumentsAdaptor: os << "ARGUMENTS_ADAPTOR"; break; case FrameStateType::kTailCallerFunction: os << "TAIL_CALLER_FRAME"; break; case FrameStateType::kConstructStub: os << "CONSTRUCT_STUB"; break; } return os; } std::ostream& operator<<(std::ostream& os, FrameStateInfo const& info) { os << info.type() << ", " << info.bailout_id() << ", " << info.state_combine(); Handle shared_info; if (info.shared_info().ToHandle(&shared_info)) { os << ", " << Brief(*shared_info); } return os; } } // namespace compiler } // namespace internal } // namespace v8