| Index: src/arm/deoptimizer-arm.cc
|
| ===================================================================
|
| --- src/arm/deoptimizer-arm.cc (revision 11527)
|
| +++ src/arm/deoptimizer-arm.cc (working copy)
|
| @@ -50,6 +50,10 @@
|
|
|
| if (!function->IsOptimized()) return;
|
|
|
| + // The optimized code is going to be patched, so we cannot use it
|
| + // any more. Play safe and reset the whole cache.
|
| + function->shared()->set_optimized_code_map(Smi::FromInt(0));
|
| +
|
| // Get the optimized code.
|
| Code* code = function->code();
|
| Address code_start_address = code->instruction_start();
|
| @@ -97,8 +101,19 @@
|
| // ignore all slots that might have been recorded on it.
|
| isolate->heap()->mark_compact_collector()->InvalidateCode(code);
|
|
|
| - // Set the code for the function to non-optimized version.
|
| - function->ReplaceCode(function->shared()->code());
|
| + // Iterate over all the functions which share the same code object
|
| + // and make them use unoptimized version.
|
| + Context* context = function->context()->global_context();
|
| + Object* element = context->get(Context::OPTIMIZED_FUNCTIONS_LIST);
|
| + SharedFunctionInfo* shared = function->shared();
|
| + while (!element->IsUndefined()) {
|
| + JSFunction* func = JSFunction::cast(element);
|
| + // Grab element before code replacement as ReplaceCode alters the list.
|
| + element = func->next_function_link();
|
| + if (func->code() == code) {
|
| + func->ReplaceCode(shared->code());
|
| + }
|
| + }
|
|
|
| if (FLAG_trace_deopt) {
|
| PrintF("[forced deoptimization: ");
|
| @@ -239,9 +254,9 @@
|
| unsigned node_id = iterator.Next();
|
| USE(node_id);
|
| ASSERT(node_id == ast_id);
|
| - JSFunction* function = JSFunction::cast(ComputeLiteral(iterator.Next()));
|
| - USE(function);
|
| - ASSERT(function == function_);
|
| + int closure_id = iterator.Next();
|
| + USE(closure_id);
|
| + ASSERT_EQ(Translation::kSelfLiteralId, closure_id);
|
| unsigned height = iterator.Next();
|
| unsigned height_in_bytes = height * kPointerSize;
|
| USE(height_in_bytes);
|
| @@ -352,8 +367,8 @@
|
| if (FLAG_trace_osr) {
|
| PrintF("[on-stack replacement translation %s: 0x%08" V8PRIxPTR " ",
|
| ok ? "finished" : "aborted",
|
| - reinterpret_cast<intptr_t>(function));
|
| - function->PrintName();
|
| + reinterpret_cast<intptr_t>(function_));
|
| + function_->PrintName();
|
| PrintF(" => pc=0x%0x]\n", output_[0]->GetPc());
|
| }
|
| }
|
| @@ -583,7 +598,15 @@
|
| int frame_index) {
|
| // Read the ast node id, function, and frame height for this output frame.
|
| int node_id = iterator->Next();
|
| - JSFunction* function = JSFunction::cast(ComputeLiteral(iterator->Next()));
|
| + JSFunction* function;
|
| + if (frame_index != 0) {
|
| + function = JSFunction::cast(ComputeLiteral(iterator->Next()));
|
| + } else {
|
| + int closure_id = iterator->Next();
|
| + USE(closure_id);
|
| + ASSERT_EQ(Translation::kSelfLiteralId, closure_id);
|
| + function = function_;
|
| + }
|
| unsigned height = iterator->Next();
|
| unsigned height_in_bytes = height * kPointerSize;
|
| if (FLAG_trace_deopt) {
|
|
|