Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: src/objects.h

Issue 11035053: Rollback trunk to bleeding_edge revision 12525 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mips/macro-assembler-mips.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 OMIT_CREATION 170 OMIT_CREATION
171 }; 171 };
172 172
173 173
174 // Indicates whether transitions can be added to a source map or not. 174 // Indicates whether transitions can be added to a source map or not.
175 enum TransitionFlag { 175 enum TransitionFlag {
176 INSERT_TRANSITION, 176 INSERT_TRANSITION,
177 OMIT_TRANSITION 177 OMIT_TRANSITION
178 }; 178 };
179 179
180
181 // Indicates whether the transition is simple: the target map of the transition
182 // either extends the current map with a new property, or it modifies the
183 // property that was added last to the current map.
184 enum SimpleTransitionFlag {
185 SIMPLE_TRANSITION,
186 FULL_TRANSITION
187 };
188
189
190 // Indicates whether we are only interested in the descriptors of a particular 180 // Indicates whether we are only interested in the descriptors of a particular
191 // map, or in all descriptors in the descriptor array. 181 // map, or in all descriptors in the descriptor array.
192 enum DescriptorFlag { 182 enum DescriptorFlag {
193 ALL_DESCRIPTORS, 183 ALL_DESCRIPTORS,
194 OWN_DESCRIPTORS 184 OWN_DESCRIPTORS
195 }; 185 };
196 186
197 187
198 // Instance size sentinel for objects of variable size. 188 // Instance size sentinel for objects of variable size.
199 const int kVariableSizeSentinel = 0; 189 const int kVariableSizeSentinel = 0;
(...skipping 1490 matching lines...) Expand 10 before | Expand all | Expand 10 after
1690 1680
1691 MUST_USE_RESULT MaybeObject* DefineAccessor(AccessorInfo* info); 1681 MUST_USE_RESULT MaybeObject* DefineAccessor(AccessorInfo* info);
1692 1682
1693 // Used from Object::GetProperty(). 1683 // Used from Object::GetProperty().
1694 MUST_USE_RESULT MaybeObject* GetPropertyWithFailedAccessCheck( 1684 MUST_USE_RESULT MaybeObject* GetPropertyWithFailedAccessCheck(
1695 Object* receiver, 1685 Object* receiver,
1696 LookupResult* result, 1686 LookupResult* result,
1697 String* name, 1687 String* name,
1698 PropertyAttributes* attributes); 1688 PropertyAttributes* attributes);
1699 MUST_USE_RESULT MaybeObject* GetPropertyWithInterceptor( 1689 MUST_USE_RESULT MaybeObject* GetPropertyWithInterceptor(
1700 Object* receiver, 1690 JSReceiver* receiver,
1701 String* name, 1691 String* name,
1702 PropertyAttributes* attributes); 1692 PropertyAttributes* attributes);
1703 MUST_USE_RESULT MaybeObject* GetPropertyPostInterceptor( 1693 MUST_USE_RESULT MaybeObject* GetPropertyPostInterceptor(
1704 Object* receiver, 1694 JSReceiver* receiver,
1705 String* name, 1695 String* name,
1706 PropertyAttributes* attributes); 1696 PropertyAttributes* attributes);
1707 MUST_USE_RESULT MaybeObject* GetLocalPropertyPostInterceptor( 1697 MUST_USE_RESULT MaybeObject* GetLocalPropertyPostInterceptor(
1708 Object* receiver, 1698 JSReceiver* receiver,
1709 String* name, 1699 String* name,
1710 PropertyAttributes* attributes); 1700 PropertyAttributes* attributes);
1711 1701
1712 // Returns true if this is an instance of an api function and has 1702 // Returns true if this is an instance of an api function and has
1713 // been modified since it was created. May give false positives. 1703 // been modified since it was created. May give false positives.
1714 bool IsDirty(); 1704 bool IsDirty();
1715 1705
1716 // If the receiver is a JSGlobalProxy this method will return its prototype, 1706 // If the receiver is a JSGlobalProxy this method will return its prototype,
1717 // otherwise the result is the receiver itself. 1707 // otherwise the result is the receiver itself.
1718 inline Object* BypassGlobalProxy(); 1708 inline Object* BypassGlobalProxy();
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
2487 2477
2488 // Returns true for both shared empty_descriptor_array and for smis, which the 2478 // Returns true for both shared empty_descriptor_array and for smis, which the
2489 // map uses to encode additional bit fields when the descriptor array is not 2479 // map uses to encode additional bit fields when the descriptor array is not
2490 // yet used. 2480 // yet used.
2491 inline bool IsEmpty(); 2481 inline bool IsEmpty();
2492 2482
2493 // Returns the number of descriptors in the array. 2483 // Returns the number of descriptors in the array.
2494 int number_of_descriptors() { 2484 int number_of_descriptors() {
2495 ASSERT(length() >= kFirstIndex || IsEmpty()); 2485 ASSERT(length() >= kFirstIndex || IsEmpty());
2496 int len = length(); 2486 int len = length();
2497 return len == 0 ? 0 : Smi::cast(get(kDescriptorLengthIndex))->value(); 2487 return len <= kFirstIndex ? 0 : (len - kFirstIndex) / kDescriptorSize;
2498 } 2488 }
2499 2489
2500 int number_of_descriptors_storage() {
2501 int len = length();
2502 return len == 0 ? 0 : (len - kFirstIndex) / kDescriptorSize;
2503 }
2504
2505 int NumberOfSlackDescriptors() {
2506 return number_of_descriptors_storage() - number_of_descriptors();
2507 }
2508
2509 inline void SetNumberOfDescriptors(int number_of_descriptors);
2510 inline int number_of_entries() { return number_of_descriptors(); } 2490 inline int number_of_entries() { return number_of_descriptors(); }
2511 2491
2512 bool HasEnumCache() { 2492 bool HasEnumCache() {
2513 return !IsEmpty() && !get(kEnumCacheIndex)->IsSmi(); 2493 return !IsEmpty() && !get(kEnumCacheIndex)->IsSmi();
2514 } 2494 }
2515 2495
2516 void CopyEnumCacheFrom(DescriptorArray* array) { 2496 void CopyEnumCacheFrom(DescriptorArray* array) {
2517 set(kEnumCacheIndex, array->get(kEnumCacheIndex)); 2497 set(kEnumCacheIndex, array->get(kEnumCacheIndex));
2518 } 2498 }
2519 2499
2520 FixedArray* GetEnumCache() { 2500 Object* GetEnumCache() {
2521 ASSERT(HasEnumCache()); 2501 ASSERT(HasEnumCache());
2522 FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex)); 2502 FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
2523 return FixedArray::cast(bridge->get(kEnumCacheBridgeCacheIndex)); 2503 return bridge->get(kEnumCacheBridgeCacheIndex);
2524 }
2525
2526 bool HasEnumIndicesCache() {
2527 if (IsEmpty()) return false;
2528 Object* object = get(kEnumCacheIndex);
2529 if (object->IsSmi()) return false;
2530 FixedArray* bridge = FixedArray::cast(object);
2531 return !bridge->get(kEnumCacheBridgeIndicesCacheIndex)->IsSmi();
2532 }
2533
2534 FixedArray* GetEnumIndicesCache() {
2535 ASSERT(HasEnumIndicesCache());
2536 FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
2537 return FixedArray::cast(bridge->get(kEnumCacheBridgeIndicesCacheIndex));
2538 } 2504 }
2539 2505
2540 Object** GetEnumCacheSlot() { 2506 Object** GetEnumCacheSlot() {
2541 ASSERT(HasEnumCache()); 2507 ASSERT(HasEnumCache());
2542 return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), 2508 return HeapObject::RawField(reinterpret_cast<HeapObject*>(this),
2543 kEnumCacheOffset); 2509 kEnumCacheOffset);
2544 } 2510 }
2545 2511
2546 void ClearEnumCache(); 2512 void ClearEnumCache();
2547 2513
(...skipping 17 matching lines...) Expand all
2565 2531
2566 inline String* GetSortedKey(int descriptor_number); 2532 inline String* GetSortedKey(int descriptor_number);
2567 inline int GetSortedKeyIndex(int descriptor_number); 2533 inline int GetSortedKeyIndex(int descriptor_number);
2568 inline void SetSortedKey(int pointer, int descriptor_number); 2534 inline void SetSortedKey(int pointer, int descriptor_number);
2569 2535
2570 // Accessor for complete descriptor. 2536 // Accessor for complete descriptor.
2571 inline void Get(int descriptor_number, Descriptor* desc); 2537 inline void Get(int descriptor_number, Descriptor* desc);
2572 inline void Set(int descriptor_number, 2538 inline void Set(int descriptor_number,
2573 Descriptor* desc, 2539 Descriptor* desc,
2574 const WhitenessWitness&); 2540 const WhitenessWitness&);
2575 inline void Set(int descriptor_number, Descriptor* desc);
2576 inline void EraseDescriptor(Heap* heap, int descriptor_number);
2577 2541
2578 // Append automatically sets the enumeration index. This should only be used 2542 // Append automatically sets the enumeration index. This should only be used
2579 // to add descriptors in bulk at the end, followed by sorting the descriptor 2543 // to add descriptors in bulk at the end, followed by sorting the descriptor
2580 // array. 2544 // array.
2581 inline void Append(Descriptor* desc, const WhitenessWitness&); 2545 inline void Append(Descriptor* desc,
2582 inline void Append(Descriptor* desc); 2546 const WhitenessWitness&,
2547 int number_of_set_descriptors);
2583 2548
2584 // Transfer a complete descriptor from the src descriptor array to this 2549 // Transfer a complete descriptor from the src descriptor array to this
2585 // descriptor array. 2550 // descriptor array.
2586 void CopyFrom(int dst_index, 2551 void CopyFrom(int dst_index,
2587 DescriptorArray* src, 2552 DescriptorArray* src,
2588 int src_index, 2553 int src_index,
2589 const WhitenessWitness&); 2554 const WhitenessWitness&);
2590 2555
2591 MUST_USE_RESULT MaybeObject* CopyUpTo(int enumeration_index); 2556 MUST_USE_RESULT MaybeObject* CopyUpTo(int enumeration_index);
2592 2557
2593 // Sort the instance descriptors by the hash codes of their keys. 2558 // Sort the instance descriptors by the hash codes of their keys.
2594 void Sort(); 2559 void Sort();
2595 2560
2596 // Search the instance descriptors for given name. 2561 // Search the instance descriptors for given name.
2597 INLINE(int Search(String* name, int number_of_own_descriptors)); 2562 INLINE(int Search(String* name, int number_of_own_descriptors));
2598 2563
2599 // As the above, but uses DescriptorLookupCache and updates it when 2564 // As the above, but uses DescriptorLookupCache and updates it when
2600 // necessary. 2565 // necessary.
2601 INLINE(int SearchWithCache(String* name, Map* map)); 2566 INLINE(int SearchWithCache(String* name, Map* map));
2602 2567
2603 // Allocates a DescriptorArray, but returns the singleton 2568 // Allocates a DescriptorArray, but returns the singleton
2604 // empty descriptor array object if number_of_descriptors is 0. 2569 // empty descriptor array object if number_of_descriptors is 0.
2605 MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors, 2570 MUST_USE_RESULT static MaybeObject* Allocate(int number_of_descriptors);
2606 int slack = 0);
2607 2571
2608 // Casting. 2572 // Casting.
2609 static inline DescriptorArray* cast(Object* obj); 2573 static inline DescriptorArray* cast(Object* obj);
2610 2574
2611 // Constant for denoting key was not found. 2575 // Constant for denoting key was not found.
2612 static const int kNotFound = -1; 2576 static const int kNotFound = -1;
2613 2577
2614 static const int kDescriptorLengthIndex = 0; 2578 static const int kEnumCacheIndex = 0;
2615 static const int kEnumCacheIndex = 1; 2579 static const int kFirstIndex = 1;
2616 static const int kFirstIndex = 2;
2617 2580
2618 // The length of the "bridge" to the enum cache. 2581 // The length of the "bridge" to the enum cache.
2619 static const int kEnumCacheBridgeLength = 2; 2582 static const int kEnumCacheBridgeLength = 2;
2620 static const int kEnumCacheBridgeCacheIndex = 0; 2583 static const int kEnumCacheBridgeCacheIndex = 0;
2621 static const int kEnumCacheBridgeIndicesCacheIndex = 1; 2584 static const int kEnumCacheBridgeIndicesCacheIndex = 1;
2622 2585
2623 // Layout description. 2586 // Layout description.
2624 static const int kDescriptorLengthOffset = FixedArray::kHeaderSize; 2587 static const int kEnumCacheOffset = FixedArray::kHeaderSize;
2625 static const int kEnumCacheOffset = kDescriptorLengthOffset + kPointerSize;
2626 static const int kFirstOffset = kEnumCacheOffset + kPointerSize; 2588 static const int kFirstOffset = kEnumCacheOffset + kPointerSize;
2627 2589
2628 // Layout description for the bridge array. 2590 // Layout description for the bridge array.
2629 static const int kEnumCacheBridgeCacheOffset = FixedArray::kHeaderSize; 2591 static const int kEnumCacheBridgeCacheOffset = FixedArray::kHeaderSize;
2630 2592
2631 // Layout of descriptor. 2593 // Layout of descriptor.
2632 static const int kDescriptorKey = 0; 2594 static const int kDescriptorKey = 0;
2633 static const int kDescriptorDetails = 1; 2595 static const int kDescriptorDetails = 1;
2634 static const int kDescriptorValue = 2; 2596 static const int kDescriptorValue = 2;
2635 static const int kDescriptorSize = 3; 2597 static const int kDescriptorSize = 3;
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
2906 set(kCapacityIndex, Smi::FromInt(capacity)); 2868 set(kCapacityIndex, Smi::FromInt(capacity));
2907 } 2869 }
2908 2870
2909 2871
2910 // Returns probe entry. 2872 // Returns probe entry.
2911 static uint32_t GetProbe(uint32_t hash, uint32_t number, uint32_t size) { 2873 static uint32_t GetProbe(uint32_t hash, uint32_t number, uint32_t size) {
2912 ASSERT(IsPowerOf2(size)); 2874 ASSERT(IsPowerOf2(size));
2913 return (hash + GetProbeOffset(number)) & (size - 1); 2875 return (hash + GetProbeOffset(number)) & (size - 1);
2914 } 2876 }
2915 2877
2916 inline static uint32_t FirstProbe(uint32_t hash, uint32_t size) { 2878 static uint32_t FirstProbe(uint32_t hash, uint32_t size) {
2917 return hash & (size - 1); 2879 return hash & (size - 1);
2918 } 2880 }
2919 2881
2920 inline static uint32_t NextProbe( 2882 static uint32_t NextProbe(uint32_t last, uint32_t number, uint32_t size) {
2921 uint32_t last, uint32_t number, uint32_t size) {
2922 return (last + number) & (size - 1); 2883 return (last + number) & (size - 1);
2923 } 2884 }
2924 2885
2925 // Rehashes this hash-table into the new table. 2886 // Rehashes this hash-table into the new table.
2926 MUST_USE_RESULT MaybeObject* Rehash(HashTable* new_table, Key key); 2887 MUST_USE_RESULT MaybeObject* Rehash(HashTable* new_table, Key key);
2927 2888
2928 // Attempt to shrink hash table after removal of key. 2889 // Attempt to shrink hash table after removal of key.
2929 MUST_USE_RESULT MaybeObject* Shrink(Key key); 2890 MUST_USE_RESULT MaybeObject* Shrink(Key key);
2930 2891
2931 // Ensure enough space for n additional elements. 2892 // Ensure enough space for n additional elements.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2998 // parameter. 2959 // parameter.
2999 bool LookupSymbolIfExists(String* str, String** symbol); 2960 bool LookupSymbolIfExists(String* str, String** symbol);
3000 bool LookupTwoCharsSymbolIfExists(uint32_t c1, uint32_t c2, String** symbol); 2961 bool LookupTwoCharsSymbolIfExists(uint32_t c1, uint32_t c2, String** symbol);
3001 2962
3002 // Casting. 2963 // Casting.
3003 static inline SymbolTable* cast(Object* obj); 2964 static inline SymbolTable* cast(Object* obj);
3004 2965
3005 private: 2966 private:
3006 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s); 2967 MUST_USE_RESULT MaybeObject* LookupKey(HashTableKey* key, Object** s);
3007 2968
3008 template <bool seq_ascii> friend class JsonParser;
3009
3010 DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable); 2969 DISALLOW_IMPLICIT_CONSTRUCTORS(SymbolTable);
3011 }; 2970 };
3012 2971
3013 2972
3014 class MapCacheShape : public BaseShape<HashTableKey*> { 2973 class MapCacheShape : public BaseShape<HashTableKey*> {
3015 public: 2974 public:
3016 static inline bool IsMatch(HashTableKey* key, Object* value) { 2975 static inline bool IsMatch(HashTableKey* key, Object* value) {
3017 return key->IsMatch(value); 2976 return key->IsMatch(value);
3018 } 2977 }
3019 static inline uint32_t Hash(HashTableKey* key) { 2978 static inline uint32_t Hash(HashTableKey* key) {
(...skipping 1822 matching lines...) Expand 10 before | Expand all | Expand 10 after
4842 ElementsKind to_kind); 4801 ElementsKind to_kind);
4843 4802
4844 bool StoresOwnDescriptors() { return HasTransitionArray(); } 4803 bool StoresOwnDescriptors() { return HasTransitionArray(); }
4845 inline bool HasTransitionArray(); 4804 inline bool HasTransitionArray();
4846 inline bool HasElementsTransition(); 4805 inline bool HasElementsTransition();
4847 inline Map* elements_transition_map(); 4806 inline Map* elements_transition_map();
4848 MUST_USE_RESULT inline MaybeObject* set_elements_transition_map( 4807 MUST_USE_RESULT inline MaybeObject* set_elements_transition_map(
4849 Map* transitioned_map); 4808 Map* transitioned_map);
4850 inline void SetTransition(int transition_index, Map* target); 4809 inline void SetTransition(int transition_index, Map* target);
4851 inline Map* GetTransition(int transition_index); 4810 inline Map* GetTransition(int transition_index);
4852 MUST_USE_RESULT inline MaybeObject* AddTransition(String* key, 4811 MUST_USE_RESULT inline MaybeObject* AddTransition(String* key, Map* target);
4853 Map* target,
4854 SimpleTransitionFlag flag);
4855 DECL_ACCESSORS(transitions, TransitionArray) 4812 DECL_ACCESSORS(transitions, TransitionArray)
4856 inline void ClearTransitions(Heap* heap, 4813 inline void ClearTransitions(Heap* heap,
4857 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 4814 WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
4858 4815
4859 // Tells whether the map is attached to SharedFunctionInfo 4816 // Tells whether the map is attached to SharedFunctionInfo
4860 // (for inobject slack tracking). 4817 // (for inobject slack tracking).
4861 inline void set_attached_to_shared_function_info(bool value); 4818 inline void set_attached_to_shared_function_info(bool value);
4862 4819
4863 inline bool attached_to_shared_function_info(); 4820 inline bool attached_to_shared_function_info();
4864 4821
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
4995 4952
4996 inline bool owns_descriptors(); 4953 inline bool owns_descriptors();
4997 inline void set_owns_descriptors(bool is_shared); 4954 inline void set_owns_descriptors(bool is_shared);
4998 4955
4999 MUST_USE_RESULT MaybeObject* RawCopy(int instance_size); 4956 MUST_USE_RESULT MaybeObject* RawCopy(int instance_size);
5000 MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors(); 4957 MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors();
5001 MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); 4958 MUST_USE_RESULT MaybeObject* CopyDropDescriptors();
5002 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptors( 4959 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptors(
5003 DescriptorArray* descriptors, 4960 DescriptorArray* descriptors,
5004 String* name, 4961 String* name,
5005 TransitionFlag flag, 4962 TransitionFlag flag);
5006 int descriptor_index);
5007 MUST_USE_RESULT MaybeObject* ShareDescriptor(Descriptor* descriptor); 4963 MUST_USE_RESULT MaybeObject* ShareDescriptor(Descriptor* descriptor);
5008 MUST_USE_RESULT MaybeObject* CopyAddDescriptor(Descriptor* descriptor, 4964 MUST_USE_RESULT MaybeObject* CopyAddDescriptor(Descriptor* descriptor,
5009 TransitionFlag flag); 4965 TransitionFlag flag);
5010 MUST_USE_RESULT MaybeObject* CopyInsertDescriptor(Descriptor* descriptor, 4966 MUST_USE_RESULT MaybeObject* CopyInsertDescriptor(Descriptor* descriptor,
5011 TransitionFlag flag); 4967 TransitionFlag flag);
5012 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptor(Descriptor* descriptor, 4968 MUST_USE_RESULT MaybeObject* CopyReplaceDescriptor(Descriptor* descriptor,
5013 int index, 4969 int index,
5014 TransitionFlag flag); 4970 TransitionFlag flag);
5015 MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind, 4971 MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind,
5016 TransitionFlag flag); 4972 TransitionFlag flag);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5048 inline void ClearCodeCache(Heap* heap); 5004 inline void ClearCodeCache(Heap* heap);
5049 5005
5050 // Update code cache. 5006 // Update code cache.
5051 static void UpdateCodeCache(Handle<Map> map, 5007 static void UpdateCodeCache(Handle<Map> map,
5052 Handle<String> name, 5008 Handle<String> name,
5053 Handle<Code> code); 5009 Handle<Code> code);
5054 MUST_USE_RESULT MaybeObject* UpdateCodeCache(String* name, Code* code); 5010 MUST_USE_RESULT MaybeObject* UpdateCodeCache(String* name, Code* code);
5055 5011
5056 // Extend the descriptor array of the map with the list of descriptors. 5012 // Extend the descriptor array of the map with the list of descriptors.
5057 // In case of duplicates, the latest descriptor is used. 5013 // In case of duplicates, the latest descriptor is used.
5058 static void AppendCallbackDescriptors(Handle<Map> map, 5014 static void CopyAppendCallbackDescriptors(Handle<Map> map,
5059 Handle<Object> descriptors); 5015 Handle<Object> descriptors);
5060
5061 static void EnsureDescriptorSlack(Handle<Map> map, int slack);
5062 5016
5063 // Returns the found code or undefined if absent. 5017 // Returns the found code or undefined if absent.
5064 Object* FindInCodeCache(String* name, Code::Flags flags); 5018 Object* FindInCodeCache(String* name, Code::Flags flags);
5065 5019
5066 // Returns the non-negative index of the code object if it is in the 5020 // Returns the non-negative index of the code object if it is in the
5067 // cache and -1 otherwise. 5021 // cache and -1 otherwise.
5068 int IndexInCodeCache(Object* name, Code* code); 5022 int IndexInCodeCache(Object* name, Code* code);
5069 5023
5070 // Removes a code object from the code cache at the given index. 5024 // Removes a code object from the code cache at the given index.
5071 void RemoveFromCodeCache(String* name, Code* code, int index); 5025 void RemoveFromCodeCache(String* name, Code* code, int index);
(...skipping 1978 matching lines...) Expand 10 before | Expand all | Expand 10 after
7050 void AddSurrogatePairNoIndex(uc32 c); 7004 void AddSurrogatePairNoIndex(uc32 c);
7051 7005
7052 // Returns the value to store in the hash field of a string with 7006 // Returns the value to store in the hash field of a string with
7053 // the given length and contents. 7007 // the given length and contents.
7054 uint32_t GetHashField(); 7008 uint32_t GetHashField();
7055 7009
7056 // Returns true if the characters seen so far make up a legal array 7010 // Returns true if the characters seen so far make up a legal array
7057 // index. 7011 // index.
7058 bool is_array_index() { return is_array_index_; } 7012 bool is_array_index() { return is_array_index_; }
7059 7013
7014 bool is_valid() { return is_valid_; }
7015
7016 void invalidate() { is_valid_ = false; }
7017
7060 // Calculated hash value for a string consisting of 1 to 7018 // Calculated hash value for a string consisting of 1 to
7061 // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). 7019 // String::kMaxArrayIndexSize digits with no leading zeros (except "0").
7062 // value is represented decimal value. 7020 // value is represented decimal value.
7063 static uint32_t MakeArrayIndexHash(uint32_t value, int length); 7021 static uint32_t MakeArrayIndexHash(uint32_t value, int length);
7064 7022
7065 // No string is allowed to have a hash of zero. That value is reserved 7023 // No string is allowed to have a hash of zero. That value is reserved
7066 // for internal properties. If the hash calculation yields zero then we 7024 // for internal properties. If the hash calculation yields zero then we
7067 // use 27 instead. 7025 // use 27 instead.
7068 static const int kZeroHash = 27; 7026 static const int kZeroHash = 27;
7069 7027
7070 private: 7028 private:
7071 uint32_t array_index() { 7029 uint32_t array_index() {
7072 ASSERT(is_array_index()); 7030 ASSERT(is_array_index());
7073 return array_index_; 7031 return array_index_;
7074 } 7032 }
7075 7033
7076 inline uint32_t GetHash(); 7034 inline uint32_t GetHash();
7077 7035
7078 // Reusable parts of the hashing algorithm.
7079 INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint32_t c));
7080 INLINE(static uint32_t GetHashCore(uint32_t running_hash));
7081
7082 int length_; 7036 int length_;
7083 uint32_t raw_running_hash_; 7037 uint32_t raw_running_hash_;
7084 uint32_t array_index_; 7038 uint32_t array_index_;
7085 bool is_array_index_; 7039 bool is_array_index_;
7086 bool is_first_char_; 7040 bool is_first_char_;
7041 bool is_valid_;
7087 friend class TwoCharHashTableKey; 7042 friend class TwoCharHashTableKey;
7088
7089 template <bool seq_ascii> friend class JsonParser;
7090 }; 7043 };
7091 7044
7092 7045
7093 class IncrementalAsciiStringHasher {
7094 public:
7095 explicit inline IncrementalAsciiStringHasher(uint32_t seed, char first_char);
7096 inline void AddCharacter(uc32 c);
7097 inline uint32_t GetHash();
7098
7099 private:
7100 int length_;
7101 uint32_t raw_running_hash_;
7102 uint32_t array_index_;
7103 bool is_array_index_;
7104 char first_char_;
7105 };
7106
7107
7108 // Calculates string hash. 7046 // Calculates string hash.
7109 template <typename schar> 7047 template <typename schar>
7110 inline uint32_t HashSequentialString(const schar* chars, 7048 inline uint32_t HashSequentialString(const schar* chars,
7111 int length, 7049 int length,
7112 uint32_t seed); 7050 uint32_t seed);
7113 7051
7114 7052
7115 // The characteristics of a string are stored in its map. Retrieving these 7053 // The characteristics of a string are stored in its map. Retrieving these
7116 // few bits of information is moderately expensive, involving two memory 7054 // few bits of information is moderately expensive, involving two memory
7117 // loads where the second is dependent on the first. To improve efficiency 7055 // loads where the second is dependent on the first. To improve efficiency
(...skipping 1920 matching lines...) Expand 10 before | Expand all | Expand 10 after
9038 } else { 8976 } else {
9039 value &= ~(1 << bit_position); 8977 value &= ~(1 << bit_position);
9040 } 8978 }
9041 return value; 8979 return value;
9042 } 8980 }
9043 }; 8981 };
9044 8982
9045 } } // namespace v8::internal 8983 } } // namespace v8::internal
9046 8984
9047 #endif // V8_OBJECTS_H_ 8985 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/mips/macro-assembler-mips.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698