src/share/vm/c1/c1_IR.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/c1/c1_IR.cpp	Thu Mar 20 11:28:59 2014
--- new/src/share/vm/c1/c1_IR.cpp	Thu Mar 20 11:28:58 2014

*** 225,236 **** --- 225,272 ---- VMReg name = frame_map()->regname(opr); _oop_map->set_oop(name); } + // Mirror the stack size calculation in the deopt code + // How much stack space would we need at this point in the program in + // case of deoptimization? + int CodeEmitInfo::interpreter_frame_size() const { + ValueStack* state = _stack; + int size = 0; + int callee_parameters = 0; + int callee_locals = 0; + int popframe_extra_args = 0; + + if (JvmtiExport::can_pop_frame() && state->kind() != ValueStack::StateBefore) { + ciMethod* method = state->scope()->method(); + int bci = state->bci(); + popframe_extra_args = MAX2(-method->get_stack_effect_if_at_invoke(bci), 0); + } + + while (state != NULL) { + int locks = state->locks_size(); + int temps = state->stack_size(); + bool is_top_frame = (state->caller_state() == NULL); + ciMethod* method = state->scope()->method(); + + int frame_size = BytesPerWord * Interpreter::size_activation(method->max_stack(), + temps + callee_parameters, + popframe_extra_args, + locks, + callee_parameters, + callee_locals, + is_top_frame); + size += frame_size; + + callee_parameters = method->size_of_parameters(); + callee_locals = method->max_locals(); + popframe_extra_args = 0; + state = state->caller_state(); + } + return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord; + } // Implementation of IR IR::IR(Compilation* compilation, ciMethod* method, int osr_bci) : _locals_size(in_WordSize(-1))

src/share/vm/c1/c1_IR.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File