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);
|