329
330 // Lock if necessary
331 BasicObjectLock *monitor;
332 monitor = nullptr;
333 if (method->is_synchronized()) {
334 monitor = (BasicObjectLock*) istate->stack_base();
335 oop lockee = monitor->obj();
336 bool success = false;
337 if (LockingMode == LM_LEGACY) {
338 markWord disp = lockee->mark().set_unlocked();
339 monitor->lock()->set_displaced_header(disp);
340 success = true;
341 if (lockee->cas_set_mark(markWord::from_pointer(monitor), disp) != disp) {
342 // Is it simple recursive case?
343 if (thread->is_lock_owned((address) disp.clear_lock_bits().to_pointer())) {
344 monitor->lock()->set_displaced_header(markWord::from_pointer(nullptr));
345 } else {
346 success = false;
347 }
348 }
349 if (success) {
350 THREAD->inc_held_monitor_count();
351 }
352 }
353 if (!success) {
354 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
355 if (HAS_PENDING_EXCEPTION)
356 goto unwind_and_return;
357 }
358 }
359
360 // Get the signature handler
361 InterpreterRuntime::SignatureHandler *handler; {
362 address handlerAddr = method->signature_handler();
363 if (handlerAddr == nullptr) {
364 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
365 if (HAS_PENDING_EXCEPTION)
366 goto unlock_unwind_and_return;
367
368 handlerAddr = method->signature_handler();
369 assert(handlerAddr != nullptr, "eh?");
370 }
371 if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {
482 thread->active_handles()->clear();
483
484 unlock_unwind_and_return:
485
486 // Unlock if necessary
487 if (monitor) {
488 bool success = false;
489 if (LockingMode == LM_LEGACY) {
490 BasicLock* lock = monitor->lock();
491 oop rcvr = monitor->obj();
492 monitor->set_obj(nullptr);
493 success = true;
494 markWord header = lock->displaced_header();
495 if (header.to_pointer() != nullptr) { // Check for recursive lock
496 markWord old_header = markWord::encode(lock);
497 if (rcvr->cas_set_mark(header, old_header) != old_header) {
498 monitor->set_obj(rcvr);
499 success = false;
500 }
501 }
502 if (success) {
503 THREAD->dec_held_monitor_count();
504 }
505 }
506 if (!success) {
507 InterpreterRuntime::monitorexit(monitor);
508 }
509 }
510
511 unwind_and_return:
512
513 // Unwind the current activation
514 thread->pop_zero_frame();
515
516 // Pop our parameters
517 stack->set_sp(stack->sp() + method->size_of_parameters());
518
519 // Push our result
520 if (!HAS_PENDING_EXCEPTION) {
521 BasicType type = method->result_type();
522 stack->set_sp(stack->sp() - type2size[type]);
523
524 switch (type) {
|
329
330 // Lock if necessary
331 BasicObjectLock *monitor;
332 monitor = nullptr;
333 if (method->is_synchronized()) {
334 monitor = (BasicObjectLock*) istate->stack_base();
335 oop lockee = monitor->obj();
336 bool success = false;
337 if (LockingMode == LM_LEGACY) {
338 markWord disp = lockee->mark().set_unlocked();
339 monitor->lock()->set_displaced_header(disp);
340 success = true;
341 if (lockee->cas_set_mark(markWord::from_pointer(monitor), disp) != disp) {
342 // Is it simple recursive case?
343 if (thread->is_lock_owned((address) disp.clear_lock_bits().to_pointer())) {
344 monitor->lock()->set_displaced_header(markWord::from_pointer(nullptr));
345 } else {
346 success = false;
347 }
348 }
349 }
350 if (!success) {
351 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
352 if (HAS_PENDING_EXCEPTION)
353 goto unwind_and_return;
354 }
355 }
356
357 // Get the signature handler
358 InterpreterRuntime::SignatureHandler *handler; {
359 address handlerAddr = method->signature_handler();
360 if (handlerAddr == nullptr) {
361 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
362 if (HAS_PENDING_EXCEPTION)
363 goto unlock_unwind_and_return;
364
365 handlerAddr = method->signature_handler();
366 assert(handlerAddr != nullptr, "eh?");
367 }
368 if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {
479 thread->active_handles()->clear();
480
481 unlock_unwind_and_return:
482
483 // Unlock if necessary
484 if (monitor) {
485 bool success = false;
486 if (LockingMode == LM_LEGACY) {
487 BasicLock* lock = monitor->lock();
488 oop rcvr = monitor->obj();
489 monitor->set_obj(nullptr);
490 success = true;
491 markWord header = lock->displaced_header();
492 if (header.to_pointer() != nullptr) { // Check for recursive lock
493 markWord old_header = markWord::encode(lock);
494 if (rcvr->cas_set_mark(header, old_header) != old_header) {
495 monitor->set_obj(rcvr);
496 success = false;
497 }
498 }
499 }
500 if (!success) {
501 InterpreterRuntime::monitorexit(monitor);
502 }
503 }
504
505 unwind_and_return:
506
507 // Unwind the current activation
508 thread->pop_zero_frame();
509
510 // Pop our parameters
511 stack->set_sp(stack->sp() + method->size_of_parameters());
512
513 // Push our result
514 if (!HAS_PENDING_EXCEPTION) {
515 BasicType type = method->result_type();
516 stack->set_sp(stack->sp() - type2size[type]);
517
518 switch (type) {
|