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

Side by Side Diff: src/objects.cc

Issue 234573005: Clean up the public interface of Map. (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') | src/objects-inl.h » ('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 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 2617 matching lines...) Expand 10 before | Expand all | Expand 10 after
2628 old_map->PrintGeneralization( 2628 old_map->PrintGeneralization(
2629 stdout, "", modify_index, descriptor, descriptors, 2629 stdout, "", modify_index, descriptor, descriptors,
2630 old_descriptors->GetDetails(modify_index).type() == CONSTANT && 2630 old_descriptors->GetDetails(modify_index).type() == CONSTANT &&
2631 store_mode == FORCE_FIELD, 2631 store_mode == FORCE_FIELD,
2632 old_representation, updated_representation); 2632 old_representation, updated_representation);
2633 } 2633 }
2634 2634
2635 // Add missing transitions. 2635 // Add missing transitions.
2636 Handle<Map> new_map = split_map; 2636 Handle<Map> new_map = split_map;
2637 for (; descriptor < descriptors; descriptor++) { 2637 for (; descriptor < descriptors; descriptor++) {
2638 new_map = Map::CopyInstallDescriptors(new_map, descriptor, new_descriptors); 2638 new_map = CopyInstallDescriptors(new_map, descriptor, new_descriptors);
2639 } 2639 }
2640 2640
2641 new_map->set_owns_descriptors(true); 2641 new_map->set_owns_descriptors(true);
2642 return new_map; 2642 return new_map;
2643 } 2643 }
2644 2644
2645 2645
2646 // Generalize the representation of all FIELD descriptors. 2646 // Generalize the representation of all FIELD descriptors.
2647 Handle<Map> Map::GeneralizeAllFieldRepresentations( 2647 Handle<Map> Map::GeneralizeAllFieldRepresentations(
2648 Handle<Map> map, 2648 Handle<Map> map,
(...skipping 4138 matching lines...) Expand 10 before | Expand all | Expand 10 after
6787 6787
6788 6788
6789 Handle<Map> Map::CopyNormalized(Handle<Map> map, 6789 Handle<Map> Map::CopyNormalized(Handle<Map> map,
6790 PropertyNormalizationMode mode, 6790 PropertyNormalizationMode mode,
6791 NormalizedMapSharingMode sharing) { 6791 NormalizedMapSharingMode sharing) {
6792 int new_instance_size = map->instance_size(); 6792 int new_instance_size = map->instance_size();
6793 if (mode == CLEAR_INOBJECT_PROPERTIES) { 6793 if (mode == CLEAR_INOBJECT_PROPERTIES) {
6794 new_instance_size -= map->inobject_properties() * kPointerSize; 6794 new_instance_size -= map->inobject_properties() * kPointerSize;
6795 } 6795 }
6796 6796
6797 Handle<Map> result = Map::RawCopy(map, new_instance_size); 6797 Handle<Map> result = RawCopy(map, new_instance_size);
6798 6798
6799 if (mode != CLEAR_INOBJECT_PROPERTIES) { 6799 if (mode != CLEAR_INOBJECT_PROPERTIES) {
6800 result->set_inobject_properties(map->inobject_properties()); 6800 result->set_inobject_properties(map->inobject_properties());
6801 } 6801 }
6802 6802
6803 result->set_is_shared(sharing == SHARED_NORMALIZED_MAP); 6803 result->set_is_shared(sharing == SHARED_NORMALIZED_MAP);
6804 result->set_dictionary_map(true); 6804 result->set_dictionary_map(true);
6805 result->set_migration_target(false); 6805 result->set_migration_target(false);
6806 6806
6807 #ifdef VERIFY_HEAP 6807 #ifdef VERIFY_HEAP
(...skipping 24 matching lines...) Expand all
6832 6832
6833 Handle<Map> Map::ShareDescriptor(Handle<Map> map, 6833 Handle<Map> Map::ShareDescriptor(Handle<Map> map,
6834 Handle<DescriptorArray> descriptors, 6834 Handle<DescriptorArray> descriptors,
6835 Descriptor* descriptor) { 6835 Descriptor* descriptor) {
6836 // Sanity check. This path is only to be taken if the map owns its descriptor 6836 // Sanity check. This path is only to be taken if the map owns its descriptor
6837 // array, implying that its NumberOfOwnDescriptors equals the number of 6837 // array, implying that its NumberOfOwnDescriptors equals the number of
6838 // descriptors in the descriptor array. 6838 // descriptors in the descriptor array.
6839 ASSERT(map->NumberOfOwnDescriptors() == 6839 ASSERT(map->NumberOfOwnDescriptors() ==
6840 map->instance_descriptors()->number_of_descriptors()); 6840 map->instance_descriptors()->number_of_descriptors());
6841 6841
6842 Handle<Map> result = Map::CopyDropDescriptors(map); 6842 Handle<Map> result = CopyDropDescriptors(map);
6843 Handle<Name> name = descriptor->GetKey(); 6843 Handle<Name> name = descriptor->GetKey();
6844 Handle<TransitionArray> transitions = 6844 Handle<TransitionArray> transitions =
6845 TransitionArray::CopyInsert(map, name, result, SIMPLE_TRANSITION); 6845 TransitionArray::CopyInsert(map, name, result, SIMPLE_TRANSITION);
6846 6846
6847 // Ensure there's space for the new descriptor in the shared descriptor array. 6847 // Ensure there's space for the new descriptor in the shared descriptor array.
6848 if (descriptors->NumberOfSlackDescriptors() == 0) { 6848 if (descriptors->NumberOfSlackDescriptors() == 0) {
6849 int old_size = descriptors->number_of_descriptors(); 6849 int old_size = descriptors->number_of_descriptors();
6850 if (old_size == 0) { 6850 if (old_size == 0) {
6851 descriptors = DescriptorArray::Allocate(map->GetIsolate(), 0, 1); 6851 descriptors = DescriptorArray::Allocate(map->GetIsolate(), 0, 1);
6852 } else { 6852 } else {
6853 Map::EnsureDescriptorSlack(map, old_size < 4 ? 1 : old_size / 2); 6853 EnsureDescriptorSlack(map, old_size < 4 ? 1 : old_size / 2);
6854 descriptors = handle(map->instance_descriptors()); 6854 descriptors = handle(map->instance_descriptors());
6855 } 6855 }
6856 } 6856 }
6857 6857
6858 // Commit the state atomically. 6858 // Commit the state atomically.
6859 DisallowHeapAllocation no_gc; 6859 DisallowHeapAllocation no_gc;
6860 6860
6861 descriptors->Append(descriptor); 6861 descriptors->Append(descriptor);
6862 result->SetBackPointer(*map); 6862 result->SetBackPointer(*map);
6863 result->InitializeDescriptors(*descriptors); 6863 result->InitializeDescriptors(*descriptors);
6864 6864
6865 ASSERT(result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1); 6865 ASSERT(result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1);
6866 6866
6867 map->set_transitions(*transitions); 6867 map->set_transitions(*transitions);
6868 map->set_owns_descriptors(false); 6868 map->set_owns_descriptors(false);
6869 6869
6870 return result; 6870 return result;
6871 } 6871 }
6872 6872
6873 6873
6874 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map, 6874 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map,
6875 Handle<DescriptorArray> descriptors, 6875 Handle<DescriptorArray> descriptors,
6876 TransitionFlag flag, 6876 TransitionFlag flag,
6877 SimpleTransitionFlag simple_flag) { 6877 SimpleTransitionFlag simple_flag) {
6878 return Map::CopyReplaceDescriptors( 6878 return CopyReplaceDescriptors(
6879 map, descriptors, flag, Handle<Name>::null(), simple_flag); 6879 map, descriptors, flag, Handle<Name>::null(), simple_flag);
6880 } 6880 }
6881 6881
6882 6882
6883 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map, 6883 Handle<Map> Map::CopyReplaceDescriptors(Handle<Map> map,
6884 Handle<DescriptorArray> descriptors, 6884 Handle<DescriptorArray> descriptors,
6885 TransitionFlag flag, 6885 TransitionFlag flag,
6886 Handle<Name> name, 6886 Handle<Name> name,
6887 SimpleTransitionFlag simple_flag) { 6887 SimpleTransitionFlag simple_flag) {
6888 ASSERT(descriptors->IsSortedNoDuplicates()); 6888 ASSERT(descriptors->IsSortedNoDuplicates());
(...skipping 14 matching lines...) Expand all
6903 } 6903 }
6904 6904
6905 6905
6906 // Since this method is used to rewrite an existing transition tree, it can 6906 // Since this method is used to rewrite an existing transition tree, it can
6907 // always insert transitions without checking. 6907 // always insert transitions without checking.
6908 Handle<Map> Map::CopyInstallDescriptors(Handle<Map> map, 6908 Handle<Map> Map::CopyInstallDescriptors(Handle<Map> map,
6909 int new_descriptor, 6909 int new_descriptor,
6910 Handle<DescriptorArray> descriptors) { 6910 Handle<DescriptorArray> descriptors) {
6911 ASSERT(descriptors->IsSortedNoDuplicates()); 6911 ASSERT(descriptors->IsSortedNoDuplicates());
6912 6912
6913 Handle<Map> result = Map::CopyDropDescriptors(map); 6913 Handle<Map> result = CopyDropDescriptors(map);
6914 6914
6915 result->InitializeDescriptors(*descriptors); 6915 result->InitializeDescriptors(*descriptors);
6916 result->SetNumberOfOwnDescriptors(new_descriptor + 1); 6916 result->SetNumberOfOwnDescriptors(new_descriptor + 1);
6917 6917
6918 int unused_property_fields = map->unused_property_fields(); 6918 int unused_property_fields = map->unused_property_fields();
6919 if (descriptors->GetDetails(new_descriptor).type() == FIELD) { 6919 if (descriptors->GetDetails(new_descriptor).type() == FIELD) {
6920 unused_property_fields = map->unused_property_fields() - 1; 6920 unused_property_fields = map->unused_property_fields() - 1;
6921 if (unused_property_fields < 0) { 6921 if (unused_property_fields < 0) {
6922 unused_property_fields += JSObject::kFieldsAdded; 6922 unused_property_fields += JSObject::kFieldsAdded;
6923 } 6923 }
(...skipping 27 matching lines...) Expand all
6951 IsMoreGeneralElementsKindTransition(map->elements_kind(), kind)); 6951 IsMoreGeneralElementsKindTransition(map->elements_kind(), kind));
6952 ASSERT(kind != map->elements_kind()); 6952 ASSERT(kind != map->elements_kind());
6953 } 6953 }
6954 6954
6955 bool insert_transition = 6955 bool insert_transition =
6956 flag == INSERT_TRANSITION && !map->HasElementsTransition(); 6956 flag == INSERT_TRANSITION && !map->HasElementsTransition();
6957 6957
6958 if (insert_transition && map->owns_descriptors()) { 6958 if (insert_transition && map->owns_descriptors()) {
6959 // In case the map owned its own descriptors, share the descriptors and 6959 // In case the map owned its own descriptors, share the descriptors and
6960 // transfer ownership to the new map. 6960 // transfer ownership to the new map.
6961 Handle<Map> new_map = Map::CopyDropDescriptors(map); 6961 Handle<Map> new_map = CopyDropDescriptors(map);
6962 6962
6963 SetElementsTransitionMap(map, new_map); 6963 SetElementsTransitionMap(map, new_map);
6964 6964
6965 new_map->set_elements_kind(kind); 6965 new_map->set_elements_kind(kind);
6966 new_map->InitializeDescriptors(map->instance_descriptors()); 6966 new_map->InitializeDescriptors(map->instance_descriptors());
6967 new_map->SetBackPointer(*map); 6967 new_map->SetBackPointer(*map);
6968 map->set_owns_descriptors(false); 6968 map->set_owns_descriptors(false);
6969 return new_map; 6969 return new_map;
6970 } 6970 }
6971 6971
6972 // In case the map did not own its own descriptors, a split is forced by 6972 // In case the map did not own its own descriptors, a split is forced by
6973 // copying the map; creating a new descriptor array cell. 6973 // copying the map; creating a new descriptor array cell.
6974 // Create a new free-floating map only if we are not allowed to store it. 6974 // Create a new free-floating map only if we are not allowed to store it.
6975 Handle<Map> new_map = Map::Copy(map); 6975 Handle<Map> new_map = Copy(map);
6976 6976
6977 new_map->set_elements_kind(kind); 6977 new_map->set_elements_kind(kind);
6978 6978
6979 if (insert_transition) { 6979 if (insert_transition) {
6980 SetElementsTransitionMap(map, new_map); 6980 SetElementsTransitionMap(map, new_map);
6981 new_map->SetBackPointer(*map); 6981 new_map->SetBackPointer(*map);
6982 } 6982 }
6983 6983
6984 return new_map; 6984 return new_map;
6985 } 6985 }
6986 6986
6987 6987
6988 Handle<Map> Map::CopyForObserved(Handle<Map> map) { 6988 Handle<Map> Map::CopyForObserved(Handle<Map> map) {
6989 ASSERT(!map->is_observed()); 6989 ASSERT(!map->is_observed());
6990 6990
6991 Isolate* isolate = map->GetIsolate(); 6991 Isolate* isolate = map->GetIsolate();
6992 6992
6993 // In case the map owned its own descriptors, share the descriptors and 6993 // In case the map owned its own descriptors, share the descriptors and
6994 // transfer ownership to the new map. 6994 // transfer ownership to the new map.
6995 Handle<Map> new_map; 6995 Handle<Map> new_map;
6996 if (map->owns_descriptors()) { 6996 if (map->owns_descriptors()) {
6997 new_map = Map::CopyDropDescriptors(map); 6997 new_map = CopyDropDescriptors(map);
6998 } else { 6998 } else {
6999 new_map = Map::Copy(map); 6999 new_map = Copy(map);
7000 } 7000 }
7001 7001
7002 Handle<TransitionArray> transitions = TransitionArray::CopyInsert( 7002 Handle<TransitionArray> transitions = TransitionArray::CopyInsert(
7003 map, isolate->factory()->observed_symbol(), new_map, FULL_TRANSITION); 7003 map, isolate->factory()->observed_symbol(), new_map, FULL_TRANSITION);
7004 7004
7005 map->set_transitions(*transitions); 7005 map->set_transitions(*transitions);
7006 7006
7007 new_map->set_is_observed(); 7007 new_map->set_is_observed();
7008 7008
7009 if (map->owns_descriptors()) { 7009 if (map->owns_descriptors()) {
7010 new_map->InitializeDescriptors(map->instance_descriptors()); 7010 new_map->InitializeDescriptors(map->instance_descriptors());
7011 map->set_owns_descriptors(false); 7011 map->set_owns_descriptors(false);
7012 } 7012 }
7013 7013
7014 new_map->SetBackPointer(*map); 7014 new_map->SetBackPointer(*map);
7015 return new_map; 7015 return new_map;
7016 } 7016 }
7017 7017
7018 7018
7019 Handle<Map> Map::Copy(Handle<Map> map) { 7019 Handle<Map> Map::Copy(Handle<Map> map) {
7020 Handle<DescriptorArray> descriptors(map->instance_descriptors()); 7020 Handle<DescriptorArray> descriptors(map->instance_descriptors());
7021 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); 7021 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
7022 Handle<DescriptorArray> new_descriptors = 7022 Handle<DescriptorArray> new_descriptors =
7023 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors); 7023 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors);
7024 return Map::CopyReplaceDescriptors(map, new_descriptors, OMIT_TRANSITION); 7024 return CopyReplaceDescriptors(map, new_descriptors, OMIT_TRANSITION);
7025 } 7025 }
7026 7026
7027 7027
7028 Handle<Map> Map::Create(Handle<JSFunction> constructor, 7028 Handle<Map> Map::Create(Handle<JSFunction> constructor,
7029 int extra_inobject_properties) { 7029 int extra_inobject_properties) {
7030 Handle<Map> copy = Copy(handle(constructor->initial_map())); 7030 Handle<Map> copy = Copy(handle(constructor->initial_map()));
7031 7031
7032 // Check that we do not overflow the instance size when adding the 7032 // Check that we do not overflow the instance size when adding the
7033 // extra inobject properties. 7033 // extra inobject properties.
7034 int instance_size_delta = extra_inobject_properties * kPointerSize; 7034 int instance_size_delta = extra_inobject_properties * kPointerSize;
(...skipping 23 matching lines...) Expand all
7058 Descriptor* descriptor, 7058 Descriptor* descriptor,
7059 TransitionFlag flag) { 7059 TransitionFlag flag) {
7060 Handle<DescriptorArray> descriptors(map->instance_descriptors()); 7060 Handle<DescriptorArray> descriptors(map->instance_descriptors());
7061 7061
7062 // Ensure the key is unique. 7062 // Ensure the key is unique.
7063 descriptor->KeyToUniqueName(); 7063 descriptor->KeyToUniqueName();
7064 7064
7065 if (flag == INSERT_TRANSITION && 7065 if (flag == INSERT_TRANSITION &&
7066 map->owns_descriptors() && 7066 map->owns_descriptors() &&
7067 map->CanHaveMoreTransitions()) { 7067 map->CanHaveMoreTransitions()) {
7068 return Map::ShareDescriptor(map, descriptors, descriptor); 7068 return ShareDescriptor(map, descriptors, descriptor);
7069 } 7069 }
7070 7070
7071 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo( 7071 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo(
7072 descriptors, map->NumberOfOwnDescriptors(), 1); 7072 descriptors, map->NumberOfOwnDescriptors(), 1);
7073 new_descriptors->Append(descriptor); 7073 new_descriptors->Append(descriptor);
7074 7074
7075 return Map::CopyReplaceDescriptors( 7075 return CopyReplaceDescriptors(
7076 map, new_descriptors, flag, descriptor->GetKey(), SIMPLE_TRANSITION); 7076 map, new_descriptors, flag, descriptor->GetKey(), SIMPLE_TRANSITION);
7077 } 7077 }
7078 7078
7079 7079
7080 Handle<Map> Map::CopyInsertDescriptor(Handle<Map> map, 7080 Handle<Map> Map::CopyInsertDescriptor(Handle<Map> map,
7081 Descriptor* descriptor, 7081 Descriptor* descriptor,
7082 TransitionFlag flag) { 7082 TransitionFlag flag) {
7083 Handle<DescriptorArray> old_descriptors(map->instance_descriptors()); 7083 Handle<DescriptorArray> old_descriptors(map->instance_descriptors());
7084 7084
7085 // Ensure the key is unique. 7085 // Ensure the key is unique.
7086 descriptor->KeyToUniqueName(); 7086 descriptor->KeyToUniqueName();
7087 7087
7088 // We replace the key if it is already present. 7088 // We replace the key if it is already present.
7089 int index = old_descriptors->SearchWithCache(*descriptor->GetKey(), *map); 7089 int index = old_descriptors->SearchWithCache(*descriptor->GetKey(), *map);
7090 if (index != DescriptorArray::kNotFound) { 7090 if (index != DescriptorArray::kNotFound) {
7091 return Map::CopyReplaceDescriptor( 7091 return CopyReplaceDescriptor(map, old_descriptors, descriptor, index, flag);
7092 map, old_descriptors, descriptor, index, flag);
7093 } 7092 }
7094 return Map::CopyAddDescriptor(map, descriptor, flag); 7093 return CopyAddDescriptor(map, descriptor, flag);
7095 } 7094 }
7096 7095
7097 7096
7098 Handle<DescriptorArray> DescriptorArray::CopyUpTo( 7097 Handle<DescriptorArray> DescriptorArray::CopyUpTo(
7099 Handle<DescriptorArray> desc, 7098 Handle<DescriptorArray> desc,
7100 int enumeration_index, 7099 int enumeration_index,
7101 int slack) { 7100 int slack) {
7102 return DescriptorArray::CopyUpToAddAttributes( 7101 return DescriptorArray::CopyUpToAddAttributes(
7103 desc, enumeration_index, NONE, slack); 7102 desc, enumeration_index, NONE, slack);
7104 } 7103 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
7160 7159
7161 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo( 7160 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo(
7162 descriptors, map->NumberOfOwnDescriptors()); 7161 descriptors, map->NumberOfOwnDescriptors());
7163 7162
7164 new_descriptors->Replace(insertion_index, descriptor); 7163 new_descriptors->Replace(insertion_index, descriptor);
7165 7164
7166 SimpleTransitionFlag simple_flag = 7165 SimpleTransitionFlag simple_flag =
7167 (insertion_index == descriptors->number_of_descriptors() - 1) 7166 (insertion_index == descriptors->number_of_descriptors() - 1)
7168 ? SIMPLE_TRANSITION 7167 ? SIMPLE_TRANSITION
7169 : FULL_TRANSITION; 7168 : FULL_TRANSITION;
7170 return Map::CopyReplaceDescriptors( 7169 return CopyReplaceDescriptors(map, new_descriptors, flag, key, simple_flag);
7171 map, new_descriptors, flag, key, simple_flag);
7172 } 7170 }
7173 7171
7174 7172
7175 void Map::UpdateCodeCache(Handle<Map> map, 7173 void Map::UpdateCodeCache(Handle<Map> map,
7176 Handle<Name> name, 7174 Handle<Name> name,
7177 Handle<Code> code) { 7175 Handle<Code> code) {
7178 Isolate* isolate = map->GetIsolate(); 7176 Isolate* isolate = map->GetIsolate();
7179 CALL_HEAP_FUNCTION_VOID(isolate, 7177 CALL_HEAP_FUNCTION_VOID(isolate,
7180 map->UpdateCodeCache(*name, *code)); 7178 map->UpdateCodeCache(*name, *code));
7181 } 7179 }
(...skipping 4344 matching lines...) Expand 10 before | Expand all | Expand 10 after
11526 int capacity = (cache->length() - header) / step; 11524 int capacity = (cache->length() - header) / step;
11527 int transitions = map->NumberOfProtoTransitions() + 1; 11525 int transitions = map->NumberOfProtoTransitions() + 1;
11528 11526
11529 if (transitions > capacity) { 11527 if (transitions > capacity) {
11530 if (capacity > kMaxCachedPrototypeTransitions) return map; 11528 if (capacity > kMaxCachedPrototypeTransitions) return map;
11531 11529
11532 // Grow array by factor 2 over and above what we need. 11530 // Grow array by factor 2 over and above what we need.
11533 Factory* factory = map->GetIsolate()->factory(); 11531 Factory* factory = map->GetIsolate()->factory();
11534 cache = factory->CopySizeFixedArray(cache, transitions * 2 * step + header); 11532 cache = factory->CopySizeFixedArray(cache, transitions * 2 * step + header);
11535 11533
11536 Map::SetPrototypeTransitions(map, cache); 11534 SetPrototypeTransitions(map, cache);
11537 } 11535 }
11538 11536
11539 // Reload number of transitions as GC might shrink them. 11537 // Reload number of transitions as GC might shrink them.
11540 int last = map->NumberOfProtoTransitions(); 11538 int last = map->NumberOfProtoTransitions();
11541 int entry = header + last * step; 11539 int entry = header + last * step;
11542 11540
11543 cache->set(entry + kProtoTransitionPrototypeOffset, *prototype); 11541 cache->set(entry + kProtoTransitionPrototypeOffset, *prototype);
11544 cache->set(entry + kProtoTransitionMapOffset, *target_map); 11542 cache->set(entry + kProtoTransitionMapOffset, *target_map);
11545 map->SetNumberOfProtoTransitions(last + 1); 11543 map->SetNumberOfProtoTransitions(last + 1);
11546 11544
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
11806 11804
11807 void DependentCode::AddToDependentICList(Handle<Code> stub) { 11805 void DependentCode::AddToDependentICList(Handle<Code> stub) {
11808 DisallowHeapAllocation no_heap_allocation; 11806 DisallowHeapAllocation no_heap_allocation;
11809 GroupStartIndexes starts(this); 11807 GroupStartIndexes starts(this);
11810 int i = starts.at(kWeakICGroup); 11808 int i = starts.at(kWeakICGroup);
11811 stub->set_next_code_link(object_at(i)); 11809 stub->set_next_code_link(object_at(i));
11812 set_object_at(i, *stub); 11810 set_object_at(i, *stub);
11813 } 11811 }
11814 11812
11815 11813
11814 Handle<Map> Map::TransitionToPrototype(Handle<Map> map,
11815 Handle<Object> prototype) {
11816 Handle<Map> new_map = GetPrototypeTransition(map, prototype);
11817 if (new_map.is_null()) {
11818 new_map = Copy(map);
11819 PutPrototypeTransition(map, prototype, new_map);
11820 new_map->set_prototype(*prototype);
11821 }
11822 return new_map;
11823 }
11824
11825
11816 Handle<Object> JSObject::SetPrototype(Handle<JSObject> object, 11826 Handle<Object> JSObject::SetPrototype(Handle<JSObject> object,
11817 Handle<Object> value, 11827 Handle<Object> value,
11818 bool skip_hidden_prototypes) { 11828 bool skip_hidden_prototypes) {
11819 #ifdef DEBUG 11829 #ifdef DEBUG
11820 int size = object->Size(); 11830 int size = object->Size();
11821 #endif 11831 #endif
11822 11832
11823 Isolate* isolate = object->GetIsolate(); 11833 Isolate* isolate = object->GetIsolate();
11824 Heap* heap = isolate->heap(); 11834 Heap* heap = isolate->heap();
11825 // Silently ignore the change if value is not a JSObject or null. 11835 // Silently ignore the change if value is not a JSObject or null.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
11876 // Set the new prototype of the object. 11886 // Set the new prototype of the object.
11877 Handle<Map> map(real_receiver->map()); 11887 Handle<Map> map(real_receiver->map());
11878 11888
11879 // Nothing to do if prototype is already set. 11889 // Nothing to do if prototype is already set.
11880 if (map->prototype() == *value) return value; 11890 if (map->prototype() == *value) return value;
11881 11891
11882 if (value->IsJSObject()) { 11892 if (value->IsJSObject()) {
11883 JSObject::OptimizeAsPrototype(Handle<JSObject>::cast(value)); 11893 JSObject::OptimizeAsPrototype(Handle<JSObject>::cast(value));
11884 } 11894 }
11885 11895
11886 Handle<Map> new_map = Map::GetPrototypeTransition(map, value); 11896 Handle<Map> new_map = Map::TransitionToPrototype(map, value);
11887 if (new_map.is_null()) {
11888 new_map = Map::Copy(map);
11889 Map::PutPrototypeTransition(map, value, new_map);
11890 new_map->set_prototype(*value);
11891 }
11892 ASSERT(new_map->prototype() == *value); 11897 ASSERT(new_map->prototype() == *value);
11893 JSObject::MigrateToMap(real_receiver, new_map); 11898 JSObject::MigrateToMap(real_receiver, new_map);
11894 11899
11895 if (!dictionary_elements_in_chain && 11900 if (!dictionary_elements_in_chain &&
11896 new_map->DictionaryElementsInPrototypeChainOnly()) { 11901 new_map->DictionaryElementsInPrototypeChainOnly()) {
11897 // If the prototype chain didn't previously have element callbacks, then 11902 // If the prototype chain didn't previously have element callbacks, then
11898 // KeyedStoreICs need to be cleared to ensure any that involve this 11903 // KeyedStoreICs need to be cleared to ensure any that involve this
11899 // map go generic. 11904 // map go generic.
11900 object->GetHeap()->ClearAllICsByKind(Code::KEYED_STORE_IC); 11905 object->GetHeap()->ClearAllICsByKind(Code::KEYED_STORE_IC);
11901 } 11906 }
(...skipping 4615 matching lines...) Expand 10 before | Expand all | Expand 10 after
16517 #define ERROR_MESSAGES_TEXTS(C, T) T, 16522 #define ERROR_MESSAGES_TEXTS(C, T) T,
16518 static const char* error_messages_[] = { 16523 static const char* error_messages_[] = {
16519 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16524 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16520 }; 16525 };
16521 #undef ERROR_MESSAGES_TEXTS 16526 #undef ERROR_MESSAGES_TEXTS
16522 return error_messages_[reason]; 16527 return error_messages_[reason];
16523 } 16528 }
16524 16529
16525 16530
16526 } } // namespace v8::internal 16531 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698