Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 45 // | 45 // |
| 46 // Inheritance hierarchy: | 46 // Inheritance hierarchy: |
| 47 // - MaybeObject (an object or a failure) | 47 // - MaybeObject (an object or a failure) |
| 48 // - Failure (immediate for marking failed operation) | 48 // - Failure (immediate for marking failed operation) |
| 49 // - Object | 49 // - Object |
| 50 // - Smi (immediate small integer) | 50 // - Smi (immediate small integer) |
| 51 // - HeapObject (superclass for everything allocated in the heap) | 51 // - HeapObject (superclass for everything allocated in the heap) |
| 52 // - JSReceiver (suitable for property access) | 52 // - JSReceiver (suitable for property access) |
| 53 // - JSObject | 53 // - JSObject |
| 54 // - JSArray | 54 // - JSArray |
| 55 // - JSSet | |
| 56 // - JSMap | |
| 55 // - JSWeakMap | 57 // - JSWeakMap |
| 56 // - JSRegExp | 58 // - JSRegExp |
| 57 // - JSFunction | 59 // - JSFunction |
| 58 // - GlobalObject | 60 // - GlobalObject |
| 59 // - JSGlobalObject | 61 // - JSGlobalObject |
| 60 // - JSBuiltinsObject | 62 // - JSBuiltinsObject |
| 61 // - JSGlobalProxy | 63 // - JSGlobalProxy |
| 62 // - JSValue | 64 // - JSValue |
| 63 // - JSMessageObject | 65 // - JSMessageObject |
| 64 // - JSProxy | 66 // - JSProxy |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 621 JS_FUNCTION_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE, FIRST_JS_PROXY_TYPE | 623 JS_FUNCTION_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE, FIRST_JS_PROXY_TYPE |
| 622 JS_PROXY_TYPE, // LAST_JS_PROXY_TYPE | 624 JS_PROXY_TYPE, // LAST_JS_PROXY_TYPE |
| 623 | 625 |
| 624 JS_VALUE_TYPE, // FIRST_JS_OBJECT_TYPE | 626 JS_VALUE_TYPE, // FIRST_JS_OBJECT_TYPE |
| 625 JS_OBJECT_TYPE, | 627 JS_OBJECT_TYPE, |
| 626 JS_CONTEXT_EXTENSION_OBJECT_TYPE, | 628 JS_CONTEXT_EXTENSION_OBJECT_TYPE, |
| 627 JS_GLOBAL_OBJECT_TYPE, | 629 JS_GLOBAL_OBJECT_TYPE, |
| 628 JS_BUILTINS_OBJECT_TYPE, | 630 JS_BUILTINS_OBJECT_TYPE, |
| 629 JS_GLOBAL_PROXY_TYPE, | 631 JS_GLOBAL_PROXY_TYPE, |
| 630 JS_ARRAY_TYPE, | 632 JS_ARRAY_TYPE, |
| 633 JS_SET_TYPE, | |
| 634 JS_MAP_TYPE, | |
| 631 JS_WEAK_MAP_TYPE, | 635 JS_WEAK_MAP_TYPE, |
| 632 | 636 |
| 633 JS_REGEXP_TYPE, | 637 JS_REGEXP_TYPE, |
| 634 | 638 |
| 635 JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE | 639 JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE |
| 636 | 640 |
| 637 // Pseudo-types | 641 // Pseudo-types |
| 638 FIRST_TYPE = 0x0, | 642 FIRST_TYPE = 0x0, |
| 639 LAST_TYPE = JS_FUNCTION_TYPE, | 643 LAST_TYPE = JS_FUNCTION_TYPE, |
| 640 INVALID_TYPE = FIRST_TYPE - 1, | 644 INVALID_TYPE = FIRST_TYPE - 1, |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 813 V(Oddball) \ | 817 V(Oddball) \ |
| 814 V(SharedFunctionInfo) \ | 818 V(SharedFunctionInfo) \ |
| 815 V(JSValue) \ | 819 V(JSValue) \ |
| 816 V(JSMessageObject) \ | 820 V(JSMessageObject) \ |
| 817 V(StringWrapper) \ | 821 V(StringWrapper) \ |
| 818 V(Foreign) \ | 822 V(Foreign) \ |
| 819 V(Boolean) \ | 823 V(Boolean) \ |
| 820 V(JSArray) \ | 824 V(JSArray) \ |
| 821 V(JSProxy) \ | 825 V(JSProxy) \ |
| 822 V(JSFunctionProxy) \ | 826 V(JSFunctionProxy) \ |
| 827 V(JSSet) \ | |
| 828 V(JSMap) \ | |
| 823 V(JSWeakMap) \ | 829 V(JSWeakMap) \ |
| 824 V(JSRegExp) \ | 830 V(JSRegExp) \ |
| 825 V(HashTable) \ | 831 V(HashTable) \ |
| 826 V(Dictionary) \ | 832 V(Dictionary) \ |
| 827 V(SymbolTable) \ | 833 V(SymbolTable) \ |
| 828 V(JSFunctionResultCache) \ | 834 V(JSFunctionResultCache) \ |
| 829 V(NormalizedMapCache) \ | 835 V(NormalizedMapCache) \ |
| 830 V(CompilationCacheTable) \ | 836 V(CompilationCacheTable) \ |
| 831 V(CodeCacheHashTable) \ | 837 V(CodeCacheHashTable) \ |
| 832 V(PolymorphicCodeCacheHashTable) \ | 838 V(PolymorphicCodeCacheHashTable) \ |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 929 | 935 |
| 930 static Handle<Object> GetElement(Handle<Object> object, uint32_t index); | 936 static Handle<Object> GetElement(Handle<Object> object, uint32_t index); |
| 931 inline MaybeObject* GetElement(uint32_t index); | 937 inline MaybeObject* GetElement(uint32_t index); |
| 932 // For use when we know that no exception can be thrown. | 938 // For use when we know that no exception can be thrown. |
| 933 inline Object* GetElementNoExceptionThrown(uint32_t index); | 939 inline Object* GetElementNoExceptionThrown(uint32_t index); |
| 934 MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index); | 940 MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index); |
| 935 | 941 |
| 936 // Return the object's prototype (might be Heap::null_value()). | 942 // Return the object's prototype (might be Heap::null_value()). |
| 937 Object* GetPrototype(); | 943 Object* GetPrototype(); |
| 938 | 944 |
| 945 // Returns the permanent hash code associated with this object depending on | |
| 946 // the actual object type. | |
| 947 uint32_t GetHash(); | |
|
rossberg
2011/10/24 15:44:11
It is not very intuitive that this function fails
Michael Starzinger
2011/10/25 11:17:26
Done. As discussed extensively offline, the only f
| |
| 948 | |
| 949 // Checks whether this object has the same value as the given one. This | |
| 950 // function is implemented according to ES5, section 9.12 and can be used | |
| 951 // to implement the Harmony "egal" function. | |
| 952 bool SameValue(Object* other); | |
| 953 | |
| 939 // Tries to convert an object to an array index. Returns true and sets | 954 // Tries to convert an object to an array index. Returns true and sets |
| 940 // the output parameter if it succeeds. | 955 // the output parameter if it succeeds. |
| 941 inline bool ToArrayIndex(uint32_t* index); | 956 inline bool ToArrayIndex(uint32_t* index); |
| 942 | 957 |
| 943 // Returns true if this is a JSValue containing a string and the index is | 958 // Returns true if this is a JSValue containing a string and the index is |
| 944 // < the length of the string. Used to implement [] on strings. | 959 // < the length of the string. Used to implement [] on strings. |
| 945 inline bool IsStringObjectWithCharacterAt(uint32_t index); | 960 inline bool IsStringObjectWithCharacterAt(uint32_t index); |
| 946 | 961 |
| 947 #ifdef DEBUG | 962 #ifdef DEBUG |
| 948 // Verify a pointer is a valid object pointer. | 963 // Verify a pointer is a valid object pointer. |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1377 inline bool HasLocalProperty(String* name); | 1392 inline bool HasLocalProperty(String* name); |
| 1378 inline bool HasElement(uint32_t index); | 1393 inline bool HasElement(uint32_t index); |
| 1379 | 1394 |
| 1380 // Return the object's prototype (might be Heap::null_value()). | 1395 // Return the object's prototype (might be Heap::null_value()). |
| 1381 inline Object* GetPrototype(); | 1396 inline Object* GetPrototype(); |
| 1382 | 1397 |
| 1383 // Set the object's prototype (only JSReceiver and null are allowed). | 1398 // Set the object's prototype (only JSReceiver and null are allowed). |
| 1384 MUST_USE_RESULT MaybeObject* SetPrototype(Object* value, | 1399 MUST_USE_RESULT MaybeObject* SetPrototype(Object* value, |
| 1385 bool skip_hidden_prototypes); | 1400 bool skip_hidden_prototypes); |
| 1386 | 1401 |
| 1402 // Checks whether the object has a permanent object identity hash. If this | |
| 1403 // function returns true, GetIdentityHash will never fail. | |
| 1404 inline bool HasIdentityHash(); | |
| 1405 | |
| 1387 // Retrieves a permanent object identity hash code. The undefined value might | 1406 // Retrieves a permanent object identity hash code. The undefined value might |
| 1388 // be returned in case no has been created yet and OMIT_CREATION was used. | 1407 // be returned in case no has been created yet and OMIT_CREATION was used. |
| 1389 inline MUST_USE_RESULT MaybeObject* GetIdentityHash(CreationFlag flag); | 1408 inline MUST_USE_RESULT MaybeObject* GetIdentityHash(CreationFlag flag); |
| 1390 | 1409 |
| 1391 // Lookup a property. If found, the result is valid and has | 1410 // Lookup a property. If found, the result is valid and has |
| 1392 // detailed information. | 1411 // detailed information. |
| 1393 void LocalLookup(String* name, LookupResult* result); | 1412 void LocalLookup(String* name, LookupResult* result); |
| 1394 void Lookup(String* name, LookupResult* result); | 1413 void Lookup(String* name, LookupResult* result); |
| 1395 | 1414 |
| 1396 protected: | 1415 protected: |
| (...skipping 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2943 // Remove all entries were key is a number and (from <= key && key < to). | 2962 // Remove all entries were key is a number and (from <= key && key < to). |
| 2944 void RemoveNumberEntries(uint32_t from, uint32_t to); | 2963 void RemoveNumberEntries(uint32_t from, uint32_t to); |
| 2945 | 2964 |
| 2946 // Bit masks. | 2965 // Bit masks. |
| 2947 static const int kRequiresSlowElementsMask = 1; | 2966 static const int kRequiresSlowElementsMask = 1; |
| 2948 static const int kRequiresSlowElementsTagSize = 1; | 2967 static const int kRequiresSlowElementsTagSize = 1; |
| 2949 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; | 2968 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; |
| 2950 }; | 2969 }; |
| 2951 | 2970 |
| 2952 | 2971 |
| 2972 template <int entrysize> | |
| 2953 class ObjectHashTableShape { | 2973 class ObjectHashTableShape { |
| 2954 public: | 2974 public: |
| 2955 static inline bool IsMatch(JSReceiver* key, Object* other); | 2975 static inline bool IsMatch(Object* key, Object* other); |
| 2956 static inline uint32_t Hash(JSReceiver* key); | 2976 static inline uint32_t Hash(Object* key); |
| 2957 static inline uint32_t HashForObject(JSReceiver* key, Object* object); | 2977 static inline uint32_t HashForObject(Object* key, Object* object); |
| 2958 MUST_USE_RESULT static inline MaybeObject* AsObject(JSReceiver* key); | 2978 MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key); |
| 2959 static const int kPrefixSize = 0; | 2979 static const int kPrefixSize = 0; |
| 2960 static const int kEntrySize = 2; | 2980 static const int kEntrySize = entrysize; |
| 2961 }; | 2981 }; |
| 2962 | 2982 |
| 2963 | 2983 |
| 2964 // ObjectHashTable maps keys that are JavaScript objects to object values by | 2984 // ObjectHashSet holds keys that are arbitrary objects by using the identity |
| 2985 // hash of the key for hashing purposes. | |
| 2986 class ObjectHashSet: public HashTable<ObjectHashTableShape<1>, Object*> { | |
| 2987 public: | |
| 2988 static inline ObjectHashSet* cast(Object* obj) { | |
| 2989 ASSERT(obj->IsHashTable()); | |
| 2990 return reinterpret_cast<ObjectHashSet*>(obj); | |
| 2991 } | |
| 2992 | |
| 2993 // Looks up whether the given key is part of this hash set. | |
| 2994 bool Contains(Object* key); | |
| 2995 | |
| 2996 // Adds the given key to this hash set. | |
| 2997 MUST_USE_RESULT MaybeObject* Add(Object* key); | |
| 2998 | |
| 2999 // Removes the given key from this hash set. | |
| 3000 MUST_USE_RESULT MaybeObject* Remove(Object* key); | |
| 3001 }; | |
| 3002 | |
| 3003 | |
| 3004 // ObjectHashTable maps keys that are arbitrary objects to object values by | |
| 2965 // using the identity hash of the key for hashing purposes. | 3005 // using the identity hash of the key for hashing purposes. |
| 2966 class ObjectHashTable: public HashTable<ObjectHashTableShape, JSReceiver*> { | 3006 class ObjectHashTable: public HashTable<ObjectHashTableShape<2>, Object*> { |
| 2967 public: | 3007 public: |
| 2968 static inline ObjectHashTable* cast(Object* obj) { | 3008 static inline ObjectHashTable* cast(Object* obj) { |
| 2969 ASSERT(obj->IsHashTable()); | 3009 ASSERT(obj->IsHashTable()); |
| 2970 return reinterpret_cast<ObjectHashTable*>(obj); | 3010 return reinterpret_cast<ObjectHashTable*>(obj); |
| 2971 } | 3011 } |
| 2972 | 3012 |
| 2973 // Looks up the value associated with the given key. The undefined value is | 3013 // Looks up the value associated with the given key. The undefined value is |
| 2974 // returned in case the key is not present. | 3014 // returned in case the key is not present. |
| 2975 Object* Lookup(JSReceiver* key); | 3015 Object* Lookup(Object* key); |
| 2976 | 3016 |
| 2977 // Adds (or overwrites) the value associated with the given key. Mapping a | 3017 // Adds (or overwrites) the value associated with the given key. Mapping a |
| 2978 // key to the undefined value causes removal of the whole entry. | 3018 // key to the undefined value causes removal of the whole entry. |
| 2979 MUST_USE_RESULT MaybeObject* Put(JSReceiver* key, Object* value); | 3019 MUST_USE_RESULT MaybeObject* Put(Object* key, Object* value); |
| 2980 | 3020 |
| 2981 private: | 3021 private: |
| 2982 friend class MarkCompactCollector; | 3022 friend class MarkCompactCollector; |
| 2983 | 3023 |
| 2984 void AddEntry(int entry, JSReceiver* key, Object* value); | 3024 void AddEntry(int entry, Object* key, Object* value); |
| 2985 void RemoveEntry(int entry, Heap* heap); | 3025 void RemoveEntry(int entry, Heap* heap); |
| 2986 inline void RemoveEntry(int entry); | 3026 inline void RemoveEntry(int entry); |
| 2987 | 3027 |
| 2988 // Returns the index to the value of an entry. | 3028 // Returns the index to the value of an entry. |
| 2989 static inline int EntryToValueIndex(int entry) { | 3029 static inline int EntryToValueIndex(int entry) { |
| 2990 return EntryToIndex(entry) + 1; | 3030 return EntryToIndex(entry) + 1; |
| 2991 } | 3031 } |
| 2992 }; | 3032 }; |
| 2993 | 3033 |
| 2994 | 3034 |
| (...skipping 3980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6975 | 7015 |
| 6976 typedef FixedBodyDescriptor<kHandlerOffset, | 7016 typedef FixedBodyDescriptor<kHandlerOffset, |
| 6977 kConstructTrapOffset + kPointerSize, | 7017 kConstructTrapOffset + kPointerSize, |
| 6978 kSize> BodyDescriptor; | 7018 kSize> BodyDescriptor; |
| 6979 | 7019 |
| 6980 private: | 7020 private: |
| 6981 DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunctionProxy); | 7021 DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunctionProxy); |
| 6982 }; | 7022 }; |
| 6983 | 7023 |
| 6984 | 7024 |
| 7025 // The JSSet describes EcmaScript Harmony maps | |
| 7026 class JSSet: public JSObject { | |
| 7027 public: | |
| 7028 // [set]: the backing hash set containing keys. | |
| 7029 DECL_ACCESSORS(table, Object) | |
| 7030 | |
| 7031 // Casting. | |
| 7032 static inline JSSet* cast(Object* obj); | |
| 7033 | |
| 7034 #ifdef OBJECT_PRINT | |
| 7035 inline void JSSetPrint() { | |
| 7036 JSSetPrint(stdout); | |
| 7037 } | |
| 7038 void JSSetPrint(FILE* out); | |
| 7039 #endif | |
| 7040 #ifdef DEBUG | |
| 7041 void JSSetVerify(); | |
| 7042 #endif | |
| 7043 | |
| 7044 static const int kTableOffset = JSObject::kHeaderSize; | |
| 7045 static const int kSize = kTableOffset + kPointerSize; | |
| 7046 | |
| 7047 private: | |
| 7048 DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet); | |
| 7049 }; | |
| 7050 | |
| 7051 | |
| 7052 // The JSMap describes EcmaScript Harmony maps | |
| 7053 class JSMap: public JSObject { | |
| 7054 public: | |
| 7055 // [table]: the backing hash table mapping keys to values. | |
| 7056 DECL_ACCESSORS(table, Object) | |
| 7057 | |
| 7058 // Casting. | |
| 7059 static inline JSMap* cast(Object* obj); | |
| 7060 | |
| 7061 #ifdef OBJECT_PRINT | |
| 7062 inline void JSMapPrint() { | |
| 7063 JSMapPrint(stdout); | |
| 7064 } | |
| 7065 void JSMapPrint(FILE* out); | |
| 7066 #endif | |
| 7067 #ifdef DEBUG | |
| 7068 void JSMapVerify(); | |
| 7069 #endif | |
| 7070 | |
| 7071 static const int kTableOffset = JSObject::kHeaderSize; | |
| 7072 static const int kSize = kTableOffset + kPointerSize; | |
| 7073 | |
| 7074 private: | |
| 7075 DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap); | |
| 7076 }; | |
| 7077 | |
| 7078 | |
| 6985 // The JSWeakMap describes EcmaScript Harmony weak maps | 7079 // The JSWeakMap describes EcmaScript Harmony weak maps |
| 6986 class JSWeakMap: public JSObject { | 7080 class JSWeakMap: public JSObject { |
| 6987 public: | 7081 public: |
| 6988 // [table]: the backing hash table mapping keys to values. | 7082 // [table]: the backing hash table mapping keys to values. |
| 6989 DECL_ACCESSORS(table, Object) | 7083 DECL_ACCESSORS(table, Object) |
| 6990 | 7084 |
| 6991 // [next]: linked list of encountered weak maps during GC. | 7085 // [next]: linked list of encountered weak maps during GC. |
| 6992 DECL_ACCESSORS(next, Object) | 7086 DECL_ACCESSORS(next, Object) |
| 6993 | 7087 |
| 6994 // Unchecked accessors to be used during GC. | 7088 // Unchecked accessors to be used during GC. |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7654 } else { | 7748 } else { |
| 7655 value &= ~(1 << bit_position); | 7749 value &= ~(1 << bit_position); |
| 7656 } | 7750 } |
| 7657 return value; | 7751 return value; |
| 7658 } | 7752 } |
| 7659 }; | 7753 }; |
| 7660 | 7754 |
| 7661 } } // namespace v8::internal | 7755 } } // namespace v8::internal |
| 7662 | 7756 |
| 7663 #endif // V8_OBJECTS_H_ | 7757 #endif // V8_OBJECTS_H_ |
| OLD | NEW |