< prev index next >

src/hotspot/share/runtime/reflection.cpp

Print this page
rev 50282 : 8203881: Print errornous size in NegativeArraySizeException


 320   if (type == T_VOID) {
 321     THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 322   }
 323   else {
 324     return Universe::typeArrayKlassObj(type);
 325   }
 326 }
 327 
 328 #ifdef ASSERT
 329 static oop basic_type_arrayklass_to_mirror(Klass* basic_type_arrayklass, TRAPS) {
 330   BasicType type = TypeArrayKlass::cast(basic_type_arrayklass)->element_type();
 331   return Universe::java_mirror(type);
 332 }
 333 #endif
 334 
 335 arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
 336   if (element_mirror == NULL) {
 337     THROW_0(vmSymbols::java_lang_NullPointerException());
 338   }
 339   if (length < 0) {
 340     THROW_0(vmSymbols::java_lang_NegativeArraySizeException());



 341   }
 342   if (java_lang_Class::is_primitive(element_mirror)) {
 343     Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
 344     return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
 345   } else {
 346     Klass* k = java_lang_Class::as_Klass(element_mirror);
 347     if (k->is_array_klass() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
 348       THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 349     }
 350     return oopFactory::new_objArray(k, length, THREAD);
 351   }
 352 }
 353 
 354 
 355 arrayOop Reflection::reflect_new_multi_array(oop element_mirror, typeArrayOop dim_array, TRAPS) {
 356   assert(dim_array->is_typeArray(), "just checking");
 357   assert(TypeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
 358 
 359   if (element_mirror == NULL) {
 360     THROW_0(vmSymbols::java_lang_NullPointerException());
 361   }
 362 
 363   int len = dim_array->length();
 364   if (len <= 0 || len > MAX_DIM) {
 365     THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 366   }
 367 
 368   jint dimensions[MAX_DIM];   // C array copy of intArrayOop
 369   for (int i = 0; i < len; i++) {
 370     int d = dim_array->int_at(i);
 371     if (d < 0) {
 372       THROW_0(vmSymbols::java_lang_NegativeArraySizeException());



 373     }
 374     dimensions[i] = d;
 375   }
 376 
 377   Klass* klass;
 378   int dim = len;
 379   if (java_lang_Class::is_primitive(element_mirror)) {
 380     klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
 381   } else {
 382     klass = java_lang_Class::as_Klass(element_mirror);
 383     if (klass->is_array_klass()) {
 384       int k_dim = ArrayKlass::cast(klass)->dimension();
 385       if (k_dim + len > MAX_DIM) {
 386         THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 387       }
 388       dim += k_dim;
 389     }
 390   }
 391   klass = klass->array_klass(dim, CHECK_NULL);
 392   oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, CHECK_NULL);




 320   if (type == T_VOID) {
 321     THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 322   }
 323   else {
 324     return Universe::typeArrayKlassObj(type);
 325   }
 326 }
 327 
 328 #ifdef ASSERT
 329 static oop basic_type_arrayklass_to_mirror(Klass* basic_type_arrayklass, TRAPS) {
 330   BasicType type = TypeArrayKlass::cast(basic_type_arrayklass)->element_type();
 331   return Universe::java_mirror(type);
 332 }
 333 #endif
 334 
 335 arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
 336   if (element_mirror == NULL) {
 337     THROW_0(vmSymbols::java_lang_NullPointerException());
 338   }
 339   if (length < 0) {
 340     ResourceMark rm(THREAD);
 341     stringStream ss;
 342     ss.print("%d", length);
 343     THROW_MSG_0(vmSymbols::java_lang_NegativeArraySizeException(), ss.as_string());
 344   }
 345   if (java_lang_Class::is_primitive(element_mirror)) {
 346     Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
 347     return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
 348   } else {
 349     Klass* k = java_lang_Class::as_Klass(element_mirror);
 350     if (k->is_array_klass() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
 351       THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 352     }
 353     return oopFactory::new_objArray(k, length, THREAD);
 354   }
 355 }
 356 
 357 
 358 arrayOop Reflection::reflect_new_multi_array(oop element_mirror, typeArrayOop dim_array, TRAPS) {
 359   assert(dim_array->is_typeArray(), "just checking");
 360   assert(TypeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
 361 
 362   if (element_mirror == NULL) {
 363     THROW_0(vmSymbols::java_lang_NullPointerException());
 364   }
 365 
 366   int len = dim_array->length();
 367   if (len <= 0 || len > MAX_DIM) {
 368     THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 369   }
 370 
 371   jint dimensions[MAX_DIM];   // C array copy of intArrayOop
 372   for (int i = 0; i < len; i++) {
 373     int d = dim_array->int_at(i);
 374     if (d < 0) {
 375       ResourceMark rm(THREAD);
 376       stringStream ss;
 377       ss.print("%d", d);
 378       THROW_MSG_0(vmSymbols::java_lang_NegativeArraySizeException(), ss.as_string());
 379     }
 380     dimensions[i] = d;
 381   }
 382 
 383   Klass* klass;
 384   int dim = len;
 385   if (java_lang_Class::is_primitive(element_mirror)) {
 386     klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
 387   } else {
 388     klass = java_lang_Class::as_Klass(element_mirror);
 389     if (klass->is_array_klass()) {
 390       int k_dim = ArrayKlass::cast(klass)->dimension();
 391       if (k_dim + len > MAX_DIM) {
 392         THROW_0(vmSymbols::java_lang_IllegalArgumentException());
 393       }
 394       dim += k_dim;
 395     }
 396   }
 397   klass = klass->array_klass(dim, CHECK_NULL);
 398   oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, CHECK_NULL);


< prev index next >