< prev index next >

src/hotspot/cpu/zero/cppInterpreter_zero.cpp

Print this page




 256       CALL_VM_NOCHECK(mcs = InterpreterRuntime::build_method_counters(thread, method));
 257       if (HAS_PENDING_EXCEPTION)
 258         goto unwind_and_return;
 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     markWord disp = lockee->mark()->set_unlocked();
 277 
 278     monitor->lock()->set_displaced_header(disp);
 279     if (lockee->cas_set_mark((markWord)monitor, 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();
 300       assert(handlerAddr != NULL, "eh?");
 301     }


 400     if (result[0] == 0) {
 401       istate->set_oop_temp(NULL);
 402     } else {
 403       jobject handle = reinterpret_cast<jobject>(result[0]);
 404       istate->set_oop_temp(JNIHandles::resolve(handle));
 405     }
 406   }
 407 
 408   // Reset handle block
 409   thread->active_handles()->clear();
 410 
 411  unlock_unwind_and_return:
 412 
 413   // Unlock if necessary
 414   if (monitor) {
 415     BasicLock *lock = monitor->lock();
 416     markWord header = lock->displaced_header();
 417     oop rcvr = monitor->obj();
 418     monitor->set_obj(NULL);
 419 
 420     if (header != NULL) {
 421       markWord old_header = markWord::encode(lock);
 422       if (rcvr->cas_set_mark(header, old_header) != old_header) {
 423         monitor->set_obj(rcvr); {
 424           HandleMark hm(thread);
 425           CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
 426         }
 427       }
 428     }
 429   }
 430 
 431  unwind_and_return:
 432 
 433   // Unwind the current activation
 434   thread->pop_zero_frame();
 435 
 436   // Pop our parameters
 437   stack->set_sp(stack->sp() + method->size_of_parameters());
 438 
 439   // Push our result
 440   if (!HAS_PENDING_EXCEPTION) {




 256       CALL_VM_NOCHECK(mcs = InterpreterRuntime::build_method_counters(thread, method));
 257       if (HAS_PENDING_EXCEPTION)
 258         goto unwind_and_return;
 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     markWord disp = lockee->mark().set_unlocked();
 277 
 278     monitor->lock()->set_displaced_header(disp);
 279     if (lockee->cas_set_mark(markWord::from_pointer(monitor), disp) != disp) {
 280       if (thread->is_lock_owned((address) disp.clear_lock_bits().to_pointer())) {
 281         monitor->lock()->set_displaced_header(markWord::from_pointer(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();
 300       assert(handlerAddr != NULL, "eh?");
 301     }


 400     if (result[0] == 0) {
 401       istate->set_oop_temp(NULL);
 402     } else {
 403       jobject handle = reinterpret_cast<jobject>(result[0]);
 404       istate->set_oop_temp(JNIHandles::resolve(handle));
 405     }
 406   }
 407 
 408   // Reset handle block
 409   thread->active_handles()->clear();
 410 
 411  unlock_unwind_and_return:
 412 
 413   // Unlock if necessary
 414   if (monitor) {
 415     BasicLock *lock = monitor->lock();
 416     markWord header = lock->displaced_header();
 417     oop rcvr = monitor->obj();
 418     monitor->set_obj(NULL);
 419 
 420     if (header.to_pointer() != NULL) {
 421       markWord old_header = markWord::encode(lock);
 422       if (rcvr->cas_set_mark(header, old_header) != old_header) {
 423         monitor->set_obj(rcvr); {
 424           HandleMark hm(thread);
 425           CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
 426         }
 427       }
 428     }
 429   }
 430 
 431  unwind_and_return:
 432 
 433   // Unwind the current activation
 434   thread->pop_zero_frame();
 435 
 436   // Pop our parameters
 437   stack->set_sp(stack->sp() + method->size_of_parameters());
 438 
 439   // Push our result
 440   if (!HAS_PENDING_EXCEPTION) {


< prev index next >