Chromium Code Reviews| Index: src/objects.h |
| diff --git a/src/objects.h b/src/objects.h |
| index 2938750e54d3437e642511b1e5af7353df361c8d..f1bb642180a2ebbeb3e90f5b15d25a9bacf44e68 100644 |
| --- a/src/objects.h |
| +++ b/src/objects.h |
| @@ -52,6 +52,8 @@ |
| // - JSReceiver (suitable for property access) |
| // - JSObject |
| // - JSArray |
| +// - JSSet |
| +// - JSMap |
| // - JSWeakMap |
| // - JSRegExp |
| // - JSFunction |
| @@ -628,6 +630,8 @@ enum InstanceType { |
| JS_BUILTINS_OBJECT_TYPE, |
| JS_GLOBAL_PROXY_TYPE, |
| JS_ARRAY_TYPE, |
| + JS_SET_TYPE, |
| + JS_MAP_TYPE, |
| JS_WEAK_MAP_TYPE, |
| JS_REGEXP_TYPE, |
| @@ -820,6 +824,8 @@ class MaybeObject BASE_EMBEDDED { |
| V(JSArray) \ |
| V(JSProxy) \ |
| V(JSFunctionProxy) \ |
| + V(JSSet) \ |
| + V(JSMap) \ |
| V(JSWeakMap) \ |
| V(JSRegExp) \ |
| V(HashTable) \ |
| @@ -936,6 +942,16 @@ class Object : public MaybeObject { |
| // Return the object's prototype (might be Heap::null_value()). |
| Object* GetPrototype(); |
| + // 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); |
| + |
| + // 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 |
| + // to implement the Harmony "egal" function. |
| + bool SameValue(Object* other); |
| + |
| // Tries to convert an object to an array index. Returns true and sets |
| // the output parameter if it succeeds. |
| inline bool ToArrayIndex(uint32_t* index); |
| @@ -1385,7 +1401,7 @@ class JSReceiver: public HeapObject { |
| bool skip_hidden_prototypes); |
| // Retrieves a permanent object identity hash code. The undefined value might |
| - // be returned in case no has been created yet and OMIT_CREATION was used. |
| + // be returned in case no hash was created yet and OMIT_CREATION was used. |
| inline MUST_USE_RESULT MaybeObject* GetIdentityHash(CreationFlag flag); |
| // Lookup a property. If found, the result is valid and has |
| @@ -2950,20 +2966,41 @@ class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { |
| }; |
| +template <int entrysize> |
| class ObjectHashTableShape { |
| public: |
| - static inline bool IsMatch(JSReceiver* key, Object* other); |
| - static inline uint32_t Hash(JSReceiver* key); |
| - static inline uint32_t HashForObject(JSReceiver* key, Object* object); |
| - MUST_USE_RESULT static inline MaybeObject* AsObject(JSReceiver* key); |
| + static inline bool IsMatch(Object* key, Object* other); |
| + static inline uint32_t Hash(Object* key); |
| + static inline uint32_t HashForObject(Object* key, Object* object); |
| + MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key); |
| static const int kPrefixSize = 0; |
| - static const int kEntrySize = 2; |
| + static const int kEntrySize = entrysize; |
| +}; |
| + |
| + |
| +// ObjectHashSet holds keys that are arbitrary objects by using the identity |
| +// hash of the key for hashing purposes. |
| +class ObjectHashSet: public HashTable<ObjectHashTableShape<1>, Object*> { |
| + public: |
| + static inline ObjectHashSet* cast(Object* obj) { |
| + ASSERT(obj->IsHashTable()); |
| + return reinterpret_cast<ObjectHashSet*>(obj); |
| + } |
| + |
| + // Looks up whether the given key is part of this hash set. |
| + bool Contains(Object* key); |
| + |
| + // Adds the given key to this hash set. |
| + MUST_USE_RESULT MaybeObject* Add(Object* key); |
| + |
| + // Removes the given key from this hash set. |
| + MUST_USE_RESULT MaybeObject* Remove(Object* key); |
| }; |
| -// ObjectHashTable maps keys that are JavaScript objects to object values by |
| +// ObjectHashTable maps keys that are arbitrary objects to object values by |
| // using the identity hash of the key for hashing purposes. |
| -class ObjectHashTable: public HashTable<ObjectHashTableShape, JSReceiver*> { |
| +class ObjectHashTable: public HashTable<ObjectHashTableShape<2>, Object*> { |
| public: |
| static inline ObjectHashTable* cast(Object* obj) { |
| ASSERT(obj->IsHashTable()); |
| @@ -2972,16 +3009,16 @@ class ObjectHashTable: public HashTable<ObjectHashTableShape, JSReceiver*> { |
| // Looks up the value associated with the given key. The undefined value is |
| // returned in case the key is not present. |
| - Object* Lookup(JSReceiver* key); |
| + Object* Lookup(Object* key); |
| // Adds (or overwrites) the value associated with the given key. Mapping a |
| // key to the undefined value causes removal of the whole entry. |
| - MUST_USE_RESULT MaybeObject* Put(JSReceiver* key, Object* value); |
| + MUST_USE_RESULT MaybeObject* Put(Object* key, Object* value); |
| private: |
| friend class MarkCompactCollector; |
| - void AddEntry(int entry, JSReceiver* key, Object* value); |
| + void AddEntry(int entry, Object* key, Object* value); |
| void RemoveEntry(int entry, Heap* heap); |
| inline void RemoveEntry(int entry); |
| @@ -6982,6 +7019,60 @@ class JSFunctionProxy: public JSProxy { |
| }; |
| +// The JSSet describes EcmaScript Harmony maps |
|
arv (Not doing code reviews)
2011/10/26 17:09:44
nit
// The JSSet describes EcmaScript Harmony *s
Michael Starzinger
2011/10/27 15:36:05
Done (will include in next CL).
|
| +class JSSet: public JSObject { |
| + public: |
| + // [set]: the backing hash set containing keys. |
| + DECL_ACCESSORS(table, Object) |
| + |
| + // Casting. |
| + static inline JSSet* cast(Object* obj); |
| + |
| +#ifdef OBJECT_PRINT |
| + inline void JSSetPrint() { |
| + JSSetPrint(stdout); |
| + } |
| + void JSSetPrint(FILE* out); |
| +#endif |
| +#ifdef DEBUG |
| + void JSSetVerify(); |
| +#endif |
| + |
| + static const int kTableOffset = JSObject::kHeaderSize; |
| + static const int kSize = kTableOffset + kPointerSize; |
| + |
| + private: |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet); |
| +}; |
| + |
| + |
| +// The JSMap describes EcmaScript Harmony maps |
| +class JSMap: public JSObject { |
| + public: |
| + // [table]: the backing hash table mapping keys to values. |
| + DECL_ACCESSORS(table, Object) |
| + |
| + // Casting. |
| + static inline JSMap* cast(Object* obj); |
| + |
| +#ifdef OBJECT_PRINT |
| + inline void JSMapPrint() { |
| + JSMapPrint(stdout); |
| + } |
| + void JSMapPrint(FILE* out); |
| +#endif |
| +#ifdef DEBUG |
| + void JSMapVerify(); |
| +#endif |
| + |
| + static const int kTableOffset = JSObject::kHeaderSize; |
| + static const int kSize = kTableOffset + kPointerSize; |
| + |
| + private: |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap); |
| +}; |
| + |
| + |
| // The JSWeakMap describes EcmaScript Harmony weak maps |
| class JSWeakMap: public JSObject { |
| public: |