Home | History | Annotate | Download | only in src
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/property.h"
      6 
      7 #include "src/handles-inl.h"
      8 #include "src/ostreams.h"
      9 
     10 namespace v8 {
     11 namespace internal {
     12 
     13 std::ostream& operator<<(std::ostream& os,
     14                          const PropertyAttributes& attributes) {
     15   os << "[";
     16   os << (((attributes & READ_ONLY) == 0) ? "W" : "_");    // writable
     17   os << (((attributes & DONT_ENUM) == 0) ? "E" : "_");    // enumerable
     18   os << (((attributes & DONT_DELETE) == 0) ? "C" : "_");  // configurable
     19   os << "]";
     20   return os;
     21 }
     22 
     23 
     24 struct FastPropertyDetails {
     25   explicit FastPropertyDetails(const PropertyDetails& v) : details(v) {}
     26   const PropertyDetails details;
     27 };
     28 
     29 
     30 // Outputs PropertyDetails as a dictionary details.
     31 std::ostream& operator<<(std::ostream& os, const PropertyDetails& details) {
     32   os << "(";
     33   if (details.location() == kDescriptor) {
     34     os << "immutable ";
     35   }
     36   os << (details.kind() == kData ? "data" : "accessor");
     37   return os << ", dictionary_index: " << details.dictionary_index()
     38             << ", attrs: " << details.attributes() << ")";
     39 }
     40 
     41 
     42 // Outputs PropertyDetails as a descriptor array details.
     43 std::ostream& operator<<(std::ostream& os,
     44                          const FastPropertyDetails& details_fast) {
     45   const PropertyDetails& details = details_fast.details;
     46   os << "(";
     47   if (details.location() == kDescriptor) {
     48     os << "immutable ";
     49   }
     50   os << (details.kind() == kData ? "data" : "accessor");
     51   os << ": " << details.representation().Mnemonic();
     52   if (details.location() == kField) {
     53     os << ", field_index: " << details.field_index();
     54   }
     55   return os << ", p: " << details.pointer()
     56             << ", attrs: " << details.attributes() << ")";
     57 }
     58 
     59 
     60 #ifdef OBJECT_PRINT
     61 void PropertyDetails::Print(bool dictionary_mode) {
     62   OFStream os(stdout);
     63   if (dictionary_mode) {
     64     os << *this;
     65   } else {
     66     os << FastPropertyDetails(*this);
     67   }
     68   os << "\n" << std::flush;
     69 }
     70 #endif
     71 
     72 
     73 std::ostream& operator<<(std::ostream& os, const Descriptor& d) {
     74   Object* value = *d.GetValue();
     75   os << "Descriptor " << Brief(*d.GetKey()) << " @ " << Brief(value) << " ";
     76   if (value->IsAccessorPair()) {
     77     AccessorPair* pair = AccessorPair::cast(value);
     78     os << "(get: " << Brief(pair->getter())
     79        << ", set: " << Brief(pair->setter()) << ") ";
     80   }
     81   os << FastPropertyDetails(d.GetDetails());
     82   return os;
     83 }
     84 
     85 }  // namespace internal
     86 }  // namespace v8
     87