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/field-type.h"
      8 #include "src/handles-inl.h"
      9 #include "src/ostreams.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 std::ostream& operator<<(std::ostream& os,
     15                          const PropertyAttributes& attributes) {
     16   os << "[";
     17   os << (((attributes & READ_ONLY) == 0) ? "W" : "_");    // writable
     18   os << (((attributes & DONT_ENUM) == 0) ? "E" : "_");    // enumerable
     19   os << (((attributes & DONT_DELETE) == 0) ? "C" : "_");  // configurable
     20   os << "]";
     21   return os;
     22 }
     23 
     24 DataDescriptor::DataDescriptor(Handle<Name> key, int field_index,
     25                                PropertyAttributes attributes,
     26                                Representation representation)
     27     : Descriptor(key, FieldType::Any(key->GetIsolate()), attributes, DATA,
     28                  representation, field_index) {}
     29 
     30 struct FastPropertyDetails {
     31   explicit FastPropertyDetails(const PropertyDetails& v) : details(v) {}
     32   const PropertyDetails details;
     33 };
     34 
     35 
     36 // Outputs PropertyDetails as a dictionary details.
     37 std::ostream& operator<<(std::ostream& os, const PropertyDetails& details) {
     38   os << "(";
     39   if (details.location() == kDescriptor) {
     40     os << "immutable ";
     41   }
     42   os << (details.kind() == kData ? "data" : "accessor");
     43   return os << ", dictionary_index: " << details.dictionary_index()
     44             << ", attrs: " << details.attributes() << ")";
     45 }
     46 
     47 
     48 // Outputs PropertyDetails as a descriptor array details.
     49 std::ostream& operator<<(std::ostream& os,
     50                          const FastPropertyDetails& details_fast) {
     51   const PropertyDetails& details = details_fast.details;
     52   os << "(";
     53   if (details.location() == kDescriptor) {
     54     os << "immutable ";
     55   }
     56   os << (details.kind() == kData ? "data" : "accessor");
     57   os << ": " << details.representation().Mnemonic();
     58   if (details.location() == kField) {
     59     os << ", field_index: " << details.field_index();
     60   }
     61   return os << ", p: " << details.pointer()
     62             << ", attrs: " << details.attributes() << ")";
     63 }
     64 
     65 
     66 #ifdef OBJECT_PRINT
     67 void PropertyDetails::Print(bool dictionary_mode) {
     68   OFStream os(stdout);
     69   if (dictionary_mode) {
     70     os << *this;
     71   } else {
     72     os << FastPropertyDetails(*this);
     73   }
     74   os << "\n" << std::flush;
     75 }
     76 #endif
     77 
     78 
     79 std::ostream& operator<<(std::ostream& os, const Descriptor& d) {
     80   Object* value = *d.GetValue();
     81   os << "Descriptor " << Brief(*d.GetKey()) << " @ " << Brief(value) << " ";
     82   if (value->IsAccessorPair()) {
     83     AccessorPair* pair = AccessorPair::cast(value);
     84     os << "(get: " << Brief(pair->getter())
     85        << ", set: " << Brief(pair->setter()) << ") ";
     86   }
     87   os << FastPropertyDetails(d.GetDetails());
     88   return os;
     89 }
     90 
     91 }  // namespace internal
     92 }  // namespace v8
     93