632 // Utility method converting a single SignatureStream element into java.lang.Class instance
633
634 oop get_mirror_from_signature(methodHandle method, SignatureStream* ss, TRAPS) {
635 switch (ss->type()) {
636 default:
637 assert(ss->type() != T_VOID || ss->at_return_type(), "T_VOID should only appear as return type");
638 return java_lang_Class::primitive_mirror(ss->type());
639 case T_OBJECT:
640 case T_ARRAY:
641 Symbol* name = ss->as_symbol(CHECK_NULL);
642 oop loader = instanceKlass::cast(method->method_holder())->class_loader();
643 oop protection_domain = instanceKlass::cast(method->method_holder())->protection_domain();
644 klassOop k = SystemDictionary::resolve_or_fail(
645 name,
646 Handle(THREAD, loader),
647 Handle(THREAD, protection_domain),
648 true, CHECK_NULL);
649 if (TraceClassResolution) {
650 trace_class_resolution(k);
651 }
652 return k->klass_part()->java_mirror();
653 };
654 }
655
656
657 objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) {
658 // Allocate array holding parameter types (java.lang.Class instances)
659 objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
660 objArrayHandle mirrors (THREAD, m);
661 int index = 0;
662 // Collect parameter types
663 ResourceMark rm(THREAD);
664 Symbol* signature = method->signature();
665 SignatureStream ss(signature);
666 while (!ss.at_return_type()) {
667 oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
668 mirrors->obj_at_put(index++, mirror);
669 ss.next();
670 }
671 assert(index == parameter_count, "invalid parameter count");
672 if (return_type != NULL) {
|
632 // Utility method converting a single SignatureStream element into java.lang.Class instance
633
634 oop get_mirror_from_signature(methodHandle method, SignatureStream* ss, TRAPS) {
635 switch (ss->type()) {
636 default:
637 assert(ss->type() != T_VOID || ss->at_return_type(), "T_VOID should only appear as return type");
638 return java_lang_Class::primitive_mirror(ss->type());
639 case T_OBJECT:
640 case T_ARRAY:
641 Symbol* name = ss->as_symbol(CHECK_NULL);
642 oop loader = instanceKlass::cast(method->method_holder())->class_loader();
643 oop protection_domain = instanceKlass::cast(method->method_holder())->protection_domain();
644 klassOop k = SystemDictionary::resolve_or_fail(
645 name,
646 Handle(THREAD, loader),
647 Handle(THREAD, protection_domain),
648 true, CHECK_NULL);
649 if (TraceClassResolution) {
650 trace_class_resolution(k);
651 }
652 return k->java_mirror();
653 };
654 }
655
656
657 objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) {
658 // Allocate array holding parameter types (java.lang.Class instances)
659 objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
660 objArrayHandle mirrors (THREAD, m);
661 int index = 0;
662 // Collect parameter types
663 ResourceMark rm(THREAD);
664 Symbol* signature = method->signature();
665 SignatureStream ss(signature);
666 while (!ss.at_return_type()) {
667 oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
668 mirrors->obj_at_put(index++, mirror);
669 ss.next();
670 }
671 assert(index == parameter_count, "invalid parameter count");
672 if (return_type != NULL) {
|