property.cc revision 958fae7ec3f466955f8e5b50fa5b8d38b9e91675
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
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LookupResult::Iterate(ObjectVisitor* visitor) {
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LookupResult* current = this;  // Could be NULL.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (current != NULL) {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    visitor->VisitPointer(bit_cast<Object**>(&current->holder_));
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    visitor->VisitPointer(bit_cast<Object**>(&current->transition_));
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    current = current->next_;
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const LookupResult& r) {
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsFound()) return os << "Not Found\n";
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os << "LookupResult:\n";
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsTransition()) {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os << " -transition target:\n" << Brief(r.GetTransitionTarget()) << "\n";
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os;
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os,
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                         const PropertyAttributes& attributes) {
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "[";
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (((attributes & READ_ONLY) == 0) ? "W" : "_");    // writable
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (((attributes & DONT_ENUM) == 0) ? "E" : "_");    // enumerable
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (((attributes & DONT_DELETE) == 0) ? "C" : "_");  // configurable
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "]";
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstruct FastPropertyDetails {
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit FastPropertyDetails(const PropertyDetails& v) : details(v) {}
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const PropertyDetails details;
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Outputs PropertyDetails as a dictionary details.
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const PropertyDetails& details) {
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "(";
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (details.location() == IN_DESCRIPTOR) {
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << "immutable ";
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (details.kind() == DATA ? "data" : "accessor");
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os << ", dictionary_index: " << details.dictionary_index()
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            << ", attrs: " << details.attributes() << ")";
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Outputs PropertyDetails as a descriptor array details.
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os,
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                         const FastPropertyDetails& details_fast) {
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const PropertyDetails& details = details_fast.details;
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "(";
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (details.location() == IN_DESCRIPTOR) {
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << "immutable ";
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << (details.kind() == DATA ? "data" : "accessor");
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (details.location() == IN_OBJECT) {
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << ": " << details.representation().Mnemonic()
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier       << ", field_index: " << details.field_index();
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os << ", p: " << details.pointer()
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            << ", attrs: " << details.attributes() << ")";
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef OBJECT_PRINT
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid PropertyDetails::Print(bool dictionary_mode) {
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  OFStream os(stdout);
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (dictionary_mode) {
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << *this;
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << FastPropertyDetails(*this);
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "\n" << std::flush;
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const Descriptor& d) {
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object* value = *d.GetValue();
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << "Descriptor " << Brief(*d.GetKey()) << " @ " << Brief(value) << " ";
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (value->IsAccessorPair()) {
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    AccessorPair* pair = AccessorPair::cast(value);
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    os << "(get: " << Brief(pair->getter())
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier       << ", set: " << Brief(pair->setter()) << ") ";
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  os << FastPropertyDetails(d.GetDetails());
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return os;
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
107