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