mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-22 03:54:33 +02:00
6862945: 4/3 conversion of jmethodID to methodOop in JVMTI is too expensive
Refactor JNIHandles::checked_resolve_jmethod_id() into fast and paranoid parts. Reviewed-by: never, alanb
This commit is contained in:
parent
10e13deca1
commit
aca1d9534f
2 changed files with 17 additions and 6 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -96,6 +96,7 @@ static const char * fatal_received_null_class = "JNI received a null class";
|
||||||
static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";
|
static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";
|
||||||
static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass";
|
static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass";
|
||||||
static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";
|
static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";
|
||||||
|
static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call";
|
||||||
static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";
|
static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";
|
||||||
static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";
|
static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";
|
||||||
static const char * fatal_non_array = "Non-array passed to JNI array operations";
|
static const char * fatal_non_array = "Non-array passed to JNI array operations";
|
||||||
|
@ -291,10 +292,16 @@ oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {
|
||||||
|
|
||||||
methodOop jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {
|
methodOop jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {
|
||||||
ASSERT_OOPS_ALLOWED;
|
ASSERT_OOPS_ALLOWED;
|
||||||
|
// do the fast jmethodID check first
|
||||||
methodOop moop = JNIHandles::checked_resolve_jmethod_id(method_id);
|
methodOop moop = JNIHandles::checked_resolve_jmethod_id(method_id);
|
||||||
if (moop == NULL) {
|
if (moop == NULL) {
|
||||||
ReportJNIFatalError(thr, fatal_wrong_class_or_method);
|
ReportJNIFatalError(thr, fatal_wrong_class_or_method);
|
||||||
}
|
}
|
||||||
|
// jmethodIDs are supposed to be weak global handles, but that
|
||||||
|
// can be expensive so check it last
|
||||||
|
else if (!JNIHandles::is_weak_global_handle((jobject) method_id)) {
|
||||||
|
ReportJNIFatalError(thr, fatal_non_weak_method);
|
||||||
|
}
|
||||||
return moop;
|
return moop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -196,12 +196,16 @@ inline methodOop JNIHandles::resolve_jmethod_id(jmethodID mid) {
|
||||||
};
|
};
|
||||||
|
|
||||||
inline methodOop JNIHandles::checked_resolve_jmethod_id(jmethodID mid) {
|
inline methodOop JNIHandles::checked_resolve_jmethod_id(jmethodID mid) {
|
||||||
jobject handle = (jobject)mid;
|
if (mid == NULL) {
|
||||||
if (is_weak_global_handle(handle)) {
|
|
||||||
return (methodOop) resolve_non_null(handle);
|
|
||||||
} else {
|
|
||||||
return (methodOop) NULL;
|
return (methodOop) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oop o = resolve_non_null((jobject) mid);
|
||||||
|
if (!o->is_method()) {
|
||||||
|
return (methodOop) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (methodOop) o;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue