Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index e8c985048455e406c77c6b4c6814261f2cb7ab41..73ccc58094fb3d19d6261e7f74fd2793fccf8211 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. |
+ Object* GetHash(); |
+ |
// 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 Object* GetIdentityHash(); |
+ |
+ // 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. |
@@ -2303,8 +2309,7 @@ class JSObject: public JSReceiver { |
// Returns true if the object has a property with the hidden string as name. |
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 +2863,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 +3491,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 +3601,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 +4067,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 +4096,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 +9386,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); |
}; |