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