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

Side by Side Diff: src/objects.h

Issue 776143005: Optimize Object.seal and Object.preventExtensions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add nonextensible and sealed as special transitions Created 6 years 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
« no previous file with comments | « src/heap/heap.h ('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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_OBJECTS_H_ 5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_ 6 #define V8_OBJECTS_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 2097 matching lines...) Expand 10 before | Expand all | Expand 10 after
2108 Object* pre_allocated_value, 2108 Object* pre_allocated_value,
2109 Object* filler_value); 2109 Object* filler_value);
2110 2110
2111 // Check whether this object references another object 2111 // Check whether this object references another object
2112 bool ReferencesObject(Object* obj); 2112 bool ReferencesObject(Object* obj);
2113 2113
2114 // Disalow further properties to be added to the object. 2114 // Disalow further properties to be added to the object.
2115 MUST_USE_RESULT static MaybeHandle<Object> PreventExtensions( 2115 MUST_USE_RESULT static MaybeHandle<Object> PreventExtensions(
2116 Handle<JSObject> object); 2116 Handle<JSObject> object);
2117 2117
2118 // ES5 Object.seal
2119 MUST_USE_RESULT static MaybeHandle<Object> Seal(Handle<JSObject> object);
2120
2118 // ES5 Object.freeze 2121 // ES5 Object.freeze
2119 MUST_USE_RESULT static MaybeHandle<Object> Freeze(Handle<JSObject> object); 2122 MUST_USE_RESULT static MaybeHandle<Object> Freeze(Handle<JSObject> object);
2120 2123
2121 // Called the first time an object is observed with ES7 Object.observe. 2124 // Called the first time an object is observed with ES7 Object.observe.
2122 static void SetObserved(Handle<JSObject> object); 2125 static void SetObserved(Handle<JSObject> object);
2123 2126
2124 // Copy object. 2127 // Copy object.
2125 enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 }; 2128 enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 };
2126 2129
2127 static Handle<JSObject> Copy(Handle<JSObject> object); 2130 static Handle<JSObject> Copy(Handle<JSObject> object);
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
2397 // Set the hidden property backing store to either a hash table or 2400 // Set the hidden property backing store to either a hash table or
2398 // the inline-stored identity hash. 2401 // the inline-stored identity hash.
2399 static Handle<Object> SetHiddenPropertiesHashTable( 2402 static Handle<Object> SetHiddenPropertiesHashTable(
2400 Handle<JSObject> object, 2403 Handle<JSObject> object,
2401 Handle<Object> value); 2404 Handle<Object> value);
2402 2405
2403 MUST_USE_RESULT Object* GetIdentityHash(); 2406 MUST_USE_RESULT Object* GetIdentityHash();
2404 2407
2405 static Handle<Smi> GetOrCreateIdentityHash(Handle<JSObject> object); 2408 static Handle<Smi> GetOrCreateIdentityHash(Handle<JSObject> object);
2406 2409
2410 static Handle<SeededNumberDictionary> GetNormalizedElementDictionary(
2411 Handle<JSObject> object);
2412
2413 // Helper for fast versions of preventExtensions, seal, and freeze.
2414 // attrs is one of NONE, SEALED, or FROZEN (depending on the operation).
2415 template <PropertyAttributes attrs>
2416 MUST_USE_RESULT static MaybeHandle<Object> PreventExtensionsWithTransition(
2417 Handle<JSObject> object);
2418
2407 DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); 2419 DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject);
2408 }; 2420 };
2409 2421
2410 2422
2411 // Common superclass for FixedArrays that allow implementations to share 2423 // Common superclass for FixedArrays that allow implementations to share
2412 // common accessors and some code paths. 2424 // common accessors and some code paths.
2413 class FixedArrayBase: public HeapObject { 2425 class FixedArrayBase: public HeapObject {
2414 public: 2426 public:
2415 // [length]: length of the array. 2427 // [length]: length of the array.
2416 inline int length() const; 2428 inline int length() const;
(...skipping 3252 matching lines...) Expand 10 before | Expand all | Expand 10 after
5669 5681
5670 class EnumLengthBits: public BitField<int, 5682 class EnumLengthBits: public BitField<int,
5671 0, kDescriptorIndexBitCount> {}; // NOLINT 5683 0, kDescriptorIndexBitCount> {}; // NOLINT
5672 class NumberOfOwnDescriptorsBits: public BitField<int, 5684 class NumberOfOwnDescriptorsBits: public BitField<int,
5673 kDescriptorIndexBitCount, kDescriptorIndexBitCount> {}; // NOLINT 5685 kDescriptorIndexBitCount, kDescriptorIndexBitCount> {}; // NOLINT
5674 STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20); 5686 STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20);
5675 class DictionaryMap : public BitField<bool, 20, 1> {}; 5687 class DictionaryMap : public BitField<bool, 20, 1> {};
5676 class OwnsDescriptors : public BitField<bool, 21, 1> {}; 5688 class OwnsDescriptors : public BitField<bool, 21, 1> {};
5677 class HasInstanceCallHandler : public BitField<bool, 22, 1> {}; 5689 class HasInstanceCallHandler : public BitField<bool, 22, 1> {};
5678 class Deprecated : public BitField<bool, 23, 1> {}; 5690 class Deprecated : public BitField<bool, 23, 1> {};
5679 class IsFrozen : public BitField<bool, 24, 1> {}; 5691 class IsUnstable : public BitField<bool, 24, 1> {};
5680 class IsUnstable : public BitField<bool, 25, 1> {}; 5692 class IsMigrationTarget : public BitField<bool, 25, 1> {};
5681 class IsMigrationTarget : public BitField<bool, 26, 1> {}; 5693 // Bits 26 and 27 are free.
5682 // Bit 27 is free.
5683 5694
5684 // Keep this bit field at the very end for better code in 5695 // Keep this bit field at the very end for better code in
5685 // Builtins::kJSConstructStubGeneric stub. 5696 // Builtins::kJSConstructStubGeneric stub.
5686 // This counter is used for in-object slack tracking and for map aging. 5697 // This counter is used for in-object slack tracking and for map aging.
5687 // The in-object slack tracking is considered enabled when the counter is 5698 // The in-object slack tracking is considered enabled when the counter is
5688 // in the range [kSlackTrackingCounterStart, kSlackTrackingCounterEnd]. 5699 // in the range [kSlackTrackingCounterStart, kSlackTrackingCounterEnd].
5689 class Counter : public BitField<int, 28, 4> {}; 5700 class Counter : public BitField<int, 28, 4> {};
5690 static const int kSlackTrackingCounterStart = 14; 5701 static const int kSlackTrackingCounterStart = 14;
5691 static const int kSlackTrackingCounterEnd = 8; 5702 static const int kSlackTrackingCounterEnd = 8;
5692 static const int kRetainingCounterStart = kSlackTrackingCounterEnd - 1; 5703 static const int kRetainingCounterStart = kSlackTrackingCounterEnd - 1;
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
6022 DCHECK(length == 0 || instance_descriptors()->HasEnumCache()); 6033 DCHECK(length == 0 || instance_descriptors()->HasEnumCache());
6023 DCHECK(length <= NumberOfOwnDescriptors()); 6034 DCHECK(length <= NumberOfOwnDescriptors());
6024 } 6035 }
6025 set_bit_field3(EnumLengthBits::update(bit_field3(), length)); 6036 set_bit_field3(EnumLengthBits::update(bit_field3(), length));
6026 } 6037 }
6027 6038
6028 inline bool owns_descriptors(); 6039 inline bool owns_descriptors();
6029 inline void set_owns_descriptors(bool owns_descriptors); 6040 inline void set_owns_descriptors(bool owns_descriptors);
6030 inline bool has_instance_call_handler(); 6041 inline bool has_instance_call_handler();
6031 inline void set_has_instance_call_handler(); 6042 inline void set_has_instance_call_handler();
6032 inline void freeze();
6033 inline bool is_frozen();
6034 inline void mark_unstable(); 6043 inline void mark_unstable();
6035 inline bool is_stable(); 6044 inline bool is_stable();
6036 inline void set_migration_target(bool value); 6045 inline void set_migration_target(bool value);
6037 inline bool is_migration_target(); 6046 inline bool is_migration_target();
6038 inline void set_counter(int value); 6047 inline void set_counter(int value);
6039 inline int counter(); 6048 inline int counter();
6040 inline void deprecate(); 6049 inline void deprecate();
6041 inline bool is_deprecated(); 6050 inline bool is_deprecated();
6042 inline bool CanBeDeprecated(); 6051 inline bool CanBeDeprecated();
6043 // Returns a non-deprecated version of the input. If the input was not 6052 // Returns a non-deprecated version of the input. If the input was not
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
6081 ElementsKind to_kind); 6090 ElementsKind to_kind);
6082 6091
6083 static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind); 6092 static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind);
6084 6093
6085 static Handle<Map> CopyAsElementsKind(Handle<Map> map, 6094 static Handle<Map> CopyAsElementsKind(Handle<Map> map,
6086 ElementsKind kind, 6095 ElementsKind kind,
6087 TransitionFlag flag); 6096 TransitionFlag flag);
6088 6097
6089 static Handle<Map> CopyForObserved(Handle<Map> map); 6098 static Handle<Map> CopyForObserved(Handle<Map> map);
6090 6099
6091 static Handle<Map> CopyForFreeze(Handle<Map> map); 6100 static Handle<Map> CopyForPreventExtensions(Handle<Map> map,
6101 PropertyAttributes attrs_to_add,
6102 Handle<Symbol> transition_marker,
6103 const char* reason);
6092 // Maximal number of fast properties. Used to restrict the number of map 6104 // Maximal number of fast properties. Used to restrict the number of map
6093 // transitions to avoid an explosion in the number of maps for objects used as 6105 // transitions to avoid an explosion in the number of maps for objects used as
6094 // dictionaries. 6106 // dictionaries.
6095 inline bool TooManyFastProperties(StoreFromKeyed store_mode); 6107 inline bool TooManyFastProperties(StoreFromKeyed store_mode);
6096 static Handle<Map> TransitionToDataProperty(Handle<Map> map, 6108 static Handle<Map> TransitionToDataProperty(Handle<Map> map,
6097 Handle<Name> name, 6109 Handle<Name> name,
6098 Handle<Object> value, 6110 Handle<Object> value,
6099 PropertyAttributes attributes, 6111 PropertyAttributes attributes,
6100 StoreFromKeyed store_mode); 6112 StoreFromKeyed store_mode);
6101 static Handle<Map> TransitionToAccessorProperty( 6113 static Handle<Map> TransitionToAccessorProperty(
(...skipping 4920 matching lines...) Expand 10 before | Expand all | Expand 10 after
11022 } else { 11034 } else {
11023 value &= ~(1 << bit_position); 11035 value &= ~(1 << bit_position);
11024 } 11036 }
11025 return value; 11037 return value;
11026 } 11038 }
11027 }; 11039 };
11028 11040
11029 } } // namespace v8::internal 11041 } } // namespace v8::internal
11030 11042
11031 #endif // V8_OBJECTS_H_ 11043 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698