Tue, 05 Jan 2010 11:16:09 -0800
Merge
1.1 --- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Tue Jan 05 15:21:25 2010 +0100 1.2 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Tue Jan 05 11:16:09 2010 -0800 1.3 @@ -245,7 +245,7 @@ 1.4 if (handlerAddr == NULL) { 1.5 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method)); 1.6 if (HAS_PENDING_EXCEPTION) 1.7 - goto unwind_and_return; 1.8 + goto unlock_unwind_and_return; 1.9 1.10 handlerAddr = method->signature_handler(); 1.11 assert(handlerAddr != NULL, "eh?"); 1.12 @@ -254,7 +254,7 @@ 1.13 CALL_VM_NOCHECK(handlerAddr = 1.14 InterpreterRuntime::slow_signature_handler(thread, method, NULL,NULL)); 1.15 if (HAS_PENDING_EXCEPTION) 1.16 - goto unwind_and_return; 1.17 + goto unlock_unwind_and_return; 1.18 } 1.19 handler = \ 1.20 InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr); 1.21 @@ -365,10 +365,10 @@ 1.22 // Reset handle block 1.23 thread->active_handles()->clear(); 1.24 1.25 - // Unlock if necessary. It seems totally wrong that this 1.26 - // is skipped in the event of an exception but apparently 1.27 - // the template interpreter does this so we do too. 1.28 - if (monitor && !HAS_PENDING_EXCEPTION) { 1.29 + unlock_unwind_and_return: 1.30 + 1.31 + // Unlock if necessary 1.32 + if (monitor) { 1.33 BasicLock *lock = monitor->lock(); 1.34 markOop header = lock->displaced_header(); 1.35 oop rcvr = monitor->obj();