Mercurial > hg > truffle
comparison src/share/vm/prims/jvmtiImpl.cpp @ 2019:09b4dd4f152b
7004582: Add GetThisObject() function to JVMTI 1.2
Summary: Add 'GetThisObject' function
Reviewed-by: never, coleenp
author | kamg |
---|---|
date | Thu, 09 Dec 2010 15:04:26 -0500 |
parents | f95d63e2154a |
children | 7246a374a9f2 |
comparison
equal
deleted
inserted
replaced
2018:642e54d1850a | 2019:09b4dd4f152b |
---|---|
584 , _jvf(NULL) | 584 , _jvf(NULL) |
585 , _result(JVMTI_ERROR_NONE) | 585 , _result(JVMTI_ERROR_NONE) |
586 { | 586 { |
587 } | 587 } |
588 | 588 |
589 | |
590 vframe *VM_GetOrSetLocal::get_vframe() { | 589 vframe *VM_GetOrSetLocal::get_vframe() { |
591 if (!_thread->has_last_Java_frame()) { | 590 if (!_thread->has_last_Java_frame()) { |
592 return NULL; | 591 return NULL; |
593 } | 592 } |
594 RegisterMap reg_map(_thread); | 593 RegisterMap reg_map(_thread); |
607 _result = JVMTI_ERROR_NO_MORE_FRAMES; | 606 _result = JVMTI_ERROR_NO_MORE_FRAMES; |
608 return NULL; | 607 return NULL; |
609 } | 608 } |
610 javaVFrame *jvf = (javaVFrame*)vf; | 609 javaVFrame *jvf = (javaVFrame*)vf; |
611 | 610 |
612 if (!vf->is_java_frame() || jvf->method()->is_native()) { | 611 if (!vf->is_java_frame()) { |
613 _result = JVMTI_ERROR_OPAQUE_FRAME; | 612 _result = JVMTI_ERROR_OPAQUE_FRAME; |
614 return NULL; | 613 return NULL; |
615 } | 614 } |
616 return jvf; | 615 return jvf; |
617 } | 616 } |
738 | 737 |
739 bool VM_GetOrSetLocal::doit_prologue() { | 738 bool VM_GetOrSetLocal::doit_prologue() { |
740 _jvf = get_java_vframe(); | 739 _jvf = get_java_vframe(); |
741 NULL_CHECK(_jvf, false); | 740 NULL_CHECK(_jvf, false); |
742 | 741 |
742 if (_jvf->method()->is_native()) { | |
743 if (getting_receiver() && !_jvf->method()->is_static()) { | |
744 return true; | |
745 } else { | |
746 _result = JVMTI_ERROR_OPAQUE_FRAME; | |
747 return false; | |
748 } | |
749 } | |
750 | |
743 if (!check_slot_type(_jvf)) { | 751 if (!check_slot_type(_jvf)) { |
744 return false; | 752 return false; |
745 } | 753 } |
746 return true; | 754 return true; |
747 } | 755 } |
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 |