258 }
259 InvocationCounter *counter = mcs->invocation_counter();
260 counter->increment();
261 if (counter->reached_InvocationLimit(mcs->backedge_counter())) {
262 CALL_VM_NOCHECK(
263 InterpreterRuntime::frequency_counter_overflow(thread, NULL));
264 if (HAS_PENDING_EXCEPTION)
265 goto unwind_and_return;
266 }
267 }
268
269 // Lock if necessary
270 BasicObjectLock *monitor;
271 monitor = NULL;
272 if (method->is_synchronized()) {
273 monitor = (BasicObjectLock*) istate->stack_base();
274 oop lockee = monitor->obj();
275 markOop disp = lockee->mark()->set_unlocked();
276
277 monitor->lock()->set_displaced_header(disp);
278 if (Atomic::cmpxchg((markOop)monitor, lockee->mark_addr(), disp) != disp) {
279 if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
280 monitor->lock()->set_displaced_header(NULL);
281 }
282 else {
283 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
284 if (HAS_PENDING_EXCEPTION)
285 goto unwind_and_return;
286 }
287 }
288 }
289
290 // Get the signature handler
291 InterpreterRuntime::SignatureHandler *handler; {
292 address handlerAddr = method->signature_handler();
293 if (handlerAddr == NULL) {
294 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
295 if (HAS_PENDING_EXCEPTION)
296 goto unlock_unwind_and_return;
297
298 handlerAddr = method->signature_handler();
|
258 }
259 InvocationCounter *counter = mcs->invocation_counter();
260 counter->increment();
261 if (counter->reached_InvocationLimit(mcs->backedge_counter())) {
262 CALL_VM_NOCHECK(
263 InterpreterRuntime::frequency_counter_overflow(thread, NULL));
264 if (HAS_PENDING_EXCEPTION)
265 goto unwind_and_return;
266 }
267 }
268
269 // Lock if necessary
270 BasicObjectLock *monitor;
271 monitor = NULL;
272 if (method->is_synchronized()) {
273 monitor = (BasicObjectLock*) istate->stack_base();
274 oop lockee = monitor->obj();
275 markOop disp = lockee->mark()->set_unlocked();
276
277 monitor->lock()->set_displaced_header(disp);
278 if (lockee->cas_set_mark((markOop)monitor, disp) != disp) {
279 if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
280 monitor->lock()->set_displaced_header(NULL);
281 }
282 else {
283 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
284 if (HAS_PENDING_EXCEPTION)
285 goto unwind_and_return;
286 }
287 }
288 }
289
290 // Get the signature handler
291 InterpreterRuntime::SignatureHandler *handler; {
292 address handlerAddr = method->signature_handler();
293 if (handlerAddr == NULL) {
294 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
295 if (HAS_PENDING_EXCEPTION)
296 goto unlock_unwind_and_return;
297
298 handlerAddr = method->signature_handler();
|