< prev index next >

src/hotspot/share/interpreter/bytecodeInterpreter.cpp

Print this page
rev 49011 : 8197405: Improve messages of AbstractMethodErrors and IncompatibleClassChangeErrors.
Reviewed-by: coleenp, dholmes


2574             }
2575           }
2576           // Check that the entry is non-null.  A null entry means
2577           // that the receiver class doesn't implement the
2578           // interface, and wasn't the same as when the caller was
2579           // compiled.
2580           if (scan->interface_klass() == NULL) {
2581             VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap);
2582           }
2583         }
2584 
2585         itableOffsetEntry* ki = (itableOffsetEntry*) int2->start_of_itable();
2586         int i;
2587         for ( i = 0 ; i < int2->itable_length() ; i++, ki++ ) {
2588           if (ki->interface_klass() == iclass) break;
2589         }
2590         // If the interface isn't found, this class doesn't implement this
2591         // interface.  The link resolver checks this but only for the first
2592         // time this interface is called.
2593         if (i == int2->itable_length()) {
2594           VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap);

2595         }
2596         int mindex = interface_method->itable_index();
2597 
2598         itableMethodEntry* im = ki->first_method_entry(rcvr->klass());
2599         callee = im[mindex].method();
2600         if (callee == NULL) {
2601           VM_JAVA_ERROR(vmSymbols::java_lang_AbstractMethodError(), "", note_no_trap);

2602         }
2603 
2604         // Profile virtual call.
2605         BI_PROFILE_UPDATE_VIRTUALCALL(rcvr->klass());
2606 
2607         istate->set_callee(callee);
2608         istate->set_callee_entry_point(callee->from_interpreted_entry());
2609 #ifdef VM_JVMTI
2610         if (JvmtiExport::can_post_interpreter_events() && THREAD->is_interp_only_mode()) {
2611           istate->set_callee_entry_point(callee->interpreter_entry());
2612         }
2613 #endif /* VM_JVMTI */
2614         istate->set_bcp_advance(5);
2615         UPDATE_PC_AND_RETURN(0); // I'll be back...
2616       }
2617 
2618       CASE(_invokevirtual):
2619       CASE(_invokespecial):
2620       CASE(_invokestatic): {
2621         u2 index = Bytes::get_native_u2(pc+1);




2574             }
2575           }
2576           // Check that the entry is non-null.  A null entry means
2577           // that the receiver class doesn't implement the
2578           // interface, and wasn't the same as when the caller was
2579           // compiled.
2580           if (scan->interface_klass() == NULL) {
2581             VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap);
2582           }
2583         }
2584 
2585         itableOffsetEntry* ki = (itableOffsetEntry*) int2->start_of_itable();
2586         int i;
2587         for ( i = 0 ; i < int2->itable_length() ; i++, ki++ ) {
2588           if (ki->interface_klass() == iclass) break;
2589         }
2590         // If the interface isn't found, this class doesn't implement this
2591         // interface. The link resolver checks this but only for the first
2592         // time this interface is called.
2593         if (i == int2->itable_length()) {
2594           CALL_VM(InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose(THREAD, rcvr->klass(), iclass),
2595                   handle_exception);
2596         }
2597         int mindex = interface_method->itable_index();
2598 
2599         itableMethodEntry* im = ki->first_method_entry(rcvr->klass());
2600         callee = im[mindex].method();
2601         if (callee == NULL) {
2602           CALL_VM(InterpreterRuntime::throw_AbstractMethodErrorVerbose(THREAD, rcvr->klass(), interface_method),
2603                   handle_exception);
2604         }
2605 
2606         // Profile virtual call.
2607         BI_PROFILE_UPDATE_VIRTUALCALL(rcvr->klass());
2608 
2609         istate->set_callee(callee);
2610         istate->set_callee_entry_point(callee->from_interpreted_entry());
2611 #ifdef VM_JVMTI
2612         if (JvmtiExport::can_post_interpreter_events() && THREAD->is_interp_only_mode()) {
2613           istate->set_callee_entry_point(callee->interpreter_entry());
2614         }
2615 #endif /* VM_JVMTI */
2616         istate->set_bcp_advance(5);
2617         UPDATE_PC_AND_RETURN(0); // I'll be back...
2618       }
2619 
2620       CASE(_invokevirtual):
2621       CASE(_invokespecial):
2622       CASE(_invokestatic): {
2623         u2 index = Bytes::get_native_u2(pc+1);


< prev index next >