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);