mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
7004582: Add GetThisObject() function to JVMTI 1.2
Add 'GetThisObject' function Reviewed-by: never, coleenp
This commit is contained in:
parent
d344b51209
commit
de27a1608c
9 changed files with 156 additions and 69 deletions
|
@ -586,7 +586,6 @@ VM_GetOrSetLocal::VM_GetOrSetLocal(JavaThread* thread, JavaThread* calling_threa
|
|||
{
|
||||
}
|
||||
|
||||
|
||||
vframe *VM_GetOrSetLocal::get_vframe() {
|
||||
if (!_thread->has_last_Java_frame()) {
|
||||
return NULL;
|
||||
|
@ -609,7 +608,7 @@ javaVFrame *VM_GetOrSetLocal::get_java_vframe() {
|
|||
}
|
||||
javaVFrame *jvf = (javaVFrame*)vf;
|
||||
|
||||
if (!vf->is_java_frame() || jvf->method()->is_native()) {
|
||||
if (!vf->is_java_frame()) {
|
||||
_result = JVMTI_ERROR_OPAQUE_FRAME;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -740,6 +739,15 @@ bool VM_GetOrSetLocal::doit_prologue() {
|
|||
_jvf = get_java_vframe();
|
||||
NULL_CHECK(_jvf, false);
|
||||
|
||||
if (_jvf->method()->is_native()) {
|
||||
if (getting_receiver() && !_jvf->method()->is_static()) {
|
||||
return true;
|
||||
} else {
|
||||
_result = JVMTI_ERROR_OPAQUE_FRAME;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!check_slot_type(_jvf)) {
|
||||
return false;
|
||||
}
|
||||
|
@ -781,40 +789,46 @@ void VM_GetOrSetLocal::doit() {
|
|||
HandleMark hm;
|
||||
|
||||
switch (_type) {
|
||||
case T_INT: locals->set_int_at (_index, _value.i); break;
|
||||
case T_LONG: locals->set_long_at (_index, _value.j); break;
|
||||
case T_FLOAT: locals->set_float_at (_index, _value.f); break;
|
||||
case T_DOUBLE: locals->set_double_at(_index, _value.d); break;
|
||||
case T_OBJECT: {
|
||||
Handle ob_h(JNIHandles::resolve_external_guard(_value.l));
|
||||
locals->set_obj_at (_index, ob_h);
|
||||
break;
|
||||
}
|
||||
default: ShouldNotReachHere();
|
||||
case T_INT: locals->set_int_at (_index, _value.i); break;
|
||||
case T_LONG: locals->set_long_at (_index, _value.j); break;
|
||||
case T_FLOAT: locals->set_float_at (_index, _value.f); break;
|
||||
case T_DOUBLE: locals->set_double_at(_index, _value.d); break;
|
||||
case T_OBJECT: {
|
||||
Handle ob_h(JNIHandles::resolve_external_guard(_value.l));
|
||||
locals->set_obj_at (_index, ob_h);
|
||||
break;
|
||||
}
|
||||
default: ShouldNotReachHere();
|
||||
}
|
||||
_jvf->set_locals(locals);
|
||||
} else {
|
||||
StackValueCollection *locals = _jvf->locals();
|
||||
if (_jvf->method()->is_native() && _jvf->is_compiled_frame()) {
|
||||
assert(getting_receiver(), "Can only get here when getting receiver");
|
||||
oop receiver = _jvf->fr().get_native_receiver();
|
||||
_value.l = JNIHandles::make_local(_calling_thread, receiver);
|
||||
} else {
|
||||
StackValueCollection *locals = _jvf->locals();
|
||||
|
||||
if (locals->at(_index)->type() == T_CONFLICT) {
|
||||
memset(&_value, 0, sizeof(_value));
|
||||
_value.l = NULL;
|
||||
return;
|
||||
}
|
||||
if (locals->at(_index)->type() == T_CONFLICT) {
|
||||
memset(&_value, 0, sizeof(_value));
|
||||
_value.l = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (_type) {
|
||||
case T_INT: _value.i = locals->int_at (_index); break;
|
||||
case T_LONG: _value.j = locals->long_at (_index); break;
|
||||
case T_FLOAT: _value.f = locals->float_at (_index); break;
|
||||
case T_DOUBLE: _value.d = locals->double_at(_index); break;
|
||||
case T_OBJECT: {
|
||||
// Wrap the oop to be returned in a local JNI handle since
|
||||
// oops_do() no longer applies after doit() is finished.
|
||||
oop obj = locals->obj_at(_index)();
|
||||
_value.l = JNIHandles::make_local(_calling_thread, obj);
|
||||
break;
|
||||
}
|
||||
default: ShouldNotReachHere();
|
||||
switch (_type) {
|
||||
case T_INT: _value.i = locals->int_at (_index); break;
|
||||
case T_LONG: _value.j = locals->long_at (_index); break;
|
||||
case T_FLOAT: _value.f = locals->float_at (_index); break;
|
||||
case T_DOUBLE: _value.d = locals->double_at(_index); break;
|
||||
case T_OBJECT: {
|
||||
// Wrap the oop to be returned in a local JNI handle since
|
||||
// oops_do() no longer applies after doit() is finished.
|
||||
oop obj = locals->obj_at(_index)();
|
||||
_value.l = JNIHandles::make_local(_calling_thread, obj);
|
||||
break;
|
||||
}
|
||||
default: ShouldNotReachHere();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -825,6 +839,10 @@ bool VM_GetOrSetLocal::allow_nested_vm_operations() const {
|
|||
}
|
||||
|
||||
|
||||
VM_GetReceiver::VM_GetReceiver(
|
||||
JavaThread* thread, JavaThread* caller_thread, jint depth)
|
||||
: VM_GetOrSetLocal(thread, caller_thread, depth, 0) {}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue