Index: src/property-details.h |
diff --git a/src/property-details.h b/src/property-details.h |
index 4a3152d94d2e17e920f807614ae1ac054f047eba..11fe52c1007ef6594d9c1f55bebe6d5a2bf748bf 100644 |
--- a/src/property-details.h |
+++ b/src/property-details.h |
@@ -41,10 +41,24 @@ typedef TypeImpl<ZoneTypeConfig> Type; |
class TypeInfo; |
// Type of properties. |
+// Order of kinds is significant. |
+// Must fit in the BitField PropertyDetails::KindField. |
+enum PropertyKind { DATA = 0, ACCESSOR = 1 }; |
+ |
+ |
+// Order of modes is significant. |
+// Must fit in the BitField PropertyDetails::StoreModeField. |
+enum PropertyLocation { IN_OBJECT = 0, IN_DESCRIPTOR = 1 }; |
+ |
+ |
// Order of properties is significant. |
// Must fit in the BitField PropertyDetails::TypeField. |
// A copy of this is in mirror-debugger.js. |
-enum PropertyType { FIELD = 0, CONSTANT = 1, CALLBACKS = 2 }; |
+enum PropertyType { |
+ FIELD = (IN_OBJECT << 1) | DATA, |
+ CONSTANT = (IN_DESCRIPTOR << 1) | DATA, |
+ CALLBACKS = (IN_DESCRIPTOR << 1) | ACCESSOR |
+}; |
class Representation { |
@@ -222,6 +236,9 @@ class PropertyDetails BASE_EMBEDDED { |
return Representation::FromKind(static_cast<Representation::Kind>(bits)); |
} |
+ PropertyKind kind() const { return KindField::decode(value_); } |
+ PropertyLocation location() const { return LocationField::decode(value_); } |
+ |
PropertyType type() const { return TypeField::decode(value_); } |
PropertyAttributes attributes() const { |
@@ -253,7 +270,8 @@ class PropertyDetails BASE_EMBEDDED { |
// Bit fields in value_ (type, shift, size). Must be public so the |
// constants can be embedded in generated code. |
- class TypeField : public BitField<PropertyType, 0, 2> {}; |
+ class KindField : public BitField<PropertyKind, 0, 1> {}; |
+ class LocationField : public BitField<PropertyLocation, 1, 1> {}; |
class AttributesField : public BitField<PropertyAttributes, 2, 3> {}; |
// Bit fields for normalized objects. |
@@ -268,6 +286,12 @@ class PropertyDetails BASE_EMBEDDED { |
: public BitField<uint32_t, 9 + kDescriptorIndexBitCount, |
kDescriptorIndexBitCount> {}; // NOLINT |
+ // NOTE: TypeField overlaps with KindField and LocationField. |
+ class TypeField : public BitField<PropertyType, 0, 2> {}; |
+ STATIC_ASSERT(KindField::kNext == LocationField::kShift); |
+ STATIC_ASSERT(TypeField::kShift == KindField::kShift); |
+ STATIC_ASSERT(TypeField::kNext == LocationField::kNext); |
+ |
// All bits for both fast and slow objects must fit in a smi. |
STATIC_ASSERT(DictionaryStorageField::kNext <= 31); |
STATIC_ASSERT(FieldIndexField::kNext <= 31); |