< prev index next >

src/hotspot/share/prims/jvm.cpp

Print this page

        

@@ -1302,16 +1302,17 @@
 JVM_END
 
 JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
   JVMWrapper("JVM_GetClassSigners");
   JvmtiVMObjectAllocEventCollector oam;
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
+  oop mirror = JNIHandles::resolve_non_null(cls);
+  if (java_lang_Class::is_primitive(mirror)) {
     // There are no signers for primitive types
     return NULL;
   }
 
-  objArrayHandle signers(THREAD, java_lang_Class::signers(JNIHandles::resolve_non_null(cls)));
+  objArrayHandle signers(THREAD, java_lang_Class::signers(mirror));
 
   // If there are no signers set in the class, or if the class
   // is an array, return NULL.
   if (signers == NULL) return NULL;
 

@@ -1327,34 +1328,36 @@
 JVM_END
 
 
 JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers))
   JVMWrapper("JVM_SetClassSigners");
-  if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
+  oop mirror = JNIHandles::resolve_non_null(cls);
+  if (!java_lang_Class::is_primitive(mirror)) {
     // This call is ignored for primitive types and arrays.
     // Signers are only set once, ClassLoader.java, and thus shouldn't
     // be called with an array.  Only the bootstrap loader creates arrays.
-    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
+    Klass* k = java_lang_Class::as_Klass(mirror);
     if (k->is_instance_klass()) {
       java_lang_Class::set_signers(k->java_mirror(), objArrayOop(JNIHandles::resolve(signers)));
     }
   }
 JVM_END
 
 
 JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
   JVMWrapper("JVM_GetProtectionDomain");
-  if (JNIHandles::resolve(cls) == NULL) {
+  oop mirror = JNIHandles::resolve_non_null(cls);
+  if (mirror == NULL) {
     THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
   }
 
-  if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
+  if (java_lang_Class::is_primitive(mirror)) {
     // Primitive types does not have a protection domain.
     return NULL;
   }
 
-  oop pd = java_lang_Class::protection_domain(JNIHandles::resolve(cls));
+  oop pd = java_lang_Class::protection_domain(mirror);
   return (jobject) JNIHandles::make_local(THREAD, pd);
 JVM_END
 
 
 // Returns the inherited_access_control_context field of the running thread.

@@ -1472,16 +1475,17 @@
 JVM_END
 
 
 JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))
   JVMWrapper("JVM_GetClassModifiers");
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
+  oop mirror = JNIHandles::resolve_non_null(cls);
+  if (java_lang_Class::is_primitive(mirror)) {
     // Primitive type
     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
   }
 
-  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
+  Klass* k = java_lang_Class::as_Klass(mirror);
   debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0));
   assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");
   return k->modifier_flags();
 JVM_END
 

@@ -1490,18 +1494,18 @@
 
 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
   JvmtiVMObjectAllocEventCollector oam;
   // ofClass is a reference to a java_lang_Class object. The mirror object
   // of an InstanceKlass
