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

Unified Diff: src/objects.h

Issue 1033653002: Move prototype metadata from internal properties to prototype maps (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: small fixes Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/isolate.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 5961dc060f82ac581ccda19073d2375e2dfe9b34..6f24312e9d376443d3ac8ff350ec0c046c2a76b1 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -144,6 +144,7 @@
// - DebugInfo
// - BreakPointInfo
// - CodeCache
+// - PrototypeInfo
// - WeakCell
//
// Formats of Object*:
@@ -420,6 +421,7 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1;
V(TYPE_FEEDBACK_INFO_TYPE) \
V(ALIASED_ARGUMENTS_ENTRY_TYPE) \
V(BOX_TYPE) \
+ V(PROTOTYPE_INFO_TYPE) \
\
V(FIXED_ARRAY_TYPE) \
V(FIXED_DOUBLE_ARRAY_TYPE) \
@@ -517,25 +519,27 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1;
// Note that for subtle reasons related to the ordering or numerical values of
// type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST
// manually.
-#define STRUCT_LIST(V) \
- V(BOX, Box, box) \
- V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo, executable_accessor_info)\
- V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \
- V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \
- V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \
- V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \
- V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \
- V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \
- V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \
- V(SCRIPT, Script, script) \
- V(ALLOCATION_SITE, AllocationSite, allocation_site) \
- V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \
- V(CODE_CACHE, CodeCache, code_cache) \
- V(POLYMORPHIC_CODE_CACHE, PolymorphicCodeCache, polymorphic_code_cache) \
- V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \
- V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \
- V(DEBUG_INFO, DebugInfo, debug_info) \
- V(BREAK_POINT_INFO, BreakPointInfo, break_point_info)
+#define STRUCT_LIST(V) \
+ V(BOX, Box, box) \
+ V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo, \
+ executable_accessor_info) \
+ V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \
+ V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \
+ V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \
+ V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \
+ V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \
+ V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \
+ V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \
+ V(SCRIPT, Script, script) \
+ V(ALLOCATION_SITE, AllocationSite, allocation_site) \
+ V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \
+ V(CODE_CACHE, CodeCache, code_cache) \
+ V(POLYMORPHIC_CODE_CACHE, PolymorphicCodeCache, polymorphic_code_cache) \
+ V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \
+ V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \
+ V(DEBUG_INFO, DebugInfo, debug_info) \
+ V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) \
+ V(PROTOTYPE_INFO, PrototypeInfo, prototype_info)
// We use the full 8 bits of the instance_type field to encode heap object
// instance types. The high-order bit (bit 7) is set if the object is not a
@@ -718,6 +722,7 @@ enum InstanceType {
SHARED_FUNCTION_INFO_TYPE,
WEAK_CELL_TYPE,
PROPERTY_CELL_TYPE,
+ PROTOTYPE_INFO_TYPE,
// All the following types are subtypes of JSReceiver, which corresponds to
// objects in the JS sense. The first and the last type in this range are
@@ -2049,7 +2054,11 @@ class JSObject: public JSReceiver {
static void TransitionElementsKind(Handle<JSObject> object,
ElementsKind to_kind);
- static void MigrateToMap(Handle<JSObject> object, Handle<Map> new_map);
+ // Always use this to migrate an object to a new map.
+ // |expected_additional_properties| is only used for fast-to-slow transitions
+ // and ignored otherwise.
+ static void MigrateToMap(Handle<JSObject> object, Handle<Map> new_map,
+ int expected_additional_properties = 0);
// Convert the object to use the canonical dictionary
// representation. If the object is expected to have additional properties
@@ -2603,6 +2612,8 @@ class WeakFixedArray : public FixedArray {
inline Object* Get(int index) const;
inline int Length() const;
+ static Object* Empty() { return Smi::FromInt(0); }
+
DECLARE_CAST(WeakFixedArray)
private:
@@ -5796,15 +5807,15 @@ class Map: public HeapObject {
inline void set_unused_property_fields(int value);
// Bit field.
- inline byte bit_field();
+ inline byte bit_field() const;
inline void set_bit_field(byte value);
// Bit field 2.
- inline byte bit_field2();
+ inline byte bit_field2() const;
inline void set_bit_field2(byte value);
// Bit field 3.
- inline uint32_t bit_field3();
+ inline uint32_t bit_field3() const;
inline void set_bit_field3(uint32_t bits);
class EnumLengthBits: public BitField<int,
@@ -5899,7 +5910,7 @@ class Map: public HeapObject {
inline void set_is_extensible(bool value);
inline bool is_extensible();
inline void set_is_prototype_map(bool value);
- inline bool is_prototype_map();
+ inline bool is_prototype_map() const;
inline void set_elements_kind(ElementsKind elements_kind) {
DCHECK(static_cast<int>(elements_kind) < kElementsKindCount);
@@ -5970,6 +5981,9 @@ class Map: public HeapObject {
// Don't call set_raw_transitions() directly to overwrite transitions, use
// the TransitionArray::ReplaceTransitions() wrapper instead!
DECL_ACCESSORS(raw_transitions, Object)
+ // [prototype_info]: Per-prototype metadata. Aliased with transitions
+ // (which prototype maps don't have).
+ DECL_ACCESSORS(prototype_info, Object)
Map* FindRootMap();
Map* FindFieldOwner(int descriptor);
@@ -6328,9 +6342,10 @@ class Map: public HeapObject {
// otherwise a transition array is used.
// For prototype maps, this slot is used to store a pointer to the prototype
// object using this map.
- static const int kTransitionsOffset =
+ static const int kTransitionsOrPrototypeInfoOffset =
kConstructorOrBackPointerOffset + kPointerSize;
- static const int kDescriptorsOffset = kTransitionsOffset + kPointerSize;
+ static const int kDescriptorsOffset =
+ kTransitionsOrPrototypeInfoOffset + kPointerSize;
#if V8_DOUBLE_FIELDS_UNBOXING
static const int kLayoutDecriptorOffset = kDescriptorsOffset + kPointerSize;
static const int kCodeCacheOffset = kLayoutDecriptorOffset + kPointerSize;
@@ -6535,6 +6550,33 @@ class Box : public Struct {
};
+// Container for metadata stored on each prototype map.
+class PrototypeInfo : public Struct {
+ public:
+ // [prototype_users]: WeakFixedArray containing maps using this prototype,
+ // or Smi(0) if uninitialized.
+ DECL_ACCESSORS(prototype_users, Object)
+ // [validity_cell]: Cell containing the validity bit for prototype chains
+ // going through this object, or Smi(0) if uninitialized.
+ DECL_ACCESSORS(validity_cell, Object)
+
+ DECLARE_CAST(PrototypeInfo)
+
+ // Dispatched behavior.
+ DECLARE_PRINTER(PrototypeInfo)
+ DECLARE_VERIFIER(PrototypeInfo)
+
+ static const int kPrototypeObjectOffset = HeapObject::kHeaderSize;
+ static const int kPrototypeUsersOffset =
+ kPrototypeObjectOffset + kPointerSize;
+ static const int kValidityCellOffset = kPrototypeUsersOffset + kPointerSize;
+ static const int kSize = kValidityCellOffset + kPointerSize;
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(PrototypeInfo);
+};
+
+
// Script describes a script which has been added to the VM.
class Script: public Struct {
public:
« no previous file with comments | « src/isolate.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698