779 } |
787 } |
780 StackValueCollection *locals = _jvf->locals(); |
788 StackValueCollection *locals = _jvf->locals(); |
781 HandleMark hm; |
789 HandleMark hm; |
782 |
790 |
783 switch (_type) { |
791 switch (_type) { |
784 case T_INT: locals->set_int_at (_index, _value.i); break; |
792 case T_INT: locals->set_int_at (_index, _value.i); break; |
785 case T_LONG: locals->set_long_at (_index, _value.j); break; |
793 case T_LONG: locals->set_long_at (_index, _value.j); break; |
786 case T_FLOAT: locals->set_float_at (_index, _value.f); break; |
794 case T_FLOAT: locals->set_float_at (_index, _value.f); break; |
787 case T_DOUBLE: locals->set_double_at(_index, _value.d); break; |
795 case T_DOUBLE: locals->set_double_at(_index, _value.d); break; |
788 case T_OBJECT: { |
796 case T_OBJECT: { |
789 Handle ob_h(JNIHandles::resolve_external_guard(_value.l)); |
797 Handle ob_h(JNIHandles::resolve_external_guard(_value.l)); |
790 locals->set_obj_at (_index, ob_h); |
798 locals->set_obj_at (_index, ob_h); |
791 break; |
799 break; |
792 } |
800 } |
793 default: ShouldNotReachHere(); |
801 default: ShouldNotReachHere(); |
794 } |
802 } |
795 _jvf->set_locals(locals); |
803 _jvf->set_locals(locals); |
796 } else { |
804 } else { |
797 StackValueCollection *locals = _jvf->locals(); |
805 if (_jvf->method()->is_native() && _jvf->is_compiled_frame()) { |
798 |
806 assert(getting_receiver(), "Can only get here when getting receiver"); |
799 if (locals->at(_index)->type() == T_CONFLICT) { |
807 oop receiver = _jvf->fr().get_native_receiver(); |
800 memset(&_value, 0, sizeof(_value)); |
808 _value.l = JNIHandles::make_local(_calling_thread, receiver); |
801 _value.l = NULL; |
809 } else { |
802 return; |
810 StackValueCollection *locals = _jvf->locals(); |
803 } |
811 |
804 |
812 if (locals->at(_index)->type() == T_CONFLICT) { |
805 switch (_type) { |
813 memset(&_value, 0, sizeof(_value)); |
806 case T_INT: _value.i = locals->int_at (_index); break; |
814 _value.l = NULL; |
807 case T_LONG: _value.j = locals->long_at (_index); break; |
815 return; |
808 case T_FLOAT: _value.f = locals->float_at (_index); break; |
816 } |
809 case T_DOUBLE: _value.d = locals->double_at(_index); break; |
817 |
810 case T_OBJECT: { |
818 switch (_type) { |
811 // Wrap the oop to be returned in a local JNI handle since |
819 case T_INT: _value.i = locals->int_at (_index); break; |
812 // oops_do() no longer applies after doit() is finished. |
820 case T_LONG: _value.j = locals->long_at (_index); break; |
813 oop obj = locals->obj_at(_index)(); |
821 case T_FLOAT: _value.f = locals->float_at (_index); break; |
814 _value.l = JNIHandles::make_local(_calling_thread, obj); |
822 case T_DOUBLE: _value.d = locals->double_at(_index); break; |
815 break; |
823 case T_OBJECT: { |
816 } |
824 // Wrap the oop to be returned in a local JNI handle since |
817 default: ShouldNotReachHere(); |
825 // oops_do() no longer applies after doit() is finished. |
|
826 oop obj = locals->obj_at(_index)(); |
|
827 _value.l = JNIHandles::make_local(_calling_thread, obj); |
|
828 break; |
|
829 } |
|
830 default: ShouldNotReachHere(); |
|
831 } |
818 } |
832 } |
819 } |
833 } |
820 } |
834 } |
821 |
835 |
822 |
836 |
823 bool VM_GetOrSetLocal::allow_nested_vm_operations() const { |
837 bool VM_GetOrSetLocal::allow_nested_vm_operations() const { |
824 return true; // May need to deoptimize |
838 return true; // May need to deoptimize |
825 } |
839 } |
826 |
840 |
|
841 |
|
842 VM_GetReceiver::VM_GetReceiver( |
|
843 JavaThread* thread, JavaThread* caller_thread, jint depth) |
|
844 : VM_GetOrSetLocal(thread, caller_thread, depth, 0) {} |
827 |
845 |
828 ///////////////////////////////////////////////////////////////////////////////////////// |
846 ///////////////////////////////////////////////////////////////////////////////////////// |
829 |
847 |
830 // |
848 // |
831 // class JvmtiSuspendControl - see comments in jvmtiImpl.hpp |
849 // class JvmtiSuspendControl - see comments in jvmtiImpl.hpp |