8026025: JVM_GetCallerClass allows Reflection.getCallerClass(int depth) to use
authordholmes
Tue, 08 Oct 2013 02:56:06 -0400
changeset 20392 a61df72089e5
parent 20391 7b146c5ebb18
child 20394 2868e32b6fd0
8026025: JVM_GetCallerClass allows Reflection.getCallerClass(int depth) to use Reviewed-by: alanb, dholmes, twisti Contributed-by: mandy.chung@oracle.com
hotspot/src/share/vm/prims/jvm.cpp
hotspot/src/share/vm/prims/jvm.h
--- a/hotspot/src/share/vm/prims/jvm.cpp	Mon Oct 07 12:20:28 2013 -0400
+++ b/hotspot/src/share/vm/prims/jvm.cpp	Tue Oct 08 02:56:06 2013 -0400
@@ -668,13 +668,12 @@
 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth))
   JVMWrapper("JVM_GetCallerClass");
 
-  // Pre-JDK 8 and early builds of JDK 8 don't have a CallerSensitive annotation.
-  if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) {
+  // Pre-JDK 8 and early builds of JDK 8 don't have a CallerSensitive annotation; or
+  // sun.reflect.Reflection.getCallerClass with a depth parameter is provided
+  // temporarily for existing code to use until a replacement API is defined.
+  if (SystemDictionary::reflect_CallerSensitive_klass() == NULL || depth != JVM_CALLER_DEPTH) {
     Klass* k = thread->security_get_caller_class(depth);
     return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror());
-  } else {
-    // Basic handshaking with Java_sun_reflect_Reflection_getCallerClass
-    assert(depth == -1, "wrong handshake depth");
   }
 
   // Getting the class of the caller frame.
--- a/hotspot/src/share/vm/prims/jvm.h	Mon Oct 07 12:20:28 2013 -0400
+++ b/hotspot/src/share/vm/prims/jvm.h	Tue Oct 08 02:56:06 2013 -0400
@@ -374,6 +374,9 @@
 /*
  * java.lang.Class and java.lang.ClassLoader
  */
+
+#define JVM_CALLER_DEPTH -1
+
 /*
  * Returns the class in which the code invoking the native method
  * belongs.