Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(997)

Side by Side Diff: src/objects.h

Issue 9212006: [objects] NotSeededNumberDictionary Base URL: gh:v8/v8@master
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/incremental-marking.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3018 matching lines...) Expand 10 before | Expand all | Expand 10 after
3029 MUST_USE_RESULT MaybeObject* TransformPropertiesToFastFor( 3029 MUST_USE_RESULT MaybeObject* TransformPropertiesToFastFor(
3030 JSObject* obj, 3030 JSObject* obj,
3031 int unused_property_fields); 3031 int unused_property_fields);
3032 3032
3033 // Find entry for key, otherwise return kNotFound. Optimized version of 3033 // Find entry for key, otherwise return kNotFound. Optimized version of
3034 // HashTable::FindEntry. 3034 // HashTable::FindEntry.
3035 int FindEntry(String* key); 3035 int FindEntry(String* key);
3036 }; 3036 };
3037 3037
3038 3038
3039 enum NumberDictionaryKind {
3040 kNotSeeded = 0,
3041 kSeeded
3042 };
3043
3044
3045 template <NumberDictionaryKind kind>
3039 class NumberDictionaryShape : public BaseShape<uint32_t> { 3046 class NumberDictionaryShape : public BaseShape<uint32_t> {
3040 public: 3047 public:
3041 static const bool UsesSeed = true; 3048 static const bool UsesSeed = kind;
3042 3049
3043 static inline bool IsMatch(uint32_t key, Object* other); 3050 static inline bool IsMatch(uint32_t key, Object* other);
3044 static inline uint32_t Hash(uint32_t key); 3051 static inline uint32_t Hash(uint32_t key);
3045 static inline uint32_t SeededHash(uint32_t key, uint32_t seed); 3052 static inline uint32_t SeededHash(uint32_t key, uint32_t seed);
3046 static inline uint32_t HashForObject(uint32_t key, Object* object); 3053 static inline uint32_t HashForObject(uint32_t key, Object* object);
3047 static inline uint32_t SeededHashForObject(uint32_t key, 3054 static inline uint32_t SeededHashForObject(uint32_t key,
3048 uint32_t seed, 3055 uint32_t seed,
3049 Object* object); 3056 Object* object);
3050 MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key); 3057 MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key);
3051 static const int kPrefixSize = 2; 3058 static const int kPrefixSize = 2;
3052 static const int kEntrySize = 3; 3059 static const int kEntrySize = 3;
3053 static const bool kIsEnumerable = false; 3060 static const bool kIsEnumerable = false;
3054 }; 3061 };
3055 3062
3056 3063
3057 class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { 3064 class NumberDictionaryBase {
3058 public: 3065 public:
3059 static NumberDictionary* cast(Object* obj) {
3060 ASSERT(obj->IsDictionary());
3061 return reinterpret_cast<NumberDictionary*>(obj);
3062 }
3063
3064 // Type specific at put (default NONE attributes is used when adding). 3066 // Type specific at put (default NONE attributes is used when adding).
3065 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value); 3067 MUST_USE_RESULT MaybeObject* AtNumberPut(uint32_t key, Object* value);
3066 MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key, 3068 MUST_USE_RESULT MaybeObject* AddNumberEntry(uint32_t key,
3067 Object* value, 3069 Object* value,
3068 PropertyDetails details); 3070 PropertyDetails details);
3069 3071
3070 // Set an existing entry or add a new one if needed.
3071 // Return the updated dictionary.
3072 MUST_USE_RESULT static Handle<NumberDictionary> Set(
3073 Handle<NumberDictionary> dictionary,
3074 uint32_t index,
3075 Handle<Object> value,
3076 PropertyDetails details);
3077 3072
3078 MUST_USE_RESULT MaybeObject* Set(uint32_t key, 3073 MUST_USE_RESULT MaybeObject* Set(uint32_t key,
3079 Object* value, 3074 Object* value,
3080 PropertyDetails details); 3075 PropertyDetails details);
3081 3076
3082 void UpdateMaxNumberKey(uint32_t key); 3077 void UpdateMaxNumberKey(uint32_t key);
3083 3078
3084 // If slow elements are required we will never go back to fast-case 3079 // If slow elements are required we will never go back to fast-case
3085 // for the elements kept in this dictionary. We require slow 3080 // for the elements kept in this dictionary. We require slow
3086 // elements if an element has been added at an index larger than 3081 // elements if an element has been added at an index larger than
3087 // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called 3082 // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called
3088 // when defining a getter or setter with a number key. 3083 // when defining a getter or setter with a number key.
3089 inline bool requires_slow_elements(); 3084 inline bool requires_slow_elements();
3090 inline void set_requires_slow_elements(); 3085 inline void set_requires_slow_elements();
3091 3086
3092 // Get the value of the max number key that has been added to this 3087 // Get the value of the max number key that has been added to this
3093 // dictionary. max_number_key can only be called if 3088 // dictionary. max_number_key can only be called if
3094 // requires_slow_elements returns false. 3089 // requires_slow_elements returns false.
3095 inline uint32_t max_number_key(); 3090 inline uint32_t max_number_key();
3096 3091
3092 protected:
3097 // Bit masks. 3093 // Bit masks.
3098 static const int kRequiresSlowElementsMask = 1; 3094 static const int kRequiresSlowElementsMask = 1;
3099 static const int kRequiresSlowElementsTagSize = 1; 3095 static const int kRequiresSlowElementsTagSize = 1;
3100 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; 3096 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1;
3097
3098 private:
3099 // Internal function for easier conversion
3100 inline NumberDictionary* as_dict() {
3101 return reinterpret_cast<NumberDictionary*>(this);
3102 }
3101 }; 3103 };
3102 3104
3103 3105
3106 class NumberDictionary :
3107 public Dictionary<NumberDictionaryShape<kSeeded>, uint32_t>,
3108 public NumberDictionaryBase {
3109 public:
3110 static NumberDictionary* cast(Object* obj) {
3111 ASSERT(obj->IsDictionary());
3112 return reinterpret_cast<NumberDictionary*>(obj);
3113 }
3114
3115 MUST_USE_RESULT MaybeObject* Set(uint32_t key,
3116 Object* value,
3117 PropertyDetails details) {
3118 return NumberDictionaryBase::Set(key, value, details);
3119 }
3120
3121 // Set an existing entry or add a new one if needed.
3122 // Return the updated dictionary.
3123 MUST_USE_RESULT static Handle<NumberDictionary> Set(
3124 Handle<NumberDictionary> dictionary,
3125 uint32_t index,
3126 Handle<Object> value,
3127 PropertyDetails details);
3128
3129 friend class NumberDictionaryBase;
3130 };
3131
3132
3133 class NotSeededNumberDictionary :
3134 public Dictionary<NumberDictionaryShape<kNotSeeded>, uint32_t>,
3135 public NumberDictionaryBase {
3136 public:
3137 static NotSeededNumberDictionary* cast(Object* obj) {
3138 ASSERT(obj->IsDictionary());
3139 return reinterpret_cast<NotSeededNumberDictionary*>(obj);
3140 }
3141
3142 MUST_USE_RESULT MaybeObject* Set(uint32_t key,
3143 Object* value,
3144 PropertyDetails details) {
3145 return NumberDictionaryBase::Set(key, value, details);
3146 }
3147
3148 // Set an existing entry or add a new one if needed.
3149 // Return the updated dictionary.
3150 MUST_USE_RESULT static Handle<NotSeededNumberDictionary> Set(
3151 Handle<NotSeededNumberDictionary> dictionary,
3152 uint32_t index,
3153 Handle<Object> value,
3154 PropertyDetails details);
3155 };
3156
3157
3104 template <int entrysize> 3158 template <int entrysize>
3105 class ObjectHashTableShape : public BaseShape<Object*> { 3159 class ObjectHashTableShape : public BaseShape<Object*> {
3106 public: 3160 public:
3107 static inline bool IsMatch(Object* key, Object* other); 3161 static inline bool IsMatch(Object* key, Object* other);
3108 static inline uint32_t Hash(Object* key); 3162 static inline uint32_t Hash(Object* key);
3109 static inline uint32_t HashForObject(Object* key, Object* object); 3163 static inline uint32_t HashForObject(Object* key, Object* object);
3110 MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key); 3164 MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key);
3111 static const int kPrefixSize = 0; 3165 static const int kPrefixSize = 0;
3112 static const int kEntrySize = entrysize; 3166 static const int kEntrySize = entrysize;
3113 }; 3167 };
(...skipping 5040 matching lines...) Expand 10 before | Expand all | Expand 10 after
8154 } else { 8208 } else {
8155 value &= ~(1 << bit_position); 8209 value &= ~(1 << bit_position);
8156 } 8210 }
8157 return value; 8211 return value;
8158 } 8212 }
8159 }; 8213 };
8160 8214
8161 } } // namespace v8::internal 8215 } } // namespace v8::internal
8162 8216
8163 #endif // V8_OBJECTS_H_ 8217 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/incremental-marking.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698