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

Side by Side Diff: src/objects.h

Issue 1575423002: Move properties from JSObject to JSReceiver (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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 1784 matching lines...) Expand 10 before | Expand all | Expand 10 after
1795 }; 1795 };
1796 1796
1797 1797
1798 enum GetKeysConversion { KEEP_NUMBERS, CONVERT_TO_STRING }; 1798 enum GetKeysConversion { KEEP_NUMBERS, CONVERT_TO_STRING };
1799 1799
1800 1800
1801 // JSReceiver includes types on which properties can be defined, i.e., 1801 // JSReceiver includes types on which properties can be defined, i.e.,
1802 // JSObject and JSProxy. 1802 // JSObject and JSProxy.
1803 class JSReceiver: public HeapObject { 1803 class JSReceiver: public HeapObject {
1804 public: 1804 public:
1805 // [properties]: Backing storage for properties.
1806 // properties is a FixedArray in the fast case and a Dictionary in the
1807 // slow case.
1808 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties.
1809 inline void initialize_properties();
1810 inline bool HasFastProperties();
1811 // Gets slow properties for non-global objects.
1812 inline NameDictionary* property_dictionary();
1813
1805 DECLARE_CAST(JSReceiver) 1814 DECLARE_CAST(JSReceiver)
1806 1815
1807 // ES6 section 7.1.1 ToPrimitive 1816 // ES6 section 7.1.1 ToPrimitive
1808 MUST_USE_RESULT static MaybeHandle<Object> ToPrimitive( 1817 MUST_USE_RESULT static MaybeHandle<Object> ToPrimitive(
1809 Handle<JSReceiver> receiver, 1818 Handle<JSReceiver> receiver,
1810 ToPrimitiveHint hint = ToPrimitiveHint::kDefault); 1819 ToPrimitiveHint hint = ToPrimitiveHint::kDefault);
1811 MUST_USE_RESULT static MaybeHandle<Object> OrdinaryToPrimitive( 1820 MUST_USE_RESULT static MaybeHandle<Object> OrdinaryToPrimitive(
1812 Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint); 1821 Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint);
1813 1822
1814 static MaybeHandle<Context> GetFunctionRealm(Handle<JSReceiver> receiver); 1823 static MaybeHandle<Context> GetFunctionRealm(Handle<JSReceiver> receiver);
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 return GetKeys(object, JSReceiver::OWN_ONLY, ALL_PROPERTIES, 1962 return GetKeys(object, JSReceiver::OWN_ONLY, ALL_PROPERTIES,
1954 CONVERT_TO_STRING); 1963 CONVERT_TO_STRING);
1955 } 1964 }
1956 1965
1957 // Computes the enumerable keys for a JSObject. Used for implementing 1966 // Computes the enumerable keys for a JSObject. Used for implementing
1958 // "for (n in object) { }". 1967 // "for (n in object) { }".
1959 MUST_USE_RESULT static MaybeHandle<FixedArray> GetKeys( 1968 MUST_USE_RESULT static MaybeHandle<FixedArray> GetKeys(
1960 Handle<JSReceiver> object, KeyCollectionType type, PropertyFilter filter, 1969 Handle<JSReceiver> object, KeyCollectionType type, PropertyFilter filter,
1961 GetKeysConversion keys_conversion = KEEP_NUMBERS); 1970 GetKeysConversion keys_conversion = KEEP_NUMBERS);
1962 1971
1972 // Layout description.
1973 static const int kPropertiesOffset = HeapObject::kHeaderSize;
1974 static const int kHeaderSize = HeapObject::kHeaderSize + kPointerSize;
1975
1963 private: 1976 private:
1964 DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver); 1977 DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver);
1965 }; 1978 };
1966 1979
1967 1980
1968 // The JSObject describes real heap allocated JavaScript objects with 1981 // The JSObject describes real heap allocated JavaScript objects with
1969 // properties. 1982 // properties.
1970 // Note that the map of JSObject changes during execution to enable inline 1983 // Note that the map of JSObject changes during execution to enable inline
1971 // caching. 1984 // caching.
1972 class JSObject: public JSReceiver { 1985 class JSObject: public JSReceiver {
1973 public: 1986 public:
1974 static MUST_USE_RESULT MaybeHandle<JSObject> New( 1987 static MUST_USE_RESULT MaybeHandle<JSObject> New(
1975 Handle<JSFunction> constructor, Handle<JSReceiver> new_target, 1988 Handle<JSFunction> constructor, Handle<JSReceiver> new_target,
1976 Handle<AllocationSite> site = Handle<AllocationSite>::null()); 1989 Handle<AllocationSite> site = Handle<AllocationSite>::null());
1977 1990
1978 // [properties]: Backing storage for properties.
1979 // properties is a FixedArray in the fast case and a Dictionary in the
1980 // slow case.
1981 DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties.
1982 inline void initialize_properties();
1983 inline bool HasFastProperties();
1984 // Gets slow properties for non-global objects.
1985 inline NameDictionary* property_dictionary();
1986 // Gets global object properties. 1991 // Gets global object properties.
1987 inline GlobalDictionary* global_dictionary(); 1992 inline GlobalDictionary* global_dictionary();
1988 1993
1989 static MaybeHandle<Context> GetFunctionRealm(Handle<JSObject> object); 1994 static MaybeHandle<Context> GetFunctionRealm(Handle<JSObject> object);
1990 1995
1991 // [elements]: The elements (properties with names that are integers). 1996 // [elements]: The elements (properties with names that are integers).
1992 // 1997 //
1993 // Elements can be in two general modes: fast and slow. Each mode 1998 // Elements can be in two general modes: fast and slow. Each mode
1994 // corrensponds to a set of object representations of elements that 1999 // corrensponds to a set of object representations of elements that
1995 // have something in common. 2000 // have something in common.
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
2467 // not to arbitrary other JSObject maps. 2472 // not to arbitrary other JSObject maps.
2468 static const int kInitialGlobalObjectUnusedPropertiesCount = 4; 2473 static const int kInitialGlobalObjectUnusedPropertiesCount = 4;
2469 2474
2470 static const int kMaxInstanceSize = 255 * kPointerSize; 2475 static const int kMaxInstanceSize = 255 * kPointerSize;
2471 // When extending the backing storage for property values, we increase 2476 // When extending the backing storage for property values, we increase
2472 // its size by more than the 1 entry necessary, so sequentially adding fields 2477 // its size by more than the 1 entry necessary, so sequentially adding fields
2473 // to the same object requires fewer allocations and copies. 2478 // to the same object requires fewer allocations and copies.
2474 static const int kFieldsAdded = 3; 2479 static const int kFieldsAdded = 3;
2475 2480
2476 // Layout description. 2481 // Layout description.
2477 static const int kPropertiesOffset = HeapObject::kHeaderSize; 2482 static const int kElementsOffset = JSReceiver::kHeaderSize;
2478 static const int kElementsOffset = kPropertiesOffset + kPointerSize;
2479 static const int kHeaderSize = kElementsOffset + kPointerSize; 2483 static const int kHeaderSize = kElementsOffset + kPointerSize;
2480 2484
2481 STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize); 2485 STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize);
2482 2486
2483 typedef FlexibleBodyDescriptor<kPropertiesOffset> BodyDescriptor; 2487 typedef FlexibleBodyDescriptor<JSReceiver::kPropertiesOffset> BodyDescriptor;
2484 2488
2485 // Enqueue change record for Object.observe. May cause GC. 2489 // Enqueue change record for Object.observe. May cause GC.
2486 MUST_USE_RESULT static MaybeHandle<Object> EnqueueChangeRecord( 2490 MUST_USE_RESULT static MaybeHandle<Object> EnqueueChangeRecord(
2487 Handle<JSObject> object, const char* type, Handle<Name> name, 2491 Handle<JSObject> object, const char* type, Handle<Name> name,
2488 Handle<Object> old_value); 2492 Handle<Object> old_value);
2489 2493
2490 // Gets the number of currently used elements. 2494 // Gets the number of currently used elements.
2491 int GetFastElementsUsage(); 2495 int GetFastElementsUsage();
2492 2496
2493 // Deletes an existing named property in a normalized object. 2497 // Deletes an existing named property in a normalized object.
(...skipping 7122 matching lines...) Expand 10 before | Expand all | Expand 10 after
9616 Isolate* isolate, Handle<JSReceiver> receiver, Handle<JSProxy> proxy, 9620 Isolate* isolate, Handle<JSReceiver> receiver, Handle<JSProxy> proxy,
9617 PropertyFilter filter, KeyAccumulator* accumulator); 9621 PropertyFilter filter, KeyAccumulator* accumulator);
9618 9622
9619 MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes( 9623 MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes(
9620 LookupIterator* it); 9624 LookupIterator* it);
9621 9625
9622 // Dispatched behavior. 9626 // Dispatched behavior.
9623 DECLARE_PRINTER(JSProxy) 9627 DECLARE_PRINTER(JSProxy)
9624 DECLARE_VERIFIER(JSProxy) 9628 DECLARE_VERIFIER(JSProxy)
9625 9629
9626 // Layout description. We add padding so that a proxy has the same 9630 // Layout description.
9627 // size as a virgin JSObject. This is essential for becoming a JSObject 9631 static const int kTargetOffset = JSReceiver::kHeaderSize;
9628 // upon freeze.
9629 static const int kTargetOffset = HeapObject::kHeaderSize;
9630 static const int kHandlerOffset = kTargetOffset + kPointerSize; 9632 static const int kHandlerOffset = kTargetOffset + kPointerSize;
9631 static const int kHashOffset = kHandlerOffset + kPointerSize; 9633 static const int kHashOffset = kHandlerOffset + kPointerSize;
9632 static const int kSize = kHashOffset + kPointerSize; 9634 static const int kSize = kHashOffset + kPointerSize;
9633 9635
9634 typedef FixedBodyDescriptor<kTargetOffset, kSize, kSize> BodyDescriptor; 9636 typedef FixedBodyDescriptor<JSReceiver::kPropertiesOffset, kSize, kSize>
9637 BodyDescriptor;
9635 9638
9636 MUST_USE_RESULT Object* GetIdentityHash(); 9639 MUST_USE_RESULT Object* GetIdentityHash();
9637 9640
9638 static Handle<Smi> GetOrCreateIdentityHash(Handle<JSProxy> proxy); 9641 static Handle<Smi> GetOrCreateIdentityHash(Handle<JSProxy> proxy);
9639 9642
9640 private: 9643 private:
9641 DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy); 9644 DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy);
9642 }; 9645 };
9643 9646
9644 9647
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after
10739 } 10742 }
10740 return value; 10743 return value;
10741 } 10744 }
10742 }; 10745 };
10743 10746
10744 10747
10745 } // NOLINT, false-positive due to second-order macros. 10748 } // NOLINT, false-positive due to second-order macros.
10746 } // NOLINT, false-positive due to second-order macros. 10749 } // NOLINT, false-positive due to second-order macros.
10747 10750
10748 #endif // V8_OBJECTS_H_ 10751 #endif // V8_OBJECTS_H_
OLDNEW
« src/factory.cc ('K') | « src/factory.cc ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698