src/share/vm/interpreter/bytecodeInterpreter.cpp

changeset 2036
126ea7725993
parent 1907
c18cbe5936b8
child 2084
13b87063b4d8
equal deleted inserted replaced
2035:a64438a2b7e8 2036:126ea7725993
337 */ 337 */
338 #undef CHECK_NULL 338 #undef CHECK_NULL
339 #define CHECK_NULL(obj_) \ 339 #define CHECK_NULL(obj_) \
340 if ((obj_) == NULL) { \ 340 if ((obj_) == NULL) { \
341 VM_JAVA_ERROR(vmSymbols::java_lang_NullPointerException(), ""); \ 341 VM_JAVA_ERROR(vmSymbols::java_lang_NullPointerException(), ""); \
342 } 342 } \
343 VERIFY_OOP(obj_)
343 344
344 #define VMdoubleConstZero() 0.0 345 #define VMdoubleConstZero() 0.0
345 #define VMdoubleConstOne() 1.0 346 #define VMdoubleConstOne() 1.0
346 #define VMlongConstZero() (max_jlong-max_jlong) 347 #define VMlongConstZero() (max_jlong-max_jlong)
347 #define VMlongConstOne() ((max_jlong-max_jlong)+1) 348 #define VMlongConstOne() ((max_jlong-max_jlong)+1)
507 /* 0xA8 */ &&opc_jsr, &&opc_ret, &&opc_tableswitch,&&opc_lookupswitch, 508 /* 0xA8 */ &&opc_jsr, &&opc_ret, &&opc_tableswitch,&&opc_lookupswitch,
508 /* 0xAC */ &&opc_ireturn, &&opc_lreturn, &&opc_freturn, &&opc_dreturn, 509 /* 0xAC */ &&opc_ireturn, &&opc_lreturn, &&opc_freturn, &&opc_dreturn,
509 510
510 /* 0xB0 */ &&opc_areturn, &&opc_return, &&opc_getstatic, &&opc_putstatic, 511 /* 0xB0 */ &&opc_areturn, &&opc_return, &&opc_getstatic, &&opc_putstatic,
511 /* 0xB4 */ &&opc_getfield, &&opc_putfield, &&opc_invokevirtual,&&opc_invokespecial, 512 /* 0xB4 */ &&opc_getfield, &&opc_putfield, &&opc_invokevirtual,&&opc_invokespecial,
512 /* 0xB8 */ &&opc_invokestatic,&&opc_invokeinterface,NULL, &&opc_new, 513 /* 0xB8 */ &&opc_invokestatic,&&opc_invokeinterface,&&opc_default, &&opc_new,
513 /* 0xBC */ &&opc_newarray, &&opc_anewarray, &&opc_arraylength, &&opc_athrow, 514 /* 0xBC */ &&opc_newarray, &&opc_anewarray, &&opc_arraylength, &&opc_athrow,
514 515
515 /* 0xC0 */ &&opc_checkcast, &&opc_instanceof, &&opc_monitorenter, &&opc_monitorexit, 516 /* 0xC0 */ &&opc_checkcast, &&opc_instanceof, &&opc_monitorenter, &&opc_monitorexit,
516 /* 0xC4 */ &&opc_wide, &&opc_multianewarray, &&opc_ifnull, &&opc_ifnonnull, 517 /* 0xC4 */ &&opc_wide, &&opc_multianewarray, &&opc_ifnull, &&opc_ifnonnull,
517 /* 0xC8 */ &&opc_goto_w, &&opc_jsr_w, &&opc_breakpoint, &&opc_default, 518 /* 0xC8 */ &&opc_goto_w, &&opc_jsr_w, &&opc_breakpoint, &&opc_default,
537 538
538 #ifdef ASSERT 539 #ifdef ASSERT
539 // this will trigger a VERIFY_OOP on entry 540 // this will trigger a VERIFY_OOP on entry
540 if (istate->msg() != initialize && ! METHOD->is_static()) { 541 if (istate->msg() != initialize && ! METHOD->is_static()) {
541 oop rcvr = LOCALS_OBJECT(0); 542 oop rcvr = LOCALS_OBJECT(0);
543 VERIFY_OOP(rcvr);
542 } 544 }
543 #endif 545 #endif
544 // #define HACK 546 // #define HACK
545 #ifdef HACK 547 #ifdef HACK
546 bool interesting = false; 548 bool interesting = false;
547 #endif // HACK 549 #endif // HACK
548 550
549 /* QQQ this should be a stack method so we don't know actual direction */ 551 /* QQQ this should be a stack method so we don't know actual direction */
550 assert(istate->msg() == initialize || 552 guarantee(istate->msg() == initialize ||
551 topOfStack >= istate->stack_limit() && 553 topOfStack >= istate->stack_limit() &&
552 topOfStack < istate->stack_base(), 554 topOfStack < istate->stack_base(),
553 "Stack top out of range"); 555 "Stack top out of range");
554 556
555 switch (istate->msg()) { 557 switch (istate->msg()) {
611 oop rcvr; 613 oop rcvr;
612 if (METHOD->is_static()) { 614 if (METHOD->is_static()) {
613 rcvr = METHOD->constants()->pool_holder()->klass_part()->java_mirror(); 615 rcvr = METHOD->constants()->pool_holder()->klass_part()->java_mirror();
614 } else { 616 } else {
615 rcvr = LOCALS_OBJECT(0); 617 rcvr = LOCALS_OBJECT(0);
618 VERIFY_OOP(rcvr);
616 } 619 }
617 // The initial monitor is ours for the taking 620 // The initial monitor is ours for the taking
618 BasicObjectLock* mon = &istate->monitor_base()[-1]; 621 BasicObjectLock* mon = &istate->monitor_base()[-1];
619 oop monobj = mon->obj(); 622 oop monobj = mon->obj();
620 assert(mon->obj() == rcvr, "method monitor mis-initialized"); 623 assert(mon->obj() == rcvr, "method monitor mis-initialized");
733 } 736 }
734 737
735 case popping_frame: { 738 case popping_frame: {
736 // returned from a java call to pop the frame, restart the call 739 // returned from a java call to pop the frame, restart the call
737 // clear the message so we don't confuse ourselves later 740 // clear the message so we don't confuse ourselves later
741 ShouldNotReachHere(); // we don't return this.
738 assert(THREAD->pop_frame_in_process(), "wrong frame pop state"); 742 assert(THREAD->pop_frame_in_process(), "wrong frame pop state");
739 istate->set_msg(no_request); 743 istate->set_msg(no_request);
740 THREAD->clr_pop_frame_in_process(); 744 THREAD->clr_pop_frame_in_process();
741 goto run; 745 goto run;
742 } 746 }
799 } 803 }
800 case got_monitors: { 804 case got_monitors: {
801 // continue locking now that we have a monitor to use 805 // continue locking now that we have a monitor to use
802 // we expect to find newly allocated monitor at the "top" of the monitor stack. 806 // we expect to find newly allocated monitor at the "top" of the monitor stack.
803 oop lockee = STACK_OBJECT(-1); 807 oop lockee = STACK_OBJECT(-1);
808 VERIFY_OOP(lockee);
804 // derefing's lockee ought to provoke implicit null check 809 // derefing's lockee ought to provoke implicit null check
805 // find a free monitor 810 // find a free monitor
806 BasicObjectLock* entry = (BasicObjectLock*) istate->stack_base(); 811 BasicObjectLock* entry = (BasicObjectLock*) istate->stack_base();
807 assert(entry->obj() == NULL, "Frame manager didn't allocate the monitor"); 812 assert(entry->obj() == NULL, "Frame manager didn't allocate the monitor");
808 entry->set_obj(lockee); 813 entry->set_obj(lockee);
909 UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1); 914 UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
910 915
911 /* load from local variable */ 916 /* load from local variable */
912 917
913 CASE(_aload): 918 CASE(_aload):
919 VERIFY_OOP(LOCALS_OBJECT(pc[1]));
914 SET_STACK_OBJECT(LOCALS_OBJECT(pc[1]), 0); 920 SET_STACK_OBJECT(LOCALS_OBJECT(pc[1]), 0);
915 UPDATE_PC_AND_TOS_AND_CONTINUE(2, 1); 921 UPDATE_PC_AND_TOS_AND_CONTINUE(2, 1);
916 922
917 CASE(_iload): 923 CASE(_iload):
918 CASE(_fload): 924 CASE(_fload):
928 UPDATE_PC_AND_TOS_AND_CONTINUE(2, 2); 934 UPDATE_PC_AND_TOS_AND_CONTINUE(2, 2);
929 935
930 #undef OPC_LOAD_n 936 #undef OPC_LOAD_n
931 #define OPC_LOAD_n(num) \ 937 #define OPC_LOAD_n(num) \
932 CASE(_aload_##num): \ 938 CASE(_aload_##num): \
939 VERIFY_OOP(LOCALS_OBJECT(num)); \
933 SET_STACK_OBJECT(LOCALS_OBJECT(num), 0); \ 940 SET_STACK_OBJECT(LOCALS_OBJECT(num), 0); \
934 UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1); \ 941 UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1); \
935 \ 942 \
936 CASE(_iload_##num): \ 943 CASE(_iload_##num): \
937 CASE(_fload_##num): \ 944 CASE(_fload_##num): \
973 uint16_t reg = Bytes::get_Java_u2(pc + 2); 980 uint16_t reg = Bytes::get_Java_u2(pc + 2);
974 981
975 opcode = pc[1]; 982 opcode = pc[1];
976 switch(opcode) { 983 switch(opcode) {
977 case Bytecodes::_aload: 984 case Bytecodes::_aload:
985 VERIFY_OOP(LOCALS_OBJECT(reg));
978 SET_STACK_OBJECT(LOCALS_OBJECT(reg), 0); 986 SET_STACK_OBJECT(LOCALS_OBJECT(reg), 0);
979 UPDATE_PC_AND_TOS_AND_CONTINUE(4, 1); 987 UPDATE_PC_AND_TOS_AND_CONTINUE(4, 1);
980 988
981 case Bytecodes::_iload: 989 case Bytecodes::_iload:
982 case Bytecodes::_fload: 990 case Bytecodes::_fload:
1097 #undef OPC_INT_BINARY 1105 #undef OPC_INT_BINARY
1098 #define OPC_INT_BINARY(opcname, opname, test) \ 1106 #define OPC_INT_BINARY(opcname, opname, test) \
1099 CASE(_i##opcname): \ 1107 CASE(_i##opcname): \
1100 if (test && (STACK_INT(-1) == 0)) { \ 1108 if (test && (STACK_INT(-1) == 0)) { \
1101 VM_JAVA_ERROR(vmSymbols::java_lang_ArithmeticException(), \ 1109 VM_JAVA_ERROR(vmSymbols::java_lang_ArithmeticException(), \
1102 "/ by int zero"); \ 1110 "/ by zero"); \
1103 } \ 1111 } \
1104 SET_STACK_INT(VMint##opname(STACK_INT(-2), \ 1112 SET_STACK_INT(VMint##opname(STACK_INT(-2), \
1105 STACK_INT(-1)), \ 1113 STACK_INT(-1)), \
1106 -2); \ 1114 -2); \
1107 UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); \ 1115 UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); \
1275 CASE(_f2d): /* convert top of stack float to double */ 1283 CASE(_f2d): /* convert top of stack float to double */
1276 { 1284 {
1277 jfloat f; 1285 jfloat f;
1278 jdouble r; 1286 jdouble r;
1279 f = STACK_FLOAT(-1); 1287 f = STACK_FLOAT(-1);
1288 #ifdef IA64
1289 // IA64 gcc bug
1290 r = ( f == 0.0f ) ? (jdouble) f : (jdouble) f + ia64_double_zero;
1291 #else
1280 r = (jdouble) f; 1292 r = (jdouble) f;
1293 #endif
1281 MORE_STACK(-1); // POP 1294 MORE_STACK(-1); // POP
1282 SET_STACK_DOUBLE(r, 1); 1295 SET_STACK_DOUBLE(r, 1);
1283 UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2); 1296 UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
1284 } 1297 }
1285 1298
1469 } 1482 }
1470 1483
1471 CASE(_return_register_finalizer): { 1484 CASE(_return_register_finalizer): {
1472 1485
1473 oop rcvr = LOCALS_OBJECT(0); 1486 oop rcvr = LOCALS_OBJECT(0);
1487 VERIFY_OOP(rcvr);
1474 if (rcvr->klass()->klass_part()->has_finalizer()) { 1488 if (rcvr->klass()->klass_part()->has_finalizer()) {
1475 CALL_VM(InterpreterRuntime::register_finalizer(THREAD, rcvr), handle_exception); 1489 CALL_VM(InterpreterRuntime::register_finalizer(THREAD, rcvr), handle_exception);
1476 } 1490 }
1477 goto handle_return; 1491 goto handle_return;
1478 } 1492 }
1559 /* 1573 /*
1560 * This one looks different because of the assignability check 1574 * This one looks different because of the assignability check
1561 */ 1575 */
1562 CASE(_aastore): { 1576 CASE(_aastore): {
1563 oop rhsObject = STACK_OBJECT(-1); 1577 oop rhsObject = STACK_OBJECT(-1);
1578 VERIFY_OOP(rhsObject);
1564 ARRAY_INTRO( -3); 1579 ARRAY_INTRO( -3);
1565 // arrObj, index are set 1580 // arrObj, index are set
1566 if (rhsObject != NULL) { 1581 if (rhsObject != NULL) {
1567 /* Check assignability of rhsObject into arrObj */ 1582 /* Check assignability of rhsObject into arrObj */
1568 klassOop rhsKlassOop = rhsObject->klass(); // EBX (subclass) 1583 klassOop rhsKlassOop = rhsObject->klass(); // EBX (subclass)
1701 if ( *count_addr > 0 ) { 1716 if ( *count_addr > 0 ) {
1702 if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) { 1717 if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) {
1703 obj = (oop)NULL; 1718 obj = (oop)NULL;
1704 } else { 1719 } else {
1705 obj = (oop) STACK_OBJECT(-1); 1720 obj = (oop) STACK_OBJECT(-1);
1721 VERIFY_OOP(obj);
1706 } 1722 }
1707 CALL_VM(InterpreterRuntime::post_field_access(THREAD, 1723 CALL_VM(InterpreterRuntime::post_field_access(THREAD,
1708 obj, 1724 obj,
1709 cache), 1725 cache),
1710 handle_exception); 1726 handle_exception);
1726 // 1742 //
1727 TosState tos_type = cache->flag_state(); 1743 TosState tos_type = cache->flag_state();
1728 int field_offset = cache->f2(); 1744 int field_offset = cache->f2();
1729 if (cache->is_volatile()) { 1745 if (cache->is_volatile()) {
1730 if (tos_type == atos) { 1746 if (tos_type == atos) {
1747 VERIFY_OOP(obj->obj_field_acquire(field_offset));
1731 SET_STACK_OBJECT(obj->obj_field_acquire(field_offset), -1); 1748 SET_STACK_OBJECT(obj->obj_field_acquire(field_offset), -1);
1732 } else if (tos_type == itos) { 1749 } else if (tos_type == itos) {
1733 SET_STACK_INT(obj->int_field_acquire(field_offset), -1); 1750 SET_STACK_INT(obj->int_field_acquire(field_offset), -1);
1734 } else if (tos_type == ltos) { 1751 } else if (tos_type == ltos) {
1735 SET_STACK_LONG(obj->long_field_acquire(field_offset), 0); 1752 SET_STACK_LONG(obj->long_field_acquire(field_offset), 0);
1746 SET_STACK_DOUBLE(obj->double_field_acquire(field_offset), 0); 1763 SET_STACK_DOUBLE(obj->double_field_acquire(field_offset), 0);
1747 MORE_STACK(1); 1764 MORE_STACK(1);
1748 } 1765 }
1749 } else { 1766 } else {
1750 if (tos_type == atos) { 1767 if (tos_type == atos) {
1768 VERIFY_OOP(obj->obj_field(field_offset));
1751 SET_STACK_OBJECT(obj->obj_field(field_offset), -1); 1769 SET_STACK_OBJECT(obj->obj_field(field_offset), -1);
1752 } else if (tos_type == itos) { 1770 } else if (tos_type == itos) {
1753 SET_STACK_INT(obj->int_field(field_offset), -1); 1771 SET_STACK_INT(obj->int_field(field_offset), -1);
1754 } else if (tos_type == ltos) { 1772 } else if (tos_type == ltos) {
1755 SET_STACK_LONG(obj->long_field(field_offset), 0); 1773 SET_STACK_LONG(obj->long_field(field_offset), 0);
1797 if (cache->is_long() || cache->is_double()) { 1815 if (cache->is_long() || cache->is_double()) {
1798 obj = (oop) STACK_OBJECT(-3); 1816 obj = (oop) STACK_OBJECT(-3);
1799 } else { 1817 } else {
1800 obj = (oop) STACK_OBJECT(-2); 1818 obj = (oop) STACK_OBJECT(-2);
1801 } 1819 }
1820 VERIFY_OOP(obj);
1802 } 1821 }
1803 1822
1804 CALL_VM(InterpreterRuntime::post_field_modification(THREAD, 1823 CALL_VM(InterpreterRuntime::post_field_modification(THREAD,
1805 obj, 1824 obj,
1806 cache, 1825 cache,
1835 int field_offset = cache->f2(); 1854 int field_offset = cache->f2();
1836 if (cache->is_volatile()) { 1855 if (cache->is_volatile()) {
1837 if (tos_type == itos) { 1856 if (tos_type == itos) {
1838 obj->release_int_field_put(field_offset, STACK_INT(-1)); 1857 obj->release_int_field_put(field_offset, STACK_INT(-1));
1839 } else if (tos_type == atos) { 1858 } else if (tos_type == atos) {
1859 VERIFY_OOP(STACK_OBJECT(-1));
1840 obj->release_obj_field_put(field_offset, STACK_OBJECT(-1)); 1860 obj->release_obj_field_put(field_offset, STACK_OBJECT(-1));
1841 OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0); 1861 OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0);
1842 } else if (tos_type == btos) { 1862 } else if (tos_type == btos) {
1843 obj->release_byte_field_put(field_offset, STACK_INT(-1)); 1863 obj->release_byte_field_put(field_offset, STACK_INT(-1));
1844 } else if (tos_type == ltos) { 1864 } else if (tos_type == ltos) {
1855 OrderAccess::storeload(); 1875 OrderAccess::storeload();
1856 } else { 1876 } else {
1857 if (tos_type == itos) { 1877 if (tos_type == itos) {
1858 obj->int_field_put(field_offset, STACK_INT(-1)); 1878 obj->int_field_put(field_offset, STACK_INT(-1));
1859 } else if (tos_type == atos) { 1879 } else if (tos_type == atos) {
1880 VERIFY_OOP(STACK_OBJECT(-1));
1860 obj->obj_field_put(field_offset, STACK_OBJECT(-1)); 1881 obj->obj_field_put(field_offset, STACK_OBJECT(-1));
1861 OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0); 1882 OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0);
1862 } else if (tos_type == btos) { 1883 } else if (tos_type == btos) {
1863 obj->byte_field_put(field_offset, STACK_INT(-1)); 1884 obj->byte_field_put(field_offset, STACK_INT(-1));
1864 } else if (tos_type == ltos) { 1885 } else if (tos_type == ltos) {
1959 THREAD->set_vm_result(NULL); 1980 THREAD->set_vm_result(NULL);
1960 UPDATE_PC_AND_TOS_AND_CONTINUE(4, -(dims-1)); 1981 UPDATE_PC_AND_TOS_AND_CONTINUE(4, -(dims-1));
1961 } 1982 }
1962 CASE(_checkcast): 1983 CASE(_checkcast):
1963 if (STACK_OBJECT(-1) != NULL) { 1984 if (STACK_OBJECT(-1) != NULL) {
1985 VERIFY_OOP(STACK_OBJECT(-1));
1964 u2 index = Bytes::get_Java_u2(pc+1); 1986 u2 index = Bytes::get_Java_u2(pc+1);
1965 if (ProfileInterpreter) { 1987 if (ProfileInterpreter) {
1966 // needs Profile_checkcast QQQ 1988 // needs Profile_checkcast QQQ
1967 ShouldNotReachHere(); 1989 ShouldNotReachHere();
1968 } 1990 }
1997 2019
1998 CASE(_instanceof): 2020 CASE(_instanceof):
1999 if (STACK_OBJECT(-1) == NULL) { 2021 if (STACK_OBJECT(-1) == NULL) {
2000 SET_STACK_INT(0, -1); 2022 SET_STACK_INT(0, -1);
2001 } else { 2023 } else {
2024 VERIFY_OOP(STACK_OBJECT(-1));
2002 u2 index = Bytes::get_Java_u2(pc+1); 2025 u2 index = Bytes::get_Java_u2(pc+1);
2003 // Constant pool may have actual klass or unresolved klass. If it is 2026 // Constant pool may have actual klass or unresolved klass. If it is
2004 // unresolved we must resolve it 2027 // unresolved we must resolve it
2005 if (METHOD->constants()->tag_at(index).is_unresolved_klass()) { 2028 if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
2006 CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception); 2029 CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
2042 case JVM_CONSTANT_Float: 2065 case JVM_CONSTANT_Float:
2043 SET_STACK_FLOAT(constants->float_at(index), 0); 2066 SET_STACK_FLOAT(constants->float_at(index), 0);
2044 break; 2067 break;
2045 2068
2046 case JVM_CONSTANT_String: 2069 case JVM_CONSTANT_String:
2070 VERIFY_OOP(constants->resolved_string_at(index));
2047 SET_STACK_OBJECT(constants->resolved_string_at(index), 0); 2071 SET_STACK_OBJECT(constants->resolved_string_at(index), 0);
2048 break; 2072 break;
2049 2073
2050 case JVM_CONSTANT_Class: 2074 case JVM_CONSTANT_Class:
2075 VERIFY_OOP(constants->resolved_klass_at(index)->klass_part()->java_mirror());
2051 SET_STACK_OBJECT(constants->resolved_klass_at(index)->klass_part()->java_mirror(), 0); 2076 SET_STACK_OBJECT(constants->resolved_klass_at(index)->klass_part()->java_mirror(), 0);
2052 break; 2077 break;
2053 2078
2054 case JVM_CONSTANT_UnresolvedString: 2079 case JVM_CONSTANT_UnresolvedString:
2055 case JVM_CONSTANT_UnresolvedClass: 2080 case JVM_CONSTANT_UnresolvedClass:
2056 case JVM_CONSTANT_UnresolvedClassInError: 2081 case JVM_CONSTANT_UnresolvedClassInError:
2057 CALL_VM(InterpreterRuntime::ldc(THREAD, wide), handle_exception); 2082 CALL_VM(InterpreterRuntime::ldc(THREAD, wide), handle_exception);
2058 SET_STACK_OBJECT(THREAD->vm_result(), 0); 2083 SET_STACK_OBJECT(THREAD->vm_result(), 0);
2059 THREAD->set_vm_result(NULL); 2084 THREAD->set_vm_result(NULL);
2060 break; 2085 break;
2061
2062 #if 0
2063 CASE(_fast_igetfield):
2064 CASE(_fastagetfield):
2065 CASE(_fast_aload_0):
2066 CASE(_fast_iaccess_0):
2067 CASE(__fast_aaccess_0):
2068 CASE(_fast_linearswitch):
2069 CASE(_fast_binaryswitch):
2070 fatal("unsupported fast bytecode");
2071 #endif
2072 2086
2073 default: ShouldNotReachHere(); 2087 default: ShouldNotReachHere();
2074 } 2088 }
2075 UPDATE_PC_AND_TOS_AND_CONTINUE(incr, 1); 2089 UPDATE_PC_AND_TOS_AND_CONTINUE(incr, 1);
2076 } 2090 }
2120 callee = (methodOop) cache->f2(); 2134 callee = (methodOop) cache->f2();
2121 } else { 2135 } else {
2122 // get receiver 2136 // get receiver
2123 int parms = cache->parameter_size(); 2137 int parms = cache->parameter_size();
2124 // Same comments as invokevirtual apply here 2138 // Same comments as invokevirtual apply here
2139 VERIFY_OOP(STACK_OBJECT(-parms));
2125 instanceKlass* rcvrKlass = (instanceKlass*) 2140 instanceKlass* rcvrKlass = (instanceKlass*)
2126 STACK_OBJECT(-parms)->klass()->klass_part(); 2141 STACK_OBJECT(-parms)->klass()->klass_part();
2127 callee = (methodOop) rcvrKlass->start_of_vtable()[ cache->f2()]; 2142 callee = (methodOop) rcvrKlass->start_of_vtable()[ cache->f2()];
2128 } 2143 }
2129 istate->set_callee(callee); 2144 istate->set_callee(callee);
2203 // methodOop callee = rcvr->klass()->klass_part()->vtable()->method_at(cache->f2()); 2218 // methodOop callee = rcvr->klass()->klass_part()->vtable()->method_at(cache->f2());
2204 // 2219 //
2205 // this fails with an assert 2220 // this fails with an assert
2206 // instanceKlass* rcvrKlass = instanceKlass::cast(STACK_OBJECT(-parms)->klass()); 2221 // instanceKlass* rcvrKlass = instanceKlass::cast(STACK_OBJECT(-parms)->klass());
2207 // but this works 2222 // but this works
2223 VERIFY_OOP(STACK_OBJECT(-parms));
2208 instanceKlass* rcvrKlass = (instanceKlass*) STACK_OBJECT(-parms)->klass()->klass_part(); 2224 instanceKlass* rcvrKlass = (instanceKlass*) STACK_OBJECT(-parms)->klass()->klass_part();
2209 /* 2225 /*
2210 Executing this code in java.lang.String: 2226 Executing this code in java.lang.String:
2211 public String(char value[]) { 2227 public String(char value[]) {
2212 this.count = value.length; 2228 this.count = value.length;
2649 // 2665 //
2650 THREAD->popframe_preserve_args(in_ByteSize(METHOD->size_of_parameters() * wordSize), 2666 THREAD->popframe_preserve_args(in_ByteSize(METHOD->size_of_parameters() * wordSize),
2651 LOCALS_SLOT(METHOD->size_of_parameters() - 1)); 2667 LOCALS_SLOT(METHOD->size_of_parameters() - 1));
2652 THREAD->set_popframe_condition_bit(JavaThread::popframe_force_deopt_reexecution_bit); 2668 THREAD->set_popframe_condition_bit(JavaThread::popframe_force_deopt_reexecution_bit);
2653 } 2669 }
2654 UPDATE_PC_AND_RETURN(1); 2670 THREAD->clr_pop_frame_in_process();
2655 } else {
2656 // Normal return
2657 // Advance the pc and return to frame manager
2658 istate->set_msg(return_from_method);
2659 istate->set_return_kind((Bytecodes::Code)opcode);
2660 UPDATE_PC_AND_RETURN(1);
2661 } 2671 }
2672
2673 // Normal return
2674 // Advance the pc and return to frame manager
2675 istate->set_msg(return_from_method);
2676 istate->set_return_kind((Bytecodes::Code)opcode);
2677 UPDATE_PC_AND_RETURN(1);
2662 } /* handle_return: */ 2678 } /* handle_return: */
2663 2679
2664 // This is really a fatal error return 2680 // This is really a fatal error return
2665 2681
2666 finish: 2682 finish:

mercurial