573 // and that takes two interpreter stack slots.
574 tos_addr += 2 * Interpreter::stackElementWords;
575 #else
576 tos_addr += 2;
577 #endif // AMD64
578 }
579 } else {
580 tos_addr = (intptr_t*)interpreter_frame_tos_address();
581 }
582
583 switch (type) {
584 case T_OBJECT :
585 case T_ARRAY : {
586 oop obj;
587 if (method->is_native()) {
588 obj = cast_to_oop(at(interpreter_frame_oop_temp_offset));
589 } else {
590 oop* obj_p = (oop*)tos_addr;
591 obj = (obj_p == NULL) ? (oop)NULL : *obj_p;
592 }
593 assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
594 *oop_result = obj;
595 break;
596 }
597 case T_BOOLEAN : value_result->z = *(jboolean*)tos_addr; break;
598 case T_BYTE : value_result->b = *(jbyte*)tos_addr; break;
599 case T_CHAR : value_result->c = *(jchar*)tos_addr; break;
600 case T_SHORT : value_result->s = *(jshort*)tos_addr; break;
601 case T_INT : value_result->i = *(jint*)tos_addr; break;
602 case T_LONG : value_result->j = *(jlong*)tos_addr; break;
603 case T_FLOAT : {
604 #ifdef AMD64
605 value_result->f = *(jfloat*)tos_addr;
606 #else
607 if (method->is_native()) {
608 jdouble d = *(jdouble*)tos_addr; // Result was in ST0 so need to convert to jfloat
609 value_result->f = (jfloat)d;
610 } else {
611 value_result->f = *(jfloat*)tos_addr;
612 }
613 #endif // AMD64
|
573 // and that takes two interpreter stack slots.
574 tos_addr += 2 * Interpreter::stackElementWords;
575 #else
576 tos_addr += 2;
577 #endif // AMD64
578 }
579 } else {
580 tos_addr = (intptr_t*)interpreter_frame_tos_address();
581 }
582
583 switch (type) {
584 case T_OBJECT :
585 case T_ARRAY : {
586 oop obj;
587 if (method->is_native()) {
588 obj = cast_to_oop(at(interpreter_frame_oop_temp_offset));
589 } else {
590 oop* obj_p = (oop*)tos_addr;
591 obj = (obj_p == NULL) ? (oop)NULL : *obj_p;
592 }
593 assert(obj == NULL || GC::gc()->heap()->is_in(obj), "sanity check");
594 *oop_result = obj;
595 break;
596 }
597 case T_BOOLEAN : value_result->z = *(jboolean*)tos_addr; break;
598 case T_BYTE : value_result->b = *(jbyte*)tos_addr; break;
599 case T_CHAR : value_result->c = *(jchar*)tos_addr; break;
600 case T_SHORT : value_result->s = *(jshort*)tos_addr; break;
601 case T_INT : value_result->i = *(jint*)tos_addr; break;
602 case T_LONG : value_result->j = *(jlong*)tos_addr; break;
603 case T_FLOAT : {
604 #ifdef AMD64
605 value_result->f = *(jfloat*)tos_addr;
606 #else
607 if (method->is_native()) {
608 jdouble d = *(jdouble*)tos_addr; // Result was in ST0 so need to convert to jfloat
609 value_result->f = (jfloat)d;
610 } else {
611 value_result->f = *(jfloat*)tos_addr;
612 }
613 #endif // AMD64
|