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

Side by Side Diff: src/objects.cc

Issue 1361103002: [field type tracking] Fix handling of cleared WeakCells (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: add more --verify-heap checks after object migrations Created 5 years, 2 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
« no previous file with comments | « src/objects.h ('k') | test/mjsunit/mjsunit.status » ('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 "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 2708 matching lines...) Expand 10 before | Expand all | Expand 10 after
2719 details.representation().IsNone()); 2719 details.representation().IsNone());
2720 2720
2721 // Skip if already updated the shared descriptor. 2721 // Skip if already updated the shared descriptor.
2722 if (instance_descriptors()->GetValue(descriptor) == *new_wrapped_type) return; 2722 if (instance_descriptors()->GetValue(descriptor) == *new_wrapped_type) return;
2723 DataDescriptor d(name, instance_descriptors()->GetFieldIndex(descriptor), 2723 DataDescriptor d(name, instance_descriptors()->GetFieldIndex(descriptor),
2724 new_wrapped_type, details.attributes(), new_representation); 2724 new_wrapped_type, details.attributes(), new_representation);
2725 instance_descriptors()->Replace(descriptor, &d); 2725 instance_descriptors()->Replace(descriptor, &d);
2726 } 2726 }
2727 2727
2728 2728
2729 bool FieldTypeIsCleared(Representation rep, Handle<HeapType> type) {
2730 return type->Is(HeapType::None()) && rep.IsHeapObject();
2731 }
2732
2733
2729 // static 2734 // static
2730 Handle<HeapType> Map::GeneralizeFieldType(Handle<HeapType> type1, 2735 Handle<HeapType> Map::GeneralizeFieldType(Representation rep1,
2736 Handle<HeapType> type1,
2737 Representation rep2,
2731 Handle<HeapType> type2, 2738 Handle<HeapType> type2,
2732 Isolate* isolate) { 2739 Isolate* isolate) {
2740 // Cleared field types need special treatment. They represent lost knowledge,
2741 // so we must be conservative, so their generalization with any other type
2742 // is "Any".
2743 if (FieldTypeIsCleared(rep1, type1) || FieldTypeIsCleared(rep2, type2)) {
2744 return HeapType::Any(isolate);
2745 }
2733 if (type1->NowIs(type2)) return type2; 2746 if (type1->NowIs(type2)) return type2;
2734 if (type2->NowIs(type1)) return type1; 2747 if (type2->NowIs(type1)) return type1;
2735 return HeapType::Any(isolate); 2748 return HeapType::Any(isolate);
2736 } 2749 }
2737 2750
2738 2751
2739 // static 2752 // static
2740 void Map::GeneralizeFieldType(Handle<Map> map, int modify_index, 2753 void Map::GeneralizeFieldType(Handle<Map> map, int modify_index,
2741 Representation new_representation, 2754 Representation new_representation,
2742 Handle<HeapType> new_field_type) { 2755 Handle<HeapType> new_field_type) {
2743 Isolate* isolate = map->GetIsolate(); 2756 Isolate* isolate = map->GetIsolate();
2744 2757
2745 // Check if we actually need to generalize the field type at all. 2758 // Check if we actually need to generalize the field type at all.
2746 Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate); 2759 Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate);
2747 Representation old_representation = 2760 Representation old_representation =
2748 old_descriptors->GetDetails(modify_index).representation(); 2761 old_descriptors->GetDetails(modify_index).representation();
2749 Handle<HeapType> old_field_type(old_descriptors->GetFieldType(modify_index), 2762 Handle<HeapType> old_field_type(old_descriptors->GetFieldType(modify_index),
2750 isolate); 2763 isolate);
2751 2764
2752 if (old_representation.Equals(new_representation) && 2765 if (old_representation.Equals(new_representation) &&
2766 !FieldTypeIsCleared(new_representation, new_field_type) &&
2767 // Checking old_field_type for being cleared is not necessary because
2768 // the NowIs check below would fail anyway in that case.
2753 new_field_type->NowIs(old_field_type)) { 2769 new_field_type->NowIs(old_field_type)) {
2754 DCHECK(Map::GeneralizeFieldType(old_field_type, 2770 DCHECK(Map::GeneralizeFieldType(old_representation, old_field_type,
2755 new_field_type, 2771 new_representation, new_field_type, isolate)
2756 isolate)->NowIs(old_field_type)); 2772 ->NowIs(old_field_type));
2757 return; 2773 return;
2758 } 2774 }
2759 2775
2760 // Determine the field owner. 2776 // Determine the field owner.
2761 Handle<Map> field_owner(map->FindFieldOwner(modify_index), isolate); 2777 Handle<Map> field_owner(map->FindFieldOwner(modify_index), isolate);
2762 Handle<DescriptorArray> descriptors( 2778 Handle<DescriptorArray> descriptors(
2763 field_owner->instance_descriptors(), isolate); 2779 field_owner->instance_descriptors(), isolate);
2764 DCHECK_EQ(*old_field_type, descriptors->GetFieldType(modify_index)); 2780 DCHECK_EQ(*old_field_type, descriptors->GetFieldType(modify_index));
2765 bool old_field_type_was_cleared =
2766 old_field_type->Is(HeapType::None()) && old_representation.IsHeapObject();
2767 2781
2768 // Determine the generalized new field type. Conservatively assume type Any
2769 // for cleared field types because the cleared type could have been a
2770 // deprecated map and there still could be live instances with a non-
2771 // deprecated version of the map.
2772 new_field_type = 2782 new_field_type =
2773 old_field_type_was_cleared 2783 Map::GeneralizeFieldType(old_representation, old_field_type,
2774 ? HeapType::Any(isolate) 2784 new_representation, new_field_type, isolate);
2775 : Map::GeneralizeFieldType(old_field_type, new_field_type, isolate);
2776 2785
2777 PropertyDetails details = descriptors->GetDetails(modify_index); 2786 PropertyDetails details = descriptors->GetDetails(modify_index);
2778 Handle<Name> name(descriptors->GetKey(modify_index)); 2787 Handle<Name> name(descriptors->GetKey(modify_index));
2779 2788
2780 Handle<Object> wrapped_type(WrapType(new_field_type)); 2789 Handle<Object> wrapped_type(WrapType(new_field_type));
2781 field_owner->UpdateFieldType(modify_index, name, new_representation, 2790 field_owner->UpdateFieldType(modify_index, name, new_representation,
2782 wrapped_type); 2791 wrapped_type);
2783 field_owner->dependent_code()->DeoptimizeDependentCodeGroup( 2792 field_owner->dependent_code()->DeoptimizeDependentCodeGroup(
2784 isolate, DependentCode::kFieldTypeGroup); 2793 isolate, DependentCode::kFieldTypeGroup);
2785 2794
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2989 PropertyLocation tmp_location = tmp_details.location(); 2998 PropertyLocation tmp_location = tmp_details.location();
2990 if (tmp_location == kField) { 2999 if (tmp_location == kField) {
2991 if (next_kind == kData) { 3000 if (next_kind == kData) {
2992 Handle<HeapType> next_field_type; 3001 Handle<HeapType> next_field_type;
2993 if (modify_index == i) { 3002 if (modify_index == i) {
2994 next_field_type = new_field_type; 3003 next_field_type = new_field_type;
2995 if (!property_kind_reconfiguration) { 3004 if (!property_kind_reconfiguration) {
2996 Handle<HeapType> old_field_type = 3005 Handle<HeapType> old_field_type =
2997 GetFieldType(isolate, old_descriptors, i, 3006 GetFieldType(isolate, old_descriptors, i,
2998 old_details.location(), tmp_representation); 3007 old_details.location(), tmp_representation);
2999 next_field_type = 3008 Representation old_representation = old_details.representation();
3000 GeneralizeFieldType(next_field_type, old_field_type, isolate); 3009 next_field_type = GeneralizeFieldType(
3010 old_representation, old_field_type, new_representation,
3011 next_field_type, isolate);
3001 } 3012 }
3002 } else { 3013 } else {
3003 Handle<HeapType> old_field_type = 3014 Handle<HeapType> old_field_type =
3004 GetFieldType(isolate, old_descriptors, i, old_details.location(), 3015 GetFieldType(isolate, old_descriptors, i, old_details.location(),
3005 tmp_representation); 3016 tmp_representation);
3006 next_field_type = old_field_type; 3017 next_field_type = old_field_type;
3007 } 3018 }
3008 GeneralizeFieldType(tmp_map, i, tmp_representation, next_field_type); 3019 GeneralizeFieldType(tmp_map, i, tmp_representation, next_field_type);
3009 } 3020 }
3010 } else if (old_location == kField || 3021 } else if (old_location == kField ||
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
3154 DCHECK_EQ(next_attributes, target_details.attributes()); 3165 DCHECK_EQ(next_attributes, target_details.attributes());
3155 3166
3156 if (next_location == kField) { 3167 if (next_location == kField) {
3157 if (next_kind == kData) { 3168 if (next_kind == kData) {
3158 Handle<HeapType> target_field_type = 3169 Handle<HeapType> target_field_type =
3159 GetFieldType(isolate, target_descriptors, i, 3170 GetFieldType(isolate, target_descriptors, i,
3160 target_details.location(), next_representation); 3171 target_details.location(), next_representation);
3161 3172
3162 Handle<HeapType> next_field_type; 3173 Handle<HeapType> next_field_type;
3163 if (modify_index == i) { 3174 if (modify_index == i) {
3164 next_field_type = 3175 next_field_type = GeneralizeFieldType(
3165 GeneralizeFieldType(target_field_type, new_field_type, isolate); 3176 target_details.representation(), target_field_type,
3177 new_representation, new_field_type, isolate);
3166 if (!property_kind_reconfiguration) { 3178 if (!property_kind_reconfiguration) {
3167 Handle<HeapType> old_field_type = 3179 Handle<HeapType> old_field_type =
3168 GetFieldType(isolate, old_descriptors, i, 3180 GetFieldType(isolate, old_descriptors, i,
3169 old_details.location(), next_representation); 3181 old_details.location(), next_representation);
3170 next_field_type = 3182 next_field_type = GeneralizeFieldType(
3171 GeneralizeFieldType(next_field_type, old_field_type, isolate); 3183 old_details.representation(), old_field_type,
3184 next_representation, next_field_type, isolate);
3172 } 3185 }
3173 } else { 3186 } else {
3174 Handle<HeapType> old_field_type = 3187 Handle<HeapType> old_field_type =
3175 GetFieldType(isolate, old_descriptors, i, old_details.location(), 3188 GetFieldType(isolate, old_descriptors, i, old_details.location(),
3176 next_representation); 3189 next_representation);
3177 next_field_type = 3190 next_field_type = GeneralizeFieldType(
3178 GeneralizeFieldType(target_field_type, old_field_type, isolate); 3191 old_details.representation(), old_field_type, next_representation,
3192 target_field_type, isolate);
3179 } 3193 }
3180 Handle<Object> wrapped_type(WrapType(next_field_type)); 3194 Handle<Object> wrapped_type(WrapType(next_field_type));
3181 DataDescriptor d(target_key, current_offset, wrapped_type, 3195 DataDescriptor d(target_key, current_offset, wrapped_type,
3182 next_attributes, next_representation); 3196 next_attributes, next_representation);
3183 current_offset += d.GetDetails().field_width_in_words(); 3197 current_offset += d.GetDetails().field_width_in_words();
3184 new_descriptors->Set(i, &d); 3198 new_descriptors->Set(i, &d);
3185 } else { 3199 } else {
3186 UNIMPLEMENTED(); // TODO(ishell): implement. 3200 UNIMPLEMENTED(); // TODO(ishell): implement.
3187 } 3201 }
3188 } else { 3202 } else {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3229 3243
3230 if (next_location == kField) { 3244 if (next_location == kField) {
3231 if (next_kind == kData) { 3245 if (next_kind == kData) {
3232 Handle<HeapType> next_field_type; 3246 Handle<HeapType> next_field_type;
3233 if (modify_index == i) { 3247 if (modify_index == i) {
3234 next_field_type = new_field_type; 3248 next_field_type = new_field_type;
3235 if (!property_kind_reconfiguration) { 3249 if (!property_kind_reconfiguration) {
3236 Handle<HeapType> old_field_type = 3250 Handle<HeapType> old_field_type =
3237 GetFieldType(isolate, old_descriptors, i, 3251 GetFieldType(isolate, old_descriptors, i,
3238 old_details.location(), next_representation); 3252 old_details.location(), next_representation);
3239 next_field_type = 3253 next_field_type = GeneralizeFieldType(
3240 GeneralizeFieldType(next_field_type, old_field_type, isolate); 3254 old_details.representation(), old_field_type,
3255 next_representation, next_field_type, isolate);
3241 } 3256 }
3242 } else { 3257 } else {
3243 Handle<HeapType> old_field_type = 3258 Handle<HeapType> old_field_type =
3244 GetFieldType(isolate, old_descriptors, i, old_details.location(), 3259 GetFieldType(isolate, old_descriptors, i, old_details.location(),
3245 next_representation); 3260 next_representation);
3246 next_field_type = old_field_type; 3261 next_field_type = old_field_type;
3247 } 3262 }
3248 3263
3249 Handle<Object> wrapped_type(WrapType(next_field_type)); 3264 Handle<Object> wrapped_type(WrapType(next_field_type));
3250 3265
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
3791 it->WriteDataValue(to_assign); 3806 it->WriteDataValue(to_assign);
3792 3807
3793 // Send the change record if there are observers. 3808 // Send the change record if there are observers.
3794 if (is_observed && !value->SameValue(*maybe_old.ToHandleChecked())) { 3809 if (is_observed && !value->SameValue(*maybe_old.ToHandleChecked())) {
3795 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( 3810 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord(
3796 receiver, "update", it->GetName(), 3811 receiver, "update", it->GetName(),
3797 maybe_old.ToHandleChecked()), 3812 maybe_old.ToHandleChecked()),
3798 Object); 3813 Object);
3799 } 3814 }
3800 3815
3816 #if VERIFY_HEAP
3817 if (FLAG_verify_heap) {
3818 receiver->JSObjectVerify();
3819 }
3820 #endif
3801 return value; 3821 return value;
3802 } 3822 }
3803 3823
3804 3824
3805 MUST_USE_RESULT static MaybeHandle<Object> BeginPerformSplice( 3825 MUST_USE_RESULT static MaybeHandle<Object> BeginPerformSplice(
3806 Handle<JSArray> object) { 3826 Handle<JSArray> object) {
3807 Isolate* isolate = object->GetIsolate(); 3827 Isolate* isolate = object->GetIsolate();
3808 HandleScope scope(isolate); 3828 HandleScope scope(isolate);
3809 Handle<Object> args[] = {object}; 3829 Handle<Object> args[] = {object};
3810 3830
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3913 } 3933 }
3914 3934
3915 // Send the change record if there are observers. 3935 // Send the change record if there are observers.
3916 if (receiver->map()->is_observed() && 3936 if (receiver->map()->is_observed() &&
3917 !isolate->IsInternallyUsedPropertyName(it->name())) { 3937 !isolate->IsInternallyUsedPropertyName(it->name())) {
3918 RETURN_ON_EXCEPTION(isolate, JSObject::EnqueueChangeRecord( 3938 RETURN_ON_EXCEPTION(isolate, JSObject::EnqueueChangeRecord(
3919 receiver, "add", it->name(), 3939 receiver, "add", it->name(),
3920 it->factory()->the_hole_value()), 3940 it->factory()->the_hole_value()),
3921 Object); 3941 Object);
3922 } 3942 }
3943 #if VERIFY_HEAP
3944 if (FLAG_verify_heap) {
3945 receiver->JSObjectVerify();
3946 }
3947 #endif
3923 } 3948 }
3924 3949
3925 return value; 3950 return value;
3926 } 3951 }
3927 3952
3928 3953
3929 void Map::EnsureDescriptorSlack(Handle<Map> map, int slack) { 3954 void Map::EnsureDescriptorSlack(Handle<Map> map, int slack) {
3930 // Only supports adding slack to owned descriptors. 3955 // Only supports adding slack to owned descriptors.
3931 DCHECK(map->owns_descriptors()); 3956 DCHECK(map->owns_descriptors());
3932 3957
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
4565 4590
4566 4591
4567 void JSObject::MigrateInstance(Handle<JSObject> object) { 4592 void JSObject::MigrateInstance(Handle<JSObject> object) {
4568 Handle<Map> original_map(object->map()); 4593 Handle<Map> original_map(object->map());
4569 Handle<Map> map = Map::Update(original_map); 4594 Handle<Map> map = Map::Update(original_map);
4570 map->set_migration_target(true); 4595 map->set_migration_target(true);
4571 MigrateToMap(object, map); 4596 MigrateToMap(object, map);
4572 if (FLAG_trace_migration) { 4597 if (FLAG_trace_migration) {
4573 object->PrintInstanceMigration(stdout, *original_map, *map); 4598 object->PrintInstanceMigration(stdout, *original_map, *map);
4574 } 4599 }
4600 #if VERIFY_HEAP
4601 if (FLAG_verify_heap) {
4602 object->JSObjectVerify();
4603 }
4604 #endif
4575 } 4605 }
4576 4606
4577 4607
4578 // static 4608 // static
4579 bool JSObject::TryMigrateInstance(Handle<JSObject> object) { 4609 bool JSObject::TryMigrateInstance(Handle<JSObject> object) {
4580 Isolate* isolate = object->GetIsolate(); 4610 Isolate* isolate = object->GetIsolate();
4581 DisallowDeoptimization no_deoptimization(isolate); 4611 DisallowDeoptimization no_deoptimization(isolate);
4582 Handle<Map> original_map(object->map(), isolate); 4612 Handle<Map> original_map(object->map(), isolate);
4583 Handle<Map> new_map; 4613 Handle<Map> new_map;
4584 if (!Map::TryUpdate(original_map).ToHandle(&new_map)) { 4614 if (!Map::TryUpdate(original_map).ToHandle(&new_map)) {
4585 return false; 4615 return false;
4586 } 4616 }
4587 JSObject::MigrateToMap(object, new_map); 4617 JSObject::MigrateToMap(object, new_map);
4588 if (FLAG_trace_migration) { 4618 if (FLAG_trace_migration) {
4589 object->PrintInstanceMigration(stdout, *original_map, object->map()); 4619 object->PrintInstanceMigration(stdout, *original_map, object->map());
4590 } 4620 }
4621 #if VERIFY_HEAP
4622 if (FLAG_verify_heap) {
4623 object->JSObjectVerify();
4624 }
4625 #endif
4591 return true; 4626 return true;
4592 } 4627 }
4593 4628
4594 4629
4595 void JSObject::AddProperty(Handle<JSObject> object, Handle<Name> name, 4630 void JSObject::AddProperty(Handle<JSObject> object, Handle<Name> name,
4596 Handle<Object> value, 4631 Handle<Object> value,
4597 PropertyAttributes attributes) { 4632 PropertyAttributes attributes) {
4598 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); 4633 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR);
4599 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); 4634 CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
4600 #ifdef DEBUG 4635 #ifdef DEBUG
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
4689 // By clearing the setter we don't have to introduce a lookup to 4724 // By clearing the setter we don't have to introduce a lookup to
4690 // the setter, simply make it unavailable to reflect the 4725 // the setter, simply make it unavailable to reflect the
4691 // attributes. 4726 // attributes.
4692 if (attributes & READ_ONLY) { 4727 if (attributes & READ_ONLY) {
4693 ExecutableAccessorInfo::ClearSetter(new_data); 4728 ExecutableAccessorInfo::ClearSetter(new_data);
4694 } 4729 }
4695 4730
4696 it->TransitionToAccessorPair(new_data, attributes); 4731 it->TransitionToAccessorPair(new_data, attributes);
4697 } else { 4732 } else {
4698 it->ReconfigureDataProperty(value, attributes); 4733 it->ReconfigureDataProperty(value, attributes);
4699 it->WriteDataValue(value);
4700 } 4734 }
4701 4735
4702 if (is_observed) { 4736 if (is_observed) {
4703 RETURN_ON_EXCEPTION( 4737 RETURN_ON_EXCEPTION(
4704 it->isolate(), 4738 it->isolate(),
4705 EnqueueChangeRecord(object, "reconfigure", it->GetName(), 4739 EnqueueChangeRecord(object, "reconfigure", it->GetName(),
4706 it->factory()->the_hole_value()), 4740 it->factory()->the_hole_value()),
4707 Object); 4741 Object);
4708 } 4742 }
4709 4743
(...skipping 15 matching lines...) Expand all
4725 // non-writable nor to non-enumerable. 4759 // non-writable nor to non-enumerable.
4726 if (it->IsElement() && object->HasFixedTypedArrayElements()) { 4760 if (it->IsElement() && object->HasFixedTypedArrayElements()) {
4727 return RedefineNonconfigurableProperty(it->isolate(), it->GetName(), 4761 return RedefineNonconfigurableProperty(it->isolate(), it->GetName(),
4728 value, STRICT); 4762 value, STRICT);
4729 } 4763 }
4730 4764
4731 // Reconfigure the data property if the attributes mismatch. 4765 // Reconfigure the data property if the attributes mismatch.
4732 if (is_observed) old_value = it->GetDataValue(); 4766 if (is_observed) old_value = it->GetDataValue();
4733 4767
4734 it->ReconfigureDataProperty(value, attributes); 4768 it->ReconfigureDataProperty(value, attributes);
4735 it->WriteDataValue(value);
4736 4769
4737 if (is_observed) { 4770 if (is_observed) {
4738 if (old_value->SameValue(*value)) { 4771 if (old_value->SameValue(*value)) {
4739 old_value = it->factory()->the_hole_value(); 4772 old_value = it->factory()->the_hole_value();
4740 } 4773 }
4741 RETURN_ON_EXCEPTION(it->isolate(), 4774 RETURN_ON_EXCEPTION(it->isolate(),
4742 EnqueueChangeRecord(object, "reconfigure", 4775 EnqueueChangeRecord(object, "reconfigure",
4743 it->GetName(), old_value), 4776 it->GetName(), old_value),
4744 Object); 4777 Object);
4745 } 4778 }
(...skipping 11944 matching lines...) Expand 10 before | Expand all | Expand 10 after
16690 if (cell->value() != *new_value) { 16723 if (cell->value() != *new_value) {
16691 cell->set_value(*new_value); 16724 cell->set_value(*new_value);
16692 Isolate* isolate = cell->GetIsolate(); 16725 Isolate* isolate = cell->GetIsolate();
16693 cell->dependent_code()->DeoptimizeDependentCodeGroup( 16726 cell->dependent_code()->DeoptimizeDependentCodeGroup(
16694 isolate, DependentCode::kPropertyCellChangedGroup); 16727 isolate, DependentCode::kPropertyCellChangedGroup);
16695 } 16728 }
16696 } 16729 }
16697 16730
16698 } // namespace internal 16731 } // namespace internal
16699 } // namespace v8 16732 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698