Chromium Code Reviews| Index: src/objects.h |
| diff --git a/src/objects.h b/src/objects.h |
| index e8c985048455e406c77c6b4c6814261f2cb7ab41..1aea8ecdfb939f5a3b8757e144881cf244c00977 100644 |
| --- a/src/objects.h |
| +++ b/src/objects.h |
| @@ -255,13 +255,6 @@ enum NormalizedMapSharingMode { |
| }; |
| -// Indicates whether a get method should implicitly create the object looked up. |
| -enum CreationFlag { |
| - ALLOW_CREATION, |
| - OMIT_CREATION |
| -}; |
| - |
| - |
| // Indicates whether transitions can be added to a source map or not. |
| enum TransitionFlag { |
| INSERT_TRANSITION, |
| @@ -1509,10 +1502,17 @@ class Object : public MaybeObject { |
| // Return the object's prototype (might be Heap::null_value()). |
| Object* GetPrototype(Isolate* isolate); |
| + // Returns the permanent hash code associated with this object. May return |
| + // undefined if not yet created. |
| + MUST_USE_RESULT Object* GetHash(); |
|
Michael Starzinger
2013/11/04 17:58:58
nit: I think we can drop the MUST_USE_RESULT here,
rafaelw
2013/11/05 09:56:54
Done.
|
| + |
| // Returns the permanent hash code associated with this object depending on |
| - // the actual object type. Might return a failure in case no hash was |
| - // created yet or GC was caused by creation. |
| - MUST_USE_RESULT MaybeObject* GetHash(CreationFlag flag); |
| + // the actual object type. May create and store a hash code if needed and none |
| + // exists. |
| + // TODO(rafaelw): Remove isolate parameter when objects.cc is fully |
| + // handlified. |
| + static Handle<Object> GetOrCreateHash(Handle<Object> object, |
| + Isolate* isolate); |
| // Checks whether this object has the same value as the given one. This |
| // function is implemented according to ES5, section 9.12 and can be used |
| @@ -2003,8 +2003,13 @@ class JSReceiver: public HeapObject { |
| inline Object* GetConstructor(); |
| // Retrieves a permanent object identity hash code. The undefined value might |
| - // be returned in case no hash was created yet and OMIT_CREATION was used. |
| - inline MUST_USE_RESULT MaybeObject* GetIdentityHash(CreationFlag flag); |
| + // be returned in case no hash was created yet. |
| + inline MUST_USE_RESULT Object* GetIdentityHash(); |
|
Michael Starzinger
2013/11/04 17:58:58
nit: Likewise.
rafaelw
2013/11/05 09:56:54
Done.
|
| + |
| + // Retrieves a permanent object identity hash code. May create and store a |
| + // hash code if needed and none exists. |
| + inline static Handle<Object> GetOrCreateIdentityHash( |
| + Handle<JSReceiver> object); |
| // Lookup a property. If found, the result is valid and has |
| // detailed information. |
| @@ -2036,6 +2041,9 @@ class JSReceiver: public HeapObject { |
| DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver); |
| }; |
| +// Forward declaration for JSObject::GetOrCreateHiddenPropertiesHashTable. |
| +class ObjectHashTable; |
| + |
| // The JSObject describes real heap allocated JavaScript objects with |
| // properties. |
| // Note that the map of JSObject changes during execution to enable inline |
| @@ -2287,11 +2295,9 @@ class JSObject: public JSReceiver { |
| // Sets a hidden property on this object. Returns this object if successful, |
| // undefined if called on a detached proxy. |
| - static Handle<Object> SetHiddenProperty(Handle<JSObject> obj, |
| + static Handle<Object> SetHiddenProperty(Handle<JSObject> object, |
| Handle<Name> key, |
| Handle<Object> value); |
| - // Returns a failure if a GC is required. |
| - MUST_USE_RESULT MaybeObject* SetHiddenProperty(Name* key, Object* value); |
| // Gets the value of a hidden property with the given key. Returns the hole |
| // if the property doesn't exist (or if called on a detached proxy), |
| // otherwise returns the value set for the key. |
| @@ -2304,7 +2310,7 @@ class JSObject: public JSReceiver { |
| bool HasHiddenProperties(); |
| static int GetIdentityHash(Handle<JSObject> object); |
| - static void SetIdentityHash(Handle<JSObject> object, Smi* hash); |
| + static void SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash); |
| inline void ValidateElements(); |
| @@ -2858,23 +2864,25 @@ class JSObject: public JSReceiver { |
| Handle<Object> accessor, |
| PropertyAttributes attributes); |
| - enum InitializeHiddenProperties { |
| - CREATE_NEW_IF_ABSENT, |
| - ONLY_RETURN_INLINE_VALUE |
| - }; |
| - // If create_if_absent is true, return the hash table backing store |
| - // for hidden properties. If there is no backing store, allocate one. |
| - // If create_if_absent is false, return the hash table backing store |
| - // or the inline stored identity hash, whatever is found. |
| - MUST_USE_RESULT MaybeObject* GetHiddenPropertiesHashTable( |
| - InitializeHiddenProperties init_option); |
| + // Return the hash table backing store or the inline stored identity hash, |
| + // whatever is found. |
| + MUST_USE_RESULT Object* GetHiddenPropertiesHashTable(); |
| + |
| + // Return the hash table backing store for hidden properties. If there is no |
| + // backing store, allocate one. |
| + static Handle<ObjectHashTable> GetOrCreateHiddenPropertiesHashtable( |
| + Handle<JSObject> object); |
| + |
| // Set the hidden property backing store to either a hash table or |
| // the inline-stored identity hash. |
| - MUST_USE_RESULT MaybeObject* SetHiddenPropertiesHashTable( |
| - Object* value); |
| + static Handle<Object> SetHiddenPropertiesHashTable( |
| + Handle<JSObject> object, |
| + Handle<Object> value); |
| + |
| + MUST_USE_RESULT Object* GetIdentityHash(); |
| - MUST_USE_RESULT MaybeObject* GetIdentityHash(CreationFlag flag); |
| + static Handle<Object> GetOrCreateIdentityHash(Handle<JSObject> object); |
| DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); |
| }; |
| @@ -3484,11 +3492,6 @@ class BaseShape { |
| template<typename Shape, typename Key> |
| class HashTable: public FixedArray { |
| public: |
| - enum MinimumCapacity { |
| - USE_DEFAULT_MINIMUM_CAPACITY, |
| - USE_CUSTOM_MINIMUM_CAPACITY |
| - }; |
| - |
| // Wrapper methods |
| inline uint32_t Hash(Key key) { |
| if (Shape::UsesSeed) { |
| @@ -3599,6 +3602,9 @@ class HashTable: public FixedArray { |
| void Rehash(Key key); |
| protected: |
| + friend class ObjectHashSet; |
| + friend class ObjectHashTable; |
| + |
| // Find the entry at which to insert element with the given key that |
| // has the given hash value. |
| uint32_t FindInsertionEntry(uint32_t hash); |
| @@ -4062,11 +4068,23 @@ class ObjectHashSet: public HashTable<ObjectHashTableShape<1>, Object*> { |
| // Looks up whether the given key is part of this hash set. |
| bool Contains(Object* key); |
| + static Handle<ObjectHashSet> EnsureCapacity( |
| + Handle<ObjectHashSet> table, |
| + int n, |
| + Handle<Object> key, |
| + PretenureFlag pretenure = NOT_TENURED); |
| + |
| + // Attempt to shrink hash table after removal of key. |
| + static Handle<ObjectHashSet> Shrink(Handle<ObjectHashSet> table, |
| + Handle<Object> key); |
| + |
| // Adds the given key to this hash set. |
| - MUST_USE_RESULT MaybeObject* Add(Object* key); |
| + static Handle<ObjectHashSet> Add(Handle<ObjectHashSet> table, |
| + Handle<Object> key); |
| // Removes the given key from this hash set. |
| - MUST_USE_RESULT MaybeObject* Remove(Object* key); |
| + static Handle<ObjectHashSet> Remove(Handle<ObjectHashSet> table, |
| + Handle<Object> key); |
| }; |
| @@ -4079,13 +4097,25 @@ class ObjectHashTable: public HashTable<ObjectHashTableShape<2>, Object*> { |
| return reinterpret_cast<ObjectHashTable*>(obj); |
| } |
| + static Handle<ObjectHashTable> EnsureCapacity( |
| + Handle<ObjectHashTable> table, |
| + int n, |
| + Handle<Object> key, |
| + PretenureFlag pretenure = NOT_TENURED); |
| + |
| + // Attempt to shrink hash table after removal of key. |
| + static Handle<ObjectHashTable> Shrink(Handle<ObjectHashTable> table, |
| + Handle<Object> key); |
| + |
| // Looks up the value associated with the given key. The hole value is |
| // returned in case the key is not present. |
| Object* Lookup(Object* key); |
| // Adds (or overwrites) the value associated with the given key. Mapping a |
| // key to the hole value causes removal of the whole entry. |
| - MUST_USE_RESULT MaybeObject* Put(Object* key, Object* value); |
| + static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, |
| + Handle<Object> key, |
| + Handle<Object> value); |
| private: |
| friend class MarkCompactCollector; |
| @@ -9357,9 +9387,9 @@ class JSProxy: public JSReceiver { |
| uint32_t index, |
| DeleteMode mode); |
| - MUST_USE_RESULT MaybeObject* GetIdentityHash(CreationFlag flag); |
| - static Handle<Object> GetIdentityHash(Handle<JSProxy> proxy, |
| - CreationFlag flag); |
| + MUST_USE_RESULT Object* GetIdentityHash(); |
| + |
| + static Handle<Object> GetOrCreateIdentityHash(Handle<JSProxy> proxy); |
| DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy); |
| }; |