Chromium Code Reviews| Index: runtime/vm/raw_object.cc |
| =================================================================== |
| --- runtime/vm/raw_object.cc (revision 44959) |
| +++ runtime/vm/raw_object.cc (working copy) |
| @@ -413,7 +413,7 @@ |
| } |
| -bool RawFunction::SkipCode(RawFunction* raw_fun) { |
| +bool RawFunction::SkipCode(RawFunction* raw_fun, bool visit_current_code) { |
|
Vyacheslav Egorov (Google)
2015/04/09 12:23:08
The name is *very* confusing. Rename it do somethi
Florian Schneider
2015/04/09 14:48:38
Done.
|
| // NOTE: This code runs while GC is in progress and runs within |
| // a NoHandleScope block. Hence it is not okay to use regular Zone or |
| // Scope handles. We use direct stack handles, and so the raw pointers in |
| @@ -424,12 +424,15 @@ |
| fn = raw_fun; |
| Code code; |
| - code = fn.CurrentCode(); |
| + if (visit_current_code) { |
| + code = fn.CurrentCode(); |
| + } else { |
| + code = fn.unoptimized_code(); |
| + } |
| if (fn.HasCode() && // The function may not have code. |
| !fn.is_intrinsic() && // These may not increment the usage counter. |
| - !code.is_optimized() && |
| - (fn.CurrentCode() == fn.unoptimized_code()) && |
| + (!visit_current_code || !code.is_optimized()) && |
| !code.HasBreakpoint() && |
| (fn.usage_counter() >= 0)) { |
| fn.set_usage_counter(fn.usage_counter() / 2); |
| @@ -443,15 +446,20 @@ |
| intptr_t RawFunction::VisitFunctionPointers(RawFunction* raw_obj, |
| ObjectPointerVisitor* visitor) { |
| - if (visitor->visit_function_code() || |
| - !RawFunction::SkipCode(raw_obj)) { |
| - visitor->VisitPointers(raw_obj->from(), raw_obj->to()); |
| + visitor->VisitPointers(raw_obj->from(), raw_obj->to_no_code()); |
| + if (visitor->visit_function_code() || !SkipCode(raw_obj, true)) { |
|
Vyacheslav Egorov (Google)
2015/04/09 12:23:08
I think bool parameter is a bit confusing. Maybe p
Florian Schneider
2015/04/09 14:48:38
Done.
|
| + visitor->VisitPointer( |
| + reinterpret_cast<RawObject**>(&raw_obj->ptr()->instructions_)); |
| } else { |
| - GrowableArray<RawFunction*>* sfga = visitor->skipped_code_functions(); |
| - ASSERT(sfga != NULL); |
| - sfga->Add(raw_obj); |
| - visitor->VisitPointers(raw_obj->from(), raw_obj->to_no_code()); |
| + visitor->skipped_current_code_functions()->Add(raw_obj); |
| } |
| + |
| + if (visitor->visit_function_code() || !SkipCode(raw_obj, false)) { |
|
Vyacheslav Egorov (Google)
2015/04/09 12:23:08
we decay fn.usage_counter() twice. I think it shou
Florian Schneider
2015/04/09 14:48:38
Done.
|
| + visitor->VisitPointer( |
| + reinterpret_cast<RawObject**>(&raw_obj->ptr()->unoptimized_code_)); |
| + } else { |
| + visitor->skipped_unoptimized_code_functions()->Add(raw_obj); |
| + } |
| return Function::InstanceSize(); |
| } |