The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / src / property-details.h @ f230a1cf

History | View | Annotate | Download (9.58 KB)

1
// Copyright 2012 the V8 project authors. All rights reserved.
2
// Redistribution and use in source and binary forms, with or without
3
// modification, are permitted provided that the following conditions are
4
// met:
5
//
6
//     * Redistributions of source code must retain the above copyright
7
//       notice, this list of conditions and the following disclaimer.
8
//     * Redistributions in binary form must reproduce the above
9
//       copyright notice, this list of conditions and the following
10
//       disclaimer in the documentation and/or other materials provided
11
//       with the distribution.
12
//     * Neither the name of Google Inc. nor the names of its
13
//       contributors may be used to endorse or promote products derived
14
//       from this software without specific prior written permission.
15
//
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27

    
28
#ifndef V8_PROPERTY_DETAILS_H_
29
#define V8_PROPERTY_DETAILS_H_
30

    
31
#include "../include/v8.h"
32
#include "allocation.h"
33
#include "utils.h"
34

    
35
// Ecma-262 3rd 8.6.1
36
enum PropertyAttributes {
37
  NONE              = v8::None,
38
  READ_ONLY         = v8::ReadOnly,
39
  DONT_ENUM         = v8::DontEnum,
40
  DONT_DELETE       = v8::DontDelete,
41

    
42
  SEALED            = DONT_DELETE,
43
  FROZEN            = SEALED | READ_ONLY,
44

    
45
  SYMBOLIC          = 8,  // Used to filter symbol names
46
  DONT_SHOW         = DONT_ENUM | SYMBOLIC,
47
  ABSENT            = 16  // Used in runtime to indicate a property is absent.
48
  // ABSENT can never be stored in or returned from a descriptor's attributes
49
  // bitfield.  It is only used as a return value meaning the attributes of
50
  // a non-existent property.
51
};
52

    
53

    
54
namespace v8 {
55
namespace internal {
56

    
57
class Smi;
58
class Type;
59
class TypeInfo;
60

    
61
// Type of properties.
62
// Order of properties is significant.
63
// Must fit in the BitField PropertyDetails::TypeField.
64
// A copy of this is in mirror-debugger.js.
65
enum PropertyType {
66
  // Only in slow mode.
67
  NORMAL                    = 0,
68
  // Only in fast mode.
69
  FIELD                     = 1,
70
  CONSTANT                  = 2,
71
  CALLBACKS                 = 3,
72
  // Only in lookup results, not in descriptors.
73
  HANDLER                   = 4,
74
  INTERCEPTOR               = 5,
75
  TRANSITION                = 6,
76
  // Only used as a marker in LookupResult.
77
  NONEXISTENT               = 7
78
};
79

    
80

    
81
class Representation {
82
 public:
83
  enum Kind {
84
    kNone,
85
    kByte,
86
    kSmi,
87
    kInteger32,
88
    kDouble,
89
    kHeapObject,
90
    kTagged,
91
    kExternal,
92
    kNumRepresentations
93
  };
94

    
95
  Representation() : kind_(kNone) { }
96

    
97
  static Representation None() { return Representation(kNone); }
98
  static Representation Tagged() { return Representation(kTagged); }
99
  static Representation Byte() { return Representation(kByte); }
100
  static Representation Smi() { return Representation(kSmi); }
101
  static Representation Integer32() { return Representation(kInteger32); }
102
  static Representation Double() { return Representation(kDouble); }
103
  static Representation HeapObject() { return Representation(kHeapObject); }
104
  static Representation External() { return Representation(kExternal); }
105

    
106
  static Representation FromKind(Kind kind) { return Representation(kind); }
107

    
108
  // TODO(rossberg): this should die eventually.
109
  static Representation FromType(TypeInfo info);
110
  static Representation FromType(Handle<Type> type);
111

    
112
  bool Equals(const Representation& other) const {
113
    return kind_ == other.kind_;
114
  }
115

    
116
  bool IsCompatibleForLoad(const Representation& other) const {
117
    return (IsDouble() && other.IsDouble()) ||
118
        (!IsDouble() && !other.IsDouble());
119
  }
120

    
121
  bool IsCompatibleForStore(const Representation& other) const {
122
    return Equals(other);
123
  }
124

    
125
  bool is_more_general_than(const Representation& other) const {
126
    ASSERT(kind_ != kExternal);
127
    ASSERT(other.kind_ != kExternal);
128
    if (IsHeapObject()) return other.IsDouble() || other.IsNone();
129
    return kind_ > other.kind_;
130
  }
131

    
132
  bool fits_into(const Representation& other) const {
133
    return other.is_more_general_than(*this) || other.Equals(*this);
134
  }
135

    
136
  Representation generalize(Representation other) {
137
    if (other.fits_into(*this)) return *this;
138
    if (other.is_more_general_than(*this)) return other;
139
    return Representation::Tagged();
140
  }
141

    
142
  Kind kind() const { return static_cast<Kind>(kind_); }
143
  bool IsNone() const { return kind_ == kNone; }
144
  bool IsByte() const { return kind_ == kByte; }
145
  bool IsTagged() const { return kind_ == kTagged; }
146
  bool IsSmi() const { return kind_ == kSmi; }
147
  bool IsSmiOrTagged() const { return IsSmi() || IsTagged(); }
148
  bool IsInteger32() const { return kind_ == kInteger32; }
149
  bool IsSmiOrInteger32() const { return IsSmi() || IsInteger32(); }
150
  bool IsDouble() const { return kind_ == kDouble; }
151
  bool IsHeapObject() const { return kind_ == kHeapObject; }
152
  bool IsExternal() const { return kind_ == kExternal; }
153
  bool IsSpecialization() const {
154
    return IsByte() || IsSmi() || IsInteger32() || IsDouble();
155
  }
156
  const char* Mnemonic() const;
157

    
158
 private:
159
  explicit Representation(Kind k) : kind_(k) { }
160

    
161
  // Make sure kind fits in int8.
162
  STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte));
163

    
164
  int8_t kind_;
165
};
166

    
167

    
168
// PropertyDetails captures type and attributes for a property.
169
// They are used both in property dictionaries and instance descriptors.
170
class PropertyDetails BASE_EMBEDDED {
171
 public:
172
  PropertyDetails(PropertyAttributes attributes,
173
                  PropertyType type,
174
                  int index) {
175
    value_ = TypeField::encode(type)
176
        | AttributesField::encode(attributes)
177
        | DictionaryStorageField::encode(index);
178

    
179
    ASSERT(type == this->type());
180
    ASSERT(attributes == this->attributes());
181
  }
182

    
183
  PropertyDetails(PropertyAttributes attributes,
184
                  PropertyType type,
185
                  Representation representation,
186
                  int field_index = 0) {
187
    value_ = TypeField::encode(type)
188
        | AttributesField::encode(attributes)
189
        | RepresentationField::encode(EncodeRepresentation(representation))
190
        | FieldIndexField::encode(field_index);
191
  }
192

    
193
  int pointer() { return DescriptorPointer::decode(value_); }
194

    
195
  PropertyDetails set_pointer(int i) { return PropertyDetails(value_, i); }
196

    
197
  PropertyDetails CopyWithRepresentation(Representation representation) {
198
    return PropertyDetails(value_, representation);
199
  }
200
  PropertyDetails CopyAddAttributes(PropertyAttributes new_attributes) {
201
    new_attributes =
202
        static_cast<PropertyAttributes>(attributes() | new_attributes);
203
    return PropertyDetails(value_, new_attributes);
204
  }
205

    
206
  // Conversion for storing details as Object*.
207
  explicit inline PropertyDetails(Smi* smi);
208
  inline Smi* AsSmi();
209

    
210
  static uint8_t EncodeRepresentation(Representation representation) {
211
    return representation.kind();
212
  }
213

    
214
  static Representation DecodeRepresentation(uint32_t bits) {
215
    return Representation::FromKind(static_cast<Representation::Kind>(bits));
216
  }
217

    
218
  PropertyType type() { return TypeField::decode(value_); }
219

    
220
  PropertyAttributes attributes() const {
221
    return AttributesField::decode(value_);
222
  }
223

    
224
  int dictionary_index() {
225
    return DictionaryStorageField::decode(value_);
226
  }
227

    
228
  Representation representation() {
229
    ASSERT(type() != NORMAL);
230
    return DecodeRepresentation(RepresentationField::decode(value_));
231
  }
232

    
233
  int  field_index() {
234
    return FieldIndexField::decode(value_);
235
  }
236

    
237
  inline PropertyDetails AsDeleted();
238

    
239
  static bool IsValidIndex(int index) {
240
    return DictionaryStorageField::is_valid(index);
241
  }
242

    
243
  bool IsReadOnly() const { return (attributes() & READ_ONLY) != 0; }
244
  bool IsDontDelete() const { return (attributes() & DONT_DELETE) != 0; }
245
  bool IsDontEnum() const { return (attributes() & DONT_ENUM) != 0; }
246
  bool IsDeleted() const { return DeletedField::decode(value_) != 0;}
247

    
248
  // Bit fields in value_ (type, shift, size). Must be public so the
249
  // constants can be embedded in generated code.
250
  class TypeField:                public BitField<PropertyType,       0,  3> {};
251
  class AttributesField:          public BitField<PropertyAttributes, 3,  3> {};
252

    
253
  // Bit fields for normalized objects.
254
  class DeletedField:             public BitField<uint32_t,           6,  1> {};
255
  class DictionaryStorageField:   public BitField<uint32_t,           7, 24> {};
256

    
257
  // Bit fields for fast objects.
258
  class DescriptorPointer:        public BitField<uint32_t,           6, 11> {};
259
  class RepresentationField:      public BitField<uint32_t,          17,  3> {};
260
  class FieldIndexField:          public BitField<uint32_t,          20, 11> {};
261

    
262
  static const int kInitialIndex = 1;
263

    
264
 private:
265
  PropertyDetails(int value, int pointer) {
266
    value_ = DescriptorPointer::update(value, pointer);
267
  }
268
  PropertyDetails(int value, Representation representation) {
269
    value_ = RepresentationField::update(
270
        value, EncodeRepresentation(representation));
271
  }
272
  PropertyDetails(int value, PropertyAttributes attributes) {
273
    value_ = AttributesField::update(value, attributes);
274
  }
275

    
276
  uint32_t value_;
277
};
278

    
279
} }  // namespace v8::internal
280

    
281
#endif  // V8_PROPERTY_DETAILS_H_