--- old/src/share/vm/c1/c1_IR.cpp 2014-03-06 11:59:53.641194980 +0100 +++ new/src/share/vm/c1/c1_IR.cpp 2014-03-06 11:59:53.251319504 +0100 @@ -227,8 +227,44 @@ _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->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, + 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