| OLD | NEW |
| 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 "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/assert-scope.h" | 9 #include "src/assert-scope.h" |
| 10 #include "src/builtins.h" | 10 #include "src/builtins.h" |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 | 240 |
| 241 | 241 |
| 242 // PropertyNormalizationMode is used to specify whether to keep | 242 // PropertyNormalizationMode is used to specify whether to keep |
| 243 // inobject properties when normalizing properties of a JSObject. | 243 // inobject properties when normalizing properties of a JSObject. |
| 244 enum PropertyNormalizationMode { | 244 enum PropertyNormalizationMode { |
| 245 CLEAR_INOBJECT_PROPERTIES, | 245 CLEAR_INOBJECT_PROPERTIES, |
| 246 KEEP_INOBJECT_PROPERTIES | 246 KEEP_INOBJECT_PROPERTIES |
| 247 }; | 247 }; |
| 248 | 248 |
| 249 | 249 |
| 250 // Internal properties (e.g. the hidden properties dictionary) might |
| 251 // be added even though the receiver is non-extensible. |
| 252 enum ExtensibilityCheck { |
| 253 PERFORM_EXTENSIBILITY_CHECK, |
| 254 OMIT_EXTENSIBILITY_CHECK |
| 255 }; |
| 256 |
| 257 |
| 250 // Indicates how aggressively the prototype should be optimized. FAST_PROTOTYPE | 258 // Indicates how aggressively the prototype should be optimized. FAST_PROTOTYPE |
| 251 // will give the fastest result by tailoring the map to the prototype, but that | 259 // will give the fastest result by tailoring the map to the prototype, but that |
| 252 // will cause polymorphism with other objects. REGULAR_PROTOTYPE is to be used | 260 // will cause polymorphism with other objects. REGULAR_PROTOTYPE is to be used |
| 253 // (at least for now) when dynamically modifying the prototype chain of an | 261 // (at least for now) when dynamically modifying the prototype chain of an |
| 254 // object using __proto__ or Object.setPrototypeOf. | 262 // object using __proto__ or Object.setPrototypeOf. |
| 255 enum PrototypeOptimizationMode { REGULAR_PROTOTYPE, FAST_PROTOTYPE }; | 263 enum PrototypeOptimizationMode { REGULAR_PROTOTYPE, FAST_PROTOTYPE }; |
| 256 | 264 |
| 257 | 265 |
| 258 // Indicates whether transitions can be added to a source map or not. | 266 // Indicates whether transitions can be added to a source map or not. |
| 259 enum TransitionFlag { | 267 enum TransitionFlag { |
| (...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 | 1504 |
| 1497 MUST_USE_RESULT static MaybeHandle<Object> SetProperty( | 1505 MUST_USE_RESULT static MaybeHandle<Object> SetProperty( |
| 1498 LookupIterator* it, Handle<Object> value, StrictMode strict_mode, | 1506 LookupIterator* it, Handle<Object> value, StrictMode strict_mode, |
| 1499 StoreFromKeyed store_mode); | 1507 StoreFromKeyed store_mode); |
| 1500 MUST_USE_RESULT static MaybeHandle<Object> WriteToReadOnlyProperty( | 1508 MUST_USE_RESULT static MaybeHandle<Object> WriteToReadOnlyProperty( |
| 1501 LookupIterator* it, Handle<Object> value, StrictMode strict_mode); | 1509 LookupIterator* it, Handle<Object> value, StrictMode strict_mode); |
| 1502 MUST_USE_RESULT static MaybeHandle<Object> SetDataProperty( | 1510 MUST_USE_RESULT static MaybeHandle<Object> SetDataProperty( |
| 1503 LookupIterator* it, Handle<Object> value); | 1511 LookupIterator* it, Handle<Object> value); |
| 1504 MUST_USE_RESULT static MaybeHandle<Object> AddDataProperty( | 1512 MUST_USE_RESULT static MaybeHandle<Object> AddDataProperty( |
| 1505 LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, | 1513 LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, |
| 1506 StrictMode strict_mode, StoreFromKeyed store_mode); | 1514 StrictMode strict_mode, StoreFromKeyed store_mode, |
| 1515 ExtensibilityCheck check); |
| 1507 MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( | 1516 MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( |
| 1508 Handle<Object> object, | 1517 Handle<Object> object, |
| 1509 Handle<Name> key); | 1518 Handle<Name> key); |
| 1510 MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( | 1519 MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( |
| 1511 Isolate* isolate, | 1520 Isolate* isolate, |
| 1512 Handle<Object> object, | 1521 Handle<Object> object, |
| 1513 const char* key); | 1522 const char* key); |
| 1514 MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( | 1523 MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( |
| 1515 Handle<Object> object, | 1524 Handle<Object> object, |
| 1516 Handle<Name> key); | 1525 Handle<Name> key); |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1940 // JSReceiver includes types on which properties can be defined, i.e., | 1949 // JSReceiver includes types on which properties can be defined, i.e., |
| 1941 // JSObject and JSProxy. | 1950 // JSObject and JSProxy. |
| 1942 class JSReceiver: public HeapObject { | 1951 class JSReceiver: public HeapObject { |
| 1943 public: | 1952 public: |
| 1944 enum DeleteMode { | 1953 enum DeleteMode { |
| 1945 NORMAL_DELETION, | 1954 NORMAL_DELETION, |
| 1946 STRICT_DELETION, | 1955 STRICT_DELETION, |
| 1947 FORCE_DELETION | 1956 FORCE_DELETION |
| 1948 }; | 1957 }; |
| 1949 | 1958 |
| 1950 // Internal properties (e.g. the hidden properties dictionary) might | |
| 1951 // be added even though the receiver is non-extensible. | |
| 1952 enum ExtensibilityCheck { | |
| 1953 PERFORM_EXTENSIBILITY_CHECK, | |
| 1954 OMIT_EXTENSIBILITY_CHECK | |
| 1955 }; | |
| 1956 | |
| 1957 DECLARE_CAST(JSReceiver) | 1959 DECLARE_CAST(JSReceiver) |
| 1958 | 1960 |
| 1959 MUST_USE_RESULT static MaybeHandle<Object> SetElement( | 1961 MUST_USE_RESULT static MaybeHandle<Object> SetElement( |
| 1960 Handle<JSReceiver> object, | 1962 Handle<JSReceiver> object, |
| 1961 uint32_t index, | 1963 uint32_t index, |
| 1962 Handle<Object> value, | 1964 Handle<Object> value, |
| 1963 PropertyAttributes attributes, | 1965 PropertyAttributes attributes, |
| 1964 StrictMode strict_mode); | 1966 StrictMode strict_mode); |
| 1965 | 1967 |
| 1966 // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6. | 1968 // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6. |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2176 // Migrates the given object only if the target map is already available, | 2178 // Migrates the given object only if the target map is already available, |
| 2177 // or returns false if such a map is not yet available. | 2179 // or returns false if such a map is not yet available. |
| 2178 static bool TryMigrateInstance(Handle<JSObject> instance); | 2180 static bool TryMigrateInstance(Handle<JSObject> instance); |
| 2179 | 2181 |
| 2180 // Retrieve a value in a normalized object given a lookup result. | 2182 // Retrieve a value in a normalized object given a lookup result. |
| 2181 // Handles the special representation of JS global objects. | 2183 // Handles the special representation of JS global objects. |
| 2182 Object* GetNormalizedProperty(const LookupResult* result); | 2184 Object* GetNormalizedProperty(const LookupResult* result); |
| 2183 static Handle<Object> GetNormalizedProperty(Handle<JSObject> object, | 2185 static Handle<Object> GetNormalizedProperty(Handle<JSObject> object, |
| 2184 const LookupResult* result); | 2186 const LookupResult* result); |
| 2185 | 2187 |
| 2186 // Sets the property value in a normalized object given a lookup result. | |
| 2187 // Handles the special representation of JS global objects. | |
| 2188 static void SetNormalizedProperty(Handle<JSObject> object, | |
| 2189 const LookupResult* result, | |
| 2190 Handle<Object> value); | |
| 2191 | |
| 2192 // Sets the property value in a normalized object given (key, value, details). | 2188 // Sets the property value in a normalized object given (key, value, details). |
| 2193 // Handles the special representation of JS global objects. | 2189 // Handles the special representation of JS global objects. |
| 2194 static void SetNormalizedProperty(Handle<JSObject> object, | 2190 static void SetNormalizedProperty(Handle<JSObject> object, |
| 2195 Handle<Name> key, | 2191 Handle<Name> key, |
| 2196 Handle<Object> value, | 2192 Handle<Object> value, |
| 2197 PropertyDetails details); | 2193 PropertyDetails details); |
| 2198 | 2194 |
| 2199 static void OptimizeAsPrototype(Handle<JSObject> object, | 2195 static void OptimizeAsPrototype(Handle<JSObject> object, |
| 2200 PrototypeOptimizationMode mode); | 2196 PrototypeOptimizationMode mode); |
| 2201 static void ReoptimizeIfPrototype(Handle<JSObject> object); | 2197 static void ReoptimizeIfPrototype(Handle<JSObject> object); |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2625 private: | 2621 private: |
| 2626 friend class DictionaryElementsAccessor; | 2622 friend class DictionaryElementsAccessor; |
| 2627 friend class JSReceiver; | 2623 friend class JSReceiver; |
| 2628 friend class Object; | 2624 friend class Object; |
| 2629 | 2625 |
| 2630 static void MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map); | 2626 static void MigrateFastToFast(Handle<JSObject> object, Handle<Map> new_map); |
| 2631 static void MigrateFastToSlow(Handle<JSObject> object, | 2627 static void MigrateFastToSlow(Handle<JSObject> object, |
| 2632 Handle<Map> new_map, | 2628 Handle<Map> new_map, |
| 2633 int expected_additional_properties); | 2629 int expected_additional_properties); |
| 2634 | 2630 |
| 2635 static void SetPropertyToField(LookupResult* lookup, Handle<Object> value); | |
| 2636 | |
| 2637 static void ConvertAndSetOwnProperty(LookupResult* lookup, | |
| 2638 Handle<Name> name, | |
| 2639 Handle<Object> value, | |
| 2640 PropertyAttributes attributes); | |
| 2641 | |
| 2642 static void SetPropertyToFieldWithAttributes(LookupResult* lookup, | |
| 2643 Handle<Name> name, | |
| 2644 Handle<Object> value, | |
| 2645 PropertyAttributes attributes); | |
| 2646 static void GeneralizeFieldRepresentation(Handle<JSObject> object, | 2631 static void GeneralizeFieldRepresentation(Handle<JSObject> object, |
| 2647 int modify_index, | 2632 int modify_index, |
| 2648 Representation new_representation, | 2633 Representation new_representation, |
| 2649 Handle<HeapType> new_field_type); | 2634 Handle<HeapType> new_field_type); |
| 2650 | 2635 |
| 2651 static void UpdateAllocationSite(Handle<JSObject> object, | 2636 static void UpdateAllocationSite(Handle<JSObject> object, |
| 2652 ElementsKind to_kind); | 2637 ElementsKind to_kind); |
| 2653 | 2638 |
| 2654 // Used from Object::GetProperty(). | 2639 // Used from Object::GetProperty(). |
| 2655 MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithFailedAccessCheck( | 2640 MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithFailedAccessCheck( |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2709 StrictMode strict_mode, | 2694 StrictMode strict_mode, |
| 2710 bool check_prototype, | 2695 bool check_prototype, |
| 2711 SetPropertyMode set_mode = SET_PROPERTY); | 2696 SetPropertyMode set_mode = SET_PROPERTY); |
| 2712 MUST_USE_RESULT static MaybeHandle<Object> SetFastDoubleElement( | 2697 MUST_USE_RESULT static MaybeHandle<Object> SetFastDoubleElement( |
| 2713 Handle<JSObject> object, | 2698 Handle<JSObject> object, |
| 2714 uint32_t index, | 2699 uint32_t index, |
| 2715 Handle<Object> value, | 2700 Handle<Object> value, |
| 2716 StrictMode strict_mode, | 2701 StrictMode strict_mode, |
| 2717 bool check_prototype = true); | 2702 bool check_prototype = true); |
| 2718 | 2703 |
| 2719 MUST_USE_RESULT static MaybeHandle<Object> SetPropertyUsingTransition( | |
| 2720 Handle<JSObject> object, | |
| 2721 LookupResult* lookup, | |
| 2722 Handle<Name> name, | |
| 2723 Handle<Object> value, | |
| 2724 PropertyAttributes attributes); | |
| 2725 MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck( | 2704 MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck( |
| 2726 LookupIterator* it, Handle<Object> value, StrictMode strict_mode); | 2705 LookupIterator* it, Handle<Object> value, StrictMode strict_mode); |
| 2727 | 2706 |
| 2728 // Add a property to an object. | |
| 2729 MUST_USE_RESULT static MaybeHandle<Object> AddPropertyInternal( | |
| 2730 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, | |
| 2731 PropertyAttributes attributes, StoreFromKeyed store_mode, | |
| 2732 ExtensibilityCheck extensibility_check, TransitionFlag flag); | |
| 2733 | |
| 2734 // Add a property to a fast-case object. | |
| 2735 static void AddFastProperty(Handle<JSObject> object, | |
| 2736 Handle<Name> name, | |
| 2737 Handle<Object> value, | |
| 2738 PropertyAttributes attributes, | |
| 2739 StoreFromKeyed store_mode, | |
| 2740 TransitionFlag flag); | |
| 2741 | |
| 2742 // Add a property to a slow-case object. | 2707 // Add a property to a slow-case object. |
| 2743 static void AddSlowProperty(Handle<JSObject> object, | 2708 static void AddSlowProperty(Handle<JSObject> object, |
| 2744 Handle<Name> name, | 2709 Handle<Name> name, |
| 2745 Handle<Object> value, | 2710 Handle<Object> value, |
| 2746 PropertyAttributes attributes); | 2711 PropertyAttributes attributes); |
| 2747 | 2712 |
| 2748 MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty( | 2713 MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty( |
| 2749 Handle<JSObject> object, | 2714 Handle<JSObject> object, |
| 2750 Handle<Name> name, | 2715 Handle<Name> name, |
| 2751 DeleteMode mode); | 2716 DeleteMode mode); |
| (...skipping 3769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6521 static Handle<Map> CopyForFreeze(Handle<Map> map); | 6486 static Handle<Map> CopyForFreeze(Handle<Map> map); |
| 6522 // Maximal number of fast properties. Used to restrict the number of map | 6487 // Maximal number of fast properties. Used to restrict the number of map |
| 6523 // transitions to avoid an explosion in the number of maps for objects used as | 6488 // transitions to avoid an explosion in the number of maps for objects used as |
| 6524 // dictionaries. | 6489 // dictionaries. |
| 6525 inline bool TooManyFastProperties(StoreFromKeyed store_mode); | 6490 inline bool TooManyFastProperties(StoreFromKeyed store_mode); |
| 6526 static Handle<Map> TransitionToDataProperty(Handle<Map> map, | 6491 static Handle<Map> TransitionToDataProperty(Handle<Map> map, |
| 6527 Handle<Name> name, | 6492 Handle<Name> name, |
| 6528 Handle<Object> value, | 6493 Handle<Object> value, |
| 6529 PropertyAttributes attributes, | 6494 PropertyAttributes attributes, |
| 6530 StoreFromKeyed store_mode); | 6495 StoreFromKeyed store_mode); |
| 6496 static Handle<Map> ReconfigureDataProperty(Handle<Map> map, int descriptor, |
| 6497 PropertyAttributes attributes); |
| 6531 | 6498 |
| 6532 inline void AppendDescriptor(Descriptor* desc); | 6499 inline void AppendDescriptor(Descriptor* desc); |
| 6533 | 6500 |
| 6534 // Returns a copy of the map, with all transitions dropped from the | 6501 // Returns a copy of the map, with all transitions dropped from the |
| 6535 // instance descriptors. | 6502 // instance descriptors. |
| 6536 static Handle<Map> Copy(Handle<Map> map); | 6503 static Handle<Map> Copy(Handle<Map> map); |
| 6537 static Handle<Map> Create(Handle<JSFunction> constructor, | 6504 static Handle<Map> Create(Handle<JSFunction> constructor, |
| 6538 int extra_inobject_properties); | 6505 int extra_inobject_properties); |
| 6539 | 6506 |
| 6540 // Returns the next free property index (only valid for FAST MODE). | 6507 // Returns the next free property index (only valid for FAST MODE). |
| (...skipping 4732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11273 } else { | 11240 } else { |
| 11274 value &= ~(1 << bit_position); | 11241 value &= ~(1 << bit_position); |
| 11275 } | 11242 } |
| 11276 return value; | 11243 return value; |
| 11277 } | 11244 } |
| 11278 }; | 11245 }; |
| 11279 | 11246 |
| 11280 } } // namespace v8::internal | 11247 } } // namespace v8::internal |
| 11281 | 11248 |
| 11282 #endif // V8_OBJECTS_H_ | 11249 #endif // V8_OBJECTS_H_ |
| OLD | NEW |