comparison src/share/vm/runtime/reflection.cpp @ 2177:3582bf76420e

6990754: Use native memory and reference counting to implement SymbolTable Summary: move symbols from permgen into C heap and reference count them Reviewed-by: never, acorn, jmasa, stefank
author coleenp
date Thu, 27 Jan 2011 16:11:27 -0800
parents f95d63e2154a
children c7f3d0b4570f
comparison
equal deleted inserted replaced
2176:27e4ea99855d 2177:3582bf76420e
62 } 62 }
63 if (!vfst.at_end()) { 63 if (!vfst.at_end()) {
64 // this frame is a likely suspect 64 // this frame is a likely suspect
65 caller = vfst.method()->method_holder(); 65 caller = vfst.method()->method_holder();
66 line_number = vfst.method()->line_number_from_bci(vfst.bci()); 66 line_number = vfst.method()->line_number_from_bci(vfst.bci());
67 symbolOop s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name(); 67 Symbol* s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name();
68 if (s != NULL) { 68 if (s != NULL) {
69 source_file = s->as_C_string(); 69 source_file = s->as_C_string();
70 } 70 }
71 } 71 }
72 } 72 }
620 620
621 // 'inner' not declared as an inner klass in outer 621 // 'inner' not declared as an inner klass in outer
622 ResourceMark rm(THREAD); 622 ResourceMark rm(THREAD);
623 Exceptions::fthrow( 623 Exceptions::fthrow(
624 THREAD_AND_LOCATION, 624 THREAD_AND_LOCATION,
625 vmSymbolHandles::java_lang_IncompatibleClassChangeError(), 625 vmSymbols::java_lang_IncompatibleClassChangeError(),
626 "%s and %s disagree on InnerClasses attribute", 626 "%s and %s disagree on InnerClasses attribute",
627 outer->external_name(), 627 outer->external_name(),
628 inner->external_name() 628 inner->external_name()
629 ); 629 );
630 } 630 }
636 default: 636 default:
637 assert(ss->type() != T_VOID || ss->at_return_type(), "T_VOID should only appear as return type"); 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()); 638 return java_lang_Class::primitive_mirror(ss->type());
639 case T_OBJECT: 639 case T_OBJECT:
640 case T_ARRAY: 640 case T_ARRAY:
641 symbolOop name = ss->as_symbol(CHECK_NULL); 641 Symbol* name = ss->as_symbol(CHECK_NULL);
642 oop loader = instanceKlass::cast(method->method_holder())->class_loader(); 642 oop loader = instanceKlass::cast(method->method_holder())->class_loader();
643 oop protection_domain = instanceKlass::cast(method->method_holder())->protection_domain(); 643 oop protection_domain = instanceKlass::cast(method->method_holder())->protection_domain();
644 klassOop k = SystemDictionary::resolve_or_fail( 644 klassOop k = SystemDictionary::resolve_or_fail(
645 symbolHandle(THREAD, name), 645 name,
646 Handle(THREAD, loader), 646 Handle(THREAD, loader),
647 Handle(THREAD, protection_domain), 647 Handle(THREAD, protection_domain),
648 true, CHECK_NULL); 648 true, CHECK_NULL);
649 if (TraceClassResolution) { 649 if (TraceClassResolution) {
650 trace_class_resolution(k); 650 trace_class_resolution(k);
658 // Allocate array holding parameter types (java.lang.Class instances) 658 // Allocate array holding parameter types (java.lang.Class instances)
659 objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle())); 659 objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
660 objArrayHandle mirrors (THREAD, m); 660 objArrayHandle mirrors (THREAD, m);
661 int index = 0; 661 int index = 0;
662 // Collect parameter types 662 // Collect parameter types
663 symbolHandle signature (THREAD, method->signature()); 663 ResourceMark rm(THREAD);
664 Symbol* signature = method->signature();
664 SignatureStream ss(signature); 665 SignatureStream ss(signature);
665 while (!ss.at_return_type()) { 666 while (!ss.at_return_type()) {
666 oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle())); 667 oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
667 mirrors->obj_at_put(index++, mirror); 668 mirrors->obj_at_put(index++, mirror);
668 ss.next(); 669 ss.next();
679 objArrayHandle Reflection::get_exception_types(methodHandle method, TRAPS) { 680 objArrayHandle Reflection::get_exception_types(methodHandle method, TRAPS) {
680 return method->resolved_checked_exceptions(CHECK_(objArrayHandle())); 681 return method->resolved_checked_exceptions(CHECK_(objArrayHandle()));
681 } 682 }
682 683
683 684
684 Handle Reflection::new_type(symbolHandle signature, KlassHandle k, TRAPS) { 685 Handle Reflection::new_type(Symbol* signature, KlassHandle k, TRAPS) {
685 // Basic types 686 // Basic types
686 BasicType type = vmSymbols::signature_type(signature()); 687 BasicType type = vmSymbols::signature_type(signature);
687 if (type != T_OBJECT) { 688 if (type != T_OBJECT) {
688 return Handle(THREAD, Universe::java_mirror(type)); 689 return Handle(THREAD, Universe::java_mirror(type));
689 } 690 }
690 691
691 oop loader = instanceKlass::cast(k())->class_loader(); 692 oop loader = instanceKlass::cast(k())->class_loader();
712 (method()->name() == vmSymbols::class_initializer_name() 713 (method()->name() == vmSymbols::class_initializer_name()
713 && Klass::cast(method()->method_holder())->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead"); 714 && Klass::cast(method()->method_holder())->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead");
714 instanceKlassHandle holder (THREAD, method->method_holder()); 715 instanceKlassHandle holder (THREAD, method->method_holder());
715 int slot = method->method_idnum(); 716 int slot = method->method_idnum();
716 717
717 symbolHandle signature (THREAD, method->signature()); 718 Symbol* signature = method->signature();
718 int parameter_count = ArgumentCount(signature).size(); 719 int parameter_count = ArgumentCount(signature).size();
719 oop return_type_oop = NULL; 720 oop return_type_oop = NULL;
720 objArrayHandle parameter_types = get_parameter_types(method, parameter_count, &return_type_oop, CHECK_NULL); 721 objArrayHandle parameter_types = get_parameter_types(method, parameter_count, &return_type_oop, CHECK_NULL);
721 if (parameter_types.is_null() || return_type_oop == NULL) return NULL; 722 if (parameter_types.is_null() || return_type_oop == NULL) return NULL;
722 723
724 725
725 objArrayHandle exception_types = get_exception_types(method, CHECK_NULL); 726 objArrayHandle exception_types = get_exception_types(method, CHECK_NULL);
726 727
727 if (exception_types.is_null()) return NULL; 728 if (exception_types.is_null()) return NULL;
728 729
729 symbolHandle method_name(THREAD, method->name()); 730 Symbol* method_name = method->name();
730 Handle name; 731 Handle name;
731 if (intern_name) { 732 if (intern_name) {
732 // intern_name is only true with UseNewReflection 733 // intern_name is only true with UseNewReflection
733 oop name_oop = StringTable::intern(method_name(), CHECK_NULL); 734 oop name_oop = StringTable::intern(method_name, CHECK_NULL);
734 name = Handle(THREAD, name_oop); 735 name = Handle(THREAD, name_oop);
735 } else { 736 } else {
736 name = java_lang_String::create_from_symbol(method_name, CHECK_NULL); 737 name = java_lang_String::create_from_symbol(method_name, CHECK_NULL);
737 } 738 }
738 if (name.is_null()) return NULL; 739 if (name == NULL) return NULL;
739 740
740 int modifiers = method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS; 741 int modifiers = method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
741 742
742 Handle mh = java_lang_reflect_Method::create(CHECK_NULL); 743 Handle mh = java_lang_reflect_Method::create(CHECK_NULL);
743 744
749 java_lang_reflect_Method::set_exception_types(mh(), exception_types()); 750 java_lang_reflect_Method::set_exception_types(mh(), exception_types());
750 java_lang_reflect_Method::set_modifiers(mh(), modifiers); 751 java_lang_reflect_Method::set_modifiers(mh(), modifiers);
751 java_lang_reflect_Method::set_override(mh(), false); 752 java_lang_reflect_Method::set_override(mh(), false);
752 if (java_lang_reflect_Method::has_signature_field() && 753 if (java_lang_reflect_Method::has_signature_field() &&
753 method->generic_signature() != NULL) { 754 method->generic_signature() != NULL) {
754 symbolHandle gs(THREAD, method->generic_signature()); 755 Symbol* gs = method->generic_signature();
755 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL); 756 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
756 java_lang_reflect_Method::set_signature(mh(), sig()); 757 java_lang_reflect_Method::set_signature(mh(), sig());
757 } 758 }
758 if (java_lang_reflect_Method::has_annotations_field()) { 759 if (java_lang_reflect_Method::has_annotations_field()) {
759 java_lang_reflect_Method::set_annotations(mh(), method->annotations()); 760 java_lang_reflect_Method::set_annotations(mh(), method->annotations());
772 assert(method()->is_initializer(), "should call new_method instead"); 773 assert(method()->is_initializer(), "should call new_method instead");
773 774
774 instanceKlassHandle holder (THREAD, method->method_holder()); 775 instanceKlassHandle holder (THREAD, method->method_holder());
775 int slot = method->method_idnum(); 776 int slot = method->method_idnum();
776 777
777 symbolHandle signature (THREAD, method->signature()); 778 Symbol* signature = method->signature();
778 int parameter_count = ArgumentCount(signature).size(); 779 int parameter_count = ArgumentCount(signature).size();
779 objArrayHandle parameter_types = get_parameter_types(method, parameter_count, NULL, CHECK_NULL); 780 objArrayHandle parameter_types = get_parameter_types(method, parameter_count, NULL, CHECK_NULL);
780 if (parameter_types.is_null()) return NULL; 781 if (parameter_types.is_null()) return NULL;
781 782
782 objArrayHandle exception_types = get_exception_types(method, CHECK_NULL); 783 objArrayHandle exception_types = get_exception_types(method, CHECK_NULL);
792 java_lang_reflect_Constructor::set_exception_types(ch(), exception_types()); 793 java_lang_reflect_Constructor::set_exception_types(ch(), exception_types());
793 java_lang_reflect_Constructor::set_modifiers(ch(), modifiers); 794 java_lang_reflect_Constructor::set_modifiers(ch(), modifiers);
794 java_lang_reflect_Constructor::set_override(ch(), false); 795 java_lang_reflect_Constructor::set_override(ch(), false);
795 if (java_lang_reflect_Constructor::has_signature_field() && 796 if (java_lang_reflect_Constructor::has_signature_field() &&
796 method->generic_signature() != NULL) { 797 method->generic_signature() != NULL) {
797 symbolHandle gs(THREAD, method->generic_signature()); 798 Symbol* gs = method->generic_signature();
798 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL); 799 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
799 java_lang_reflect_Constructor::set_signature(ch(), sig()); 800 java_lang_reflect_Constructor::set_signature(ch(), sig());
800 } 801 }
801 if (java_lang_reflect_Constructor::has_annotations_field()) { 802 if (java_lang_reflect_Constructor::has_annotations_field()) {
802 java_lang_reflect_Constructor::set_annotations(ch(), method->annotations()); 803 java_lang_reflect_Constructor::set_annotations(ch(), method->annotations());
807 return ch(); 808 return ch();
808 } 809 }
809 810
810 811
811 oop Reflection::new_field(fieldDescriptor* fd, bool intern_name, TRAPS) { 812 oop Reflection::new_field(fieldDescriptor* fd, bool intern_name, TRAPS) {
812 symbolHandle field_name(THREAD, fd->name()); 813 Symbol* field_name = fd->name();
813 Handle name; 814 Handle name;
814 if (intern_name) { 815 if (intern_name) {
815 // intern_name is only true with UseNewReflection 816 // intern_name is only true with UseNewReflection
816 oop name_oop = StringTable::intern(field_name(), CHECK_NULL); 817 oop name_oop = StringTable::intern(field_name, CHECK_NULL);
817 name = Handle(THREAD, name_oop); 818 name = Handle(THREAD, name_oop);
818 } else { 819 } else {
819 name = java_lang_String::create_from_symbol(field_name, CHECK_NULL); 820 name = java_lang_String::create_from_symbol(field_name, CHECK_NULL);
820 } 821 }
821 symbolHandle signature (THREAD, fd->signature()); 822 Symbol* signature = fd->signature();
822 KlassHandle holder (THREAD, fd->field_holder()); 823 KlassHandle holder (THREAD, fd->field_holder());
823 Handle type = new_type(signature, holder, CHECK_NULL); 824 Handle type = new_type(signature, holder, CHECK_NULL);
824 Handle rh = java_lang_reflect_Field::create(CHECK_NULL); 825 Handle rh = java_lang_reflect_Field::create(CHECK_NULL);
825 826
826 java_lang_reflect_Field::set_clazz(rh(), Klass::cast(fd->field_holder())->java_mirror()); 827 java_lang_reflect_Field::set_clazz(rh(), Klass::cast(fd->field_holder())->java_mirror());
830 // Note the ACC_ANNOTATION bit, which is a per-class access flag, is never set here. 831 // Note the ACC_ANNOTATION bit, which is a per-class access flag, is never set here.
831 java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS); 832 java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
832 java_lang_reflect_Field::set_override(rh(), false); 833 java_lang_reflect_Field::set_override(rh(), false);
833 if (java_lang_reflect_Field::has_signature_field() && 834 if (java_lang_reflect_Field::has_signature_field() &&
834 fd->generic_signature() != NULL) { 835 fd->generic_signature() != NULL) {
835 symbolHandle gs(THREAD, fd->generic_signature()); 836 Symbol* gs = fd->generic_signature();
836 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL); 837 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
837 java_lang_reflect_Field::set_signature(rh(), sig()); 838 java_lang_reflect_Field::set_signature(rh(), sig());
838 } 839 }
839 if (java_lang_reflect_Field::has_annotations_field()) { 840 if (java_lang_reflect_Field::has_annotations_field()) {
840 java_lang_reflect_Field::set_annotations(rh(), fd->annotations()); 841 java_lang_reflect_Field::set_annotations(rh(), fd->annotations());
856 methodHandle Reflection::resolve_interface_call(instanceKlassHandle klass, methodHandle method, 857 methodHandle Reflection::resolve_interface_call(instanceKlassHandle klass, methodHandle method,
857 KlassHandle recv_klass, Handle receiver, TRAPS) { 858 KlassHandle recv_klass, Handle receiver, TRAPS) {
858 assert(!method.is_null() , "method should not be null"); 859 assert(!method.is_null() , "method should not be null");
859 860
860 CallInfo info; 861 CallInfo info;
861 symbolHandle signature (THREAD, method->signature()); 862 Symbol* signature = method->signature();
862 symbolHandle name (THREAD, method->name()); 863 Symbol* name = method->name();
863 LinkResolver::resolve_interface_call(info, receiver, recv_klass, klass, 864 LinkResolver::resolve_interface_call(info, receiver, recv_klass, klass,
864 name, signature, 865 name, signature,
865 KlassHandle(), false, true, 866 KlassHandle(), false, true,
866 CHECK_(methodHandle())); 867 CHECK_(methodHandle()));
867 return info.selected_method(); 868 return info.selected_method();
910 if (HAS_PENDING_EXCEPTION) { 911 if (HAS_PENDING_EXCEPTION) {
911 // Method resolution threw an exception; wrap it in an InvocationTargetException 912 // Method resolution threw an exception; wrap it in an InvocationTargetException
912 oop resolution_exception = PENDING_EXCEPTION; 913 oop resolution_exception = PENDING_EXCEPTION;
913 CLEAR_PENDING_EXCEPTION; 914 CLEAR_PENDING_EXCEPTION;
914 JavaCallArguments args(Handle(THREAD, resolution_exception)); 915 JavaCallArguments args(Handle(THREAD, resolution_exception));
915 THROW_ARG_0(vmSymbolHandles::java_lang_reflect_InvocationTargetException(), 916 THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
916 vmSymbolHandles::throwable_void_signature(), 917 vmSymbols::throwable_void_signature(),
917 &args); 918 &args);
918 } 919 }
919 } else { 920 } else {
920 method = resolve_interface_call(klass, reflected_method, target_klass, receiver, CHECK_(NULL)); 921 method = resolve_interface_call(klass, reflected_method, target_klass, receiver, CHECK_(NULL));
921 } 922 }
939 vmSymbols::java_lang_AbstractMethodError(), 940 vmSymbols::java_lang_AbstractMethodError(),
940 methodOopDesc::name_and_sig_as_C_string(Klass::cast(target_klass()), 941 methodOopDesc::name_and_sig_as_C_string(Klass::cast(target_klass()),
941 method->name(), 942 method->name(),
942 method->signature())); 943 method->signature()));
943 JavaCallArguments args(h_origexception); 944 JavaCallArguments args(h_origexception);
944 THROW_ARG_0(vmSymbolHandles::java_lang_reflect_InvocationTargetException(), 945 THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
945 vmSymbolHandles::throwable_void_signature(), 946 vmSymbols::throwable_void_signature(),
946 &args); 947 &args);
947 } else { 948 } else {
948 ResourceMark rm(THREAD); 949 ResourceMark rm(THREAD);
949 THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(), 950 THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(),
950 methodOopDesc::name_and_sig_as_C_string(Klass::cast(target_klass()), 951 methodOopDesc::name_and_sig_as_C_string(Klass::cast(target_klass()),
1041 if (HAS_PENDING_EXCEPTION) { 1042 if (HAS_PENDING_EXCEPTION) {
1042 // Method threw an exception; wrap it in an InvocationTargetException 1043 // Method threw an exception; wrap it in an InvocationTargetException
1043 oop target_exception = PENDING_EXCEPTION; 1044 oop target_exception = PENDING_EXCEPTION;
1044 CLEAR_PENDING_EXCEPTION; 1045 CLEAR_PENDING_EXCEPTION;
1045 JavaCallArguments args(Handle(THREAD, target_exception)); 1046 JavaCallArguments args(Handle(THREAD, target_exception));
1046 THROW_ARG_0(vmSymbolHandles::java_lang_reflect_InvocationTargetException(), 1047 THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
1047 vmSymbolHandles::throwable_void_signature(), 1048 vmSymbols::throwable_void_signature(),
1048 &args); 1049 &args);
1049 } else { 1050 } else {
1050 if (rtype == T_BOOLEAN || rtype == T_BYTE || rtype == T_CHAR || rtype == T_SHORT) 1051 if (rtype == T_BOOLEAN || rtype == T_BYTE || rtype == T_CHAR || rtype == T_SHORT)
1051 narrow((jvalue*) result.get_value_addr(), rtype, CHECK_NULL); 1052 narrow((jvalue*) result.get_value_addr(), rtype, CHECK_NULL);
1052 return box((jvalue*) result.get_value_addr(), rtype, CHECK_NULL); 1053 return box((jvalue*) result.get_value_addr(), rtype, CHECK_NULL);
1095 return true; 1096 return true;
1096 } 1097 }
1097 1098
1098 1099
1099 oop Reflection::new_field(FieldStream* st, TRAPS) { 1100 oop Reflection::new_field(FieldStream* st, TRAPS) {
1100 symbolHandle field_name(THREAD, st->name()); 1101 Symbol* field_name = st->name();
1101 Handle name = java_lang_String::create_from_symbol(field_name, CHECK_NULL); 1102 Handle name = java_lang_String::create_from_symbol(field_name, CHECK_NULL);
1102 symbolHandle signature(THREAD, st->signature()); 1103 Symbol* signature = st->signature();
1103 Handle type = new_type(signature, st->klass(), CHECK_NULL); 1104 Handle type = new_type(signature, st->klass(), CHECK_NULL);
1104 Handle rh = java_lang_reflect_Field::create(CHECK_NULL); 1105 Handle rh = java_lang_reflect_Field::create(CHECK_NULL);
1105 oop result = rh(); 1106 oop result = rh();
1106 1107
1107 java_lang_reflect_Field::set_clazz(result, st->klass()->java_mirror()); 1108 java_lang_reflect_Field::set_clazz(result, st->klass()->java_mirror());
1240 break; 1241 break;
1241 case T_OBJECT: 1242 case T_OBJECT:
1242 case T_ARRAY: { 1243 case T_ARRAY: {
1243 Handle obj(THREAD, (oop) value->l); 1244 Handle obj(THREAD, (oop) value->l);
1244 if (obj.not_null()) { 1245 if (obj.not_null()) {
1245 symbolHandle signature(THREAD, fd->signature()); 1246 Symbol* signature = fd->signature();
1246 Handle loader (THREAD, fd->loader()); 1247 Handle loader (THREAD, fd->loader());
1247 Handle protect (THREAD, Klass::cast(fd->field_holder())->protection_domain()); 1248 Handle protect (THREAD, Klass::cast(fd->field_holder())->protection_domain());
1248 klassOop k = SystemDictionary::resolve_or_fail(signature, loader, protect, true, CHECK); // may block 1249 klassOop k = SystemDictionary::resolve_or_fail(signature, loader, protect, true, CHECK); // may block
1249 if (!obj->is_a(k)) { 1250 if (!obj->is_a(k)) {
1250 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "field type mismatch"); 1251 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "field type mismatch");
1257 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "field type mismatch"); 1258 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "field type mismatch");
1258 } 1259 }
1259 } 1260 }
1260 1261
1261 1262
1262 oop Reflection::reflect_field(oop mirror, symbolOop field_name, jint which, TRAPS) { 1263 oop Reflection::reflect_field(oop mirror, Symbol* field_name, jint which, TRAPS) {
1263 // Exclude primitive types and array types 1264 // Exclude primitive types and array types
1264 if (java_lang_Class::is_primitive(mirror)) return NULL; 1265 if (java_lang_Class::is_primitive(mirror)) return NULL;
1265 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) return NULL; 1266 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) return NULL;
1266 1267
1267 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(mirror)); 1268 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(mirror));
1285 1286
1286 objArrayOop Reflection::reflect_fields(oop mirror, jint which, TRAPS) { 1287 objArrayOop Reflection::reflect_fields(oop mirror, jint which, TRAPS) {
1287 // Exclude primitive types and array types 1288 // Exclude primitive types and array types
1288 if (java_lang_Class::is_primitive(mirror) 1289 if (java_lang_Class::is_primitive(mirror)
1289 || Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { 1290 || Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) {
1290 symbolHandle name = vmSymbolHandles::java_lang_reflect_Field(); 1291 Symbol* name = vmSymbols::java_lang_reflect_Field();
1291 klassOop klass = SystemDictionary::resolve_or_fail(name, true, CHECK_NULL); 1292 klassOop klass = SystemDictionary::resolve_or_fail(name, true, CHECK_NULL);
1292 return oopFactory::new_objArray(klass, 0, CHECK_NULL); // Return empty array 1293 return oopFactory::new_objArray(klass, 0, CHECK_NULL); // Return empty array
1293 } 1294 }
1294 1295
1295 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(mirror)); 1296 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(mirror));
1306 } 1307 }
1307 } 1308 }
1308 } 1309 }
1309 1310
1310 // Allocate result 1311 // Allocate result
1311 symbolHandle name = vmSymbolHandles::java_lang_reflect_Field(); 1312 Symbol* name = vmSymbols::java_lang_reflect_Field();
1312 klassOop klass = SystemDictionary::resolve_or_fail(name, true, CHECK_NULL); 1313 klassOop klass = SystemDictionary::resolve_or_fail(name, true, CHECK_NULL);
1313 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); 1314 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL);
1314 objArrayHandle result (THREAD, r); 1315 objArrayHandle result (THREAD, r);
1315 1316
1316 // Fill in results backwards 1317 // Fill in results backwards
1325 } 1326 }
1326 return result(); 1327 return result();
1327 } 1328 }
1328 1329
1329 1330
1330 oop Reflection::reflect_method(oop mirror, symbolHandle method_name, objArrayHandle types, jint which, TRAPS) { 1331 oop Reflection::reflect_method(oop mirror, Symbol* method_name, objArrayHandle types, jint which, TRAPS) {
1331 if (java_lang_Class::is_primitive(mirror)) return NULL; 1332 if (java_lang_Class::is_primitive(mirror)) return NULL;
1332 klassOop klass = java_lang_Class::as_klassOop(mirror); 1333 klassOop klass = java_lang_Class::as_klassOop(mirror);
1333 if (Klass::cast(klass)->oop_is_array() && which == MEMBER_DECLARED) return NULL; 1334 if (Klass::cast(klass)->oop_is_array() && which == MEMBER_DECLARED) return NULL;
1334 1335
1335 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { 1336 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) {
1349 // Note that we can ignore checks for overridden methods, since we go up the hierarchy. 1350 // Note that we can ignore checks for overridden methods, since we go up the hierarchy.
1350 { 1351 {
1351 for (MethodStream st(h_k, false, false); !st.eos(); st.next()) { 1352 for (MethodStream st(h_k, false, false); !st.eos(); st.next()) {
1352 methodHandle m(THREAD, st.method()); 1353 methodHandle m(THREAD, st.method());
1353 // For interfaces include static initializers since classic does that! 1354 // For interfaces include static initializers since classic does that!
1354 if (method_name() == m->name() && (include_clinit || (m->is_public() && !m->is_static() && !m->is_initializer()))) { 1355 if (method_name == m->name() && (include_clinit || (m->is_public() && !m->is_static() && !m->is_initializer()))) {
1355 symbolHandle signature(THREAD, m->signature()); 1356 Symbol* signature = m->signature();
1356 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL); 1357 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL);
1357 if (parameter_match) { 1358 if (parameter_match) {
1358 return new_method(m, false, false, THREAD); 1359 return new_method(m, false, false, THREAD);
1359 } 1360 }
1360 } 1361 }
1362 } 1363 }
1363 // Then the public static methods (works if method holder is an interface) 1364 // Then the public static methods (works if method holder is an interface)
1364 { 1365 {
1365 for (MethodStream st(h_k, false, false); !st.eos(); st.next()) { 1366 for (MethodStream st(h_k, false, false); !st.eos(); st.next()) {
1366 methodHandle m(THREAD, st.method()); 1367 methodHandle m(THREAD, st.method());
1367 if (method_name() == m->name() && m->is_public() && m->is_static() && !m->is_initializer()) { 1368 if (method_name == m->name() && m->is_public() && m->is_static() && !m->is_initializer()) {
1368 symbolHandle signature(THREAD, m->signature()); 1369 Symbol* signature = m->signature();
1369 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL); 1370 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL);
1370 if (parameter_match) { 1371 if (parameter_match) {
1371 return new_method(m, false, false, THREAD); 1372 return new_method(m, false, false, THREAD);
1372 } 1373 }
1373 } 1374 }
1377 case MEMBER_DECLARED: 1378 case MEMBER_DECLARED:
1378 // All local methods 1379 // All local methods
1379 { 1380 {
1380 for (MethodStream st(h_k, true, true); !st.eos(); st.next()) { 1381 for (MethodStream st(h_k, true, true); !st.eos(); st.next()) {
1381 methodHandle m(THREAD, st.method()); 1382 methodHandle m(THREAD, st.method());
1382 if (method_name() == m->name() && !m->is_initializer()) { 1383 if (method_name == m->name() && !m->is_initializer()) {
1383 symbolHandle signature(THREAD, m->signature()); 1384 Symbol* signature = m->signature();
1384 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL); 1385 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL);
1385 if (parameter_match) { 1386 if (parameter_match) {
1386 return new_method(m, false, false, THREAD); 1387 return new_method(m, false, false, THREAD);
1387 } 1388 }
1388 } 1389 }
1529 1530
1530 bool local_only = (which == MEMBER_DECLARED); 1531 bool local_only = (which == MEMBER_DECLARED);
1531 for (MethodStream st(h_k, true, true); !st.eos(); st.next()) { 1532 for (MethodStream st(h_k, true, true); !st.eos(); st.next()) {
1532 methodHandle m(THREAD, st.method()); 1533 methodHandle m(THREAD, st.method());
1533 if (m->name() == vmSymbols::object_initializer_name() && (local_only || m->is_public())) { 1534 if (m->name() == vmSymbols::object_initializer_name() && (local_only || m->is_public())) {
1534 symbolHandle signature(THREAD, m->signature()); 1535 Symbol* signature = m->signature();
1535 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL); 1536 bool parameter_match = match_parameter_types(m, types, ArgumentCount(signature).size(), CHECK_NULL);
1536 if (parameter_match) { 1537 if (parameter_match) {
1537 return new_constructor(m, THREAD); 1538 return new_constructor(m, THREAD);
1538 } 1539 }
1539 } 1540 }
1567 } 1568 }
1568 } 1569 }
1569 } 1570 }
1570 1571
1571 // Allocate result 1572 // Allocate result
1572 symbolHandle name = vmSymbolHandles::java_lang_reflect_Constructor(); 1573 Symbol* name = vmSymbols::java_lang_reflect_Constructor();
1573 klassOop klass = SystemDictionary::resolve_or_fail(name, true, CHECK_NULL); 1574 klassOop klass = SystemDictionary::resolve_or_fail(name, true, CHECK_NULL);
1574 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); 1575 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL);
1575 objArrayHandle h_result (THREAD, r); 1576 objArrayHandle h_result (THREAD, r);
1576 1577
1577 // Fill in results backwards 1578 // Fill in results backwards