| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 53b9b76377f3d9dc0d897ad322de4c487ab20150..50d6f0b39956ea60626080da59402a5796cec9db 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -2426,25 +2426,19 @@ void Deoptimizer::PatchInterruptCode(Code* unoptimized_code,
|
| Code* replacement_code) {
|
| // Iterate over the back edge table and patch every interrupt
|
| // call to an unconditional call to the replacement code.
|
| - ASSERT(unoptimized_code->kind() == Code::FUNCTION);
|
| int loop_nesting_level = unoptimized_code->allow_osr_at_loop_nesting_level();
|
| - Address back_edge_cursor = unoptimized_code->instruction_start() +
|
| - unoptimized_code->back_edge_table_offset();
|
| - uint32_t table_length = Memory::uint32_at(back_edge_cursor);
|
| - back_edge_cursor += kIntSize;
|
| - for (uint32_t i = 0; i < table_length; ++i) {
|
| - uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 * kIntSize);
|
| - if (static_cast<int>(loop_depth) == loop_nesting_level) {
|
| - // Loop back edge has the loop depth that we want to patch.
|
| - uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
|
| - Address pc_after = unoptimized_code->instruction_start() + pc_offset;
|
| +
|
| + for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
|
| + !back_edges.Done();
|
| + back_edges.Next()) {
|
| + if (static_cast<int>(back_edges.loop_depth()) == loop_nesting_level) {
|
| PatchInterruptCodeAt(unoptimized_code,
|
| - pc_after,
|
| + back_edges.pc(),
|
| interrupt_code,
|
| replacement_code);
|
| }
|
| - back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
|
| }
|
| +
|
| unoptimized_code->set_back_edges_patched_for_osr(true);
|
| #ifdef DEBUG
|
| Deoptimizer::VerifyInterruptCode(
|
| @@ -2457,25 +2451,20 @@ void Deoptimizer::RevertInterruptCode(Code* unoptimized_code,
|
| Code* interrupt_code,
|
| Code* replacement_code) {
|
| // Iterate over the back edge table and revert the patched interrupt calls.
|
| - ASSERT(unoptimized_code->kind() == Code::FUNCTION);
|
| ASSERT(unoptimized_code->back_edges_patched_for_osr());
|
| int loop_nesting_level = unoptimized_code->allow_osr_at_loop_nesting_level();
|
| - Address back_edge_cursor = unoptimized_code->instruction_start() +
|
| - unoptimized_code->back_edge_table_offset();
|
| - uint32_t table_length = Memory::uint32_at(back_edge_cursor);
|
| - back_edge_cursor += kIntSize;
|
| - for (uint32_t i = 0; i < table_length; ++i) {
|
| - uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 * kIntSize);
|
| - if (static_cast<int>(loop_depth) <= loop_nesting_level) {
|
| - uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
|
| - Address pc_after = unoptimized_code->instruction_start() + pc_offset;
|
| +
|
| + for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
|
| + !back_edges.Done();
|
| + back_edges.Next()) {
|
| + if (static_cast<int>(back_edges.loop_depth()) <= loop_nesting_level) {
|
| RevertInterruptCodeAt(unoptimized_code,
|
| - pc_after,
|
| + back_edges.pc(),
|
| interrupt_code,
|
| replacement_code);
|
| }
|
| - back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
|
| }
|
| +
|
| unoptimized_code->set_back_edges_patched_for_osr(false);
|
| unoptimized_code->set_allow_osr_at_loop_nesting_level(0);
|
| #ifdef DEBUG
|
| @@ -2491,24 +2480,18 @@ void Deoptimizer::VerifyInterruptCode(Code* unoptimized_code,
|
| Code* interrupt_code,
|
| Code* replacement_code,
|
| int loop_nesting_level) {
|
| - CHECK(unoptimized_code->kind() == Code::FUNCTION);
|
| - Address back_edge_cursor = unoptimized_code->instruction_start() +
|
| - unoptimized_code->back_edge_table_offset();
|
| - uint32_t table_length = Memory::uint32_at(back_edge_cursor);
|
| - back_edge_cursor += kIntSize;
|
| - for (uint32_t i = 0; i < table_length; ++i) {
|
| - uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 * kIntSize);
|
| + for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
|
| + !back_edges.Done();
|
| + back_edges.Next()) {
|
| + uint32_t loop_depth = back_edges.loop_depth();
|
| CHECK_LE(static_cast<int>(loop_depth), Code::kMaxLoopNestingMarker);
|
| // Assert that all back edges for shallower loops (and only those)
|
| // have already been patched.
|
| - uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
|
| - Address pc_after = unoptimized_code->instruction_start() + pc_offset;
|
| CHECK_EQ((static_cast<int>(loop_depth) <= loop_nesting_level),
|
| InterruptCodeIsPatched(unoptimized_code,
|
| - pc_after,
|
| + back_edges.pc(),
|
| interrupt_code,
|
| replacement_code));
|
| - back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
|
| }
|
| }
|
| #endif // DEBUG
|
|
|