327 else {
328 return Universe::typeArrayKlassObj(type);
329 }
330 }
331
332 arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
333 if (element_mirror == NULL) {
334 THROW_0(vmSymbols::java_lang_NullPointerException());
335 }
336 if (length < 0) {
337 THROW_MSG_0(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
338 }
339 if (java_lang_Class::is_primitive(element_mirror)) {
340 Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
341 return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
342 } else {
343 Klass* k = java_lang_Class::as_Klass(element_mirror);
344 if (k->is_array_klass() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
345 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
346 }
347 if (java_lang_Class::is_box_type(element_mirror)) {
348 return oopFactory::new_objArray(k, length, THREAD);
349 } else {
350 return oopFactory::new_valueArray(k, length, THREAD);
351 }
352 }
353 }
354
355
356 arrayOop Reflection::reflect_new_multi_array(oop element_mirror, typeArrayOop dim_array, TRAPS) {
357 assert(dim_array->is_typeArray(), "just checking");
358 assert(TypeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
359
360 if (element_mirror == NULL) {
361 THROW_0(vmSymbols::java_lang_NullPointerException());
362 }
363
364 int len = dim_array->length();
365 if (len <= 0 || len > MAX_DIM) {
366 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
367 }
743 if (i == inner) {
744 return;
745 }
746 }
747 }
748
749 // 'inner' not declared as an inner klass in outer
750 ResourceMark rm(THREAD);
751 Exceptions::fthrow(
752 THREAD_AND_LOCATION,
753 vmSymbols::java_lang_IncompatibleClassChangeError(),
754 "%s and %s disagree on InnerClasses attribute",
755 outer->external_name(),
756 inner->external_name()
757 );
758 }
759
760 // Returns Q-mirror if qtype_if_value is true and k is a ValueKlass;
761 // otherwise returns java_mirror or L-mirror for ValueKlass
762 static oop java_mirror(Klass* k, jboolean qtype_if_value) {
763 if (qtype_if_value && k->is_value()) {
764 ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(k));
765 return vk->value_mirror();
766 } else {
767 return k->java_mirror();
768 }
769 }
770
771 // Utility method converting a single SignatureStream element into java.lang.Class instance
772 static oop get_mirror_from_signature(const methodHandle& method,
773 SignatureStream* ss,
774 TRAPS) {
775
776 BasicType bt = ss->type();
777 if (T_OBJECT == bt || T_ARRAY == bt || T_VALUETYPE == bt) {
778 Symbol* name = ss->as_symbol(CHECK_NULL);
779 oop loader = method->method_holder()->class_loader();
780 oop protection_domain = method->method_holder()->protection_domain();
781 const Klass* k = SystemDictionary::resolve_or_fail(name,
782 Handle(THREAD, loader),
783 Handle(THREAD, protection_domain),
784 true,
785 CHECK_NULL);
935 return ch();
936 }
937
938
939 oop Reflection::new_field(fieldDescriptor* fd, TRAPS) {
940 Symbol* field_name = fd->name();
941 oop name_oop = StringTable::intern(field_name, CHECK_NULL);
942 Handle name = Handle(THREAD, name_oop);
943 Symbol* signature = fd->signature();
944 InstanceKlass* holder = fd->field_holder();
945 Handle type = new_type(signature, holder, CHECK_NULL);
946 Handle rh = java_lang_reflect_Field::create(CHECK_NULL);
947
948 java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror());
949 java_lang_reflect_Field::set_slot(rh(), fd->index());
950 java_lang_reflect_Field::set_name(rh(), name());
951 java_lang_reflect_Field::set_type(rh(), type());
952 // Note the ACC_ANNOTATION bit, which is a per-class access flag, is never set here.
953 int modifiers = fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS;
954 if (fd->is_flattenable()) {
955 modifiers |= JVM_ACC_FLATTENABLE;
956 }
957 if (fd->is_flattened()) {
958 modifiers |= JVM_ACC_FIELD_FLATTENED;
959 }
960 java_lang_reflect_Field::set_modifiers(rh(), modifiers);
961 java_lang_reflect_Field::set_override(rh(), false);
962 if (fd->has_generic_signature()) {
963 Symbol* gs = fd->generic_signature();
964 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
965 java_lang_reflect_Field::set_signature(rh(), sig());
966 }
967 typeArrayOop an_oop = Annotations::make_java_array(fd->annotations(), CHECK_NULL);
968 java_lang_reflect_Field::set_annotations(rh(), an_oop);
969 return rh();
970 }
971
972 oop Reflection::new_parameter(Handle method, int index, Symbol* sym,
973 int flags, TRAPS) {
974
975 Handle rh = java_lang_reflect_Parameter::create(CHECK_NULL);
1215 if (rtype == T_BOOLEAN || rtype == T_BYTE || rtype == T_CHAR || rtype == T_SHORT) {
1216 narrow((jvalue*)result.get_value_addr(), rtype, CHECK_NULL);
1217 }
1218 return Reflection::box((jvalue*)result.get_value_addr(), rtype, THREAD);
1219 }
1220 }
1221
1222 // This would be nicer if, say, java.lang.reflect.Method was a subclass
1223 // of java.lang.reflect.Constructor
1224
1225 oop Reflection::invoke_method(oop method_mirror, Handle receiver, objArrayHandle args, TRAPS) {
1226 oop mirror = java_lang_reflect_Method::clazz(method_mirror);
1227 int slot = java_lang_reflect_Method::slot(method_mirror);
1228 bool override = java_lang_reflect_Method::override(method_mirror) != 0;
1229 objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Method::parameter_types(method_mirror)));
1230
1231 oop return_type_mirror = java_lang_reflect_Method::return_type(method_mirror);
1232 BasicType rtype;
1233 if (java_lang_Class::is_primitive(return_type_mirror)) {
1234 rtype = basic_type_mirror_to_basic_type(return_type_mirror, CHECK_NULL);
1235 } else if (java_lang_Class::value_mirror(return_type_mirror) == return_type_mirror) {
1236 rtype = T_VALUETYPE;
1237 } else {
1238 rtype = T_OBJECT;
1239 }
1240
1241 InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
1242 Method* m = klass->method_with_idnum(slot);
1243 if (m == NULL) {
1244 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
1245 }
1246 methodHandle method(THREAD, m);
1247
1248 return invoke(klass, method, receiver, override, ptypes, rtype, args, true, THREAD);
1249 }
1250
1251
1252 oop Reflection::invoke_constructor(oop constructor_mirror, objArrayHandle args, TRAPS) {
1253 oop mirror = java_lang_reflect_Constructor::clazz(constructor_mirror);
1254 int slot = java_lang_reflect_Constructor::slot(constructor_mirror);
1255 bool override = java_lang_reflect_Constructor::override(constructor_mirror) != 0;
|
327 else {
328 return Universe::typeArrayKlassObj(type);
329 }
330 }
331
332 arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
333 if (element_mirror == NULL) {
334 THROW_0(vmSymbols::java_lang_NullPointerException());
335 }
336 if (length < 0) {
337 THROW_MSG_0(vmSymbols::java_lang_NegativeArraySizeException(), err_msg("%d", length));
338 }
339 if (java_lang_Class::is_primitive(element_mirror)) {
340 Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
341 return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
342 } else {
343 Klass* k = java_lang_Class::as_Klass(element_mirror);
344 if (k->is_array_klass() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
345 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
346 }
347 if (java_lang_Class::is_nullable_type(element_mirror)) {
348 return oopFactory::new_objArray(k, length, THREAD);
349 } else {
350 return oopFactory::new_valueArray(k, length, THREAD);
351 }
352 }
353 }
354
355
356 arrayOop Reflection::reflect_new_multi_array(oop element_mirror, typeArrayOop dim_array, TRAPS) {
357 assert(dim_array->is_typeArray(), "just checking");
358 assert(TypeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
359
360 if (element_mirror == NULL) {
361 THROW_0(vmSymbols::java_lang_NullPointerException());
362 }
363
364 int len = dim_array->length();
365 if (len <= 0 || len > MAX_DIM) {
366 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
367 }
743 if (i == inner) {
744 return;
745 }
746 }
747 }
748
749 // 'inner' not declared as an inner klass in outer
750 ResourceMark rm(THREAD);
751 Exceptions::fthrow(
752 THREAD_AND_LOCATION,
753 vmSymbols::java_lang_IncompatibleClassChangeError(),
754 "%s and %s disagree on InnerClasses attribute",
755 outer->external_name(),
756 inner->external_name()
757 );
758 }
759
760 // Returns Q-mirror if qtype_if_value is true and k is a ValueKlass;
761 // otherwise returns java_mirror or L-mirror for ValueKlass
762 static oop java_mirror(Klass* k, jboolean qtype_if_value) {
763 if (k->is_value()) {
764 ValueKlass* vk = ValueKlass::cast(InstanceKlass::cast(k));
765 return qtype_if_value ? vk->value_mirror() : vk->nullable_mirror();
766 } else {
767 return k->java_mirror();
768 }
769 }
770
771 // Utility method converting a single SignatureStream element into java.lang.Class instance
772 static oop get_mirror_from_signature(const methodHandle& method,
773 SignatureStream* ss,
774 TRAPS) {
775
776 BasicType bt = ss->type();
777 if (T_OBJECT == bt || T_ARRAY == bt || T_VALUETYPE == bt) {
778 Symbol* name = ss->as_symbol(CHECK_NULL);
779 oop loader = method->method_holder()->class_loader();
780 oop protection_domain = method->method_holder()->protection_domain();
781 const Klass* k = SystemDictionary::resolve_or_fail(name,
782 Handle(THREAD, loader),
783 Handle(THREAD, protection_domain),
784 true,
785 CHECK_NULL);
935 return ch();
936 }
937
938
939 oop Reflection::new_field(fieldDescriptor* fd, TRAPS) {
940 Symbol* field_name = fd->name();
941 oop name_oop = StringTable::intern(field_name, CHECK_NULL);
942 Handle name = Handle(THREAD, name_oop);
943 Symbol* signature = fd->signature();
944 InstanceKlass* holder = fd->field_holder();
945 Handle type = new_type(signature, holder, CHECK_NULL);
946 Handle rh = java_lang_reflect_Field::create(CHECK_NULL);
947
948 java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror());
949 java_lang_reflect_Field::set_slot(rh(), fd->index());
950 java_lang_reflect_Field::set_name(rh(), name());
951 java_lang_reflect_Field::set_type(rh(), type());
952 // Note the ACC_ANNOTATION bit, which is a per-class access flag, is never set here.
953 int modifiers = fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS;
954 if (fd->is_flattenable()) {
955 modifiers |= JVM_ACC_FIELD_FLATTENABLE;
956 // JVM_ACC_FLATTENABLE should not be set in LWorld. set_is_flattenable should be re-examined.
957 modifiers &= ~JVM_ACC_FLATTENABLE;
958 }
959 if (fd->is_flattened()) {
960 modifiers |= JVM_ACC_FIELD_FLATTENED;
961 }
962 java_lang_reflect_Field::set_modifiers(rh(), modifiers);
963 java_lang_reflect_Field::set_override(rh(), false);
964 if (fd->has_generic_signature()) {
965 Symbol* gs = fd->generic_signature();
966 Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
967 java_lang_reflect_Field::set_signature(rh(), sig());
968 }
969 typeArrayOop an_oop = Annotations::make_java_array(fd->annotations(), CHECK_NULL);
970 java_lang_reflect_Field::set_annotations(rh(), an_oop);
971 return rh();
972 }
973
974 oop Reflection::new_parameter(Handle method, int index, Symbol* sym,
975 int flags, TRAPS) {
976
977 Handle rh = java_lang_reflect_Parameter::create(CHECK_NULL);
1217 if (rtype == T_BOOLEAN || rtype == T_BYTE || rtype == T_CHAR || rtype == T_SHORT) {
1218 narrow((jvalue*)result.get_value_addr(), rtype, CHECK_NULL);
1219 }
1220 return Reflection::box((jvalue*)result.get_value_addr(), rtype, THREAD);
1221 }
1222 }
1223
1224 // This would be nicer if, say, java.lang.reflect.Method was a subclass
1225 // of java.lang.reflect.Constructor
1226
1227 oop Reflection::invoke_method(oop method_mirror, Handle receiver, objArrayHandle args, TRAPS) {
1228 oop mirror = java_lang_reflect_Method::clazz(method_mirror);
1229 int slot = java_lang_reflect_Method::slot(method_mirror);
1230 bool override = java_lang_reflect_Method::override(method_mirror) != 0;
1231 objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Method::parameter_types(method_mirror)));
1232
1233 oop return_type_mirror = java_lang_reflect_Method::return_type(method_mirror);
1234 BasicType rtype;
1235 if (java_lang_Class::is_primitive(return_type_mirror)) {
1236 rtype = basic_type_mirror_to_basic_type(return_type_mirror, CHECK_NULL);
1237 } else if (java_lang_Class::inline_type_mirror(return_type_mirror) == return_type_mirror) {
1238 rtype = T_VALUETYPE;
1239 } else {
1240 rtype = T_OBJECT;
1241 }
1242
1243 InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
1244 Method* m = klass->method_with_idnum(slot);
1245 if (m == NULL) {
1246 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
1247 }
1248 methodHandle method(THREAD, m);
1249
1250 return invoke(klass, method, receiver, override, ptypes, rtype, args, true, THREAD);
1251 }
1252
1253
1254 oop Reflection::invoke_constructor(oop constructor_mirror, objArrayHandle args, TRAPS) {
1255 oop mirror = java_lang_reflect_Constructor::clazz(constructor_mirror);
1256 int slot = java_lang_reflect_Constructor::slot(constructor_mirror);
1257 bool override = java_lang_reflect_Constructor::override(constructor_mirror) != 0;
|