1579 int caller_actual_parameters, |
1579 int caller_actual_parameters, |
1580 int callee_param_count, |
1580 int callee_param_count, |
1581 int callee_local_count, |
1581 int callee_local_count, |
1582 frame* caller, |
1582 frame* caller, |
1583 frame* interpreter_frame, |
1583 frame* interpreter_frame, |
1584 bool is_top_frame) { |
1584 bool is_top_frame, |
|
1585 bool is_bottom_frame) { |
1585 // Note: This calculation must exactly parallel the frame setup |
1586 // Note: This calculation must exactly parallel the frame setup |
1586 // in InterpreterGenerator::generate_fixed_frame. |
1587 // in InterpreterGenerator::generate_fixed_frame. |
1587 // If f!=NULL, set up the following variables: |
1588 // If f!=NULL, set up the following variables: |
1588 // - Lmethod |
1589 // - Lmethod |
1589 // - Llocals |
1590 // - Llocals |
1662 int parm_words = caller_actual_parameters * Interpreter::stackElementWords; |
1663 int parm_words = caller_actual_parameters * Interpreter::stackElementWords; |
1663 locals = Lesp_ptr + parm_words; |
1664 locals = Lesp_ptr + parm_words; |
1664 int delta = local_words - parm_words; |
1665 int delta = local_words - parm_words; |
1665 int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; |
1666 int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; |
1666 *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; |
1667 *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; |
|
1668 if (!is_bottom_frame) { |
|
1669 // Llast_SP is set below for the current frame to SP (with the |
|
1670 // extra space for the callee's locals). Here we adjust |
|
1671 // Llast_SP for the caller's frame, removing the extra space |
|
1672 // for the current method's locals. |
|
1673 *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP); |
|
1674 } else { |
|
1675 assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP"); |
|
1676 } |
1667 } else { |
1677 } else { |
1668 assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases"); |
1678 assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases"); |
1669 // Don't have Lesp available; lay out locals block in the caller |
1679 // Don't have Lesp available; lay out locals block in the caller |
1670 // adjacent to the register window save area. |
1680 // adjacent to the register window save area. |
1671 // |
1681 // |