| Index: src/liveedit.cc
|
| diff --git a/src/liveedit.cc b/src/liveedit.cc
|
| index c3ccdf0becf3b54ddec4951a35ef015eef4db5a1..7df17ed877ae4bf81430bc29cc6a2a03e9d38469 100644
|
| --- a/src/liveedit.cc
|
| +++ b/src/liveedit.cc
|
| @@ -1247,27 +1247,41 @@ static bool IsInlined(JSFunction* function, SharedFunctionInfo* candidate) {
|
| }
|
|
|
|
|
| -class DependentFunctionFilter : public OptimizedFunctionFilter {
|
| - public:
|
| - explicit DependentFunctionFilter(
|
| - SharedFunctionInfo* function_info)
|
| - : function_info_(function_info) {}
|
| -
|
| - virtual bool TakeFunction(JSFunction* function) {
|
| - return (function->shared() == function_info_ ||
|
| - IsInlined(function, function_info_));
|
| - }
|
| -
|
| - private:
|
| - SharedFunctionInfo* function_info_;
|
| -};
|
| +static void DeoptimizeDependentFunctions(SharedFunctionInfo* function_info) {
|
| + // Marks code that shares the same shared function info or has inlined
|
| + // code that shares the same function info.
|
| + class DependentFunctionMarker: public OptimizedFunctionVisitor {
|
| + public:
|
| + SharedFunctionInfo* shared_info_;
|
| + bool found_;
|
| +
|
| + explicit DependentFunctionMarker(SharedFunctionInfo* shared_info)
|
| + : shared_info_(shared_info), found_(false) { }
|
| +
|
| + virtual void EnterContext(Context* context) { } // Don't care.
|
| + virtual void LeaveContext(Context* context) { } // Don't care.
|
| + virtual void VisitFunction(JSFunction* function) {
|
| + // It should be guaranteed by the iterator that everything is optimized.
|
| + ASSERT(function->code()->kind() == Code::OPTIMIZED_FUNCTION);
|
| + if (shared_info_ == function->shared() ||
|
| + IsInlined(function, shared_info_)) {
|
| + // mark the code for deoptimization
|
| + function->code()->set_marked_for_deoptimization(true);
|
| + found_ = true;
|
| + }
|
| + }
|
| + };
|
|
|
|
|
| -static void DeoptimizeDependentFunctions(SharedFunctionInfo* function_info) {
|
| DisallowHeapAllocation no_allocation;
|
| + DependentFunctionMarker marker(function_info);
|
| + // TODO(titzer): need to traverse all optimized code to find OSR code here.
|
| + Deoptimizer::VisitAllOptimizedFunctions(function_info->GetIsolate(), &marker);
|
|
|
| - DependentFunctionFilter filter(function_info);
|
| - Deoptimizer::DeoptimizeAllFunctionsWith(function_info->GetIsolate(), &filter);
|
| + if (marker.found_) {
|
| + // Only go through with the deoptimization if something was found.
|
| + Deoptimizer::DeoptimizeMarkedCode(function_info->GetIsolate());
|
| + }
|
| }
|
|
|
|
|
|
|