677 // When using fast locking, the compiled code has already tried the fast case |
677 // When using fast locking, the compiled code has already tried the fast case |
678 ObjectSynchronizer::slow_exit(obj, lock->lock(), THREAD); |
678 ObjectSynchronizer::slow_exit(obj, lock->lock(), THREAD); |
679 } else { |
679 } else { |
680 ObjectSynchronizer::fast_exit(obj, lock->lock(), THREAD); |
680 ObjectSynchronizer::fast_exit(obj, lock->lock(), THREAD); |
681 } |
681 } |
|
682 JRT_END |
|
683 |
|
684 // Cf. OptoRuntime::deoptimize_caller_frame |
|
685 JRT_ENTRY(void, Runtime1::deoptimize(JavaThread* thread)) |
|
686 // Called from within the owner thread, so no need for safepoint |
|
687 RegisterMap reg_map(thread, false); |
|
688 frame stub_frame = thread->last_frame(); |
|
689 assert(stub_frame.is_runtime_frame(), "sanity check"); |
|
690 frame caller_frame = stub_frame.sender(®_map); |
|
691 |
|
692 // We are coming from a compiled method; check this is true. |
|
693 assert(CodeCache::find_nmethod(caller_frame.pc()) != NULL, "sanity"); |
|
694 |
|
695 // Deoptimize the caller frame. |
|
696 Deoptimization::deoptimize_frame(thread, caller_frame.id()); |
|
697 |
|
698 // Return to the now deoptimized frame. |
682 JRT_END |
699 JRT_END |
683 |
700 |
684 |
701 |
685 static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) { |
702 static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) { |
686 Bytecode_field field_access(caller, bci); |
703 Bytecode_field field_access(caller, bci); |