1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/property.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles-inl.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h"
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os,
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                         const PropertyAttributes& attributes) {
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "[";
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (((attributes & READ_ONLY) == 0) ? "W" : "_");    // writable
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (((attributes & DONT_ENUM) == 0) ? "E" : "_");    // enumerable
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (((attributes & DONT_DELETE) == 0) ? "C" : "_");  // configurable
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "]";
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct FastPropertyDetails {
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit FastPropertyDetails(const PropertyDetails& v) : details(v) {}
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const PropertyDetails details;
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Outputs PropertyDetails as a dictionary details.
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const PropertyDetails& details) {
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "(";
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (details.location() == kDescriptor) {
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << "immutable ";
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os << (details.kind() == kData ? "data" : "accessor");
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os << ", dictionary_index: " << details.dictionary_index()
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            << ", attrs: " << details.attributes() << ")";
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Outputs PropertyDetails as a descriptor array details.
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os,
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                         const FastPropertyDetails& details_fast) {
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const PropertyDetails& details = details_fast.details;
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "(";
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (details.location() == kDescriptor) {
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << "immutable ";
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os << (details.kind() == kData ? "data" : "accessor");
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os << ": " << details.representation().Mnemonic();
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (details.location() == kField) {
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    os << ", field_index: " << details.field_index();
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os << ", p: " << details.pointer()
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            << ", attrs: " << details.attributes() << ")";
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef OBJECT_PRINT
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid PropertyDetails::Print(bool dictionary_mode) {
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  OFStream os(stdout);
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (dictionary_mode) {
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << *this;
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << FastPropertyDetails(*this);
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "\n" << std::flush;
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const Descriptor& d) {
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object* value = *d.GetValue();
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "Descriptor " << Brief(*d.GetKey()) << " @ " << Brief(value) << " ";
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (value->IsAccessorPair()) {
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    AccessorPair* pair = AccessorPair::cast(value);
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << "(get: " << Brief(pair->getter())
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier       << ", set: " << Brief(pair->setter()) << ") ";
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << FastPropertyDetails(d.GetDetails());
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
87