< prev index next >

src/share/vm/runtime/reflection.cpp

Print this page




 745          cp->klass_name_at_matches(inner, ioff)) {
 746         Klass* i = cp->klass_at(ioff, CHECK);
 747         if (i == inner) {
 748           return;
 749         }
 750      }
 751   }
 752 
 753   // 'inner' not declared as an inner klass in outer
 754   ResourceMark rm(THREAD);
 755   Exceptions::fthrow(
 756     THREAD_AND_LOCATION,
 757     vmSymbols::java_lang_IncompatibleClassChangeError(),
 758     "%s and %s disagree on InnerClasses attribute",
 759     outer->external_name(),
 760     inner->external_name()
 761   );
 762 }
 763 
 764 // Utility method converting a single SignatureStream element into java.lang.Class instance
 765 static oop get_mirror_from_signature(methodHandle method,
 766                                      SignatureStream* ss,
 767                                      TRAPS) {
 768 
 769 
 770   if (T_OBJECT == ss->type() || T_ARRAY == ss->type()) {
 771     Symbol* name = ss->as_symbol(CHECK_NULL);
 772     oop loader = method->method_holder()->class_loader();
 773     oop protection_domain = method->method_holder()->protection_domain();
 774     const Klass* k = SystemDictionary::resolve_or_fail(name,
 775                                                        Handle(THREAD, loader),
 776                                                        Handle(THREAD, protection_domain),
 777                                                        true,
 778                                                        CHECK_NULL);
 779     if (log_is_enabled(Debug, class, resolve)) {
 780       trace_class_resolution(k);
 781     }
 782     return k->java_mirror();
 783   }
 784 
 785   assert(ss->type() != T_VOID || ss->at_return_type(),
 786     "T_VOID should only appear as return type");
 787 
 788   return java_lang_Class::primitive_mirror(ss->type());
 789 }
 790 
 791 static objArrayHandle get_parameter_types(methodHandle method,
 792                                           int parameter_count,
 793                                           oop* return_type,
 794                                           TRAPS) {
 795   // Allocate array holding parameter types (java.lang.Class instances)
 796   objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
 797   objArrayHandle mirrors(THREAD, m);
 798   int index = 0;
 799   // Collect parameter types
 800   ResourceMark rm(THREAD);
 801   Symbol*  signature = method->signature();
 802   SignatureStream ss(signature);
 803   while (!ss.at_return_type()) {
 804     oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
 805     mirrors->obj_at_put(index++, mirror);
 806     ss.next();
 807   }
 808   assert(index == parameter_count, "invalid parameter count");
 809   if (return_type != NULL) {
 810     // Collect return type as well
 811     assert(ss.at_return_type(), "return type should be present");
 812     *return_type = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
 813   }
 814   return mirrors;
 815 }
 816 
 817 static objArrayHandle get_exception_types(methodHandle method, TRAPS) {
 818   return method->resolved_checked_exceptions(THREAD);
 819 }
 820 
 821 static Handle new_type(Symbol* signature, Klass* k, TRAPS) {
 822   // Basic types
 823   BasicType type = vmSymbols::signature_type(signature);
 824   if (type != T_OBJECT) {
 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)) {
 835     trace_class_resolution(result);
 836   }
 837 


