Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 2f92d70b3fb649d973597b927bb012f684f8bad4..25811d16af7c621b99e417d7cc5e1c4b9960ad36 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -3036,9 +3036,16 @@ class StringDictionary: public Dictionary<StringDictionaryShape, String*> { |
}; |
+enum NumberDictionaryKind { |
+ kNotSeeded = 0, |
+ kSeeded |
+}; |
+ |
+ |
+template <NumberDictionaryKind kind> |
class NumberDictionaryShape : public BaseShape<uint32_t> { |
public: |
- static const bool UsesSeed = true; |
+ static const bool UsesSeed = kind; |
static inline bool IsMatch(uint32_t key, Object* other); |
static inline uint32_t Hash(uint32_t key); |
@@ -3054,26 +3061,14 @@ class NumberDictionaryShape : public BaseShape<uint32_t> { |
}; |
-class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { |
+class NumberDictionaryBase { |
public: |
- static NumberDictionary* cast(Object* obj) { |
- ASSERT(obj->IsDictionary()); |
- return reinterpret_cast<NumberDictionary*>(obj); |
- } |
- |
// Type specific at put (default NONE attributes is used when adding). |
MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value); |
MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key, |
Object* value, |
PropertyDetails details); |
- // Set an existing entry or add a new one if needed. |
- // Return the updated dictionary. |
- MUST_USE_RESULT static Handle<NumberDictionary> Set( |
- Handle<NumberDictionary> dictionary, |
- uint32_t index, |
- Handle<Object> value, |
- PropertyDetails details); |
MUST_USE_RESULT MaybeObject* Set(uint32_t key, |
Object* value, |
@@ -3094,10 +3089,69 @@ class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { |
// requires_slow_elements returns false. |
inline uint32_t max_number_key(); |
+ protected: |
// Bit masks. |
static const int kRequiresSlowElementsMask = 1; |
static const int kRequiresSlowElementsTagSize = 1; |
static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; |
+ |
+ private: |
+ // Internal function for easier conversion |
+ inline NumberDictionary* as_dict() { |
+ return reinterpret_cast<NumberDictionary*>(this); |
+ } |
+}; |
+ |
+ |
+class NumberDictionary : |
+ public Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>, |
+ public NumberDictionaryBase { |
+ public: |
+ static NumberDictionary* cast(Object* obj) { |
+ ASSERT(obj->IsDictionary()); |
+ return reinterpret_cast<NumberDictionary*>(obj); |
+ } |
+ |
+ MUST_USE_RESULT MaybeObject* Set(uint32_t key, |
+ Object* value, |
+ PropertyDetails details) { |
+ return NumberDictionaryBase::Set(key, value, details); |
+ } |
+ |
+ // Set an existing entry or add a new one if needed. |
+ // Return the updated dictionary. |
+ MUST_USE_RESULT static Handle<NumberDictionary> Set( |
+ Handle<NumberDictionary> dictionary, |
+ uint32_t index, |
+ Handle<Object> value, |
+ PropertyDetails details); |
+ |
+ friend class NumberDictionaryBase; |
+}; |
+ |
+ |
+class NotSeededNumberDictionary : |
+ public Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>, |
+ public NumberDictionaryBase { |
+ public: |
+ static NotSeededNumberDictionary* cast(Object* obj) { |
+ ASSERT(obj->IsDictionary()); |
+ return reinterpret_cast<NotSeededNumberDictionary*>(obj); |
+ } |
+ |
+ MUST_USE_RESULT MaybeObject* Set(uint32_t key, |
+ Object* value, |
+ PropertyDetails details) { |
+ return NumberDictionaryBase::Set(key, value, details); |
+ } |
+ |
+ // Set an existing entry or add a new one if needed. |
+ // Return the updated dictionary. |
+ MUST_USE_RESULT static Handle<NotSeededNumberDictionary> Set( |
+ Handle<NotSeededNumberDictionary> dictionary, |
+ uint32_t index, |
+ Handle<Object> value, |
+ PropertyDetails details); |
}; |