Merge
authornever
Tue, 05 Jan 2010 11:16:09 -0800
changeset 4569 f372ea9e5ed4
parent 4567 7fc02fbe5c7a (current diff)
parent 4568 d18b14983811 (diff)
child 4570 43d30f43697e
child 4571 80b553bddc26
Merge
--- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp	Tue Jan 05 15:21:25 2010 +0100
+++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp	Tue Jan 05 11:16:09 2010 -0800
@@ -245,7 +245,7 @@
     if (handlerAddr == NULL) {
       CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
       if (HAS_PENDING_EXCEPTION)
-        goto unwind_and_return;
+        goto unlock_unwind_and_return;
 
       handlerAddr = method->signature_handler();
       assert(handlerAddr != NULL, "eh?");
@@ -254,7 +254,7 @@
       CALL_VM_NOCHECK(handlerAddr =
         InterpreterRuntime::slow_signature_handler(thread, method, NULL,NULL));
       if (HAS_PENDING_EXCEPTION)
-        goto unwind_and_return;
+        goto unlock_unwind_and_return;
     }
     handler = \
       InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr);
@@ -365,10 +365,10 @@
   // Reset handle block
   thread->active_handles()->clear();
 
-  // Unlock if necessary.  It seems totally wrong that this
-  // is skipped in the event of an exception but apparently
-  // the template interpreter does this so we do too.
-  if (monitor && !HAS_PENDING_EXCEPTION) {
+ unlock_unwind_and_return:
+
+  // Unlock if necessary
+  if (monitor) {
     BasicLock *lock = monitor->lock();
     markOop header = lock->displaced_header();
     oop rcvr = monitor->obj();