1035     value->z = (jboolean) (value->i & 1);
1036     return;
1037   case T_BYTE:
1038     value->b = (jbyte)value->i;
1039     return;
1040   case T_CHAR:
1041     value->c = (jchar)value->i;
1042     return;
1043   case T_SHORT:
1044     value->s = (jshort)value->i;
1045     return;
1046   default:
1047     break; // fail
1048   }
1049   THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch");
1050 }
1051 
1052 
1053 // Method call (shared by invoke_method and invoke_constructor)
1054 static oop invoke(InstanceKlass* klass,
1055                   methodHandle reflected_method,
1056                   Handle receiver,
1057                   bool override,
1058                   objArrayHandle ptypes,
1059                   BasicType rtype,
1060                   objArrayHandle args,
1061                   bool is_method_invoke,
1062                   TRAPS) {
1063 
1064   ResourceMark rm(THREAD);
1065 
1066   methodHandle method;      // actual method to invoke
1067   Klass* target_klass;      // target klass, receiver's klass for non-static
1068 
1069   // Ensure klass is initialized
1070   klass->initialize(CHECK_NULL);
1071 
1072   bool is_static = reflected_method->is_static();
1073   if (is_static) {
1074     // ignore receiver argument
1075     method = reflected_method;




 745          cp->klass_name_at_matches(inner, ioff)) {
 746         Klass* i = cp->klass_at(ioff, CHECK);
 747         if (i == inner) {
 748           return;
 749         }
 750      }
 751   }
 752 
 753   // 'inner' not declared as an inner klass in outer
 754   ResourceMark rm(THREAD);
 755   Exceptions::fthrow(
 756     THREAD_AND_LOCATION,
 757     vmSymbols::java_lang_IncompatibleClassChangeError(),
 758     "%s and %s disagree on InnerClasses attribute",
 759     outer->external_name(),
 760     inner->external_name()
 761   );
 762 }
 763 
 764 // Utility method converting a single SignatureStream element into java.lang.Class instance
 765 static oop get_mirror_from_signature(const methodHandle& method,
 766                                      SignatureStream* ss,
 767                                      TRAPS) {
 768 
 769 
 770   if (T_OBJECT == ss->type() || T_ARRAY == ss->type()) {
 771     Symbol* name = ss->as_symbol(CHECK_NULL);
 772     oop loader = method->method_holder()->class_loader();
 773     oop protection_domain = method->method_holder()->protection_domain();
 774     const Klass* k = SystemDictionary::resolve_or_fail(name,
 775                                                        Handle(THREAD, loader),
 776                                                        Handle(THREAD, protection_domain),
 777                                                        true,
 778                                                        CHECK_NULL);
 779     if (log_is_enabled(Debug, class, resolve)) {
 780       trace_class_resolution(k);
 781     }
 782     return k->java_mirror();
 783   }
 784 
 785   assert(ss->type() != T_VOID || ss->at_return_type(),
 786     "T_VOID should only appear as return type");
 787 
 788   return java_lang_Class::primitive_mirror(ss->type());
 789 }
 790 
 791 static objArrayHandle get_parameter_types(const methodHandle& method,
 792                                           int parameter_count,
 793                                           oop* return_type,
 794                                           TRAPS) {
 795   // Allocate array holding parameter types (java.lang.Class instances)
 796   objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
 797   objArrayHandle mirrors(THREAD, m);
 798   int index = 0;
 799   // Collect parameter types
 800   ResourceMark rm(THREAD);
 801   Symbol*  signature = method->signature();
 802   SignatureStream ss(signature);
 803   while (!ss.at_return_type()) {
 804     oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
 805     mirrors->obj_at_put(index++, mirror);
 806     ss.next();
 807   }
 808   assert(index == parameter_count, "invalid parameter count");
 809   if (return_type != NULL) {
 810     // Collect return type as well
 811     assert(ss.at_return_type(), "return type should be present");
 812     *return_type = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
 813   }
 814   return mirrors;
 815 }
 816 
 817 static objArrayHandle get_exception_types(const methodHandle& method, TRAPS) {
 818   return method->resolved_checked_exceptions(THREAD);
 819 }
 820 
 821 static Handle new_type(Symbol* signature, Klass* k, TRAPS) {
 822   // Basic types
 823   BasicType type = vmSymbols::signature_type(signature);
 824   if (type != T_OBJECT) {
 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)) {
 835     trace_class_resolution(result);
 836   }
 837 


1035     value->z = (jboolean) (value->i & 1);
1036     return;
1037   case T_BYTE:
1038     value->b = (jbyte)value->i;
1039     return;
1040   case T_CHAR:
1041     value->c = (jchar)value->i;
1042     return;
1043   case T_SHORT:
1044     value->s = (jshort)value->i;
1045     return;
1046   default:
1047     break; // fail
1048   }
1049   THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch");
1050 }
1051 
1052 
1053 // Method call (shared by invoke_method and invoke_constructor)
1054 static oop invoke(InstanceKlass* klass,
1055                   const methodHandle& reflected_method,
1056                   Handle receiver,
1057                   bool override,
1058                   objArrayHandle ptypes,
1059                   BasicType rtype,
1060                   objArrayHandle args,
1061                   bool is_method_invoke,
1062                   TRAPS) {
1063 
1064   ResourceMark rm(THREAD);
1065 
1066   methodHandle method;      // actual method to invoke
1067   Klass* target_klass;      // target klass, receiver's klass for non-static
1068 
1069   // Ensure klass is initialized
1070   klass->initialize(CHECK_NULL);
1071 
1072   bool is_static = reflected_method->is_static();
1073   if (is_static) {
1074     // ignore receiver argument
1075     method = reflected_method;


< prev index next >