Chromium Code Reviews| Index: runtime/vm/raw_object.cc |
| =================================================================== |
| --- runtime/vm/raw_object.cc (revision 30197) |
| +++ runtime/vm/raw_object.cc (working copy) |
| @@ -366,9 +366,43 @@ |
| } |
| +bool RawFunction::MayTrySkippingCode(RawFunction* raw_fun) { |
| + // 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 |
| + // these handles are not traversed. The use of handles is mainly to |
| + // be able to reuse the handle based code and avoid having to add |
| + // helper functions to the raw object interface. |
| + Function fn; |
| + fn = raw_fun; |
| + |
| + Code code; |
| + code = fn.CurrentCode(); |
| + |
| + if (fn.HasCode() && // Not already detached. |
|
Ivan Posva
2013/11/19 19:24:48
Wouldn't code just be null in this case?
zra
2013/11/22 17:18:54
Changed to !code.IsNull()
|
| + !code.is_optimized() && |
| + !fn.HasBreakpoint() && |
| + (fn.usage_counter() > 0)) { |
|
Ivan Posva
2013/11/19 19:24:48
Is this still necessary? If it is please comment w
zra
2013/11/22 17:18:54
Changed to >= 0.
|
| + fn.set_usage_counter(fn.usage_counter() / 2); |
| + if (FLAG_always_drop_code || (fn.usage_counter() == 0)) { |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| + |
| intptr_t RawFunction::VisitFunctionPointers(RawFunction* raw_obj, |
| ObjectPointerVisitor* visitor) { |
| - visitor->VisitPointers(raw_obj->from(), raw_obj->to()); |
| + if (visitor->visit_function_code() || |
| + !RawFunction::MayTrySkippingCode(raw_obj)) { |
| + visitor->VisitPointers(raw_obj->from(), raw_obj->to()); |
| + } 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()); |
| + } |
| return Function::InstanceSize(); |
| } |