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**>(¤t->holder_)); 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch visitor->VisitPointer(bit_cast<Object**>(¤t->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