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
operator <<(std::ostream & os,const PropertyAttributes & attributes)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
DataDescriptor(Handle<Name> key,int field_index,PropertyAttributes attributes,Representation representation)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 {
FastPropertyDetailsv8::internal::FastPropertyDetails31 explicit FastPropertyDetails(const PropertyDetails& v) : details(v) {}
32 const PropertyDetails details;
33 };
34
35
36 // Outputs PropertyDetails as a dictionary details.
operator <<(std::ostream & os,const PropertyDetails & 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.
operator <<(std::ostream & os,const FastPropertyDetails & details_fast)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
Print(bool dictionary_mode)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
operator <<(std::ostream & os,const Descriptor & d)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