259 }
260 InvocationCounter *counter = mcs->invocation_counter();
261 counter->increment();
262 if (counter->reached_InvocationLimit(mcs->backedge_counter())) {
263 CALL_VM_NOCHECK(
264 InterpreterRuntime::frequency_counter_overflow(thread, NULL));
265 if (HAS_PENDING_EXCEPTION)
266 goto unwind_and_return;
267 }
268 }
269
270 // Lock if necessary
271 BasicObjectLock *monitor;
272 monitor = NULL;
273 if (method->is_synchronized()) {
274 monitor = (BasicObjectLock*) istate->stack_base();
275 oop lockee = monitor->obj();
276 markOop disp = lockee->mark()->set_unlocked();
277
278 monitor->lock()->set_displaced_header(disp);
279 if (Atomic::cmpxchg_ptr(monitor, lockee->mark_addr(), disp) != disp) {
280 if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
281 monitor->lock()->set_displaced_header(NULL);
282 }
283 else {
284 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
285 if (HAS_PENDING_EXCEPTION)
286 goto unwind_and_return;
287 }
288 }
289 }
290
291 // Get the signature handler
292 InterpreterRuntime::SignatureHandler *handler; {
293 address handlerAddr = method->signature_handler();
294 if (handlerAddr == NULL) {
295 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
296 if (HAS_PENDING_EXCEPTION)
297 goto unlock_unwind_and_return;
298
299 handlerAddr = method->signature_handler();
403 istate->set_oop_temp(NULL);
404 } else {
405 jobject handle = reinterpret_cast<jobject>(result[0]);
406 istate->set_oop_temp(JNIHandles::resolve(handle));
407 }
408 }
409
410 // Reset handle block
411 thread->active_handles()->clear();
412
413 unlock_unwind_and_return:
414
415 // Unlock if necessary
416 if (monitor) {
417 BasicLock *lock = monitor->lock();
418 markOop header = lock->displaced_header();
419 oop rcvr = monitor->obj();
420 monitor->set_obj(NULL);
421
422 if (header != NULL) {
423 if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), lock) != lock) {
424 monitor->set_obj(rcvr); {
425 HandleMark hm(thread);
426 CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
427 }
428 }
429 }
430 }
431
432 unwind_and_return:
433
434 // Unwind the current activation
435 thread->pop_zero_frame();
436
437 // Pop our parameters
438 stack->set_sp(stack->sp() + method->size_of_parameters());
439
440 // Push our result
441 if (!HAS_PENDING_EXCEPTION) {
442 BasicType type = method->result_type();
443 stack->set_sp(stack->sp() - type2size[type]);
|
259 }
260 InvocationCounter *counter = mcs->invocation_counter();
261 counter->increment();
262 if (counter->reached_InvocationLimit(mcs->backedge_counter())) {
263 CALL_VM_NOCHECK(
264 InterpreterRuntime::frequency_counter_overflow(thread, NULL));
265 if (HAS_PENDING_EXCEPTION)
266 goto unwind_and_return;
267 }
268 }
269
270 // Lock if necessary
271 BasicObjectLock *monitor;
272 monitor = NULL;
273 if (method->is_synchronized()) {
274 monitor = (BasicObjectLock*) istate->stack_base();
275 oop lockee = monitor->obj();
276 markOop disp = lockee->mark()->set_unlocked();
277
278 monitor->lock()->set_displaced_header(disp);
279 if (Atomic::cmpxchg((markOop)monitor, lockee->mark_addr(), disp) != disp) {
280 if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
281 monitor->lock()->set_displaced_header(NULL);
282 }
283 else {
284 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
285 if (HAS_PENDING_EXCEPTION)
286 goto unwind_and_return;
287 }
288 }
289 }
290
291 // Get the signature handler
292 InterpreterRuntime::SignatureHandler *handler; {
293 address handlerAddr = method->signature_handler();
294 if (handlerAddr == NULL) {
295 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
296 if (HAS_PENDING_EXCEPTION)
297 goto unlock_unwind_and_return;
298
299 handlerAddr = method->signature_handler();
403 istate->set_oop_temp(NULL);
404 } else {
405 jobject handle = reinterpret_cast<jobject>(result[0]);
406 istate->set_oop_temp(JNIHandles::resolve(handle));
407 }
408 }
409
410 // Reset handle block
411 thread->active_handles()->clear();
412
413 unlock_unwind_and_return:
414
415 // Unlock if necessary
416 if (monitor) {
417 BasicLock *lock = monitor->lock();
418 markOop header = lock->displaced_header();
419 oop rcvr = monitor->obj();
420 monitor->set_obj(NULL);
421
422 if (header != NULL) {
423 if (Atomic::cmpxchg(header, rcvr->mark_addr(), (markOop)lock) != lock) {
424 monitor->set_obj(rcvr); {
425 HandleMark hm(thread);
426 CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
427 }
428 }
429 }
430 }
431
432 unwind_and_return:
433
434 // Unwind the current activation
435 thread->pop_zero_frame();
436
437 // Pop our parameters
438 stack->set_sp(stack->sp() + method->size_of_parameters());
439
440 // Push our result
441 if (!HAS_PENDING_EXCEPTION) {
442 BasicType type = method->result_type();
443 stack->set_sp(stack->sp() - type2size[type]);
|