1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/frame-states.h"
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/functional.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/handles-inl.h"
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(OutputFrameStateCombine const& sc) {
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return base::hash_combine(sc.kind_, sc.parameter_);
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, OutputFrameStateCombine const& sc) {
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (sc.kind_) {
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case OutputFrameStateCombine::kPushOutput:
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (sc.parameter_ == 0) return os << "Ignore";
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return os << "Push(" << sc.parameter_ << ")";
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case OutputFrameStateCombine::kPokeAt:
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return os << "PokeAt(" << sc.parameter_ << ")";
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  UNREACHABLE();
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator==(FrameStateInfo const& lhs, FrameStateInfo const& rhs) {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return lhs.type() == rhs.type() && lhs.bailout_id() == rhs.bailout_id() &&
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         lhs.state_combine() == rhs.state_combine() &&
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         lhs.function_info() == rhs.function_info();
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool operator!=(FrameStateInfo const& lhs, FrameStateInfo const& rhs) {
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !(lhs == rhs);
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t hash_value(FrameStateInfo const& info) {
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return base::hash_combine(static_cast<int>(info.type()), info.bailout_id(),
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            info.state_combine());
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, FrameStateType type) {
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  switch (type) {
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FrameStateType::kJavaScriptFunction:
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      os << "JS_FRAME";
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FrameStateType::kInterpretedFunction:
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      os << "INTERPRETED_FRAME";
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FrameStateType::kArgumentsAdaptor:
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      os << "ARGUMENTS_ADAPTOR";
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case FrameStateType::kTailCallerFunction:
633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      os << "TAIL_CALLER_FRAME";
643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FrameStateType::kConstructStub:
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      os << "CONSTRUCT_STUB";
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case FrameStateType::kGetterStub:
69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      os << "GETTER_STUB";
70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case FrameStateType::kSetterStub:
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      os << "SETTER_STUB";
73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, FrameStateInfo const& info) {
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os << info.type() << ", " << info.bailout_id() << ", "
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch     << info.state_combine();
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<SharedFunctionInfo> shared_info;
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (info.shared_info().ToHandle(&shared_info)) {
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    os << ", " << Brief(*shared_info);
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return os;
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
92