763 |
763 |
764 // Utility method converting a single SignatureStream element into java.lang.Class instance |
764 // Utility method converting a single SignatureStream element into java.lang.Class instance |
765 static oop get_mirror_from_signature(const methodHandle& method, |
765 static oop get_mirror_from_signature(const methodHandle& method, |
766 SignatureStream* ss, |
766 SignatureStream* ss, |
767 TRAPS) { |
767 TRAPS) { |
768 |
768 Klass* accessing_klass = method->method_holder(); |
769 |
769 assert(accessing_klass != NULL, "method has no accessing_klass"); |
770 if (T_OBJECT == ss->type() || T_ARRAY == ss->type()) { |
770 |
771 Symbol* name = ss->as_symbol(CHECK_NULL); |
771 oop mirror_oop = ss->as_java_mirror(Handle(THREAD, accessing_klass->class_loader()), |
772 oop loader = method->method_holder()->class_loader(); |
772 Handle(THREAD, accessing_klass->protection_domain()), |
773 oop protection_domain = method->method_holder()->protection_domain(); |
773 SignatureStream::NCDFError, |
774 const Klass* k = SystemDictionary::resolve_or_fail(name, |
774 CHECK_NULL); |
775 Handle(THREAD, loader), |
775 |
776 Handle(THREAD, protection_domain), |
776 // Special tracing logic for resolution of class names during reflection. |
777 true, |
777 if (log_is_enabled(Debug, class, resolve)) { |
778 CHECK_NULL); |
778 Klass* result = java_lang_Class::as_Klass(mirror_oop); |
779 if (log_is_enabled(Debug, class, resolve)) { |
779 if (result != NULL) { |
780 trace_class_resolution(k); |
780 trace_class_resolution(result); |
781 } |
781 } |
782 return k->java_mirror(); |
|
783 } |
782 } |
784 |
783 |
785 assert(ss->type() != T_VOID || ss->at_return_type(), |
784 assert(ss->type() != T_VOID || ss->at_return_type(), |
786 "T_VOID should only appear as return type"); |
785 "T_VOID should only appear as return type"); |
787 |
786 |
788 return java_lang_Class::primitive_mirror(ss->type()); |
787 return mirror_oop; |
789 } |
788 } |
790 |
789 |
791 static objArrayHandle get_parameter_types(const methodHandle& method, |
790 static objArrayHandle get_parameter_types(const methodHandle& method, |
792 int parameter_count, |
791 int parameter_count, |
793 oop* return_type, |
792 oop* return_type, |
817 static objArrayHandle get_exception_types(const methodHandle& method, TRAPS) { |
816 static objArrayHandle get_exception_types(const methodHandle& method, TRAPS) { |
818 return method->resolved_checked_exceptions(THREAD); |
817 return method->resolved_checked_exceptions(THREAD); |
819 } |
818 } |
820 |
819 |
821 static Handle new_type(Symbol* signature, Klass* k, TRAPS) { |
820 static Handle new_type(Symbol* signature, Klass* k, TRAPS) { |
822 // Basic types |
821 Handle mirror = SystemDictionary::find_java_mirror_for_type(signature, k, SignatureStream::NCDFError, CHECK_(Handle())); |
823 BasicType type = vmSymbols::signature_type(signature); |
822 |
824 if (type != T_OBJECT) { |
823 // Special tracing logic for resolution of class names during reflection. |
825 return Handle(THREAD, Universe::java_mirror(type)); |
|
826 } |
|
827 |
|
828 Klass* result = |
|
829 SystemDictionary::resolve_or_fail(signature, |
|
830 Handle(THREAD, k->class_loader()), |
|
831 Handle(THREAD, k->protection_domain()), |
|
832 true, CHECK_(Handle())); |
|
833 |
|
834 if (log_is_enabled(Debug, class, resolve)) { |
824 if (log_is_enabled(Debug, class, resolve)) { |
835 trace_class_resolution(result); |
825 Klass* result = java_lang_Class::as_Klass(mirror()); |
836 } |
826 if (result != NULL) { |
837 |
827 trace_class_resolution(result); |
838 oop nt = result->java_mirror(); |
828 } |
839 return Handle(THREAD, nt); |
829 } |
|
830 |
|
831 return mirror; |
840 } |
832 } |
841 |
833 |
842 |
834 |
843 oop Reflection::new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS) { |
835 oop Reflection::new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS) { |
844 // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods. |
836 // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods. |