| OLD | NEW |
| 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 "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "accessors.h" | 7 #include "accessors.h" |
| 8 #include "allocation-site-scopes.h" | 8 #include "allocation-site-scopes.h" |
| 9 #include "api.h" | 9 #include "api.h" |
| 10 #include "arguments.h" | 10 #include "arguments.h" |
| (...skipping 2328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2339 new_map->NumberOfOwnDescriptors(), | 2339 new_map->NumberOfOwnDescriptors(), |
| 2340 new_map->NumberOfOwnDescriptors(), | 2340 new_map->NumberOfOwnDescriptors(), |
| 2341 details.type() == CONSTANT && store_mode == FORCE_FIELD, | 2341 details.type() == CONSTANT && store_mode == FORCE_FIELD, |
| 2342 details.representation(), Representation::Tagged(), | 2342 details.representation(), Representation::Tagged(), |
| 2343 field_type, HeapType::Any()); | 2343 field_type, HeapType::Any()); |
| 2344 } | 2344 } |
| 2345 return new_map; | 2345 return new_map; |
| 2346 } | 2346 } |
| 2347 | 2347 |
| 2348 | 2348 |
| 2349 // static |
| 2350 Handle<Map> Map::CopyGeneralizeAllRepresentations(Handle<Map> map, |
| 2351 int modify_index, |
| 2352 StoreMode store_mode, |
| 2353 const char* reason) { |
| 2354 PropertyDetails details = |
| 2355 map->instance_descriptors()->GetDetails(modify_index); |
| 2356 return CopyGeneralizeAllRepresentations(map, modify_index, store_mode, |
| 2357 details.attributes(), reason); |
| 2358 } |
| 2359 |
| 2360 |
| 2349 void Map::DeprecateTransitionTree() { | 2361 void Map::DeprecateTransitionTree() { |
| 2350 if (is_deprecated()) return; | 2362 if (is_deprecated()) return; |
| 2351 if (HasTransitionArray()) { | 2363 if (HasTransitionArray()) { |
| 2352 TransitionArray* transitions = this->transitions(); | 2364 TransitionArray* transitions = this->transitions(); |
| 2353 for (int i = 0; i < transitions->number_of_transitions(); i++) { | 2365 for (int i = 0; i < transitions->number_of_transitions(); i++) { |
| 2354 transitions->GetTarget(i)->DeprecateTransitionTree(); | 2366 transitions->GetTarget(i)->DeprecateTransitionTree(); |
| 2355 } | 2367 } |
| 2356 } | 2368 } |
| 2357 deprecate(); | 2369 deprecate(); |
| 2358 dependent_code()->DeoptimizeDependentCodeGroup( | 2370 dependent_code()->DeoptimizeDependentCodeGroup( |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2584 old_descriptors->GetFieldType(modify_index), *new_field_type); | 2596 old_descriptors->GetFieldType(modify_index), *new_field_type); |
| 2585 } | 2597 } |
| 2586 old_descriptors->SetRepresentation(modify_index, new_representation); | 2598 old_descriptors->SetRepresentation(modify_index, new_representation); |
| 2587 old_descriptors->SetValue(modify_index, *new_field_type); | 2599 old_descriptors->SetValue(modify_index, *new_field_type); |
| 2588 return old_map; | 2600 return old_map; |
| 2589 } | 2601 } |
| 2590 | 2602 |
| 2591 // Check the state of the root map. | 2603 // Check the state of the root map. |
| 2592 Handle<Map> root_map(old_map->FindRootMap(), isolate); | 2604 Handle<Map> root_map(old_map->FindRootMap(), isolate); |
| 2593 if (!old_map->EquivalentToForTransition(*root_map)) { | 2605 if (!old_map->EquivalentToForTransition(*root_map)) { |
| 2594 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, | 2606 return CopyGeneralizeAllRepresentations( |
| 2595 old_details.attributes(), "not equivalent"); | 2607 old_map, modify_index, store_mode, "not equivalent"); |
| 2596 } | 2608 } |
| 2597 int root_nof = root_map->NumberOfOwnDescriptors(); | 2609 int root_nof = root_map->NumberOfOwnDescriptors(); |
| 2598 if (modify_index < root_nof) { | 2610 if (modify_index < root_nof) { |
| 2599 PropertyDetails old_details = old_descriptors->GetDetails(modify_index); | 2611 PropertyDetails old_details = old_descriptors->GetDetails(modify_index); |
| 2600 if ((old_details.type() != FIELD && store_mode == FORCE_FIELD) || | 2612 if ((old_details.type() != FIELD && store_mode == FORCE_FIELD) || |
| 2601 (old_details.type() == FIELD && | 2613 (old_details.type() == FIELD && |
| 2602 (!new_field_type->NowIs(old_descriptors->GetFieldType(modify_index)) || | 2614 (!new_field_type->NowIs(old_descriptors->GetFieldType(modify_index)) || |
| 2603 !new_representation.fits_into(old_details.representation())))) { | 2615 !new_representation.fits_into(old_details.representation())))) { |
| 2604 return CopyGeneralizeAllRepresentations(old_map, modify_index, store_mode, | 2616 return CopyGeneralizeAllRepresentations( |
| 2605 old_details.attributes(), "root modification"); | 2617 old_map, modify_index, store_mode, "root modification"); |
| 2606 } | 2618 } |
| 2607 } | 2619 } |
| 2608 | 2620 |
| 2609 Handle<Map> target_map = root_map; | 2621 Handle<Map> target_map = root_map; |
| 2610 for (int i = root_nof; i < old_nof; ++i) { | 2622 for (int i = root_nof; i < old_nof; ++i) { |
| 2611 int j = target_map->SearchTransition(old_descriptors->GetKey(i)); | 2623 int j = target_map->SearchTransition(old_descriptors->GetKey(i)); |
| 2612 if (j == TransitionArray::kNotFound) break; | 2624 if (j == TransitionArray::kNotFound) break; |
| 2613 Handle<Map> tmp_map(target_map->GetTransition(j), isolate); | 2625 Handle<Map> tmp_map(target_map->GetTransition(j), isolate); |
| 2614 Handle<DescriptorArray> tmp_descriptors = handle( | 2626 Handle<DescriptorArray> tmp_descriptors = handle( |
| 2615 tmp_map->instance_descriptors(), isolate); | 2627 tmp_map->instance_descriptors(), isolate); |
| 2616 | 2628 |
| 2617 // Check if target map is incompatible. | 2629 // Check if target map is incompatible. |
| 2618 PropertyDetails old_details = old_descriptors->GetDetails(i); | 2630 PropertyDetails old_details = old_descriptors->GetDetails(i); |
| 2619 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i); | 2631 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i); |
| 2620 PropertyType old_type = old_details.type(); | 2632 PropertyType old_type = old_details.type(); |
| 2621 PropertyType tmp_type = tmp_details.type(); | 2633 PropertyType tmp_type = tmp_details.type(); |
| 2622 if (tmp_details.attributes() != old_details.attributes() || | 2634 if (tmp_details.attributes() != old_details.attributes() || |
| 2623 ((tmp_type == CALLBACKS || old_type == CALLBACKS) && | 2635 ((tmp_type == CALLBACKS || old_type == CALLBACKS) && |
| 2624 (tmp_type != old_type || | 2636 (tmp_type != old_type || |
| 2625 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { | 2637 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { |
| 2626 return CopyGeneralizeAllRepresentations( | 2638 return CopyGeneralizeAllRepresentations( |
| 2627 old_map, modify_index, store_mode, | 2639 old_map, modify_index, store_mode, "incompatible"); |
| 2628 old_details.attributes(), "incompatible"); | |
| 2629 } | 2640 } |
| 2630 Representation old_representation = old_details.representation(); | 2641 Representation old_representation = old_details.representation(); |
| 2631 Representation tmp_representation = tmp_details.representation(); | 2642 Representation tmp_representation = tmp_details.representation(); |
| 2632 if (!old_representation.fits_into(tmp_representation) || | 2643 if (!old_representation.fits_into(tmp_representation) || |
| 2633 (!new_representation.fits_into(tmp_representation) && | 2644 (!new_representation.fits_into(tmp_representation) && |
| 2634 modify_index == i)) { | 2645 modify_index == i)) { |
| 2635 break; | 2646 break; |
| 2636 } | 2647 } |
| 2637 if (tmp_type == FIELD) { | 2648 if (tmp_type == FIELD) { |
| 2638 // Generalize the field type as necessary. | 2649 // Generalize the field type as necessary. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2682 tmp_map->instance_descriptors(), isolate); | 2693 tmp_map->instance_descriptors(), isolate); |
| 2683 | 2694 |
| 2684 // Check if target map is compatible. | 2695 // Check if target map is compatible. |
| 2685 PropertyDetails old_details = old_descriptors->GetDetails(i); | 2696 PropertyDetails old_details = old_descriptors->GetDetails(i); |
| 2686 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i); | 2697 PropertyDetails tmp_details = tmp_descriptors->GetDetails(i); |
| 2687 if (tmp_details.attributes() != old_details.attributes() || | 2698 if (tmp_details.attributes() != old_details.attributes() || |
| 2688 ((tmp_details.type() == CALLBACKS || old_details.type() == CALLBACKS) && | 2699 ((tmp_details.type() == CALLBACKS || old_details.type() == CALLBACKS) && |
| 2689 (tmp_details.type() != old_details.type() || | 2700 (tmp_details.type() != old_details.type() || |
| 2690 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { | 2701 tmp_descriptors->GetValue(i) != old_descriptors->GetValue(i)))) { |
| 2691 return CopyGeneralizeAllRepresentations( | 2702 return CopyGeneralizeAllRepresentations( |
| 2692 old_map, modify_index, store_mode, | 2703 old_map, modify_index, store_mode, "incompatible"); |
| 2693 old_details.attributes(), "incompatible"); | |
| 2694 } | 2704 } |
| 2695 target_map = tmp_map; | 2705 target_map = tmp_map; |
| 2696 } | 2706 } |
| 2697 target_nof = target_map->NumberOfOwnDescriptors(); | 2707 target_nof = target_map->NumberOfOwnDescriptors(); |
| 2698 target_descriptors = handle(target_map->instance_descriptors(), isolate); | 2708 target_descriptors = handle(target_map->instance_descriptors(), isolate); |
| 2699 | 2709 |
| 2700 // Allocate a new descriptor array large enough to hold the required | 2710 // Allocate a new descriptor array large enough to hold the required |
| 2701 // descriptors, with minimally the exact same size as the old descriptor | 2711 // descriptors, with minimally the exact same size as the old descriptor |
| 2702 // array. | 2712 // array. |
| 2703 int new_slack = Max( | 2713 int new_slack = Max( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2726 Handle<Name> target_key(target_descriptors->GetKey(i), isolate); | 2736 Handle<Name> target_key(target_descriptors->GetKey(i), isolate); |
| 2727 PropertyDetails old_details = old_descriptors->GetDetails(i); | 2737 PropertyDetails old_details = old_descriptors->GetDetails(i); |
| 2728 PropertyDetails target_details = target_descriptors->GetDetails(i); | 2738 PropertyDetails target_details = target_descriptors->GetDetails(i); |
| 2729 target_details = target_details.CopyWithRepresentation( | 2739 target_details = target_details.CopyWithRepresentation( |
| 2730 old_details.representation().generalize( | 2740 old_details.representation().generalize( |
| 2731 target_details.representation())); | 2741 target_details.representation())); |
| 2732 if (modify_index == i) { | 2742 if (modify_index == i) { |
| 2733 target_details = target_details.CopyWithRepresentation( | 2743 target_details = target_details.CopyWithRepresentation( |
| 2734 new_representation.generalize(target_details.representation())); | 2744 new_representation.generalize(target_details.representation())); |
| 2735 } | 2745 } |
| 2746 ASSERT_EQ(old_details.attributes(), target_details.attributes()); |
| 2736 if (old_details.type() == FIELD || | 2747 if (old_details.type() == FIELD || |
| 2737 target_details.type() == FIELD || | 2748 target_details.type() == FIELD || |
| 2738 (modify_index == i && store_mode == FORCE_FIELD) || | 2749 (modify_index == i && store_mode == FORCE_FIELD) || |
| 2739 (target_descriptors->GetValue(i) != old_descriptors->GetValue(i))) { | 2750 (target_descriptors->GetValue(i) != old_descriptors->GetValue(i))) { |
| 2740 Handle<HeapType> old_field_type = (old_details.type() == FIELD) | 2751 Handle<HeapType> old_field_type = (old_details.type() == FIELD) |
| 2741 ? handle(old_descriptors->GetFieldType(i), isolate) | 2752 ? handle(old_descriptors->GetFieldType(i), isolate) |
| 2742 : old_descriptors->GetValue(i)->OptimalType( | 2753 : old_descriptors->GetValue(i)->OptimalType( |
| 2743 isolate, target_details.representation()); | 2754 isolate, target_details.representation()); |
| 2744 Handle<HeapType> target_field_type = (target_details.type() == FIELD) | 2755 Handle<HeapType> target_field_type = (target_details.type() == FIELD) |
| 2745 ? handle(target_descriptors->GetFieldType(i), isolate) | 2756 ? handle(target_descriptors->GetFieldType(i), isolate) |
| (...skipping 14518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17264 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17275 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 17265 static const char* error_messages_[] = { | 17276 static const char* error_messages_[] = { |
| 17266 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17277 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 17267 }; | 17278 }; |
| 17268 #undef ERROR_MESSAGES_TEXTS | 17279 #undef ERROR_MESSAGES_TEXTS |
| 17269 return error_messages_[reason]; | 17280 return error_messages_[reason]; |
| 17270 } | 17281 } |
| 17271 | 17282 |
| 17272 | 17283 |
| 17273 } } // namespace v8::internal | 17284 } } // namespace v8::internal |
| OLD | NEW |