| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 49d046bb6ab4165a928ac35873fe2015b17b63d7..a24a7fcdb5b38ad7c3b43ffb7439b39dd925eebf 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -2591,71 +2591,68 @@ bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator,
|
|
|
|
|
| void Deoptimizer::PatchInterruptCode(Isolate* isolate,
|
| - Code* unoptimized_code) {
|
| + Code* unoptimized) {
|
| DisallowHeapAllocation no_gc;
|
| Code* replacement_code =
|
| isolate->builtins()->builtin(Builtins::kOnStackReplacement);
|
|
|
| // Iterate over the back edge table and patch every interrupt
|
| // call to an unconditional call to the replacement code.
|
| - int loop_nesting_level = unoptimized_code->allow_osr_at_loop_nesting_level();
|
| + int loop_nesting_level = unoptimized->allow_osr_at_loop_nesting_level();
|
|
|
| - for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
|
| + for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized, &no_gc);
|
| !back_edges.Done();
|
| back_edges.Next()) {
|
| if (static_cast<int>(back_edges.loop_depth()) == loop_nesting_level) {
|
| ASSERT_EQ(NOT_PATCHED, GetInterruptPatchState(isolate,
|
| - unoptimized_code,
|
| + unoptimized,
|
| back_edges.pc()));
|
| - PatchInterruptCodeAt(unoptimized_code,
|
| + PatchInterruptCodeAt(unoptimized,
|
| back_edges.pc(),
|
| replacement_code);
|
| }
|
| }
|
|
|
| - unoptimized_code->set_back_edges_patched_for_osr(true);
|
| -#ifdef DEBUG
|
| - Deoptimizer::VerifyInterruptCode(
|
| - isolate, unoptimized_code, loop_nesting_level);
|
| -#endif // DEBUG
|
| + unoptimized->set_back_edges_patched_for_osr(true);
|
| + ASSERT(Deoptimizer::VerifyInterruptCode(
|
| + isolate, unoptimized, loop_nesting_level));
|
| }
|
|
|
|
|
| void Deoptimizer::RevertInterruptCode(Isolate* isolate,
|
| - Code* unoptimized_code) {
|
| + Code* unoptimized) {
|
| DisallowHeapAllocation no_gc;
|
| Code* interrupt_code =
|
| isolate->builtins()->builtin(Builtins::kInterruptCheck);
|
|
|
| // Iterate over the back edge table and revert the patched interrupt calls.
|
| - ASSERT(unoptimized_code->back_edges_patched_for_osr());
|
| - int loop_nesting_level = unoptimized_code->allow_osr_at_loop_nesting_level();
|
| + ASSERT(unoptimized->back_edges_patched_for_osr());
|
| + int loop_nesting_level = unoptimized->allow_osr_at_loop_nesting_level();
|
|
|
| - for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
|
| + for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized, &no_gc);
|
| !back_edges.Done();
|
| back_edges.Next()) {
|
| if (static_cast<int>(back_edges.loop_depth()) <= loop_nesting_level) {
|
| ASSERT_EQ(PATCHED_FOR_OSR, GetInterruptPatchState(isolate,
|
| - unoptimized_code,
|
| + unoptimized,
|
| back_edges.pc()));
|
| - RevertInterruptCodeAt(unoptimized_code, back_edges.pc(), interrupt_code);
|
| + RevertInterruptCodeAt(unoptimized, back_edges.pc(), interrupt_code);
|
| }
|
| }
|
|
|
| - unoptimized_code->set_back_edges_patched_for_osr(false);
|
| - unoptimized_code->set_allow_osr_at_loop_nesting_level(0);
|
| -#ifdef DEBUG
|
| + unoptimized->set_back_edges_patched_for_osr(false);
|
| + unoptimized->set_allow_osr_at_loop_nesting_level(0);
|
| // Assert that none of the back edges are patched anymore.
|
| - Deoptimizer::VerifyInterruptCode(isolate, unoptimized_code, -1);
|
| -#endif // DEBUG
|
| + ASSERT(Deoptimizer::VerifyInterruptCode(isolate, unoptimized, -1));
|
| }
|
|
|
|
|
| #ifdef DEBUG
|
| -void Deoptimizer::VerifyInterruptCode(Isolate* isolate,
|
| - Code* unoptimized_code,
|
| +bool Deoptimizer::VerifyInterruptCode(Isolate* isolate,
|
| + Code* unoptimized,
|
| int loop_nesting_level) {
|
| - for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
|
| + DisallowHeapAllocation no_gc;
|
| + for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized, &no_gc);
|
| !back_edges.Done();
|
| back_edges.Next()) {
|
| uint32_t loop_depth = back_edges.loop_depth();
|
| @@ -2664,9 +2661,10 @@ void Deoptimizer::VerifyInterruptCode(Isolate* isolate,
|
| // have already been patched.
|
| CHECK_EQ((static_cast<int>(loop_depth) <= loop_nesting_level),
|
| GetInterruptPatchState(isolate,
|
| - unoptimized_code,
|
| + unoptimized,
|
| back_edges.pc()) != NOT_PATCHED);
|
| }
|
| + return true;
|
| }
|
| #endif // DEBUG
|
|
|
|
|