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 2570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2581 // // The prefix size indicates number of elements in the beginning | 2581 // // The prefix size indicates number of elements in the beginning |
2582 // // of the backing storage. | 2582 // // of the backing storage. |
2583 // static const int kPrefixSize = ..; | 2583 // static const int kPrefixSize = ..; |
2584 // // The Element size indicates number of elements per entry. | 2584 // // The Element size indicates number of elements per entry. |
2585 // static const int kEntrySize = ..; | 2585 // static const int kEntrySize = ..; |
2586 // }; | 2586 // }; |
2587 // The prefix size indicates an amount of memory in the | 2587 // The prefix size indicates an amount of memory in the |
2588 // beginning of the backing storage that can be used for non-element | 2588 // beginning of the backing storage that can be used for non-element |
2589 // information by subclasses. | 2589 // information by subclasses. |
2590 | 2590 |
| 2591 template<typename Key> |
| 2592 class BaseShape { |
| 2593 public: |
| 2594 static const bool UsesSeed = false; |
| 2595 static uint32_t Hash(Key key) { return 0; } |
| 2596 static uint32_t SeededHash(Key key, uint32_t seed) { |
| 2597 // Won't be called if UsesSeed isn't overrided by child class |
| 2598 return Hash(key); |
| 2599 } |
| 2600 static uint32_t HashForObject(Key key, Object* object) { return 0; } |
| 2601 static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) { |
| 2602 // Won't be called if UsesSeed isn't overrided by child class |
| 2603 return HashForObject(key, object); |
| 2604 } |
| 2605 }; |
| 2606 |
2591 template<typename Shape, typename Key> | 2607 template<typename Shape, typename Key> |
2592 class HashTable: public FixedArray { | 2608 class HashTable: public FixedArray { |
2593 public: | 2609 public: |
| 2610 // Wrapper methods |
| 2611 inline uint32_t Hash(Key key) { |
| 2612 if (Shape::UsesSeed) { |
| 2613 return Shape::SeededHash(key, |
| 2614 GetHeap()->StringHashSeed()); |
| 2615 } else { |
| 2616 return Shape::Hash(key); |
| 2617 } |
| 2618 } |
| 2619 |
| 2620 inline uint32_t HashForObject(Key key, Object* object) { |
| 2621 if (Shape::UsesSeed) { |
| 2622 return Shape::SeededHashForObject(key, |
| 2623 GetHeap()->StringHashSeed(), object); |
| 2624 } else { |
| 2625 return Shape::HashForObject(key, object); |
| 2626 } |
| 2627 } |
| 2628 |
2594 // Returns the number of elements in the hash table. | 2629 // Returns the number of elements in the hash table. |
2595 int NumberOfElements() { | 2630 int NumberOfElements() { |
2596 return Smi::cast(get(kNumberOfElementsIndex))->value(); | 2631 return Smi::cast(get(kNumberOfElementsIndex))->value(); |
2597 } | 2632 } |
2598 | 2633 |
2599 // Returns the number of deleted elements in the hash table. | 2634 // Returns the number of deleted elements in the hash table. |
2600 int NumberOfDeletedElements() { | 2635 int NumberOfDeletedElements() { |
2601 return Smi::cast(get(kNumberOfDeletedElementsIndex))->value(); | 2636 return Smi::cast(get(kNumberOfDeletedElementsIndex))->value(); |
2602 } | 2637 } |
2603 | 2638 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2742 virtual uint32_t Hash() = 0; | 2777 virtual uint32_t Hash() = 0; |
2743 // Returns the hash value for object. | 2778 // Returns the hash value for object. |
2744 virtual uint32_t HashForObject(Object* key) = 0; | 2779 virtual uint32_t HashForObject(Object* key) = 0; |
2745 // Returns the key object for storing into the hash table. | 2780 // Returns the key object for storing into the hash table. |
2746 // If allocations fails a failure object is returned. | 2781 // If allocations fails a failure object is returned. |
2747 MUST_USE_RESULT virtual MaybeObject* AsObject() = 0; | 2782 MUST_USE_RESULT virtual MaybeObject* AsObject() = 0; |
2748 // Required. | 2783 // Required. |
2749 virtual ~HashTableKey() {} | 2784 virtual ~HashTableKey() {} |
2750 }; | 2785 }; |
2751 | 2786 |
2752 class SymbolTableShape { | 2787 class SymbolTableShape : public BaseShape<HashTableKey*> { |
2753 public: | 2788 public: |
2754 static inline bool IsMatch(HashTableKey* key, Object* value) { | 2789 static inline bool IsMatch(HashTableKey* key, Object* value) { |
2755 return key->IsMatch(value); | 2790 return key->IsMatch(value); |
2756 } | 2791 } |
2757 static inline uint32_t Hash(HashTableKey* key) { | 2792 static inline uint32_t Hash(HashTableKey* key) { |
2758 return key->Hash(); | 2793 return key->Hash(); |
2759 } | 2794 } |
2760 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 2795 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
2761 return key->HashForObject(object); | 2796 return key->HashForObject(object); |
2762 } | 2797 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2801 // Casting. | 2836 // Casting. |
2802 static inline SymbolTable* cast(Object* obj); | 2837 static inline SymbolTable* cast(Object* obj); |
2803 | 2838 |
2804 private: | 2839 private: |
2805 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s); | 2840 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s); |
2806 | 2841 |
2807 DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable); | 2842 DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable); |
2808 }; | 2843 }; |
2809 | 2844 |
2810 | 2845 |
2811 class MapCacheShape { | 2846 class MapCacheShape : public BaseShape<HashTableKey*> { |
2812 public: | 2847 public: |
2813 static inline bool IsMatch(HashTableKey* key, Object* value) { | 2848 static inline bool IsMatch(HashTableKey* key, Object* value) { |
2814 return key->IsMatch(value); | 2849 return key->IsMatch(value); |
2815 } | 2850 } |
2816 static inline uint32_t Hash(HashTableKey* key) { | 2851 static inline uint32_t Hash(HashTableKey* key) { |
2817 return key->Hash(); | 2852 return key->Hash(); |
2818 } | 2853 } |
2819 | 2854 |
2820 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 2855 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
2821 return key->HashForObject(object); | 2856 return key->HashForObject(object); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2957 uint32_t hash); | 2992 uint32_t hash); |
2958 | 2993 |
2959 // Generate new enumeration indices to avoid enumeration index overflow. | 2994 // Generate new enumeration indices to avoid enumeration index overflow. |
2960 MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices(); | 2995 MUST_USE_RESULT MaybeObject* GenerateNewEnumerationIndices(); |
2961 static const int kMaxNumberKeyIndex = | 2996 static const int kMaxNumberKeyIndex = |
2962 HashTable<Shape, Key>::kPrefixStartIndex; | 2997 HashTable<Shape, Key>::kPrefixStartIndex; |
2963 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; | 2998 static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; |
2964 }; | 2999 }; |
2965 | 3000 |
2966 | 3001 |
2967 class StringDictionaryShape { | 3002 class StringDictionaryShape : public BaseShape<String*> { |
2968 public: | 3003 public: |
2969 static inline bool IsMatch(String* key, Object* other); | 3004 static inline bool IsMatch(String* key, Object* other); |
2970 static inline uint32_t Hash(String* key); | 3005 static inline uint32_t Hash(String* key); |
2971 static inline uint32_t HashForObject(String* key, Object* object); | 3006 static inline uint32_t HashForObject(String* key, Object* object); |
2972 MUST_USE_RESULT static inline MaybeObject* AsObject(String* key); | 3007 MUST_USE_RESULT static inline MaybeObject* AsObject(String* key); |
2973 static const int kPrefixSize = 2; | 3008 static const int kPrefixSize = 2; |
2974 static const int kEntrySize = 3; | 3009 static const int kEntrySize = 3; |
2975 static const bool kIsEnumerable = true; | 3010 static const bool kIsEnumerable = true; |
2976 }; | 3011 }; |
2977 | 3012 |
(...skipping 12 matching lines...) Expand all Loading... |
2990 MUST_USE_RESULT MaybeObject* TransformPropertiesToFastFor( | 3025 MUST_USE_RESULT MaybeObject* TransformPropertiesToFastFor( |
2991 JSObject* obj, | 3026 JSObject* obj, |
2992 int unused_property_fields); | 3027 int unused_property_fields); |
2993 | 3028 |
2994 // Find entry for key, otherwise return kNotFound. Optimized version of | 3029 // Find entry for key, otherwise return kNotFound. Optimized version of |
2995 // HashTable::FindEntry. | 3030 // HashTable::FindEntry. |
2996 int FindEntry(String* key); | 3031 int FindEntry(String* key); |
2997 }; | 3032 }; |
2998 | 3033 |
2999 | 3034 |
3000 class NumberDictionaryShape { | 3035 class NumberDictionaryShape : public BaseShape<uint32_t> { |
3001 public: | 3036 public: |
| 3037 static const bool UsesSeed = true; |
| 3038 |
3002 static inline bool IsMatch(uint32_t key, Object* other); | 3039 static inline bool IsMatch(uint32_t key, Object* other); |
3003 static inline uint32_t Hash(uint32_t key); | 3040 static inline uint32_t Hash(uint32_t key); |
| 3041 static inline uint32_t SeededHash(uint32_t key, uint32_t seed); |
3004 static inline uint32_t HashForObject(uint32_t key, Object* object); | 3042 static inline uint32_t HashForObject(uint32_t key, Object* object); |
| 3043 static inline uint32_t SeededHashForObject(uint32_t key, uint32_t seed, |
| 3044 Object* object); |
3005 MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key); | 3045 MUST_USE_RESULT static inline MaybeObject* AsObject(uint32_t key); |
3006 static const int kPrefixSize = 2; | 3046 static const int kPrefixSize = 2; |
3007 static const int kEntrySize = 3; | 3047 static const int kEntrySize = 3; |
3008 static const bool kIsEnumerable = false; | 3048 static const bool kIsEnumerable = false; |
3009 }; | 3049 }; |
3010 | 3050 |
3011 | 3051 |
3012 class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { | 3052 class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> { |
3013 public: | 3053 public: |
3014 static NumberDictionary* cast(Object* obj) { | 3054 static NumberDictionary* cast(Object* obj) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3050 inline uint32_t max_number_key(); | 3090 inline uint32_t max_number_key(); |
3051 | 3091 |
3052 // Bit masks. | 3092 // Bit masks. |
3053 static const int kRequiresSlowElementsMask = 1; | 3093 static const int kRequiresSlowElementsMask = 1; |
3054 static const int kRequiresSlowElementsTagSize = 1; | 3094 static const int kRequiresSlowElementsTagSize = 1; |
3055 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; | 3095 static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; |
3056 }; | 3096 }; |
3057 | 3097 |
3058 | 3098 |
3059 template <int entrysize> | 3099 template <int entrysize> |
3060 class ObjectHashTableShape { | 3100 class ObjectHashTableShape : public BaseShape<Object*> { |
3061 public: | 3101 public: |
3062 static inline bool IsMatch(Object* key, Object* other); | 3102 static inline bool IsMatch(Object* key, Object* other); |
3063 static inline uint32_t Hash(Object* key); | 3103 static inline uint32_t Hash(Object* key); |
3064 static inline uint32_t HashForObject(Object* key, Object* object); | 3104 static inline uint32_t HashForObject(Object* key, Object* object); |
3065 MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key); | 3105 MUST_USE_RESULT static inline MaybeObject* AsObject(Object* key); |
3066 static const int kPrefixSize = 0; | 3106 static const int kPrefixSize = 0; |
3067 static const int kEntrySize = entrysize; | 3107 static const int kEntrySize = entrysize; |
3068 }; | 3108 }; |
3069 | 3109 |
3070 | 3110 |
(...skipping 2891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5962 // object is in the saved code field. | 6002 // object is in the saved code field. |
5963 static const int kCompilationErrorValue = -2; | 6003 static const int kCompilationErrorValue = -2; |
5964 | 6004 |
5965 // When we store the sweep generation at which we moved the code from the | 6005 // When we store the sweep generation at which we moved the code from the |
5966 // code index to the saved code index we mask it of to be in the [0:255] | 6006 // code index to the saved code index we mask it of to be in the [0:255] |
5967 // range. | 6007 // range. |
5968 static const int kCodeAgeMask = 0xff; | 6008 static const int kCodeAgeMask = 0xff; |
5969 }; | 6009 }; |
5970 | 6010 |
5971 | 6011 |
5972 class CompilationCacheShape { | 6012 class CompilationCacheShape : public BaseShape<HashTableKey*> { |
5973 public: | 6013 public: |
5974 static inline bool IsMatch(HashTableKey* key, Object* value) { | 6014 static inline bool IsMatch(HashTableKey* key, Object* value) { |
5975 return key->IsMatch(value); | 6015 return key->IsMatch(value); |
5976 } | 6016 } |
5977 | 6017 |
5978 static inline uint32_t Hash(HashTableKey* key) { | 6018 static inline uint32_t Hash(HashTableKey* key) { |
5979 return key->Hash(); | 6019 return key->Hash(); |
5980 } | 6020 } |
5981 | 6021 |
5982 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 6022 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6066 // Code cache layout of the default cache. Elements are alternating name and | 6106 // Code cache layout of the default cache. Elements are alternating name and |
6067 // code objects for non normal load/store/call IC's. | 6107 // code objects for non normal load/store/call IC's. |
6068 static const int kCodeCacheEntrySize = 2; | 6108 static const int kCodeCacheEntrySize = 2; |
6069 static const int kCodeCacheEntryNameOffset = 0; | 6109 static const int kCodeCacheEntryNameOffset = 0; |
6070 static const int kCodeCacheEntryCodeOffset = 1; | 6110 static const int kCodeCacheEntryCodeOffset = 1; |
6071 | 6111 |
6072 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache); | 6112 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache); |
6073 }; | 6113 }; |
6074 | 6114 |
6075 | 6115 |
6076 class CodeCacheHashTableShape { | 6116 class CodeCacheHashTableShape : public BaseShape<HashTableKey*> { |
6077 public: | 6117 public: |
6078 static inline bool IsMatch(HashTableKey* key, Object* value) { | 6118 static inline bool IsMatch(HashTableKey* key, Object* value) { |
6079 return key->IsMatch(value); | 6119 return key->IsMatch(value); |
6080 } | 6120 } |
6081 | 6121 |
6082 static inline uint32_t Hash(HashTableKey* key) { | 6122 static inline uint32_t Hash(HashTableKey* key) { |
6083 return key->Hash(); | 6123 return key->Hash(); |
6084 } | 6124 } |
6085 | 6125 |
6086 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { | 6126 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { |
(...skipping 1985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8072 } else { | 8112 } else { |
8073 value &= ~(1 << bit_position); | 8113 value &= ~(1 << bit_position); |
8074 } | 8114 } |
8075 return value; | 8115 return value; |
8076 } | 8116 } |
8077 }; | 8117 }; |
8078 | 8118 |
8079 } } // namespace v8::internal | 8119 } } // namespace v8::internal |
8080 | 8120 |
8081 #endif // V8_OBJECTS_H_ | 8121 #endif // V8_OBJECTS_H_ |
OLD | NEW |