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 <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 code->set_marked_for_deoptimization(true); | 427 code->set_marked_for_deoptimization(true); |
428 DeoptimizeMarkedCodeForContext(function->context()->native_context()); | 428 DeoptimizeMarkedCodeForContext(function->context()->native_context()); |
429 } | 429 } |
430 } | 430 } |
431 | 431 |
432 | 432 |
433 void Deoptimizer::ComputeOutputFrames(Deoptimizer* deoptimizer) { | 433 void Deoptimizer::ComputeOutputFrames(Deoptimizer* deoptimizer) { |
434 deoptimizer->DoComputeOutputFrames(); | 434 deoptimizer->DoComputeOutputFrames(); |
435 } | 435 } |
436 | 436 |
437 | 437 bool Deoptimizer::TraceEnabledFor(StackFrame::Type frame_type) { |
438 bool Deoptimizer::TraceEnabledFor(BailoutType deopt_type, | 438 return (frame_type == StackFrame::STUB) ? FLAG_trace_stub_failures |
439 StackFrame::Type frame_type) { | 439 : FLAG_trace_deopt; |
440 switch (deopt_type) { | |
441 case EAGER: | |
442 case SOFT: | |
443 case LAZY: | |
444 return (frame_type == StackFrame::STUB) | |
445 ? FLAG_trace_stub_failures | |
446 : FLAG_trace_deopt; | |
447 } | |
448 FATAL("Unsupported deopt type"); | |
449 return false; | |
450 } | 440 } |
451 | 441 |
452 | 442 |
453 const char* Deoptimizer::MessageFor(BailoutType type) { | 443 const char* Deoptimizer::MessageFor(BailoutType type) { |
454 switch (type) { | 444 switch (type) { |
455 case EAGER: return "eager"; | 445 case EAGER: return "eager"; |
456 case SOFT: return "soft"; | 446 case SOFT: return "soft"; |
457 case LAZY: return "lazy"; | 447 case LAZY: return "lazy"; |
458 } | 448 } |
459 FATAL("Unsupported deopt type"); | 449 FATAL("Unsupported deopt type"); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 #if DEBUG | 499 #if DEBUG |
510 DCHECK(compiled_code_ != NULL); | 500 DCHECK(compiled_code_ != NULL); |
511 if (type == EAGER || type == SOFT || type == LAZY) { | 501 if (type == EAGER || type == SOFT || type == LAZY) { |
512 DCHECK(compiled_code_->kind() != Code::FUNCTION); | 502 DCHECK(compiled_code_->kind() != Code::FUNCTION); |
513 } | 503 } |
514 #endif | 504 #endif |
515 | 505 |
516 StackFrame::Type frame_type = function == NULL | 506 StackFrame::Type frame_type = function == NULL |
517 ? StackFrame::STUB | 507 ? StackFrame::STUB |
518 : StackFrame::JAVA_SCRIPT; | 508 : StackFrame::JAVA_SCRIPT; |
519 trace_scope_ = TraceEnabledFor(type, frame_type) ? | 509 trace_scope_ = TraceEnabledFor(frame_type) |
520 new CodeTracer::Scope(isolate->GetCodeTracer()) : NULL; | 510 ? new CodeTracer::Scope(isolate->GetCodeTracer()) |
| 511 : NULL; |
521 #ifdef DEBUG | 512 #ifdef DEBUG |
522 CHECK(AllowHeapAllocation::IsAllowed()); | 513 CHECK(AllowHeapAllocation::IsAllowed()); |
523 disallow_heap_allocation_ = new DisallowHeapAllocation(); | 514 disallow_heap_allocation_ = new DisallowHeapAllocation(); |
524 #endif // DEBUG | 515 #endif // DEBUG |
525 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { | 516 if (compiled_code_->kind() == Code::OPTIMIZED_FUNCTION) { |
526 PROFILE(isolate_, CodeDeoptEvent(compiled_code_, from_, fp_to_sp_delta_)); | 517 PROFILE(isolate_, CodeDeoptEvent(compiled_code_, from_, fp_to_sp_delta_)); |
527 } | 518 } |
528 unsigned size = ComputeInputFrameSize(); | 519 unsigned size = ComputeInputFrameSize(); |
529 int parameter_count = | 520 int parameter_count = |
530 function == nullptr | 521 function == nullptr |
531 ? 0 | 522 ? 0 |
532 : (function->shared()->internal_formal_parameter_count() + 1); | 523 : (function->shared()->internal_formal_parameter_count() + 1); |
533 input_ = new (size) FrameDescription(size, parameter_count); | 524 input_ = new (size) FrameDescription(size, parameter_count); |
534 input_->SetFrameType(frame_type); | 525 input_->SetFrameType(frame_type); |
535 } | 526 } |
536 | 527 |
537 Code* Deoptimizer::FindOptimizedCode(JSFunction* function) { | 528 Code* Deoptimizer::FindOptimizedCode(JSFunction* function) { |
538 switch (bailout_type_) { | 529 Code* compiled_code = FindDeoptimizingCode(from_); |
539 case Deoptimizer::SOFT: | 530 return (compiled_code == NULL) |
540 case Deoptimizer::EAGER: | 531 ? static_cast<Code*>(isolate_->FindCodeObject(from_)) |
541 case Deoptimizer::LAZY: { | 532 : compiled_code; |
542 Code* compiled_code = FindDeoptimizingCode(from_); | |
543 return (compiled_code == NULL) | |
544 ? static_cast<Code*>(isolate_->FindCodeObject(from_)) | |
545 : compiled_code; | |
546 } | |
547 } | |
548 FATAL("Could not find code for optimized function"); | |
549 return NULL; | |
550 } | 533 } |
551 | 534 |
552 | 535 |
553 void Deoptimizer::PrintFunctionName() { | 536 void Deoptimizer::PrintFunctionName() { |
554 if (function_ != nullptr && function_->IsJSFunction()) { | 537 if (function_ != nullptr && function_->IsJSFunction()) { |
555 function_->ShortPrint(trace_scope_->file()); | 538 function_->ShortPrint(trace_scope_->file()); |
556 } else { | 539 } else { |
557 PrintF(trace_scope_->file(), | 540 PrintF(trace_scope_->file(), |
558 "%s", Code::Kind2String(compiled_code_->kind())); | 541 "%s", Code::Kind2String(compiled_code_->kind())); |
559 } | 542 } |
(...skipping 3441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4001 CHECK(value_info->IsMaterializedObject()); | 3984 CHECK(value_info->IsMaterializedObject()); |
4002 | 3985 |
4003 value_info->value_ = | 3986 value_info->value_ = |
4004 Handle<Object>(previously_materialized_objects->get(i), isolate_); | 3987 Handle<Object>(previously_materialized_objects->get(i), isolate_); |
4005 } | 3988 } |
4006 } | 3989 } |
4007 } | 3990 } |
4008 | 3991 |
4009 } // namespace internal | 3992 } // namespace internal |
4010 } // namespace v8 | 3993 } // namespace v8 |
OLD | NEW |