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