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

Unified Diff: src/objects.cc

Issue 12225099: Remove prototype checks for leaf maps in optimized code. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
« src/ia32/lithium-codegen-ia32.cc ('K') | « src/objects.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« src/ia32/lithium-codegen-ia32.cc ('K') | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698