1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/property.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/field-type.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles-inl.h" 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h" 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, 16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const PropertyAttributes& attributes) { 17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << "["; 18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << (((attributes & READ_ONLY) == 0) ? "W" : "_"); // writable 19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << (((attributes & DONT_ENUM) == 0) ? "E" : "_"); // enumerable 20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << (((attributes & DONT_DELETE) == 0) ? "C" : "_"); // configurable 21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << "]"; 22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return os; 23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDescriptor Descriptor::DataField(Handle<Name> key, int field_index, 2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes attributes, 2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Representation representation) { 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return DataField(key, field_index, attributes, kMutable, representation, 2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FieldType::Any(key->GetIsolate())); 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDescriptor Descriptor::DataField(Handle<Name> key, int field_index, 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes attributes, 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyConstness constness, 3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Representation representation, 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> wrapped_field_type) { 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(wrapped_field_type->IsSmi() || wrapped_field_type->IsWeakCell()); 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyDetails details(kData, attributes, kField, constness, representation, 3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch field_index); 4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return Descriptor(key, wrapped_field_type, details); 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDescriptor Descriptor::DataConstant(Handle<Name> key, int field_index, 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> value, 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes attributes) { 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (FLAG_track_constant_fields) { 4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> any_type(FieldType::Any(), key->GetIsolate()); 4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return DataField(key, field_index, attributes, kConst, 4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Representation::Tagged(), any_type); 50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return Descriptor(key, value, kData, attributes, kDescriptor, kConst, 5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch value->OptimalRepresentation(), field_index); 54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Outputs PropertyDetails as a dictionary details. 5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid PropertyDetails::PrintAsSlowTo(std::ostream& os) { 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << "("; 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (constness() == kConst) os << "const "; 6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << (kind() == kData ? "data" : "accessor"); 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << ", dictionary_index: " << dictionary_index(); 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << ", attrs: " << attributes() << ")"; 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Outputs PropertyDetails as a descriptor array details. 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid PropertyDetails::PrintAsFastTo(std::ostream& os, PrintMode mode) { 68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << "("; 6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (constness() == kConst) os << "const "; 7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << (kind() == kData ? "data" : "accessor"); 7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (location() == kField) { 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << " field"; 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (mode & kPrintFieldIndex) { 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << " " << field_index(); 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (mode & kPrintRepresentation) { 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << ":" << representation().Mnemonic(); 7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << " descriptor"; 8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (mode & kPrintPointer) { 8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << ", p: " << pointer(); 84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (mode & kPrintAttributes) { 8662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << ", attrs: " << attributes(); 87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 8862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os << ")"; 89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef OBJECT_PRINT 92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid PropertyDetails::Print(bool dictionary_mode) { 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier OFStream os(stdout); 94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (dictionary_mode) { 9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PrintAsSlowTo(os); 96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 9762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PrintAsFastTo(os, PrintMode::kPrintFull); 98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << "\n" << std::flush; 100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 105