-
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
-      ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_instance_klass()) {
+  oop ofMirror = JNIHandles::resolve_non_null(ofClass);
+  if (java_lang_Class::is_primitive(ofMirror) ||
+      ! java_lang_Class::as_Klass(ofMirror)->is_instance_klass()) {
     oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
     return (jobjectArray)JNIHandles::make_local(THREAD, result);
   }
 
-  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
   InnerClassesIterator iter(k);
 
   if (iter.length() == 0) {
     // Neither an inner nor outer class
     oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);

@@ -1555,33 +1559,39 @@
 
 
 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
 {
   // ofClass is a reference to a java_lang_Class object.
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
-      ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_instance_klass()) {
+  oop ofMirror = JNIHandles::resolve_non_null(ofClass);
+  if (java_lang_Class::is_primitive(ofMirror)) {
+    return NULL;
+  }
+  Klass* klass = java_lang_Class::as_Klass(ofMirror);
+  if (!klass->is_instance_klass()) {
     return NULL;
   }
 
   bool inner_is_member = false;
   Klass* outer_klass
-    = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))
-                          )->compute_enclosing_class(&inner_is_member, CHECK_NULL);
+    = InstanceKlass::cast(klass)->compute_enclosing_class(&inner_is_member, CHECK_NULL);
   if (outer_klass == NULL)  return NULL;  // already a top-level class
   if (!inner_is_member)  return NULL;     // a hidden or unsafe anonymous class (inside a method)
   return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror());
 }
 JVM_END
 
 JVM_ENTRY(jstring, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls))
 {
   oop mirror = JNIHandles::resolve_non_null(cls);
-  if (java_lang_Class::is_primitive(mirror) ||
-      !java_lang_Class::as_Klass(mirror)->is_instance_klass()) {
+  if (java_lang_Class::is_primitive(mirror)) {
     return NULL;
   }
-  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
+  Klass* klass = java_lang_Class::as_Klass(mirror);
+  if (!klass->is_instance_klass()) {
+    return NULL;
+  }
+  InstanceKlass* k = InstanceKlass::cast(klass);
   int ooff = 0, noff = 0;
   if (k->find_inner_classes_attr(&ooff, &noff, THREAD)) {
     if (noff != 0) {
       constantPoolHandle i_cp(thread, k->constants());
       Symbol* name = i_cp->symbol_at(noff);

@@ -1596,13 +1606,14 @@
 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
   assert (cls != NULL, "illegal class");
   JVMWrapper("JVM_GetClassSignature");
   JvmtiVMObjectAllocEventCollector oam;
   ResourceMark rm(THREAD);
+  oop mirror = JNIHandles::resolve_non_null(cls);
   // Return null for arrays and primatives
-  if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
-    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
+  if (!java_lang_Class::is_primitive(mirror)) {
+    Klass* k = java_lang_Class::as_Klass(mirror);
     if (k->is_instance_klass()) {
       Symbol* sym = InstanceKlass::cast(k)->generic_signature();
       if (sym == NULL) return NULL;
       Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
       return (jstring) JNIHandles::make_local(THREAD, str());

@@ -1613,14 +1624,14 @@
 
 
 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
   assert (cls != NULL, "illegal class");
   JVMWrapper("JVM_GetClassAnnotations");
-
+  oop mirror = JNIHandles::resolve_non_null(cls);
   // 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));
+  if (!java_lang_Class::is_primitive(mirror)) {
+    Klass* k = java_lang_Class::as_Klass(mirror);
     if (k->is_instance_klass()) {
       typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
       return (jbyteArray) JNIHandles::make_local(THREAD, a);
     }
   }

@@ -1795,19 +1806,20 @@
 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
 {
   JVMWrapper("JVM_GetClassDeclaredFields");
   JvmtiVMObjectAllocEventCollector oam;
 
+  oop ofMirror = JNIHandles::resolve_non_null(ofClass);
   // Exclude primitive types and array types
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
-      java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) {
+  if (java_lang_Class::is_primitive(ofMirror) ||
+      java_lang_Class::as_Klass(ofMirror)->is_array_klass()) {
     // Return empty array
     oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL);
     return (jobjectArray) JNIHandles::make_local(THREAD, res);
   }
 
-  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
   constantPoolHandle cp(THREAD, k->constants());
 
   // Ensure class is linked
   k->link_class(CHECK_NULL);
 

@@ -1903,19 +1915,20 @@
                                   bool want_constructor,
                                   Klass* klass, TRAPS) {
 
   JvmtiVMObjectAllocEventCollector oam;
 
+  oop ofMirror = JNIHandles::resolve_non_null(ofClass);
   // Exclude primitive types and array types
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
-      || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) {
+  if (java_lang_Class::is_primitive(ofMirror)
+      || java_lang_Class::as_Klass(ofMirror)->is_array_klass()) {
     // Return empty array
     oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL);
     return (jobjectArray) JNIHandles::make_local(THREAD, res);
   }
 
-  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
+  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(ofMirror));
 
   // Ensure class is linked
   k->link_class(CHECK_NULL);
 
   Array<Method*>* methods = k->methods();

@@ -1985,16 +1998,17 @@
 JVM_END
 
 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
 {
   JVMWrapper("JVM_GetClassAccessFlags");
-  if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
+  oop mirror = JNIHandles::resolve_non_null(cls);
+  if (java_lang_Class::is_primitive(mirror)) {
     // Primitive type
     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
   }
 
-  Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
+  Klass* k = java_lang_Class::as_Klass(mirror);
   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
 }
 JVM_END
 
 JVM_ENTRY(jboolean, JVM_AreNestMates(JNIEnv *env, jclass current, jclass member))

@@ -2105,12 +2119,13 @@
 JVM_END
 
 JVM_ENTRY(jobjectArray, JVM_GetPermittedSubclasses(JNIEnv* env, jclass current))
 {
   JVMWrapper("JVM_GetPermittedSubclasses");
-  assert(!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(current)), "should not be");
-  Klass* c = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(current));
+  oop mirror = JNIHandles::resolve_non_null(current);
+  assert(!java_lang_Class::is_primitive(mirror), "should not be");
+  Klass* c = java_lang_Class::as_Klass(mirror);
   assert(c->is_instance_klass(), "must be");
   InstanceKlass* ik = InstanceKlass::cast(c);
   {
     JvmtiVMObjectAllocEventCollector oam;
     Array<u2>* subclasses = ik->permitted_subclasses();

@@ -2135,14 +2150,14 @@
 
 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
 {
   JVMWrapper("JVM_GetClassConstantPool");
   JvmtiVMObjectAllocEventCollector oam;
-
+  oop mirror = JNIHandles::resolve_non_null(cls);
   // Return null for primitives and arrays
-  if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
-    Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
+  if (!java_lang_Class::is_primitive(mirror)) {
+    Klass* k = java_lang_Class::as_Klass(mirror);
     if (k->is_instance_klass()) {
       InstanceKlass* k_h = InstanceKlass::cast(k);
       Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
       reflect_ConstantPool::set_cp(jcp(), k_h->constants());
       return JNIHandles::make_local(THREAD, jcp());
< prev index next >