8009382: Add JVM_Get{Field|Method}TypeAnnotations
Reviewed-by: dcubed, rbackman
Contributed-by: Joel Borggren-Franck <joel.franck@oracle.com>
--- a/hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-debug Tue Mar 26 15:00:34 2013 +0100
@@ -135,6 +135,7 @@
JVM_GetEnclosingMethodInfo;
JVM_GetFieldAnnotations;
JVM_GetFieldIxModifiers;
+ JVM_GetFieldTypeAnnotations;
JVM_GetHostName;
JVM_GetInheritedAccessControlContext;
JVM_GetInterfaceVersion;
@@ -156,6 +157,7 @@
JVM_GetMethodIxSignatureUTF;
JVM_GetMethodParameterAnnotations;
JVM_GetMethodParameters;
+ JVM_GetMethodTypeAnnotations;
JVM_GetPrimitiveArrayElement;
JVM_GetProtectionDomain;
JVM_GetSockName;
--- a/hotspot/make/bsd/makefiles/mapfile-vers-product Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/make/bsd/makefiles/mapfile-vers-product Tue Mar 26 15:00:34 2013 +0100
@@ -135,6 +135,7 @@
JVM_GetEnclosingMethodInfo;
JVM_GetFieldAnnotations;
JVM_GetFieldIxModifiers;
+ JVM_GetFieldTypeAnnotations;
JVM_GetHostName;
JVM_GetInheritedAccessControlContext;
JVM_GetInterfaceVersion;
@@ -156,6 +157,7 @@
JVM_GetMethodIxSignatureUTF;
JVM_GetMethodParameterAnnotations;
JVM_GetMethodParameters;
+ JVM_GetMethodTypeAnnotations;
JVM_GetPrimitiveArrayElement;
JVM_GetProtectionDomain;
JVM_GetSockName;
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/make/linux/makefiles/mapfile-vers-debug Tue Mar 26 15:00:34 2013 +0100
@@ -131,6 +131,7 @@
JVM_GetEnclosingMethodInfo;
JVM_GetFieldAnnotations;
JVM_GetFieldIxModifiers;
+ JVM_GetFieldTypeAnnotations;
JVM_GetHostName;
JVM_GetInheritedAccessControlContext;
JVM_GetInterfaceVersion;
@@ -152,6 +153,7 @@
JVM_GetMethodIxSignatureUTF;
JVM_GetMethodParameterAnnotations;
JVM_GetMethodParameters;
+ JVM_GetMethodTypeAnnotations;
JVM_GetPrimitiveArrayElement;
JVM_GetProtectionDomain;
JVM_GetSockName;
--- a/hotspot/make/linux/makefiles/mapfile-vers-product Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/make/linux/makefiles/mapfile-vers-product Tue Mar 26 15:00:34 2013 +0100
@@ -131,6 +131,7 @@
JVM_GetEnclosingMethodInfo;
JVM_GetFieldAnnotations;
JVM_GetFieldIxModifiers;
+ JVM_GetFieldTypeAnnotations;
JVM_GetHostName;
JVM_GetInheritedAccessControlContext;
JVM_GetInterfaceVersion;
@@ -152,6 +153,7 @@
JVM_GetMethodIxSignatureUTF;
JVM_GetMethodParameterAnnotations;
JVM_GetMethodParameters;
+ JVM_GetMethodTypeAnnotations;
JVM_GetPrimitiveArrayElement;
JVM_GetProtectionDomain;
JVM_GetSockName;
--- a/hotspot/make/solaris/makefiles/mapfile-vers Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/make/solaris/makefiles/mapfile-vers Tue Mar 26 15:00:34 2013 +0100
@@ -131,6 +131,7 @@
JVM_GetEnclosingMethodInfo;
JVM_GetFieldAnnotations;
JVM_GetFieldIxModifiers;
+ JVM_GetFieldTypeAnnotations;
JVM_GetHostName;
JVM_GetInheritedAccessControlContext;
JVM_GetInterfaceVersion;
@@ -152,6 +153,7 @@
JVM_GetMethodIxSignatureUTF;
JVM_GetMethodParameterAnnotations;
JVM_GetMethodParameters;
+ JVM_GetMethodTypeAnnotations;
JVM_GetPrimitiveArrayElement;
JVM_GetProtectionDomain;
JVM_GetSockName;
--- a/hotspot/src/share/vm/prims/jvm.cpp Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/src/share/vm/prims/jvm.cpp Tue Mar 26 15:00:34 2013 +0100
@@ -1457,7 +1457,7 @@
JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
assert (cls != NULL, "illegal class");
JVMWrapper("JVM_GetClassAnnotations");
- ResourceMark rm(THREAD);
+
// Return null for arrays and primitives
if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
@@ -1470,20 +1470,15 @@
JVM_END
-JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field))
- assert(field != NULL, "illegal field");
- JVMWrapper("JVM_GetFieldAnnotations");
-
+static bool jvm_get_field_common(jobject field, fieldDescriptor& fd, TRAPS) {
// some of this code was adapted from from jni_FromReflectedField
- // field is a handle to a java.lang.reflect.Field object
oop reflected = JNIHandles::resolve_non_null(field);
oop mirror = java_lang_reflect_Field::clazz(reflected);
Klass* k = java_lang_Class::as_Klass(mirror);
int slot = java_lang_reflect_Field::slot(reflected);
int modifiers = java_lang_reflect_Field::modifiers(reflected);
- fieldDescriptor fd;
KlassHandle kh(THREAD, k);
intptr_t offset = InstanceKlass::cast(kh())->field_offset(slot);
@@ -1491,16 +1486,29 @@
// for static fields we only look in the current class
if (!InstanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) {
assert(false, "cannot find static field");
- return NULL; // robustness
+ return false;
}
} else {
// for instance fields we start with the current class and work
// our way up through the superclass chain
if (!InstanceKlass::cast(kh())->find_field_from_offset(offset, false, &fd)) {
assert(false, "cannot find instance field");
- return NULL; // robustness
+ return false;
}
}
+ return true;
+}
+
+JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field))
+ // field is a handle to a java.lang.reflect.Field object
+ assert(field != NULL, "illegal field");
+ JVMWrapper("JVM_GetFieldAnnotations");
+
+ fieldDescriptor fd;
+ bool gotFd = jvm_get_field_common(field, fd, CHECK_NULL);
+ if (!gotFd) {
+ return NULL;
+ }
return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.annotations(), THREAD));
JVM_END
@@ -1525,12 +1533,8 @@
Klass* k = java_lang_Class::as_Klass(mirror);
Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
- if (m == NULL) {
- assert(false, "cannot find method");
- return NULL; // robustness
- }
-
- return m;
+ assert(m != NULL, "cannot find method");
+ return m; // caller has to deal with NULL in product mode
}
@@ -1539,6 +1543,10 @@
// method is a handle to a java.lang.reflect.Method object
Method* m = jvm_get_method_common(method);
+ if (m == NULL) {
+ return NULL;
+ }
+
return (jbyteArray) JNIHandles::make_local(env,
Annotations::make_java_array(m->annotations(), THREAD));
JVM_END
@@ -1549,6 +1557,10 @@
// method is a handle to a java.lang.reflect.Method object
Method* m = jvm_get_method_common(method);
+ if (m == NULL) {
+ return NULL;
+ }
+
return (jbyteArray) JNIHandles::make_local(env,
Annotations::make_java_array(m->annotation_default(), THREAD));
JVM_END
@@ -1559,6 +1571,10 @@
// method is a handle to a java.lang.reflect.Method object
Method* m = jvm_get_method_common(method);
+ if (m == NULL) {
+ return NULL;
+ }
+
return (jbyteArray) JNIHandles::make_local(env,
Annotations::make_java_array(m->parameter_annotations(), THREAD));
JVM_END
@@ -1583,6 +1599,38 @@
return NULL;
JVM_END
+JVM_ENTRY(jbyteArray, JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method))
+ assert (method != NULL, "illegal method");
+ JVMWrapper("JVM_GetMethodTypeAnnotations");
+
+ // method is a handle to a java.lang.reflect.Method object
+ Method* m = jvm_get_method_common(method);
+ if (m == NULL) {
+ return NULL;
+ }
+
+ AnnotationArray* type_annotations = m->type_annotations();
+ if (type_annotations != NULL) {
+ typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
+ return (jbyteArray) JNIHandles::make_local(env, a);
+ }
+
+ return NULL;
+JVM_END
+
+JVM_ENTRY(jbyteArray, JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field))
+ assert (field != NULL, "illegal field");
+ JVMWrapper("JVM_GetFieldTypeAnnotations");
+
+ fieldDescriptor fd;
+ bool gotFd = jvm_get_field_common(field, fd, CHECK_NULL);
+ if (!gotFd) {
+ return NULL;
+ }
+
+ return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.type_annotations(), THREAD));
+JVM_END
+
static void bounds_check(constantPoolHandle cp, jint index, TRAPS) {
if (!cp->is_within_bounds(index)) {
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
--- a/hotspot/src/share/vm/prims/jvm.h Mon Mar 25 09:36:15 2013 -0700
+++ b/hotspot/src/share/vm/prims/jvm.h Tue Mar 26 15:00:34 2013 +0100
@@ -523,6 +523,14 @@
JNIEXPORT jbyteArray JNICALL
JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls);
+// field is a handle to a java.lang.reflect.Field object
+JNIEXPORT jbyteArray JNICALL
+JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field);
+
+// method is a handle to a java.lang.reflect.Method object
+JNIEXPORT jbyteArray JNICALL
+JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method);
+
/*
* New (JDK 1.4) reflection implementation
*/