| Index: src/objects.h
|
| ===================================================================
|
| --- src/objects.h (revision 10400)
|
| +++ src/objects.h (working copy)
|
| @@ -1485,7 +1485,7 @@
|
| inline bool HasExternalDoubleElements();
|
| bool HasFastArgumentsElements();
|
| bool HasDictionaryArgumentsElements();
|
| - inline NumberDictionary* element_dictionary(); // Gets slow elements.
|
| + inline SeededNumberDictionary* element_dictionary(); // Gets slow elements.
|
|
|
| inline void set_map_and_elements(
|
| Map* map,
|
| @@ -1908,9 +1908,10 @@
|
| PropertyNormalizationMode mode,
|
| int expected_additional_properties);
|
|
|
| - // Convert and update the elements backing store to be a NumberDictionary
|
| - // dictionary. Returns the backing after conversion.
|
| - static Handle<NumberDictionary> NormalizeElements(Handle<JSObject> object);
|
| + // Convert and update the elements backing store to be a
|
| + // SeededNumberDictionary dictionary. Returns the backing after conversion.
|
| + static Handle<SeededNumberDictionary> NormalizeElements(
|
| + Handle<JSObject> object);
|
|
|
| MUST_USE_RESULT MaybeObject* NormalizeElements();
|
|
|
| @@ -2277,7 +2278,7 @@
|
| public:
|
| inline void Initialize(FixedArray* from);
|
| inline void Initialize(FixedDoubleArray* from);
|
| - inline void Initialize(NumberDictionary* from);
|
| + inline void Initialize(SeededNumberDictionary* from);
|
|
|
| // Setter and getter for elements.
|
| inline double get_scalar(int index);
|
| @@ -3038,27 +3039,40 @@
|
|
|
| class NumberDictionaryShape : public BaseShape<uint32_t> {
|
| public:
|
| + static inline bool IsMatch(uint32_t key, Object* other);
|
| + MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key);
|
| + static const int kEntrySize = 3;
|
| + static const bool kIsEnumerable = false;
|
| +};
|
| +
|
| +
|
| +class SeededNumberDictionaryShape : public NumberDictionaryShape {
|
| + public:
|
| static const bool UsesSeed = true;
|
| + static const int kPrefixSize = 2;
|
|
|
| - static inline bool IsMatch(uint32_t key, Object* other);
|
| - static inline uint32_t Hash(uint32_t key);
|
| static inline uint32_t SeededHash(uint32_t key, uint32_t seed);
|
| - static inline uint32_t HashForObject(uint32_t key, Object* object);
|
| static inline uint32_t SeededHashForObject(uint32_t key,
|
| uint32_t seed,
|
| Object* object);
|
| - MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key);
|
| - static const int kPrefixSize = 2;
|
| - static const int kEntrySize = 3;
|
| - static const bool kIsEnumerable = false;
|
| };
|
|
|
|
|
| -class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> {
|
| +class UnseededNumberDictionaryShape : public NumberDictionaryShape {
|
| public:
|
| - static NumberDictionary* cast(Object* obj) {
|
| + static const int kPrefixSize = 0;
|
| +
|
| + static inline uint32_t Hash(uint32_t key);
|
| + static inline uint32_t HashForObject(uint32_t key, Object* object);
|
| +};
|
| +
|
| +
|
| +class SeededNumberDictionary
|
| + : public Dictionary<SeededNumberDictionaryShape, uint32_t> {
|
| + public:
|
| + static SeededNumberDictionary* cast(Object* obj) {
|
| ASSERT(obj->IsDictionary());
|
| - return reinterpret_cast<NumberDictionary*>(obj);
|
| + return reinterpret_cast<SeededNumberDictionary*>(obj);
|
| }
|
|
|
| // Type specific at put (default NONE attributes is used when adding).
|
| @@ -3069,8 +3083,8 @@
|
|
|
| // 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,
|
| + MUST_USE_RESULT static Handle<SeededNumberDictionary> Set(
|
| + Handle<SeededNumberDictionary> dictionary,
|
| uint32_t index,
|
| Handle<Object> value,
|
| PropertyDetails details);
|
| @@ -3101,6 +3115,29 @@
|
| };
|
|
|
|
|
| +class UnseededNumberDictionary
|
| + : public Dictionary<UnseededNumberDictionaryShape, uint32_t> {
|
| + public:
|
| + static UnseededNumberDictionary* cast(Object* obj) {
|
| + ASSERT(obj->IsDictionary());
|
| + return reinterpret_cast<UnseededNumberDictionary*>(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);
|
| +
|
| + // Set an existing entry or add a new one if needed.
|
| + // Return the updated dictionary.
|
| + MUST_USE_RESULT static Handle<UnseededNumberDictionary> Set(
|
| + Handle<UnseededNumberDictionary> dictionary,
|
| + uint32_t index,
|
| + Handle<Object> value);
|
| +
|
| + MUST_USE_RESULT MaybeObject* Set(uint32_t key, Object* value);
|
| +};
|
| +
|
| +
|
| template <int entrysize>
|
| class ObjectHashTableShape : public BaseShape<Object*> {
|
| public:
|
|
|