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

Side by Side Diff: src/objects.cc

Issue 239203002: Move CopyReplaceDescriptors to private (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 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/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 5732 matching lines...) Expand 10 before | Expand all | Expand 10 after
5743 int transition_index = old_map->SearchTransition( 5743 int transition_index = old_map->SearchTransition(
5744 isolate->heap()->frozen_symbol()); 5744 isolate->heap()->frozen_symbol());
5745 if (transition_index != TransitionArray::kNotFound) { 5745 if (transition_index != TransitionArray::kNotFound) {
5746 Handle<Map> transition_map(old_map->GetTransition(transition_index)); 5746 Handle<Map> transition_map(old_map->GetTransition(transition_index));
5747 ASSERT(transition_map->has_dictionary_elements()); 5747 ASSERT(transition_map->has_dictionary_elements());
5748 ASSERT(transition_map->is_frozen()); 5748 ASSERT(transition_map->is_frozen());
5749 ASSERT(!transition_map->is_extensible()); 5749 ASSERT(!transition_map->is_extensible());
5750 JSObject::MigrateToMap(object, transition_map); 5750 JSObject::MigrateToMap(object, transition_map);
5751 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { 5751 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) {
5752 // Create a new descriptor array with fully-frozen properties 5752 // Create a new descriptor array with fully-frozen properties
5753 int num_descriptors = old_map->NumberOfOwnDescriptors(); 5753 Handle<Map> new_map = Map::CopyForFreeze(old_map);
5754 Handle<DescriptorArray> new_descriptors =
5755 DescriptorArray::CopyUpToAddAttributes(
5756 handle(old_map->instance_descriptors()), num_descriptors, FROZEN);
5757 Handle<Map> new_map = Map::CopyReplaceDescriptors(
5758 old_map, new_descriptors, INSERT_TRANSITION,
5759 isolate->factory()->frozen_symbol());
5760 new_map->freeze();
5761 new_map->set_is_extensible(false);
5762 new_map->set_elements_kind(DICTIONARY_ELEMENTS);
5763 JSObject::MigrateToMap(object, new_map); 5754 JSObject::MigrateToMap(object, new_map);
5764 } else { 5755 } else {
5765 // Slow path: need to normalize properties for safety 5756 // Slow path: need to normalize properties for safety
5766 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 5757 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0);
5767 5758
5768 // Create a new map, since other objects with this map may be extensible. 5759 // Create a new map, since other objects with this map may be extensible.
5769 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. 5760 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps.
5770 Handle<Map> new_map = Map::Copy(handle(object->map())); 5761 Handle<Map> new_map = Map::Copy(handle(object->map()));
5771 new_map->freeze(); 5762 new_map->freeze();
5772 new_map->set_is_extensible(false); 5763 new_map->set_is_extensible(false);
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after
6949 map->set_transitions(*transitions); 6940 map->set_transitions(*transitions);
6950 map->set_owns_descriptors(false); 6941 map->set_owns_descriptors(false);
6951 6942
6952 return result; 6943 return result;
6953 } 6944 }
6954 6945
6955 6946
6956 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map, 6947 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map,
6957 Handle<DescriptorArray> descriptors, 6948 Handle<DescriptorArray> descriptors,
6958 TransitionFlag flag, 6949 TransitionFlag flag,
6959 SimpleTransitionFlag simple_flag) {
6960 return CopyReplaceDescriptors(
6961 map, descriptors, flag, Handle<Name>::null(), simple_flag);
6962 }
6963
6964
6965 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map,
6966 Handle<DescriptorArray> descriptors,
6967 TransitionFlag flag,
6968 Handle<Name> name, 6950 Handle<Name> name,
Igor Sheludko 2014/04/16 10:26:21 While we are here: since name can be null handle p
Toon Verwaest 2014/04/16 11:16:47 Done.
6969 SimpleTransitionFlag simple_flag) { 6951 SimpleTransitionFlag simple_flag) {
6970 ASSERT(descriptors->IsSortedNoDuplicates()); 6952 ASSERT(descriptors->IsSortedNoDuplicates());
6971 6953
6972 Handle<Map> result = CopyDropDescriptors(map); 6954 Handle<Map> result = CopyDropDescriptors(map);
6973 result->InitializeDescriptors(*descriptors); 6955 result->InitializeDescriptors(*descriptors);
6974 6956
6975 if (flag == INSERT_TRANSITION && map->CanHaveMoreTransitions()) { 6957 if (flag == INSERT_TRANSITION && map->CanHaveMoreTransitions()) {
6976 Handle<TransitionArray> transitions = TransitionArray::CopyInsert( 6958 Handle<TransitionArray> transitions = TransitionArray::CopyInsert(
6977 map, name, result, simple_flag); 6959 map, name, result, simple_flag);
Igor Sheludko 2014/04/16 10:26:21 ... and name.ToHandleChecked() here as CopyInsert(
Toon Verwaest 2014/04/16 11:16:47 Done.
6978 map->set_transitions(*transitions); 6960 map->set_transitions(*transitions);
6979 result->SetBackPointer(*map); 6961 result->SetBackPointer(*map);
6980 } else { 6962 } else {
6981 int length = descriptors->number_of_descriptors(); 6963 int length = descriptors->number_of_descriptors();
6982 for (int i = 0; i < length; i++) { 6964 for (int i = 0; i < length; i++) {
6983 descriptors->SetRepresentation(i, Representation::Tagged()); 6965 descriptors->SetRepresentation(i, Representation::Tagged());
6984 if (descriptors->GetDetails(i).type() == FIELD) { 6966 if (descriptors->GetDetails(i).type() == FIELD) {
6985 descriptors->SetValue(i, HeapType::Any()); 6967 descriptors->SetValue(i, HeapType::Any());
6986 } 6968 }
6987 } 6969 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
7102 new_map->SetBackPointer(*map); 7084 new_map->SetBackPointer(*map);
7103 return new_map; 7085 return new_map;
7104 } 7086 }
7105 7087
7106 7088
7107 Handle<Map> Map::Copy(Handle<Map> map) { 7089 Handle<Map> Map::Copy(Handle<Map> map) {
7108 Handle<DescriptorArray> descriptors(map->instance_descriptors()); 7090 Handle<DescriptorArray> descriptors(map->instance_descriptors());
7109 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); 7091 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
7110 Handle<DescriptorArray> new_descriptors = 7092 Handle<DescriptorArray> new_descriptors =
7111 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors); 7093 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors);
7112 return CopyReplaceDescriptors(map, new_descriptors, OMIT_TRANSITION); 7094 return CopyReplaceDescriptors(
7095 map, new_descriptors, OMIT_TRANSITION, Handle<Name>());
7113 } 7096 }
7114 7097
7115 7098
7116 Handle<Map> Map::Create(Handle<JSFunction> constructor, 7099 Handle<Map> Map::Create(Handle<JSFunction> constructor,
7117 int extra_inobject_properties) { 7100 int extra_inobject_properties) {
7118 Handle<Map> copy = Copy(handle(constructor->initial_map())); 7101 Handle<Map> copy = Copy(handle(constructor->initial_map()));
7119 7102
7120 // Check that we do not overflow the instance size when adding the 7103 // Check that we do not overflow the instance size when adding the
7121 // extra inobject properties. 7104 // extra inobject properties.
7122 int instance_size_delta = extra_inobject_properties * kPointerSize; 7105 int instance_size_delta = extra_inobject_properties * kPointerSize;
(...skipping 12 matching lines...) Expand all
7135 int inobject_properties = 7118 int inobject_properties =
7136 copy->inobject_properties() + extra_inobject_properties; 7119 copy->inobject_properties() + extra_inobject_properties;
7137 copy->set_inobject_properties(inobject_properties); 7120 copy->set_inobject_properties(inobject_properties);
7138 copy->set_unused_property_fields(inobject_properties); 7121 copy->set_unused_property_fields(inobject_properties);
7139 copy->set_instance_size(copy->instance_size() + instance_size_delta); 7122 copy->set_instance_size(copy->instance_size() + instance_size_delta);
7140 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); 7123 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy));
7141 return copy; 7124 return copy;
7142 } 7125 }
7143 7126
7144 7127
7128 Handle<Map> Map::CopyForFreeze(Handle<Map> map) {
7129 int num_descriptors = map->NumberOfOwnDescriptors();
7130 Isolate* isolate = map->GetIsolate();
7131 Handle<DescriptorArray> new_desc = DescriptorArray::CopyUpToAddAttributes(
7132 handle(map->instance_descriptors(), isolate), num_descriptors, FROZEN);
7133 Handle<Map> new_map = Map::CopyReplaceDescriptors(
7134 map, new_desc, INSERT_TRANSITION, isolate->factory()->frozen_symbol());
7135 new_map->freeze();
7136 new_map->set_is_extensible(false);
7137 new_map->set_elements_kind(DICTIONARY_ELEMENTS);
7138 return new_map;
7139 }
7140
7141
7145 Handle<Map> Map::CopyAddDescriptor(Handle<Map> map, 7142 Handle<Map> Map::CopyAddDescriptor(Handle<Map> map,
7146 Descriptor* descriptor, 7143 Descriptor* descriptor,
7147 TransitionFlag flag) { 7144 TransitionFlag flag) {
7148 Handle<DescriptorArray> descriptors(map->instance_descriptors()); 7145 Handle<DescriptorArray> descriptors(map->instance_descriptors());
7149 7146
7150 // Ensure the key is unique. 7147 // Ensure the key is unique.
7151 descriptor->KeyToUniqueName(); 7148 descriptor->KeyToUniqueName();
7152 7149
7153 if (flag == INSERT_TRANSITION && 7150 if (flag == INSERT_TRANSITION &&
7154 map->owns_descriptors() && 7151 map->owns_descriptors() &&
(...skipping 9423 matching lines...) Expand 10 before | Expand all | Expand 10 after
16578 #define ERROR_MESSAGES_TEXTS(C, T) T, 16575 #define ERROR_MESSAGES_TEXTS(C, T) T,
16579 static const char* error_messages_[] = { 16576 static const char* error_messages_[] = {
16580 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16577 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16581 }; 16578 };
16582 #undef ERROR_MESSAGES_TEXTS 16579 #undef ERROR_MESSAGES_TEXTS
16583 return error_messages_[reason]; 16580 return error_messages_[reason];
16584 } 16581 }
16585 16582
16586 16583
16587 } } // namespace v8::internal 16584 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698