| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/deoptimizer.h" | 5 #include "src/deoptimizer.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/ast/prettyprinter.h" | 8 #include "src/ast/prettyprinter.h" |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/disasm.h" | 10 #include "src/disasm.h" |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 | 367 |
| 368 // We might be in the middle of incremental marking with compaction. | 368 // We might be in the middle of incremental marking with compaction. |
| 369 // Tell collector to treat this code object in a special way and | 369 // Tell collector to treat this code object in a special way and |
| 370 // ignore all slots that might have been recorded on it. | 370 // ignore all slots that might have been recorded on it. |
| 371 isolate->heap()->mark_compact_collector()->InvalidateCode(codes[i]); | 371 isolate->heap()->mark_compact_collector()->InvalidateCode(codes[i]); |
| 372 } | 372 } |
| 373 } | 373 } |
| 374 | 374 |
| 375 | 375 |
| 376 void Deoptimizer::DeoptimizeAll(Isolate* isolate) { | 376 void Deoptimizer::DeoptimizeAll(Isolate* isolate) { |
| 377 RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); |
| 378 RuntimeCallTimerScope runtimeTimer(isolate, &stats->DeoptimizeCode); |
| 377 TimerEventScope<TimerEventDeoptimizeCode> timer(isolate); | 379 TimerEventScope<TimerEventDeoptimizeCode> timer(isolate); |
| 378 TRACE_EVENT0("v8", "V8.DeoptimizeCode"); | 380 TRACE_EVENT0("v8", "V8.DeoptimizeCode"); |
| 379 if (FLAG_trace_deopt) { | 381 if (FLAG_trace_deopt) { |
| 380 CodeTracer::Scope scope(isolate->GetCodeTracer()); | 382 CodeTracer::Scope scope(isolate->GetCodeTracer()); |
| 381 PrintF(scope.file(), "[deoptimize all code in all contexts]\n"); | 383 PrintF(scope.file(), "[deoptimize all code in all contexts]\n"); |
| 382 } | 384 } |
| 383 DisallowHeapAllocation no_allocation; | 385 DisallowHeapAllocation no_allocation; |
| 384 // For all contexts, mark all code, then deoptimize. | 386 // For all contexts, mark all code, then deoptimize. |
| 385 Object* context = isolate->heap()->native_contexts_list(); | 387 Object* context = isolate->heap()->native_contexts_list(); |
| 386 while (!context->IsUndefined()) { | 388 while (!context->IsUndefined()) { |
| 387 Context* native_context = Context::cast(context); | 389 Context* native_context = Context::cast(context); |
| 388 MarkAllCodeForContext(native_context); | 390 MarkAllCodeForContext(native_context); |
| 389 DeoptimizeMarkedCodeForContext(native_context); | 391 DeoptimizeMarkedCodeForContext(native_context); |
| 390 context = native_context->get(Context::NEXT_CONTEXT_LINK); | 392 context = native_context->get(Context::NEXT_CONTEXT_LINK); |
| 391 } | 393 } |
| 392 } | 394 } |
| 393 | 395 |
| 394 | 396 |
| 395 void Deoptimizer::DeoptimizeMarkedCode(Isolate* isolate) { | 397 void Deoptimizer::DeoptimizeMarkedCode(Isolate* isolate) { |
| 398 RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); |
| 399 RuntimeCallTimerScope runtimeTimer(isolate, &stats->DeoptimizeCode); |
| 396 TimerEventScope<TimerEventDeoptimizeCode> timer(isolate); | 400 TimerEventScope<TimerEventDeoptimizeCode> timer(isolate); |
| 397 TRACE_EVENT0("v8", "V8.DeoptimizeCode"); | 401 TRACE_EVENT0("v8", "V8.DeoptimizeCode"); |
| 398 if (FLAG_trace_deopt) { | 402 if (FLAG_trace_deopt) { |
| 399 CodeTracer::Scope scope(isolate->GetCodeTracer()); | 403 CodeTracer::Scope scope(isolate->GetCodeTracer()); |
| 400 PrintF(scope.file(), "[deoptimize marked code in all contexts]\n"); | 404 PrintF(scope.file(), "[deoptimize marked code in all contexts]\n"); |
| 401 } | 405 } |
| 402 DisallowHeapAllocation no_allocation; | 406 DisallowHeapAllocation no_allocation; |
| 403 // For all contexts, deoptimize code already marked. | 407 // For all contexts, deoptimize code already marked. |
| 404 Object* context = isolate->heap()->native_contexts_list(); | 408 Object* context = isolate->heap()->native_contexts_list(); |
| 405 while (!context->IsUndefined()) { | 409 while (!context->IsUndefined()) { |
| 406 Context* native_context = Context::cast(context); | 410 Context* native_context = Context::cast(context); |
| 407 DeoptimizeMarkedCodeForContext(native_context); | 411 DeoptimizeMarkedCodeForContext(native_context); |
| 408 context = native_context->get(Context::NEXT_CONTEXT_LINK); | 412 context = native_context->get(Context::NEXT_CONTEXT_LINK); |
| 409 } | 413 } |
| 410 } | 414 } |
| 411 | 415 |
| 412 | 416 |
| 413 void Deoptimizer::MarkAllCodeForContext(Context* context) { | 417 void Deoptimizer::MarkAllCodeForContext(Context* context) { |
| 414 Object* element = context->OptimizedCodeListHead(); | 418 Object* element = context->OptimizedCodeListHead(); |
| 415 while (!element->IsUndefined()) { | 419 while (!element->IsUndefined()) { |
| 416 Code* code = Code::cast(element); | 420 Code* code = Code::cast(element); |
| 417 CHECK_EQ(code->kind(), Code::OPTIMIZED_FUNCTION); | 421 CHECK_EQ(code->kind(), Code::OPTIMIZED_FUNCTION); |
| 418 code->set_marked_for_deoptimization(true); | 422 code->set_marked_for_deoptimization(true); |
| 419 element = code->next_code_link(); | 423 element = code->next_code_link(); |
| 420 } | 424 } |
| 421 } | 425 } |
| 422 | 426 |
| 423 | 427 |
| 424 void Deoptimizer::DeoptimizeFunction(JSFunction* function) { | 428 void Deoptimizer::DeoptimizeFunction(JSFunction* function) { |
| 425 TimerEventScope<TimerEventDeoptimizeCode> timer(function->GetIsolate()); | 429 Isolate* isolate = function->GetIsolate(); |
| 430 RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); |
| 431 RuntimeCallTimerScope runtimeTimer(isolate, &stats->DeoptimizeCode); |
| 432 TimerEventScope<TimerEventDeoptimizeCode> timer(isolate); |
| 426 TRACE_EVENT0("v8", "V8.DeoptimizeCode"); | 433 TRACE_EVENT0("v8", "V8.DeoptimizeCode"); |
| 427 Code* code = function->code(); | 434 Code* code = function->code(); |
| 428 if (code->kind() == Code::OPTIMIZED_FUNCTION) { | 435 if (code->kind() == Code::OPTIMIZED_FUNCTION) { |
| 429 // Mark the code for deoptimization and unlink any functions that also | 436 // Mark the code for deoptimization and unlink any functions that also |
| 430 // refer to that code. The code cannot be shared across native contexts, | 437 // refer to that code. The code cannot be shared across native contexts, |
| 431 // so we only need to search one. | 438 // so we only need to search one. |
| 432 code->set_marked_for_deoptimization(true); | 439 code->set_marked_for_deoptimization(true); |
| 433 DeoptimizeMarkedCodeForContext(function->context()->native_context()); | 440 DeoptimizeMarkedCodeForContext(function->context()->native_context()); |
| 434 } | 441 } |
| 435 } | 442 } |
| (...skipping 3375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3811 CHECK(value_info->IsMaterializedObject()); | 3818 CHECK(value_info->IsMaterializedObject()); |
| 3812 | 3819 |
| 3813 value_info->value_ = | 3820 value_info->value_ = |
| 3814 Handle<Object>(previously_materialized_objects->get(i), isolate_); | 3821 Handle<Object>(previously_materialized_objects->get(i), isolate_); |
| 3815 } | 3822 } |
| 3816 } | 3823 } |
| 3817 } | 3824 } |
| 3818 | 3825 |
| 3819 } // namespace internal | 3826 } // namespace internal |
| 3820 } // namespace v8 | 3827 } // namespace v8 |
| OLD | NEW |