Mercurial > hg > shark > hotspot
changeset 2426:3d492ac71a4e
Add missing error handling to CppInterpreter::method_handle_entry
author | Gary Benson <gbenson@redhat.com> |
---|---|
date | Fri, 25 Mar 2011 10:42:06 +0000 |
parents | aba11a471177 |
children | 81efdafed48e |
files | src/cpu/zero/vm/cppInterpreter_zero.cpp |
diffstat | 1 files changed, 17 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Mar 25 10:33:22 2011 +0000 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Mar 25 10:42:06 2011 +0000 @@ -661,7 +661,7 @@ // NB all oops trashed! assert(HAS_PENDING_EXCEPTION, "should do"); stack->set_sp(unwind_sp); - return 0; // No deoptimized frames on the stack + return 0; } assert(method->intrinsic_id() == vmIntrinsics::_invokeGeneric, "should be"); @@ -670,13 +670,27 @@ // "genericInvoker") is really really odd. I'm hoping it's trying // to accomodate odd VM/class library combinations I can ignore. oop adapter = java_lang_invoke_MethodTypeForm::genericInvoker(form); - // XXX null check? + if (adapter == NULL) { + CALL_VM_NOCHECK_NOFIX( + InterpreterRuntime::throw_WrongMethodTypeException( + thread, method_type, mhtype)); + // NB all oops trashed! + assert(HAS_PENDING_EXCEPTION, "should do"); + stack->set_sp(unwind_sp); + return 0; + } // Adapters are shared among form-families of method-type. The // type being called is passed as a trusted first argument so that // the adapter knows the actual types of its arguments and return // values. - insert_vmslots(num_vmslots + 1, 1, CHECK_0); // XXX unwind! + insert_vmslots(num_vmslots + 1, 1, THREAD); + if (HAS_PENDING_EXCEPTION) { + // NB all oops trashed! + stack->set_sp(unwind_sp); + return 0; + } + vmslots = stack->sp(); num_vmslots++; SET_VMSLOTS_OBJECT(method_type, num_vmslots);