Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index a72585d696948c827a1659fb0d0c201003b9ac11..4a38c1f43141944dd82a4be3f458d1d8f4aa8fb2 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -3624,6 +3624,7 @@ MaybeObject* JSObject::NormalizeProperties(PropertyNormalizationMode mode, |
} |
set_map(new_map); |
+ map_of_this->DeoptimizeDependentCodes(DependentCodes::kPrototypeCheckGroup); |
set_properties(dictionary); |
@@ -5292,6 +5293,7 @@ MaybeObject* Map::CopyDropDescriptors() { |
result->set_pre_allocated_property_fields(pre_allocated_property_fields()); |
result->set_is_shared(false); |
result->ClearCodeCache(GetHeap()); |
+ DeoptimizeDependentCodes(DependentCodes::kPrototypeCheckGroup); |
Toon Verwaest
2013/02/11 12:23:45
Placing this in CopyDropDescriptors is probably a
ulan
2013/02/12 13:42:07
As discussed offline, adding abstraction function
|
return result; |
} |
@@ -9555,6 +9557,37 @@ bool DependentCodes::Contains(DependencyGroup group, Code* code) { |
return false; |
} |
+class DeoptimizeDependentCodeFilter : public OptimizedFunctionFilter { |
+ public: |
+ virtual bool TakeFunction(JSFunction* function) { |
+ return function->code()->marked_for_deoptimization(); |
+ } |
+}; |
+ |
+ |
+void Map::DeoptimizeDependentCodes(DependentCodes::DependencyGroup group) { |
+ AssertNoAllocation no_allocation_scope; |
+ DependentCodes* codes = dependent_codes(); |
+ DependentCodes::GroupStartIndexes starts; |
+ codes->ComputeGroupStartIndexes(starts); |
+ int start = starts[group]; |
+ int end = starts[group + 1]; |
+ int number_of_codes = starts[DependentCodes::kGroupCount]; |
+ if (start == end) return; |
+ for (int i = start; i < end; i++) { |
+ Code* code = codes->code_at(i); |
+ if (!code->marked_for_deoptimization()) { |
+ code->set_marked_for_deoptimization(true); |
+ } |
Toon Verwaest
2013/02/11 12:23:45
I guess the if(!..) { } is not necessary; since af
ulan
2013/02/12 13:42:07
Done.
|
+ } |
Toon Verwaest
2013/02/11 12:23:45
I don't particularly like this API. It seems like
ulan
2013/02/12 13:42:07
Done.
|
+ for (int src = end, dst = start; src < number_of_codes; src++, dst++) { |
+ codes->set_code_at(dst, codes->code_at(src)); |
+ } |
+ codes->set_number_of_codes(group, 0); |
+ DeoptimizeDependentCodeFilter filter; |
+ Deoptimizer::DeoptimizeAllFunctionsWith(&filter); |
+} |
+ |
MaybeObject* JSReceiver::SetPrototype(Object* value, |
bool skip_hidden_prototypes) { |