int MethodComparator::check_stack_and_locals_size(methodOop old_method, methodOop new_method) { if (old_method->max_stack() != new_method->max_stack()) { return 1; } else if (old_method->max_locals() != new_method->max_locals()) { return 2; } else if (old_method->size_of_parameters() != new_method->size_of_parameters()) { return 3; } else return 0; }
void BytecodeInterpreter::layout_interpreterState(interpreterState istate, frame* caller, frame* current, methodOop method, intptr_t* locals, intptr_t* stack, intptr_t* stack_base, intptr_t* monitor_base, intptr_t* frame_bottom, bool is_top_frame) { istate->set_locals(locals); istate->set_method(method); istate->set_self_link(istate); istate->set_prev_link(NULL); // thread will be set by a hacky repurposing of frame::patch_pc() // bcp will be set by vframeArrayElement::unpack_on_stack() istate->set_constants(method->constants()->cache()); istate->set_msg(BytecodeInterpreter::method_resume); istate->set_bcp_advance(0); istate->set_oop_temp(NULL); istate->set_mdx(NULL); if (caller->is_interpreted_frame()) { interpreterState prev = caller->get_interpreterState(); prev->set_callee(method); if (*prev->bcp() == Bytecodes::_invokeinterface) prev->set_bcp_advance(5); else prev->set_bcp_advance(3); } istate->set_callee(NULL); istate->set_monitor_base((BasicObjectLock *) monitor_base); istate->set_stack_base(stack_base); istate->set_stack(stack); istate->set_stack_limit(stack_base - method->max_stack() - 1); }
// for hashing into the table static int hash(methodOop method) { // The point here is to try to make something fairly unique // out of the fields we can read without grabbing any locks // since the method may be locked when we need the hash. return ( method->code_size() ^ method->max_stack() ^ method->max_locals() ^ method->size_of_parameters()); }
int AbstractInterpreter::layout_activation(methodOop method, int tempcount, int popframe_extra_args, int moncount, int caller_actual_parameters, int callee_param_count, int callee_locals, frame* caller, frame* interpreter_frame, bool is_top_frame, bool is_bottom_frame) { assert(popframe_extra_args == 0, "what to do?"); assert(!is_top_frame || (!callee_locals && !callee_param_count), "top frame should have no caller"); // This code must exactly match what InterpreterFrame::build // does (the full InterpreterFrame::build, that is, not the // one that creates empty frames for the deoptimizer). // // If interpreter_frame is not NULL then it will be filled in. // It's size is determined by a previous call to this method, // so it should be correct. // // Note that tempcount is the current size of the expression // stack. For top most frames we will allocate a full sized // expression stack and not the trimmed version that non-top // frames have. int header_words = InterpreterFrame::header_words; int monitor_words = moncount * frame::interpreter_frame_monitor_size(); int stack_words = is_top_frame ? method->max_stack() : tempcount; int callee_extra_locals = callee_locals - callee_param_count; if (interpreter_frame) { intptr_t *locals = interpreter_frame->fp() + method->max_locals(); interpreterState istate = interpreter_frame->get_interpreterState(); intptr_t *monitor_base = (intptr_t*) istate; intptr_t *stack_base = monitor_base - monitor_words; intptr_t *stack = stack_base - tempcount - 1; BytecodeInterpreter::layout_interpreterState(istate, caller, NULL, method, locals, stack, stack_base, monitor_base, NULL, is_top_frame); } return header_words + monitor_words + stack_words + callee_extra_locals; }
int AbstractInterpreter::size_top_interpreter_activation(methodOop method) { #ifdef PPC StackFrame frame; int call_stub_frame = round_to( StubRoutines::call_stub_base_size() + method->max_locals() * wordSize, StackAlignmentInBytes); int interpreter_frame = round_to( frame.unaligned_size() + slop_factor + method->max_stack() * wordSize + (method->is_synchronized() ? frame::interpreter_frame_monitor_size() * wordSize : 0) + sizeof(BytecodeInterpreter), StackAlignmentInBytes); return (call_stub_frame + interpreter_frame) / wordSize; #else Unimplemented(); #endif // PPC }