OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_PROPERTY_DETAILS_H_ | 5 #ifndef V8_PROPERTY_DETAILS_H_ |
6 #define V8_PROPERTY_DETAILS_H_ | 6 #define V8_PROPERTY_DETAILS_H_ |
7 | 7 |
8 #include "include/v8.h" | 8 #include "include/v8.h" |
9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
| 10 // TODO(ishell): remove once FLAG_track_constant_fields is removed. |
| 11 #include "src/flags.h" |
10 #include "src/utils.h" | 12 #include "src/utils.h" |
11 | 13 |
12 namespace v8 { | 14 namespace v8 { |
13 namespace internal { | 15 namespace internal { |
14 | 16 |
15 // ES6 6.1.7.1 | 17 // ES6 6.1.7.1 |
16 enum PropertyAttributes { | 18 enum PropertyAttributes { |
17 NONE = ::v8::None, | 19 NONE = ::v8::None, |
18 READ_ONLY = ::v8::ReadOnly, | 20 READ_ONLY = ::v8::ReadOnly, |
19 DONT_ENUM = ::v8::DontEnum, | 21 DONT_ENUM = ::v8::DontEnum, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 enum PropertyKind { kData = 0, kAccessor = 1 }; | 71 enum PropertyKind { kData = 0, kAccessor = 1 }; |
70 | 72 |
71 // Order of modes is significant. | 73 // Order of modes is significant. |
72 // Must fit in the BitField PropertyDetails::LocationField. | 74 // Must fit in the BitField PropertyDetails::LocationField. |
73 enum PropertyLocation { kField = 0, kDescriptor = 1 }; | 75 enum PropertyLocation { kField = 0, kDescriptor = 1 }; |
74 | 76 |
75 // Order of modes is significant. | 77 // Order of modes is significant. |
76 // Must fit in the BitField PropertyDetails::ConstnessField. | 78 // Must fit in the BitField PropertyDetails::ConstnessField. |
77 enum PropertyConstness { kMutable = 0, kConst = 1 }; | 79 enum PropertyConstness { kMutable = 0, kConst = 1 }; |
78 | 80 |
| 81 // TODO(ishell): remove once constant field tracking is done. |
| 82 const PropertyConstness kDefaultFieldConstness = |
| 83 FLAG_track_constant_fields ? kConst : kMutable; |
| 84 |
79 class Representation { | 85 class Representation { |
80 public: | 86 public: |
81 enum Kind { | 87 enum Kind { |
82 kNone, | 88 kNone, |
83 kInteger8, | 89 kInteger8, |
84 kUInteger8, | 90 kUInteger8, |
85 kInteger16, | 91 kInteger16, |
86 kUInteger16, | 92 kUInteger16, |
87 kSmi, | 93 kSmi, |
88 kInteger32, | 94 kInteger32, |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 | 269 |
264 PropertyDetails set_index(int index) const { | 270 PropertyDetails set_index(int index) const { |
265 PropertyDetails details = *this; | 271 PropertyDetails details = *this; |
266 details.value_ = DictionaryStorageField::update(details.value_, index); | 272 details.value_ = DictionaryStorageField::update(details.value_, index); |
267 return details; | 273 return details; |
268 } | 274 } |
269 | 275 |
270 PropertyDetails CopyWithRepresentation(Representation representation) const { | 276 PropertyDetails CopyWithRepresentation(Representation representation) const { |
271 return PropertyDetails(value_, representation); | 277 return PropertyDetails(value_, representation); |
272 } | 278 } |
| 279 PropertyDetails CopyWithConstness(PropertyConstness constness) const { |
| 280 return PropertyDetails(value_, constness); |
| 281 } |
273 PropertyDetails CopyAddAttributes(PropertyAttributes new_attributes) const { | 282 PropertyDetails CopyAddAttributes(PropertyAttributes new_attributes) const { |
274 new_attributes = | 283 new_attributes = |
275 static_cast<PropertyAttributes>(attributes() | new_attributes); | 284 static_cast<PropertyAttributes>(attributes() | new_attributes); |
276 return PropertyDetails(value_, new_attributes); | 285 return PropertyDetails(value_, new_attributes); |
277 } | 286 } |
278 | 287 |
279 // Conversion for storing details as Object*. | 288 // Conversion for storing details as Object*. |
280 explicit inline PropertyDetails(Smi* smi); | 289 explicit inline PropertyDetails(Smi* smi); |
281 inline Smi* AsSmi() const; | 290 inline Smi* AsSmi() const; |
282 | 291 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 void PrintAsFastTo(std::ostream& out, PrintMode mode = kPrintFull); | 382 void PrintAsFastTo(std::ostream& out, PrintMode mode = kPrintFull); |
374 | 383 |
375 private: | 384 private: |
376 PropertyDetails(int value, int pointer) { | 385 PropertyDetails(int value, int pointer) { |
377 value_ = DescriptorPointer::update(value, pointer); | 386 value_ = DescriptorPointer::update(value, pointer); |
378 } | 387 } |
379 PropertyDetails(int value, Representation representation) { | 388 PropertyDetails(int value, Representation representation) { |
380 value_ = RepresentationField::update( | 389 value_ = RepresentationField::update( |
381 value, EncodeRepresentation(representation)); | 390 value, EncodeRepresentation(representation)); |
382 } | 391 } |
| 392 PropertyDetails(int value, PropertyConstness constness) { |
| 393 value_ = ConstnessField::update(value, constness); |
| 394 } |
383 PropertyDetails(int value, PropertyAttributes attributes) { | 395 PropertyDetails(int value, PropertyAttributes attributes) { |
384 value_ = AttributesField::update(value, attributes); | 396 value_ = AttributesField::update(value, attributes); |
385 } | 397 } |
386 | 398 |
387 uint32_t value_; | 399 uint32_t value_; |
388 }; | 400 }; |
389 | 401 |
390 // kField location is more general than kDescriptor, kDescriptor generalizes | 402 // kField location is more general than kDescriptor, kDescriptor generalizes |
391 // only to itself. | 403 // only to itself. |
392 inline bool IsGeneralizableTo(PropertyLocation a, PropertyLocation b) { | 404 inline bool IsGeneralizableTo(PropertyLocation a, PropertyLocation b) { |
(...skipping 10 matching lines...) Expand all Loading... |
403 PropertyConstness b) { | 415 PropertyConstness b) { |
404 return a == kMutable ? kMutable : b; | 416 return a == kMutable ? kMutable : b; |
405 } | 417 } |
406 | 418 |
407 std::ostream& operator<<(std::ostream& os, | 419 std::ostream& operator<<(std::ostream& os, |
408 const PropertyAttributes& attributes); | 420 const PropertyAttributes& attributes); |
409 } // namespace internal | 421 } // namespace internal |
410 } // namespace v8 | 422 } // namespace v8 |
411 | 423 |
412 #endif // V8_PROPERTY_DETAILS_H_ | 424 #endif // V8_PROPERTY_DETAILS_H_ |
OLD | NEW |