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/objects-inl.h" 10#include "src/ostreams.h" 11 12namespace v8 { 13namespace internal { 14 15std::ostream& operator<<(std::ostream& os, 16 const PropertyAttributes& attributes) { 17 os << "["; 18 os << (((attributes & READ_ONLY) == 0) ? "W" : "_"); // writable 19 os << (((attributes & DONT_ENUM) == 0) ? "E" : "_"); // enumerable 20 os << (((attributes & DONT_DELETE) == 0) ? "C" : "_"); // configurable 21 os << "]"; 22 return os; 23} 24 25Descriptor Descriptor::DataField(Handle<Name> key, int field_index, 26 PropertyAttributes attributes, 27 Representation representation) { 28 return DataField(key, field_index, attributes, kMutable, representation, 29 FieldType::Any(key->GetIsolate())); 30} 31 32Descriptor Descriptor::DataField(Handle<Name> key, int field_index, 33 PropertyAttributes attributes, 34 PropertyConstness constness, 35 Representation representation, 36 Handle<Object> wrapped_field_type) { 37 DCHECK(wrapped_field_type->IsSmi() || wrapped_field_type->IsWeakCell()); 38 PropertyDetails details(kData, attributes, kField, constness, representation, 39 field_index); 40 return Descriptor(key, wrapped_field_type, details); 41} 42 43Descriptor Descriptor::DataConstant(Handle<Name> key, int field_index, 44 Handle<Object> value, 45 PropertyAttributes attributes) { 46 if (FLAG_track_constant_fields) { 47 Handle<Object> any_type(FieldType::Any(), key->GetIsolate()); 48 return DataField(key, field_index, attributes, kConst, 49 Representation::Tagged(), any_type); 50 51 } else { 52 return Descriptor(key, value, kData, attributes, kDescriptor, kConst, 53 value->OptimalRepresentation(), field_index); 54 } 55} 56 57// Outputs PropertyDetails as a dictionary details. 58void PropertyDetails::PrintAsSlowTo(std::ostream& os) { 59 os << "("; 60 if (constness() == kConst) os << "const "; 61 os << (kind() == kData ? "data" : "accessor"); 62 os << ", dictionary_index: " << dictionary_index(); 63 os << ", attrs: " << attributes() << ")"; 64} 65 66// Outputs PropertyDetails as a descriptor array details. 67void PropertyDetails::PrintAsFastTo(std::ostream& os, PrintMode mode) { 68 os << "("; 69 if (constness() == kConst) os << "const "; 70 os << (kind() == kData ? "data" : "accessor"); 71 if (location() == kField) { 72 os << " field"; 73 if (mode & kPrintFieldIndex) { 74 os << " " << field_index(); 75 } 76 if (mode & kPrintRepresentation) { 77 os << ":" << representation().Mnemonic(); 78 } 79 } else { 80 os << " descriptor"; 81 } 82 if (mode & kPrintPointer) { 83 os << ", p: " << pointer(); 84 } 85 if (mode & kPrintAttributes) { 86 os << ", attrs: " << attributes(); 87 } 88 os << ")"; 89} 90 91#ifdef OBJECT_PRINT 92void PropertyDetails::Print(bool dictionary_mode) { 93 OFStream os(stdout); 94 if (dictionary_mode) { 95 PrintAsSlowTo(os); 96 } else { 97 PrintAsFastTo(os, PrintMode::kPrintFull); 98 } 99 os << "\n" << std::flush; 100} 101#endif 102 103} // namespace internal 104} // namespace v8 105