// Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/property.h" #include "src/field-type.h" #include "src/handles-inl.h" #include "src/ostreams.h" namespace v8 { namespace internal { std::ostream& operator<<(std::ostream& os, const PropertyAttributes& attributes) { os << "["; os << (((attributes & READ_ONLY) == 0) ? "W" : "_"); // writable os << (((attributes & DONT_ENUM) == 0) ? "E" : "_"); // enumerable os << (((attributes & DONT_DELETE) == 0) ? "C" : "_"); // configurable os << "]"; return os; } DataDescriptor::DataDescriptor(Handle key, int field_index, PropertyAttributes attributes, Representation representation) : Descriptor(key, FieldType::Any(key->GetIsolate()), attributes, DATA, representation, field_index) {} struct FastPropertyDetails { explicit FastPropertyDetails(const PropertyDetails& v) : details(v) {} const PropertyDetails details; }; // Outputs PropertyDetails as a dictionary details. std::ostream& operator<<(std::ostream& os, const PropertyDetails& details) { os << "("; if (details.location() == kDescriptor) { os << "immutable "; } os << (details.kind() == kData ? "data" : "accessor"); return os << ", dictionary_index: " << details.dictionary_index() << ", attrs: " << details.attributes() << ")"; } // Outputs PropertyDetails as a descriptor array details. std::ostream& operator<<(std::ostream& os, const FastPropertyDetails& details_fast) { const PropertyDetails& details = details_fast.details; os << "("; if (details.location() == kDescriptor) { os << "immutable "; } os << (details.kind() == kData ? "data" : "accessor"); os << ": " << details.representation().Mnemonic(); if (details.location() == kField) { os << ", field_index: " << details.field_index(); } return os << ", p: " << details.pointer() << ", attrs: " << details.attributes() << ")"; } #ifdef OBJECT_PRINT void PropertyDetails::Print(bool dictionary_mode) { OFStream os(stdout); if (dictionary_mode) { os << *this; } else { os << FastPropertyDetails(*this); } os << "\n" << std::flush; } #endif std::ostream& operator<<(std::ostream& os, const Descriptor& d) { Object* value = *d.GetValue(); os << "Descriptor " << Brief(*d.GetKey()) << " @ " << Brief(value) << " "; if (value->IsAccessorPair()) { AccessorPair* pair = AccessorPair::cast(value); os << "(get: " << Brief(pair->getter()) << ", set: " << Brief(pair->setter()) << ") "; } os << FastPropertyDetails(d.GetDetails()); return os; } } // namespace internal } // namespace v8