src/hotspot/share/runtime/reflection.cpp
changeset 48826 c4d9d1b08e2e
parent 47765 b7c7428eaab9
child 48836 423bcbb288ff
--- a/src/hotspot/share/runtime/reflection.cpp	Wed Jan 31 10:55:49 2018 -0800
+++ b/src/hotspot/share/runtime/reflection.cpp	Fri Sep 08 10:46:46 2017 -0700
@@ -765,27 +765,26 @@
 static oop get_mirror_from_signature(const methodHandle& method,
                                      SignatureStream* ss,
                                      TRAPS) {
-
+  Klass* accessing_klass = method->method_holder();
+  assert(accessing_klass != NULL, "method has no accessing_klass");
 
-  if (T_OBJECT == ss->type() || T_ARRAY == ss->type()) {
-    Symbol* name = ss->as_symbol(CHECK_NULL);
-    oop loader = method->method_holder()->class_loader();
-    oop protection_domain = method->method_holder()->protection_domain();
-    const Klass* k = SystemDictionary::resolve_or_fail(name,
-                                                       Handle(THREAD, loader),
-                                                       Handle(THREAD, protection_domain),
-                                                       true,
-                                                       CHECK_NULL);
-    if (log_is_enabled(Debug, class, resolve)) {
-      trace_class_resolution(k);
+  oop mirror_oop = ss->as_java_mirror(Handle(THREAD, accessing_klass->class_loader()),
+                                      Handle(THREAD, accessing_klass->protection_domain()),
+                                      SignatureStream::NCDFError,
+                                      CHECK_NULL);
+
+  // Special tracing logic for resolution of class names during reflection.
+  if (log_is_enabled(Debug, class, resolve)) {
+    Klass* result = java_lang_Class::as_Klass(mirror_oop);
+    if (result != NULL) {
+      trace_class_resolution(result);
     }
-    return k->java_mirror();
   }
 
   assert(ss->type() != T_VOID || ss->at_return_type(),
     "T_VOID should only appear as return type");
 
-  return java_lang_Class::primitive_mirror(ss->type());
+  return mirror_oop;
 }
 
 static objArrayHandle get_parameter_types(const methodHandle& method,
@@ -819,24 +818,17 @@
 }
 
 static Handle new_type(Symbol* signature, Klass* k, TRAPS) {
-  // Basic types
-  BasicType type = vmSymbols::signature_type(signature);
-  if (type != T_OBJECT) {
-    return Handle(THREAD, Universe::java_mirror(type));
+  Handle mirror = SystemDictionary::find_java_mirror_for_type(signature, k, SignatureStream::NCDFError, CHECK_(Handle()));
+
+  // Special tracing logic for resolution of class names during reflection.
+  if (log_is_enabled(Debug, class, resolve)) {
+    Klass* result = java_lang_Class::as_Klass(mirror());
+    if (result != NULL) {
+      trace_class_resolution(result);
+    }
   }
 
-  Klass* result =
-    SystemDictionary::resolve_or_fail(signature,
-                                      Handle(THREAD, k->class_loader()),
-                                      Handle(THREAD, k->protection_domain()),
-                                      true, CHECK_(Handle()));
-
-  if (log_is_enabled(Debug, class, resolve)) {
-    trace_class_resolution(result);
-  }
-
-  oop nt = result->java_mirror();
-  return Handle(THREAD, nt);
+  return mirror;
 }