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

Side by Side Diff: src/objects.cc

Issue 793453004: Reland of "TransitionArray now uses <is_data_property, name, attributes> tuple as a key, which allo… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Post-rebase fixes Created 6 years 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
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('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 // 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 #include <sstream> 5 #include <sstream>
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 1932 matching lines...) Expand 10 before | Expand all | Expand 10 after
1943 return false; 1943 return false;
1944 } 1944 }
1945 // Otherwise, properties will need to be moved to the backing store. 1945 // Otherwise, properties will need to be moved to the backing store.
1946 return true; 1946 return true;
1947 } 1947 }
1948 1948
1949 1949
1950 void Map::ConnectElementsTransition(Handle<Map> parent, Handle<Map> child) { 1950 void Map::ConnectElementsTransition(Handle<Map> parent, Handle<Map> child) {
1951 Isolate* isolate = parent->GetIsolate(); 1951 Isolate* isolate = parent->GetIsolate();
1952 Handle<Name> name = isolate->factory()->elements_transition_symbol(); 1952 Handle<Name> name = isolate->factory()->elements_transition_symbol();
1953 ConnectTransition(parent, child, name, FULL_TRANSITION); 1953 ConnectTransition(parent, child, name, SPECIAL_TRANSITION);
1954 } 1954 }
1955 1955
1956 1956
1957 void JSObject::MigrateToMap(Handle<JSObject> object, Handle<Map> new_map) { 1957 void JSObject::MigrateToMap(Handle<JSObject> object, Handle<Map> new_map) {
1958 if (object->map() == *new_map) return; 1958 if (object->map() == *new_map) return;
1959 if (object->HasFastProperties()) { 1959 if (object->HasFastProperties()) {
1960 if (!new_map->is_dictionary_map()) { 1960 if (!new_map->is_dictionary_map()) {
1961 Handle<Map> old_map(object->map()); 1961 Handle<Map> old_map(object->map());
1962 MigrateFastToFast(object, new_map); 1962 MigrateFastToFast(object, new_map);
1963 if (old_map->is_prototype_map()) { 1963 if (old_map->is_prototype_map()) {
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
2201 2201
2202 for (int i = 0; i < number_of_own_descriptors; i++) { 2202 for (int i = 0; i < number_of_own_descriptors; i++) {
2203 descriptors->SetRepresentation(i, Representation::Tagged()); 2203 descriptors->SetRepresentation(i, Representation::Tagged());
2204 if (descriptors->GetDetails(i).type() == FIELD) { 2204 if (descriptors->GetDetails(i).type() == FIELD) {
2205 descriptors->SetValue(i, HeapType::Any()); 2205 descriptors->SetValue(i, HeapType::Any());
2206 } 2206 }
2207 } 2207 }
2208 2208
2209 Handle<LayoutDescriptor> new_layout_descriptor( 2209 Handle<LayoutDescriptor> new_layout_descriptor(
2210 LayoutDescriptor::FastPointerLayout(), isolate); 2210 LayoutDescriptor::FastPointerLayout(), isolate);
2211 Handle<Map> new_map = 2211 Handle<Map> new_map = CopyReplaceDescriptors(
2212 CopyReplaceDescriptors(map, descriptors, new_layout_descriptor, 2212 map, descriptors, new_layout_descriptor, OMIT_TRANSITION,
2213 OMIT_TRANSITION, MaybeHandle<Name>(), reason); 2213 MaybeHandle<Name>(), reason, SPECIAL_TRANSITION);
2214 2214
2215 // Unless the instance is being migrated, ensure that modify_index is a field. 2215 // Unless the instance is being migrated, ensure that modify_index is a field.
2216 PropertyDetails details = descriptors->GetDetails(modify_index); 2216 PropertyDetails details = descriptors->GetDetails(modify_index);
2217 if (store_mode == FORCE_FIELD && 2217 if (store_mode == FORCE_FIELD &&
2218 (details.type() != FIELD || details.attributes() != attributes)) { 2218 (details.type() != FIELD || details.attributes() != attributes)) {
2219 int field_index = details.type() == FIELD ? details.field_index() 2219 int field_index = details.type() == FIELD ? details.field_index()
2220 : new_map->NumberOfFields(); 2220 : new_map->NumberOfFields();
2221 FieldDescriptor d(handle(descriptors->GetKey(modify_index), isolate), 2221 FieldDescriptor d(handle(descriptors->GetKey(modify_index), isolate),
2222 field_index, attributes, Representation::Tagged()); 2222 field_index, attributes, Representation::Tagged());
2223 descriptors->Replace(modify_index, &d); 2223 descriptors->Replace(modify_index, &d);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 dependent_code()->DeoptimizeDependentCodeGroup( 2271 dependent_code()->DeoptimizeDependentCodeGroup(
2272 GetIsolate(), DependentCode::kTransitionGroup); 2272 GetIsolate(), DependentCode::kTransitionGroup);
2273 NotifyLeafMapLayoutChange(); 2273 NotifyLeafMapLayoutChange();
2274 } 2274 }
2275 2275
2276 2276
2277 // Invalidates a transition target at |key|, and installs |new_descriptors| over 2277 // Invalidates a transition target at |key|, and installs |new_descriptors| over
2278 // the current instance_descriptors to ensure proper sharing of descriptor 2278 // the current instance_descriptors to ensure proper sharing of descriptor
2279 // arrays. 2279 // arrays.
2280 // Returns true if the transition target at given key was deprecated. 2280 // Returns true if the transition target at given key was deprecated.
2281 bool Map::DeprecateTarget(Name* key, DescriptorArray* new_descriptors, 2281 bool Map::DeprecateTarget(PropertyType type, Name* key,
2282 PropertyAttributes attributes,
2283 DescriptorArray* new_descriptors,
2282 LayoutDescriptor* new_layout_descriptor) { 2284 LayoutDescriptor* new_layout_descriptor) {
2283 bool transition_target_deprecated = false; 2285 bool transition_target_deprecated = false;
2284 if (HasTransitionArray()) { 2286 if (HasTransitionArray()) {
2285 TransitionArray* transitions = this->transitions(); 2287 TransitionArray* transitions = this->transitions();
2286 int transition = transitions->Search(key); 2288 int transition = transitions->Search(type, key, attributes);
2287 if (transition != TransitionArray::kNotFound) { 2289 if (transition != TransitionArray::kNotFound) {
2288 transitions->GetTarget(transition)->DeprecateTransitionTree(); 2290 transitions->GetTarget(transition)->DeprecateTransitionTree();
2289 transition_target_deprecated = true; 2291 transition_target_deprecated = true;
2290 } 2292 }
2291 } 2293 }
2292 2294
2293 // Don't overwrite the empty descriptor array. 2295 // Don't overwrite the empty descriptor array.
2294 if (NumberOfOwnDescriptors() == 0) return transition_target_deprecated; 2296 if (NumberOfOwnDescriptors() == 0) return transition_target_deprecated;
2295 2297
2296 DescriptorArray* to_replace = instance_descriptors(); 2298 DescriptorArray* to_replace = instance_descriptors();
(...skipping 28 matching lines...) Expand all
2325 DisallowHeapAllocation no_allocation; 2327 DisallowHeapAllocation no_allocation;
2326 2328
2327 // This can only be called on roots of transition trees. 2329 // This can only be called on roots of transition trees.
2328 DCHECK(GetBackPointer()->IsUndefined()); 2330 DCHECK(GetBackPointer()->IsUndefined());
2329 2331
2330 Map* current = this; 2332 Map* current = this;
2331 2333
2332 for (int i = verbatim; i < length; i++) { 2334 for (int i = verbatim; i < length; i++) {
2333 if (!current->HasTransitionArray()) break; 2335 if (!current->HasTransitionArray()) break;
2334 Name* name = descriptors->GetKey(i); 2336 Name* name = descriptors->GetKey(i);
2337 PropertyDetails details = descriptors->GetDetails(i);
2335 TransitionArray* transitions = current->transitions(); 2338 TransitionArray* transitions = current->transitions();
2336 int transition = transitions->Search(name); 2339 int transition =
2340 transitions->Search(details.type(), name, details.attributes());
2337 if (transition == TransitionArray::kNotFound) break; 2341 if (transition == TransitionArray::kNotFound) break;
2338 2342
2339 Map* next = transitions->GetTarget(transition); 2343 Map* next = transitions->GetTarget(transition);
2340 DescriptorArray* next_descriptors = next->instance_descriptors(); 2344 DescriptorArray* next_descriptors = next->instance_descriptors();
2341 2345
2342 PropertyDetails details = descriptors->GetDetails(i);
2343 PropertyDetails next_details = next_descriptors->GetDetails(i); 2346 PropertyDetails next_details = next_descriptors->GetDetails(i);
2344 if (details.type() != next_details.type()) break; 2347 if (details.type() != next_details.type()) break;
2345 if (details.attributes() != next_details.attributes()) break; 2348 if (details.attributes() != next_details.attributes()) break;
2346 if (!details.representation().Equals(next_details.representation())) break; 2349 if (!details.representation().Equals(next_details.representation())) break;
2347 if (next_details.type() == FIELD) { 2350 if (next_details.type() == FIELD) {
2348 if (!descriptors->GetFieldType(i)->NowIs( 2351 if (!descriptors->GetFieldType(i)->NowIs(
2349 next_descriptors->GetFieldType(i))) break; 2352 next_descriptors->GetFieldType(i))) break;
2350 } else { 2353 } else {
2351 if (descriptors->GetValue(i) != next_descriptors->GetValue(i)) break; 2354 if (descriptors->GetValue(i) != next_descriptors->GetValue(i)) break;
2352 } 2355 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
2536 (old_details.type() == FIELD && 2539 (old_details.type() == FIELD &&
2537 (!new_field_type->NowIs(old_descriptors->GetFieldType(modify_index)) || 2540 (!new_field_type->NowIs(old_descriptors->GetFieldType(modify_index)) ||
2538 !new_representation.fits_into(old_details.representation())))) { 2541 !new_representation.fits_into(old_details.representation())))) {
2539 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, 2542 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode,
2540 "GenAll_RootModification"); 2543 "GenAll_RootModification");
2541 } 2544 }
2542 } 2545 }
2543 2546
2544 Handle<Map> target_map = root_map; 2547 Handle<Map> target_map = root_map;
2545 for (int i = root_nof; i < old_nof; ++i) { 2548 for (int i = root_nof; i < old_nof; ++i) {
2546 int j = target_map->SearchTransition(old_descriptors->GetKey(i)); 2549 PropertyDetails old_details = old_descriptors->GetDetails(i);
2550 int j = target_map->SearchTransition(old_details.type(),
2551 old_descriptors->GetKey(i),
2552 old_details.attributes());
2547 if (j == TransitionArray::kNotFound) break; 2553 if (j == TransitionArray::kNotFound) break;
2548 Handle<Map> tmp_map(target_map->GetTransition(j), isolate); 2554 Handle<Map> tmp_map(target_map->GetTransition(j), isolate);
2549 Handle<DescriptorArray> tmp_descriptors = handle( 2555 Handle<DescriptorArray> tmp_descriptors = handle(
2550 tmp_map->instance_descriptors(), isolate); 2556 tmp_map->instance_descriptors(), isolate);
2551 2557
2552 // Check if target map is incompatible. 2558 // Check if target map is incompatible.
2553 PropertyDetails old_details = old_descriptors->GetDetails(i);
2554 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i); 2559 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i);
2555 PropertyType old_type = old_details.type(); 2560 PropertyType old_type = old_details.type();
2556 PropertyType tmp_type = tmp_details.type(); 2561 PropertyType tmp_type = tmp_details.type();
2557 if (tmp_details.attributes() != old_details.attributes() || 2562 DCHECK_EQ(old_details.attributes(), tmp_details.attributes());
2558 ((tmp_type == CALLBACKS || old_type == CALLBACKS) && 2563 if ((tmp_type == CALLBACKS || old_type == CALLBACKS) &&
2559 (tmp_type != old_type || 2564 (tmp_type != old_type ||
2560 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { 2565 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i))) {
2561 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, 2566 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode,
2562 "GenAll_Incompatible"); 2567 "GenAll_Incompatible");
2563 } 2568 }
2564 Representation old_representation = old_details.representation(); 2569 Representation old_representation = old_details.representation();
2565 Representation tmp_representation = tmp_details.representation(); 2570 Representation tmp_representation = tmp_details.representation();
2566 if (!old_representation.fits_into(tmp_representation) || 2571 if (!old_representation.fits_into(tmp_representation) ||
2567 (!new_representation.fits_into(tmp_representation) && 2572 (!new_representation.fits_into(tmp_representation) &&
2568 modify_index == i)) { 2573 modify_index == i)) {
2569 break; 2574 break;
2570 } 2575 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2602 DCHECK(new_representation.fits_into( 2607 DCHECK(new_representation.fits_into(
2603 target_descriptors->GetDetails(modify_index).representation())); 2608 target_descriptors->GetDetails(modify_index).representation()));
2604 DCHECK(target_descriptors->GetDetails(modify_index).type() != FIELD || 2609 DCHECK(target_descriptors->GetDetails(modify_index).type() != FIELD ||
2605 new_field_type->NowIs( 2610 new_field_type->NowIs(
2606 target_descriptors->GetFieldType(modify_index))); 2611 target_descriptors->GetFieldType(modify_index)));
2607 return target_map; 2612 return target_map;
2608 } 2613 }
2609 2614
2610 // Find the last compatible target map in the transition tree. 2615 // Find the last compatible target map in the transition tree.
2611 for (int i = target_nof; i < old_nof; ++i) { 2616 for (int i = target_nof; i < old_nof; ++i) {
2612 int j = target_map->SearchTransition(old_descriptors->GetKey(i)); 2617 PropertyDetails old_details = old_descriptors->GetDetails(i);
2618 int j = target_map->SearchTransition(old_details.type(),
2619 old_descriptors->GetKey(i),
2620 old_details.attributes());
2613 if (j == TransitionArray::kNotFound) break; 2621 if (j == TransitionArray::kNotFound) break;
2614 Handle<Map> tmp_map(target_map->GetTransition(j), isolate); 2622 Handle<Map> tmp_map(target_map->GetTransition(j), isolate);
2615 Handle<DescriptorArray> tmp_descriptors( 2623 Handle<DescriptorArray> tmp_descriptors(
2616 tmp_map->instance_descriptors(), isolate); 2624 tmp_map->instance_descriptors(), isolate);
2617 2625
2618 // Check if target map is compatible. 2626 // Check if target map is compatible.
2619 PropertyDetails old_details = old_descriptors->GetDetails(i);
2620 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i); 2627 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i);
2621 if (tmp_details.attributes() != old_details.attributes() || 2628 DCHECK_EQ(old_details.attributes(), tmp_details.attributes());
2622 ((tmp_details.type() == CALLBACKS || old_details.type() == CALLBACKS) && 2629 if ((tmp_details.type() == CALLBACKS || old_details.type() == CALLBACKS) &&
2623 (tmp_details.type() != old_details.type() || 2630 (tmp_details.type() != old_details.type() ||
2624 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { 2631 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i))) {
2625 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, 2632 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode,
2626 "GenAll_Incompatible"); 2633 "GenAll_Incompatible");
2627 } 2634 }
2628 target_map = tmp_map; 2635 target_map = tmp_map;
2629 } 2636 }
2630 target_nof = target_map->NumberOfOwnDescriptors(); 2637 target_nof = target_map->NumberOfOwnDescriptors();
2631 target_descriptors = handle(target_map->instance_descriptors(), isolate); 2638 target_descriptors = handle(target_map->instance_descriptors(), isolate);
2632 2639
2633 // Allocate a new descriptor array large enough to hold the required 2640 // Allocate a new descriptor array large enough to hold the required
2634 // descriptors, with minimally the exact same size as the old descriptor 2641 // descriptors, with minimally the exact same size as the old descriptor
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
2746 DCHECK(store_mode != FORCE_FIELD || 2753 DCHECK(store_mode != FORCE_FIELD ||
2747 new_descriptors->GetDetails(modify_index).type() == FIELD); 2754 new_descriptors->GetDetails(modify_index).type() == FIELD);
2748 2755
2749 Handle<Map> split_map(root_map->FindLastMatchMap( 2756 Handle<Map> split_map(root_map->FindLastMatchMap(
2750 root_nof, old_nof, *new_descriptors), isolate); 2757 root_nof, old_nof, *new_descriptors), isolate);
2751 int split_nof = split_map->NumberOfOwnDescriptors(); 2758 int split_nof = split_map->NumberOfOwnDescriptors();
2752 DCHECK_NE(old_nof, split_nof); 2759 DCHECK_NE(old_nof, split_nof);
2753 2760
2754 Handle<LayoutDescriptor> new_layout_descriptor = 2761 Handle<LayoutDescriptor> new_layout_descriptor =
2755 LayoutDescriptor::New(split_map, new_descriptors, old_nof); 2762 LayoutDescriptor::New(split_map, new_descriptors, old_nof);
2756 bool transition_target_deprecated = 2763 PropertyDetails split_prop_details = old_descriptors->GetDetails(split_nof);
2757 split_map->DeprecateTarget(old_descriptors->GetKey(split_nof), 2764 bool transition_target_deprecated = split_map->DeprecateTarget(
2758 *new_descriptors, *new_layout_descriptor); 2765 split_prop_details.type(), old_descriptors->GetKey(split_nof),
2766 split_prop_details.attributes(), *new_descriptors,
2767 *new_layout_descriptor);
2759 2768
2760 // If |transition_target_deprecated| is true then the transition array 2769 // If |transition_target_deprecated| is true then the transition array
2761 // already contains entry for given descriptor. This means that the transition 2770 // already contains entry for given descriptor. This means that the transition
2762 // could be inserted regardless of whether transitions array is full or not. 2771 // could be inserted regardless of whether transitions array is full or not.
2763 if (!transition_target_deprecated && !split_map->CanHaveMoreTransitions()) { 2772 if (!transition_target_deprecated && !split_map->CanHaveMoreTransitions()) {
2764 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, 2773 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode,
2765 "GenAll_CantHaveMoreTransitions"); 2774 "GenAll_CantHaveMoreTransitions");
2766 } 2775 }
2767 2776
2768 if (FLAG_trace_generalization) { 2777 if (FLAG_trace_generalization) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2842 // Check the state of the root map. 2851 // Check the state of the root map.
2843 Map* root_map = old_map->FindRootMap(); 2852 Map* root_map = old_map->FindRootMap();
2844 if (!old_map->EquivalentToForTransition(root_map)) return MaybeHandle<Map>(); 2853 if (!old_map->EquivalentToForTransition(root_map)) return MaybeHandle<Map>();
2845 int root_nof = root_map->NumberOfOwnDescriptors(); 2854 int root_nof = root_map->NumberOfOwnDescriptors();
2846 2855
2847 int old_nof = old_map->NumberOfOwnDescriptors(); 2856 int old_nof = old_map->NumberOfOwnDescriptors();
2848 DescriptorArray* old_descriptors = old_map->instance_descriptors(); 2857 DescriptorArray* old_descriptors = old_map->instance_descriptors();
2849 2858
2850 Map* new_map = root_map; 2859 Map* new_map = root_map;
2851 for (int i = root_nof; i < old_nof; ++i) { 2860 for (int i = root_nof; i < old_nof; ++i) {
2852 int j = new_map->SearchTransition(old_descriptors->GetKey(i)); 2861 PropertyDetails old_details = old_descriptors->GetDetails(i);
2862 int j = new_map->SearchTransition(old_details.type(),
2863 old_descriptors->GetKey(i),
2864 old_details.attributes());
2853 if (j == TransitionArray::kNotFound) return MaybeHandle<Map>(); 2865 if (j == TransitionArray::kNotFound) return MaybeHandle<Map>();
2854 new_map = new_map->GetTransition(j); 2866 new_map = new_map->GetTransition(j);
2855 DescriptorArray* new_descriptors = new_map->instance_descriptors(); 2867 DescriptorArray* new_descriptors = new_map->instance_descriptors();
2856 2868
2857 PropertyDetails new_details = new_descriptors->GetDetails(i); 2869 PropertyDetails new_details = new_descriptors->GetDetails(i);
2858 PropertyDetails old_details = old_descriptors->GetDetails(i);
2859 if (old_details.attributes() != new_details.attributes() || 2870 if (old_details.attributes() != new_details.attributes() ||
2860 !old_details.representation().fits_into(new_details.representation())) { 2871 !old_details.representation().fits_into(new_details.representation())) {
2861 return MaybeHandle<Map>(); 2872 return MaybeHandle<Map>();
2862 } 2873 }
2863 PropertyType new_type = new_details.type(); 2874 PropertyType new_type = new_details.type();
2864 PropertyType old_type = old_details.type(); 2875 PropertyType old_type = old_details.type();
2865 Object* new_value = new_descriptors->GetValue(i); 2876 Object* new_value = new_descriptors->GetValue(i);
2866 Object* old_value = old_descriptors->GetValue(i); 2877 Object* old_value = old_descriptors->GetValue(i);
2867 switch (new_type) { 2878 switch (new_type) {
2868 case FIELD: 2879 case FIELD:
(...skipping 2620 matching lines...) Expand 10 before | Expand all | Expand 10 after
5489 handle(object->elements()), length, new_element_dictionary); 5500 handle(object->elements()), length, new_element_dictionary);
5490 } else { 5501 } else {
5491 // No existing elements, use a pre-allocated empty backing store 5502 // No existing elements, use a pre-allocated empty backing store
5492 new_element_dictionary = 5503 new_element_dictionary =
5493 isolate->factory()->empty_slow_element_dictionary(); 5504 isolate->factory()->empty_slow_element_dictionary();
5494 } 5505 }
5495 } 5506 }
5496 5507
5497 Handle<Map> old_map(object->map(), isolate); 5508 Handle<Map> old_map(object->map(), isolate);
5498 int transition_index = 5509 int transition_index =
5499 old_map->SearchTransition(isolate->heap()->frozen_symbol()); 5510 old_map->SearchSpecialTransition(isolate->heap()->frozen_symbol());
5500 if (transition_index != TransitionArray::kNotFound) { 5511 if (transition_index != TransitionArray::kNotFound) {
5501 Handle<Map> transition_map(old_map->GetTransition(transition_index)); 5512 Handle<Map> transition_map(old_map->GetTransition(transition_index));
5502 DCHECK(transition_map->has_dictionary_elements()); 5513 DCHECK(transition_map->has_dictionary_elements());
5503 DCHECK(transition_map->is_frozen()); 5514 DCHECK(transition_map->is_frozen());
5504 DCHECK(!transition_map->is_extensible()); 5515 DCHECK(!transition_map->is_extensible());
5505 JSObject::MigrateToMap(object, transition_map); 5516 JSObject::MigrateToMap(object, transition_map);
5506 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { 5517 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) {
5507 // Create a new descriptor array with fully-frozen properties 5518 // Create a new descriptor array with fully-frozen properties
5508 Handle<Map> new_map = Map::CopyForFreeze(old_map); 5519 Handle<Map> new_map = Map::CopyForFreeze(old_map);
5509 JSObject::MigrateToMap(object, new_map); 5520 JSObject::MigrateToMap(object, new_map);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5542 5553
5543 5554
5544 void JSObject::SetObserved(Handle<JSObject> object) { 5555 void JSObject::SetObserved(Handle<JSObject> object) {
5545 DCHECK(!object->IsJSGlobalProxy()); 5556 DCHECK(!object->IsJSGlobalProxy());
5546 DCHECK(!object->IsJSGlobalObject()); 5557 DCHECK(!object->IsJSGlobalObject());
5547 Isolate* isolate = object->GetIsolate(); 5558 Isolate* isolate = object->GetIsolate();
5548 Handle<Map> new_map; 5559 Handle<Map> new_map;
5549 Handle<Map> old_map(object->map(), isolate); 5560 Handle<Map> old_map(object->map(), isolate);
5550 DCHECK(!old_map->is_observed()); 5561 DCHECK(!old_map->is_observed());
5551 int transition_index = 5562 int transition_index =
5552 old_map->SearchTransition(isolate->heap()->observed_symbol()); 5563 old_map->SearchSpecialTransition(isolate->heap()->observed_symbol());
5553 if (transition_index != TransitionArray::kNotFound) { 5564 if (transition_index != TransitionArray::kNotFound) {
5554 new_map = handle(old_map->GetTransition(transition_index), isolate); 5565 new_map = handle(old_map->GetTransition(transition_index), isolate);
5555 DCHECK(new_map->is_observed()); 5566 DCHECK(new_map->is_observed());
5556 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { 5567 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) {
5557 new_map = Map::CopyForObserved(old_map); 5568 new_map = Map::CopyForObserved(old_map);
5558 } else { 5569 } else {
5559 new_map = Map::Copy(old_map, "SlowObserved"); 5570 new_map = Map::Copy(old_map, "SlowObserved");
5560 new_map->set_is_observed(); 5571 new_map->set_is_observed();
5561 } 5572 }
5562 JSObject::MigrateToMap(object, new_map); 5573 JSObject::MigrateToMap(object, new_map);
(...skipping 1189 matching lines...) Expand 10 before | Expand all | Expand 10 after
6752 ? LayoutDescriptor::Append(map, descriptor->GetDetails()) 6763 ? LayoutDescriptor::Append(map, descriptor->GetDetails())
6753 : handle(LayoutDescriptor::FastPointerLayout(), map->GetIsolate()); 6764 : handle(LayoutDescriptor::FastPointerLayout(), map->GetIsolate());
6754 6765
6755 { 6766 {
6756 DisallowHeapAllocation no_gc; 6767 DisallowHeapAllocation no_gc;
6757 descriptors->Append(descriptor); 6768 descriptors->Append(descriptor);
6758 result->InitializeDescriptors(*descriptors, *layout_descriptor); 6769 result->InitializeDescriptors(*descriptors, *layout_descriptor);
6759 } 6770 }
6760 6771
6761 DCHECK(result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1); 6772 DCHECK(result->NumberOfOwnDescriptors() == map->NumberOfOwnDescriptors() + 1);
6762 ConnectTransition(map, result, name, SIMPLE_TRANSITION); 6773 ConnectTransition(map, result, name, SIMPLE_PROPERTY_TRANSITION);
6763 6774
6764 return result; 6775 return result;
6765 } 6776 }
6766 6777
6767 6778
6768 #if TRACE_MAPS 6779 #if TRACE_MAPS
6769 6780
6770 // static 6781 // static
6771 void Map::TraceTransition(const char* what, Map* from, Map* to, Name* name) { 6782 void Map::TraceTransition(const char* what, Map* from, Map* to, Name* name) {
6772 if (FLAG_trace_maps) { 6783 if (FLAG_trace_maps) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
6885 if (FLAG_unbox_double_fields) { 6896 if (FLAG_unbox_double_fields) {
6886 Handle<LayoutDescriptor> layout_descriptor = 6897 Handle<LayoutDescriptor> layout_descriptor =
6887 LayoutDescriptor::AppendIfFastOrUseFull(map, details, 6898 LayoutDescriptor::AppendIfFastOrUseFull(map, details,
6888 full_layout_descriptor); 6899 full_layout_descriptor);
6889 result->set_layout_descriptor(*layout_descriptor); 6900 result->set_layout_descriptor(*layout_descriptor);
6890 SLOW_DCHECK(result->layout_descriptor()->IsConsistentWithMap(*result)); 6901 SLOW_DCHECK(result->layout_descriptor()->IsConsistentWithMap(*result));
6891 result->set_visitor_id(StaticVisitorBase::GetVisitorId(*result)); 6902 result->set_visitor_id(StaticVisitorBase::GetVisitorId(*result));
6892 } 6903 }
6893 6904
6894 Handle<Name> name = handle(descriptors->GetKey(new_descriptor)); 6905 Handle<Name> name = handle(descriptors->GetKey(new_descriptor));
6895 ConnectTransition(map, result, name, SIMPLE_TRANSITION); 6906 ConnectTransition(map, result, name, SIMPLE_PROPERTY_TRANSITION);
6896 6907
6897 return result; 6908 return result;
6898 } 6909 }
6899 6910
6900 6911
6901 Handle<Map> Map::CopyAsElementsKind(Handle<Map> map, ElementsKind kind, 6912 Handle<Map> Map::CopyAsElementsKind(Handle<Map> map, ElementsKind kind,
6902 TransitionFlag flag) { 6913 TransitionFlag flag) {
6903 if (flag == INSERT_TRANSITION) { 6914 if (flag == INSERT_TRANSITION) {
6904 DCHECK(!map->HasElementsTransition() || 6915 DCHECK(!map->HasElementsTransition() ||
6905 ((map->elements_transition_map()->elements_kind() == 6916 ((map->elements_transition_map()->elements_kind() ==
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
6963 6974
6964 new_map->set_is_observed(); 6975 new_map->set_is_observed();
6965 if (map->owns_descriptors()) { 6976 if (map->owns_descriptors()) {
6966 // The properties did not change, so reuse descriptors. 6977 // The properties did not change, so reuse descriptors.
6967 new_map->InitializeDescriptors(map->instance_descriptors(), 6978 new_map->InitializeDescriptors(map->instance_descriptors(),
6968 map->GetLayoutDescriptor()); 6979 map->GetLayoutDescriptor());
6969 } 6980 }
6970 6981
6971 if (map->CanHaveMoreTransitions()) { 6982 if (map->CanHaveMoreTransitions()) {
6972 Handle<Name> name = isolate->factory()->observed_symbol(); 6983 Handle<Name> name = isolate->factory()->observed_symbol();
6973 ConnectTransition(map, new_map, name, FULL_TRANSITION); 6984 ConnectTransition(map, new_map, name, SPECIAL_TRANSITION);
6974 } 6985 }
6975 return new_map; 6986 return new_map;
6976 } 6987 }
6977 6988
6978 6989
6979 Handle<Map> Map::Copy(Handle<Map> map, const char* reason) { 6990 Handle<Map> Map::Copy(Handle<Map> map, const char* reason) {
6980 Handle<DescriptorArray> descriptors(map->instance_descriptors()); 6991 Handle<DescriptorArray> descriptors(map->instance_descriptors());
6981 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); 6992 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
6982 Handle<DescriptorArray> new_descriptors = 6993 Handle<DescriptorArray> new_descriptors =
6983 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors); 6994 DescriptorArray::CopyUpTo(descriptors, number_of_own_descriptors);
6984 Handle<LayoutDescriptor> new_layout_descriptor(map->GetLayoutDescriptor(), 6995 Handle<LayoutDescriptor> new_layout_descriptor(map->GetLayoutDescriptor(),
6985 map->GetIsolate()); 6996 map->GetIsolate());
6986 return CopyReplaceDescriptors(map, new_descriptors, new_layout_descriptor, 6997 return CopyReplaceDescriptors(map, new_descriptors, new_layout_descriptor,
6987 OMIT_TRANSITION, MaybeHandle<Name>(), reason); 6998 OMIT_TRANSITION, MaybeHandle<Name>(), reason,
6999 SPECIAL_TRANSITION);
6988 } 7000 }
6989 7001
6990 7002
6991 Handle<Map> Map::Create(Isolate* isolate, int inobject_properties) { 7003 Handle<Map> Map::Create(Isolate* isolate, int inobject_properties) {
6992 Handle<Map> copy = 7004 Handle<Map> copy =
6993 Copy(handle(isolate->object_function()->initial_map()), "MapCreate"); 7005 Copy(handle(isolate->object_function()->initial_map()), "MapCreate");
6994 7006
6995 // Check that we do not overflow the instance size when adding the extra 7007 // Check that we do not overflow the instance size when adding the extra
6996 // inobject properties. If the instance size overflows, we allocate as many 7008 // inobject properties. If the instance size overflows, we allocate as many
6997 // properties as we can as inobject properties. 7009 // properties as we can as inobject properties.
(...skipping 18 matching lines...) Expand all
7016 7028
7017 Handle<Map> Map::CopyForFreeze(Handle<Map> map) { 7029 Handle<Map> Map::CopyForFreeze(Handle<Map> map) {
7018 int num_descriptors = map->NumberOfOwnDescriptors(); 7030 int num_descriptors = map->NumberOfOwnDescriptors();
7019 Isolate* isolate = map->GetIsolate(); 7031 Isolate* isolate = map->GetIsolate();
7020 Handle<DescriptorArray> new_desc = DescriptorArray::CopyUpToAddAttributes( 7032 Handle<DescriptorArray> new_desc = DescriptorArray::CopyUpToAddAttributes(
7021 handle(map->instance_descriptors(), isolate), num_descriptors, FROZEN); 7033 handle(map->instance_descriptors(), isolate), num_descriptors, FROZEN);
7022 Handle<LayoutDescriptor> new_layout_descriptor(map->GetLayoutDescriptor(), 7034 Handle<LayoutDescriptor> new_layout_descriptor(map->GetLayoutDescriptor(),
7023 isolate); 7035 isolate);
7024 Handle<Map> new_map = CopyReplaceDescriptors( 7036 Handle<Map> new_map = CopyReplaceDescriptors(
7025 map, new_desc, new_layout_descriptor, INSERT_TRANSITION, 7037 map, new_desc, new_layout_descriptor, INSERT_TRANSITION,
7026 isolate->factory()->frozen_symbol(), "CopyForFreeze"); 7038 isolate->factory()->frozen_symbol(), "CopyForFreeze", SPECIAL_TRANSITION);
7027 new_map->freeze(); 7039 new_map->freeze();
7028 new_map->set_is_extensible(false); 7040 new_map->set_is_extensible(false);
7029 new_map->set_elements_kind(DICTIONARY_ELEMENTS); 7041 new_map->set_elements_kind(DICTIONARY_ELEMENTS);
7030 return new_map; 7042 return new_map;
7031 } 7043 }
7032 7044
7033 7045
7034 bool DescriptorArray::CanHoldValue(int descriptor, Object* value) { 7046 bool DescriptorArray::CanHoldValue(int descriptor, Object* value) {
7035 PropertyDetails details = GetDetails(descriptor); 7047 PropertyDetails details = GetDetails(descriptor);
7036 switch (details.type()) { 7048 switch (details.type()) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
7076 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, 7088 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name,
7077 Handle<Object> value, 7089 Handle<Object> value,
7078 PropertyAttributes attributes, 7090 PropertyAttributes attributes,
7079 StoreFromKeyed store_mode) { 7091 StoreFromKeyed store_mode) {
7080 // Dictionary maps can always have additional data properties. 7092 // Dictionary maps can always have additional data properties.
7081 if (map->is_dictionary_map()) return map; 7093 if (map->is_dictionary_map()) return map;
7082 7094
7083 // Migrate to the newest map before storing the property. 7095 // Migrate to the newest map before storing the property.
7084 map = Update(map); 7096 map = Update(map);
7085 7097
7086 int index = map->SearchTransition(*name); 7098 int index = map->SearchTransition(FIELD, *name, attributes);
7087 if (index != TransitionArray::kNotFound) { 7099 if (index != TransitionArray::kNotFound) {
7088 Handle<Map> transition(map->GetTransition(index)); 7100 Handle<Map> transition(map->GetTransition(index));
7089 int descriptor = transition->LastAdded(); 7101 int descriptor = transition->LastAdded();
7090 7102
7091 // TODO(verwaest): Handle attributes better. 7103 DCHECK_EQ(attributes, transition->instance_descriptors()
7092 DescriptorArray* descriptors = transition->instance_descriptors(); 7104 ->GetDetails(descriptor)
7093 if (descriptors->GetDetails(descriptor).attributes() != attributes) { 7105 .attributes());
7094 return Map::Normalize(map, CLEAR_INOBJECT_PROPERTIES,
7095 "IncompatibleAttributes");
7096 }
7097 7106
7098 return Map::PrepareForDataProperty(transition, descriptor, value); 7107 return Map::PrepareForDataProperty(transition, descriptor, value);
7099 } 7108 }
7100 7109
7101 TransitionFlag flag = INSERT_TRANSITION; 7110 TransitionFlag flag = INSERT_TRANSITION;
7102 MaybeHandle<Map> maybe_map; 7111 MaybeHandle<Map> maybe_map;
7103 if (value->IsJSFunction()) { 7112 if (value->IsJSFunction()) {
7104 maybe_map = Map::CopyWithConstant(map, name, value, attributes, flag); 7113 maybe_map = Map::CopyWithConstant(map, name, value, attributes, flag);
7105 } else if (!map->TooManyFastProperties(store_mode)) { 7114 } else if (!map->TooManyFastProperties(store_mode)) {
7106 Isolate* isolate = name->GetIsolate(); 7115 Isolate* isolate = name->GetIsolate();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
7156 return map; 7165 return map;
7157 } 7166 }
7158 7167
7159 // Migrate to the newest map before transitioning to the new property. 7168 // Migrate to the newest map before transitioning to the new property.
7160 map = Update(map); 7169 map = Update(map);
7161 7170
7162 PropertyNormalizationMode mode = map->is_prototype_map() 7171 PropertyNormalizationMode mode = map->is_prototype_map()
7163 ? KEEP_INOBJECT_PROPERTIES 7172 ? KEEP_INOBJECT_PROPERTIES
7164 : CLEAR_INOBJECT_PROPERTIES; 7173 : CLEAR_INOBJECT_PROPERTIES;
7165 7174
7166 int index = map->SearchTransition(*name); 7175 int index = map->SearchTransition(CALLBACKS, *name, attributes);
7167 if (index != TransitionArray::kNotFound) { 7176 if (index != TransitionArray::kNotFound) {
7168 Handle<Map> transition(map->GetTransition(index)); 7177 Handle<Map> transition(map->GetTransition(index));
7169 DescriptorArray* descriptors = transition->instance_descriptors(); 7178 DescriptorArray* descriptors = transition->instance_descriptors();
7170 // Fast path, assume that we're modifying the last added descriptor.
7171 int descriptor = transition->LastAdded(); 7179 int descriptor = transition->LastAdded();
7172 if (descriptors->GetKey(descriptor) != *name) { 7180 DCHECK(descriptors->GetKey(descriptor)->Equals(*name));
7173 // If not, search for the descriptor.
7174 descriptor = descriptors->SearchWithCache(*name, *transition);
7175 }
7176 7181
7177 if (descriptors->GetDetails(descriptor).type() != CALLBACKS) { 7182 DCHECK_EQ(CALLBACKS, descriptors->GetDetails(descriptor).type());
7178 return Map::Normalize(map, mode, "TransitionToAccessorFromNonPair"); 7183 DCHECK_EQ(attributes, descriptors->GetDetails(descriptor).attributes());
7179 }
7180
7181 // TODO(verwaest): Handle attributes better.
7182 if (descriptors->GetDetails(descriptor).attributes() != attributes) {
7183 return Map::Normalize(map, mode,
7184 "TransitionToAccessorDifferentAttributes");
7185 }
7186 7184
7187 Handle<Object> maybe_pair(descriptors->GetValue(descriptor), isolate); 7185 Handle<Object> maybe_pair(descriptors->GetValue(descriptor), isolate);
7188 if (!maybe_pair->IsAccessorPair()) { 7186 if (!maybe_pair->IsAccessorPair()) {
7189 return Map::Normalize(map, mode, "TransitionToAccessorFromNonPair"); 7187 return Map::Normalize(map, mode, "TransitionToAccessorFromNonPair");
7190 } 7188 }
7191 7189
7192 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(maybe_pair); 7190 Handle<AccessorPair> pair = Handle<AccessorPair>::cast(maybe_pair);
7193 if (pair->get(component) != *accessor) { 7191 if (pair->get(component) != *accessor) {
7194 return Map::Normalize(map, mode, "TransitionToDifferentAccessor"); 7192 return Map::Normalize(map, mode, "TransitionToDifferentAccessor");
7195 } 7193 }
7196 7194
7197 return transition; 7195 return transition;
7198 } 7196 }
7199 7197
7200 Handle<AccessorPair> pair; 7198 Handle<AccessorPair> pair;
7201 DescriptorArray* old_descriptors = map->instance_descriptors(); 7199 DescriptorArray* old_descriptors = map->instance_descriptors();
7202 int descriptor = old_descriptors->SearchWithCache(*name, *map); 7200 int descriptor = old_descriptors->SearchWithCache(*name, *map);
7203 if (descriptor != DescriptorArray::kNotFound) { 7201 if (descriptor != DescriptorArray::kNotFound) {
7202 if (descriptor != map->LastAdded()) {
7203 return Map::Normalize(map, mode, "AccessorsOverwritingNonLast");
7204 }
7204 PropertyDetails old_details = old_descriptors->GetDetails(descriptor); 7205 PropertyDetails old_details = old_descriptors->GetDetails(descriptor);
7205 if (old_details.type() != CALLBACKS) { 7206 if (old_details.type() != CALLBACKS) {
7206 return Map::Normalize(map, mode, "AccessorsOverwritingNonAccessors"); 7207 return Map::Normalize(map, mode, "AccessorsOverwritingNonAccessors");
7207 } 7208 }
7208 7209
7209 if (old_details.attributes() != attributes) { 7210 if (old_details.attributes() != attributes) {
7210 return Map::Normalize(map, mode, "AccessorsWithAttributes"); 7211 return Map::Normalize(map, mode, "AccessorsWithAttributes");
7211 } 7212 }
7212 7213
7213 Handle<Object> maybe_pair(old_descriptors->GetValue(descriptor), isolate); 7214 Handle<Object> maybe_pair(old_descriptors->GetValue(descriptor), isolate);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
7255 descriptors, map->NumberOfOwnDescriptors(), 1); 7256 descriptors, map->NumberOfOwnDescriptors(), 1);
7256 new_descriptors->Append(descriptor); 7257 new_descriptors->Append(descriptor);
7257 7258
7258 Handle<LayoutDescriptor> new_layout_descriptor = 7259 Handle<LayoutDescriptor> new_layout_descriptor =
7259 FLAG_unbox_double_fields 7260 FLAG_unbox_double_fields
7260 ? LayoutDescriptor::Append(map, descriptor->GetDetails()) 7261 ? LayoutDescriptor::Append(map, descriptor->GetDetails())
7261 : handle(LayoutDescriptor::FastPointerLayout(), map->GetIsolate()); 7262 : handle(LayoutDescriptor::FastPointerLayout(), map->GetIsolate());
7262 7263
7263 return CopyReplaceDescriptors(map, new_descriptors, new_layout_descriptor, 7264 return CopyReplaceDescriptors(map, new_descriptors, new_layout_descriptor,
7264 flag, descriptor->GetKey(), "CopyAddDescriptor", 7265 flag, descriptor->GetKey(), "CopyAddDescriptor",
7265 SIMPLE_TRANSITION); 7266 SIMPLE_PROPERTY_TRANSITION);
7266 } 7267 }
7267 7268
7268 7269
7269 Handle<Map> Map::CopyInsertDescriptor(Handle<Map> map, 7270 Handle<Map> Map::CopyInsertDescriptor(Handle<Map> map,
7270 Descriptor* descriptor, 7271 Descriptor* descriptor,
7271 TransitionFlag flag) { 7272 TransitionFlag flag) {
7272 Handle<DescriptorArray> old_descriptors(map->instance_descriptors()); 7273 Handle<DescriptorArray> old_descriptors(map->instance_descriptors());
7273 7274
7274 // Ensure the key is unique. 7275 // Ensure the key is unique.
7275 descriptor->KeyToUniqueName(); 7276 descriptor->KeyToUniqueName();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
7351 7352
7352 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo( 7353 Handle<DescriptorArray> new_descriptors = DescriptorArray::CopyUpTo(
7353 descriptors, map->NumberOfOwnDescriptors()); 7354 descriptors, map->NumberOfOwnDescriptors());
7354 7355
7355 new_descriptors->Replace(insertion_index, descriptor); 7356 new_descriptors->Replace(insertion_index, descriptor);
7356 Handle<LayoutDescriptor> new_layout_descriptor = LayoutDescriptor::New( 7357 Handle<LayoutDescriptor> new_layout_descriptor = LayoutDescriptor::New(
7357 map, new_descriptors, new_descriptors->number_of_descriptors()); 7358 map, new_descriptors, new_descriptors->number_of_descriptors());
7358 7359
7359 SimpleTransitionFlag simple_flag = 7360 SimpleTransitionFlag simple_flag =
7360 (insertion_index == descriptors->number_of_descriptors() - 1) 7361 (insertion_index == descriptors->number_of_descriptors() - 1)
7361 ? SIMPLE_TRANSITION 7362 ? SIMPLE_PROPERTY_TRANSITION
7362 : FULL_TRANSITION; 7363 : PROPERTY_TRANSITION;
7363 return CopyReplaceDescriptors(map, new_descriptors, new_layout_descriptor, 7364 return CopyReplaceDescriptors(map, new_descriptors, new_layout_descriptor,
7364 flag, key, "CopyReplaceDescriptor", 7365 flag, key, "CopyReplaceDescriptor",
7365 simple_flag); 7366 simple_flag);
7366 } 7367 }
7367 7368
7368 7369
7369 void Map::UpdateCodeCache(Handle<Map> map, 7370 void Map::UpdateCodeCache(Handle<Map> map,
7370 Handle<Name> name, 7371 Handle<Name> name,
7371 Handle<Code> code) { 7372 Handle<Code> code) {
7372 Isolate* isolate = map->GetIsolate(); 7373 Isolate* isolate = map->GetIsolate();
(...skipping 9521 matching lines...) Expand 10 before | Expand all | Expand 10 after
16894 Handle<DependentCode> codes = 16895 Handle<DependentCode> codes =
16895 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), 16896 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()),
16896 DependentCode::kPropertyCellChangedGroup, 16897 DependentCode::kPropertyCellChangedGroup,
16897 info->object_wrapper()); 16898 info->object_wrapper());
16898 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); 16899 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes);
16899 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( 16900 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add(
16900 cell, info->zone()); 16901 cell, info->zone());
16901 } 16902 }
16902 16903
16903 } } // namespace v8::internal 16904 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698