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