hotspot/src/share/vm/runtime/reflection.cpp
changeset 8076 96d498ec7ae1
parent 7397 5b173b4ca846
child 8725 8c1e3dd5fe1b
equal deleted inserted replaced
8075:582dd25571b2 8076:96d498ec7ae1
    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