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;
|