< prev index next >

src/hotspot/cpu/zero/cppInterpreter_zero.cpp

Print this page




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


< prev index next >