< prev index next >

src/hotspot/share/runtime/reflection.cpp

Print this page
rev 55127 : 8223351: [lworld] Primary mirror and nullable mirror for inline type
Reviewed-by: tbd


 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;


< prev index next >