// If deoptimization happens, this function returns the point where the interpreter reexecutes // the bytecode. // Note: Bytecodes::_athrow is a special case in that it does not return // Interpreter::deopt_entry(vtos, 0) like others address AbstractInterpreter::deopt_reexecute_entry(methodOop method, address bcp) { assert(method->contains(bcp), "just checkin'"); Bytecodes::Code code = Bytecodes::java_code_at(bcp); #ifdef COMPILER1 if(code == Bytecodes::_athrow ) { return Interpreter::rethrow_exception_entry(); } #endif /* COMPILER1 */ return Interpreter::deopt_entry(vtos, 0); }
// If deoptimization happens, this function returns the point of next bytecode to continue execution address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) { assert(method->contains(bcp), "just checkin'"); Bytecodes::Code code = Bytecodes::java_code_at(bcp); assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute"); int bci = method->bci_from(bcp); int length = -1; // initial value for debugging // compute continuation length length = Bytecodes::length_at(bcp); // compute result type BasicType type = T_ILLEGAL; switch (code) { case Bytecodes::_invokevirtual : case Bytecodes::_invokespecial : case Bytecodes::_invokestatic : case Bytecodes::_invokeinterface: { Thread *thread = Thread::current(); ResourceMark rm(thread); methodHandle mh(thread, method); type = Bytecode_invoke_at(mh, bci)->result_type(thread); // since the cache entry might not be initialized: // (NOT needed for the old calling convension) if (!is_top_frame) { int index = Bytes::get_native_u2(bcp+1); method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters); } break; } case Bytecodes::_invokedynamic: { Thread *thread = Thread::current(); ResourceMark rm(thread); methodHandle mh(thread, method); type = Bytecode_invoke_at(mh, bci)->result_type(thread); // since the cache entry might not be initialized: // (NOT needed for the old calling convension) if (!is_top_frame) { int index = Bytes::get_native_u4(bcp+1); method->constants()->cache()->secondary_entry_at(index)->set_parameter_size(callee_parameters); } break; } case Bytecodes::_ldc : case Bytecodes::_ldc_w : // fall through case Bytecodes::_ldc2_w: { Thread *thread = Thread::current(); ResourceMark rm(thread); methodHandle mh(thread, method); type = Bytecode_loadconstant_at(mh, bci)->result_type(); break; } default: type = Bytecodes::result_type(code); break; } // return entry point for computed continuation state & bytecode length return is_top_frame ? Interpreter::deopt_entry (as_TosState(type), length) : Interpreter::return_entry(as_TosState(type), length); }