src/cpu/x86/vm/templateInterpreter_x86_32.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/cpu/x86/vm/templateInterpreter_x86_32.cpp	Thu Mar 20 11:28:56 2014
--- new/src/cpu/x86/vm/templateInterpreter_x86_32.cpp	Thu Mar 20 11:28:56 2014

*** 1684,1778 **** --- 1684,1693 ---- const int method_stack = (method->max_locals() + method->max_stack()) * Interpreter::stackElementWords; return overhead_size + method_stack + stub_code; } // asm based interpreter deoptimization helpers int AbstractInterpreter::layout_activation(Method* 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) { // Note: This calculation must exactly parallel the frame setup // in AbstractInterpreterGenerator::generate_method_entry. // If interpreter_frame!=NULL, set up the method, locals, and monitors. // The frame interpreter_frame, if not NULL, is guaranteed to be the right size, // as determined by a previous call to this method. // It is also guaranteed to be walkable even though it is in a skeletal state // NOTE: return size is in words not bytes // fixed size of an interpreter frame: int max_locals = method->max_locals() * Interpreter::stackElementWords; int extra_locals = (method->max_locals() - method->size_of_parameters()) * Interpreter::stackElementWords; int overhead = frame::sender_sp_offset - frame::interpreter_frame_initial_sp_offset; // Our locals were accounted for by the caller (or last_frame_adjust on the transistion) // Since the callee parameters already account for the callee's params we only need to account for // the extra locals. int size = overhead + ((callee_locals - callee_param_count)*Interpreter::stackElementWords) + (moncount*frame::interpreter_frame_monitor_size()) + tempcount*Interpreter::stackElementWords + popframe_extra_args; if (interpreter_frame != NULL) { #ifdef ASSERT if (!EnableInvokeDynamic) // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences? // Probably, since deoptimization doesn't work yet. assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)"); #endif interpreter_frame->interpreter_frame_set_method(method); // NOTE the difference in using sender_sp and interpreter_frame_sender_sp // interpreter_frame_sender_sp is the original sp of the caller (the unextended_sp) // and sender_sp is fp+8 intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1; #ifdef ASSERT if (caller->is_interpreted_frame()) { assert(locals < caller->fp() + frame::interpreter_frame_initial_sp_offset, "bad placement"); } #endif interpreter_frame->interpreter_frame_set_locals(locals); BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin(); BasicObjectLock* monbot = montop - moncount; interpreter_frame->interpreter_frame_set_monitor_end(monbot); // Set last_sp intptr_t* rsp = (intptr_t*) monbot - tempcount*Interpreter::stackElementWords - popframe_extra_args; interpreter_frame->interpreter_frame_set_last_sp(rsp); // All frames but the initial (oldest) interpreter frame we fill in have a // value for sender_sp that allows walking the stack but isn't // truly correct. Correct the value here. if (extra_locals != 0 && interpreter_frame->sender_sp() == interpreter_frame->interpreter_frame_sender_sp() ) { interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + extra_locals); } *interpreter_frame->interpreter_frame_cache_addr() = method->constants()->cache(); } return size; } //------------------------------------------------------------------------------------------------------------------------ // Exceptions void TemplateInterpreterGenerator::generate_throw_exception() { // Entry point in previous activation (i.e., if the caller was interpreted)

src/cpu/x86/vm/templateInterpreter_x86_32.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File