BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) { assert(is_interpreted_frame(), "interpreted frame expected"); Method* method = interpreter_frame_method(); BasicType type = method->result_type(); if (method->is_native()) { // Prior to calling into the runtime to notify the method exit the possible // result value is saved into the interpreter frame. address lresult = (address)&(get_ijava_state()->lresult); address fresult = (address)&(get_ijava_state()->fresult); switch (method->result_type()) { case T_OBJECT: case T_ARRAY: { *oop_result = JNIHandles::resolve(*(jobject*)lresult); break; } // We use std/stfd to store the values. case T_BOOLEAN : value_result->z = (jboolean) *(unsigned long*)lresult; break; case T_INT : value_result->i = (jint) *(long*)lresult; break; case T_CHAR : value_result->c = (jchar) *(unsigned long*)lresult; break; case T_SHORT : value_result->s = (jshort) *(long*)lresult; break; case T_BYTE : value_result->z = (jbyte) *(long*)lresult; break; case T_LONG : value_result->j = (jlong) *(long*)lresult; break; case T_FLOAT : value_result->f = (jfloat) *(double*)fresult; break; case T_DOUBLE : value_result->d = (jdouble) *(double*)fresult; break; case T_VOID : /* Nothing to do */ break; default : ShouldNotReachHere(); } } else { intptr_t* tos_addr = interpreter_frame_tos_address(); switch (method->result_type()) { case T_OBJECT: case T_ARRAY: { oop obj = *(oop*)tos_addr; assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); *oop_result = obj; } case T_BOOLEAN : value_result->z = (jboolean) *(jint*)tos_addr; break; case T_BYTE : value_result->b = (jbyte) *(jint*)tos_addr; break; case T_CHAR : value_result->c = (jchar) *(jint*)tos_addr; break; case T_SHORT : value_result->s = (jshort) *(jint*)tos_addr; break; case T_INT : value_result->i = *(jint*)tos_addr; break; case T_LONG : value_result->j = *(jlong*)tos_addr; break; case T_FLOAT : value_result->f = *(jfloat*)tos_addr; break; case T_DOUBLE : value_result->d = *(jdouble*)tos_addr; break; case T_VOID : /* Nothing to do */ break; default : ShouldNotReachHere(); } } return type; }
frame frame::sender_for_interpreter_frame(RegisterMap *map) const { // Pass callers initial_caller_sp as unextended_sp. return frame(sender_sp(), sender_pc(), CC_INTERP_ONLY((intptr_t*)((parent_ijava_frame_abi *)callers_abi())->initial_caller_sp) NOT_CC_INTERP((intptr_t*)get_ijava_state()->sender_sp) ); }
frame frame::sender_for_interpreter_frame(RegisterMap *map) const { // Pass callers initial_caller_sp as unextended_sp. return frame(sender_sp(), sender_pc(), (intptr_t*)get_ijava_state()->sender_sp); }
// top of expression stack inline intptr_t* frame::interpreter_frame_tos_address() const { return ((intptr_t*) get_ijava_state()->esp) + Interpreter::stackElementWords; }
inline void frame::interpreter_frame_set_sender_sp(intptr_t* sender_sp) { get_ijava_state()->sender_sp = (intptr_t) sender_sp; }
inline void frame::interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp) { get_ijava_state()->top_frame_sp = (intptr_t) top_frame_sp; }
inline void frame::interpreter_frame_set_esp(intptr_t* esp) { get_ijava_state()->esp = (intptr_t) esp; }
// Convenient setters inline void frame::interpreter_frame_set_monitor_end(BasicObjectLock* end) { get_ijava_state()->monitors = (intptr_t) end;}
inline intptr_t* frame::interpreter_frame_esp() const { return (intptr_t*) get_ijava_state()->esp; }
inline oop* frame::interpreter_frame_temp_oop_addr() const { return (oop *) &(get_ijava_state()->oop_tmp); }
inline BasicObjectLock* frame::interpreter_frame_monitor_begin() const { return (BasicObjectLock *) get_ijava_state(); }
// Pointer beyond the "oldest/deepest" BasicObjectLock on stack. inline BasicObjectLock* frame::interpreter_frame_monitor_end() const { return (BasicObjectLock *) get_ijava_state()->monitors; }
inline intptr_t* frame::interpreter_frame_mdp_addr() const { return (intptr_t*) &(get_ijava_state()->mdx); }