Index: src/property-details.h |
diff --git a/src/property-details.h b/src/property-details.h |
index 68e937792a30ee527232faa99ced06ed23a341af..e71419ac8c44a352ada1994964705c45979c423c 100644 |
--- a/src/property-details.h |
+++ b/src/property-details.h |
@@ -187,16 +187,25 @@ static const int kInvalidEnumCacheSentinel = |
(1 << kDescriptorIndexBitCount) - 1; |
+enum class PropertyCellType { |
+ kUninitialized, // Cell is deleted or not yet defined. |
+ kUndefined, // The PREMONOMORPHIC of property cells. |
+ kConstant, // Cell has been assigned only once. |
+ kMutable, // Cell will no longer be tracked as constant. |
+ kDeleted = kConstant, // like kUninitialized, but for cells already deleted. |
+ kInvalid = kMutable, // For dictionaries not holding cells. |
+}; |
+ |
+ |
// PropertyDetails captures type and attributes for a property. |
// They are used both in property dictionaries and instance descriptors. |
class PropertyDetails BASE_EMBEDDED { |
public: |
- PropertyDetails(PropertyAttributes attributes, |
- PropertyType type, |
- int index) { |
- value_ = TypeField::encode(type) |
- | AttributesField::encode(attributes) |
- | DictionaryStorageField::encode(index); |
+ PropertyDetails(PropertyAttributes attributes, PropertyType type, int index, |
+ PropertyCellType cell_type) { |
+ value_ = TypeField::encode(type) | AttributesField::encode(attributes) | |
+ DictionaryStorageField::encode(index) | |
+ PropertyCellTypeField::encode(cell_type); |
DCHECK(type == this->type()); |
DCHECK(attributes == this->attributes()); |
@@ -221,14 +230,32 @@ class PropertyDetails BASE_EMBEDDED { |
FieldIndexField::encode(field_index); |
} |
+ static PropertyDetails Empty() { |
+ return PropertyDetails(NONE, DATA, 0, PropertyCellType::kInvalid); |
+ } |
+ |
int pointer() const { return DescriptorPointer::decode(value_); } |
- PropertyDetails set_pointer(int i) { return PropertyDetails(value_, i); } |
+ PropertyDetails set_pointer(int i) const { |
+ return PropertyDetails(value_, i); |
+ } |
+ |
+ PropertyDetails set_cell_type(PropertyCellType type) const { |
+ PropertyDetails details = *this; |
+ details.value_ = PropertyCellTypeField::update(details.value_, type); |
+ return details; |
+ } |
+ |
+ PropertyDetails set_index(int index) const { |
+ PropertyDetails details = *this; |
+ details.value_ = DictionaryStorageField::update(details.value_, index); |
+ return details; |
+ } |
PropertyDetails CopyWithRepresentation(Representation representation) const { |
return PropertyDetails(value_, representation); |
} |
- PropertyDetails CopyAddAttributes(PropertyAttributes new_attributes) { |
+ PropertyDetails CopyAddAttributes(PropertyAttributes new_attributes) const { |
new_attributes = |
static_cast<PropertyAttributes>(attributes() | new_attributes); |
return PropertyDetails(value_, new_attributes); |
@@ -274,6 +301,9 @@ class PropertyDetails BASE_EMBEDDED { |
bool IsReadOnly() const { return (attributes() & READ_ONLY) != 0; } |
bool IsConfigurable() const { return (attributes() & DONT_DELETE) == 0; } |
bool IsDontEnum() const { return (attributes() & DONT_ENUM) != 0; } |
+ PropertyCellType cell_type() const { |
+ return PropertyCellTypeField::decode(value_); |
+ } |
// Bit fields in value_ (type, shift, size). Must be public so the |
// constants can be embedded in generated code. |
@@ -282,7 +312,8 @@ class PropertyDetails BASE_EMBEDDED { |
class AttributesField : public BitField<PropertyAttributes, 2, 3> {}; |
// Bit fields for normalized objects. |
- class DictionaryStorageField : public BitField<uint32_t, 5, 24> {}; |
+ class PropertyCellTypeField : public BitField<PropertyCellType, 5, 2> {}; |
+ class DictionaryStorageField : public BitField<uint32_t, 7, 24> {}; |
// Bit fields for fast objects. |
class RepresentationField : public BitField<uint32_t, 5, 4> {}; |