@@ -1056,46 +1056,48 @@ class CompileReplay : public StackObj {
10561056 int length = parse_int (" array length" );
10571057 oop value = nullptr ;
10581058
1059- if (field_signature[1 ] == JVM_SIGNATURE_ARRAY) {
1060- // multi dimensional array
1061- ArrayKlass* kelem = (ArrayKlass *)parse_klass (CHECK);
1062- if (kelem == nullptr ) {
1063- return ;
1064- }
1065- int rank = 0 ;
1066- while (field_signature[rank] == JVM_SIGNATURE_ARRAY) {
1067- rank++;
1068- }
1069- jint* dims = NEW_RESOURCE_ARRAY (jint, rank);
1070- dims[0 ] = length;
1071- for (int i = 1 ; i < rank; i++) {
1072- dims[i] = 1 ; // These aren't relevant to the compiler
1073- }
1074- value = kelem->multi_allocate (rank, dims, CHECK);
1075- } else {
1076- if (strcmp (field_signature, " [B" ) == 0 ) {
1077- value = oopFactory::new_byteArray (length, CHECK);
1078- } else if (strcmp (field_signature, " [Z" ) == 0 ) {
1079- value = oopFactory::new_boolArray (length, CHECK);
1080- } else if (strcmp (field_signature, " [C" ) == 0 ) {
1081- value = oopFactory::new_charArray (length, CHECK);
1082- } else if (strcmp (field_signature, " [S" ) == 0 ) {
1083- value = oopFactory::new_shortArray (length, CHECK);
1084- } else if (strcmp (field_signature, " [F" ) == 0 ) {
1085- value = oopFactory::new_floatArray (length, CHECK);
1086- } else if (strcmp (field_signature, " [D" ) == 0 ) {
1087- value = oopFactory::new_doubleArray (length, CHECK);
1088- } else if (strcmp (field_signature, " [I" ) == 0 ) {
1089- value = oopFactory::new_intArray (length, CHECK);
1090- } else if (strcmp (field_signature, " [J" ) == 0 ) {
1091- value = oopFactory::new_longArray (length, CHECK);
1092- } else if (field_signature[0 ] == JVM_SIGNATURE_ARRAY &&
1093- field_signature[1 ] == JVM_SIGNATURE_CLASS) {
1094- parse_klass (CHECK); // eat up the array class name
1095- Klass* kelem = resolve_klass (field_signature + 1 , CHECK);
1096- value = oopFactory::new_objArray (kelem, length, CHECK);
1059+ if (length != -1 ) {
1060+ if (field_signature[1 ] == JVM_SIGNATURE_ARRAY) {
1061+ // multi dimensional array
1062+ ArrayKlass* kelem = (ArrayKlass *)parse_klass (CHECK);
1063+ if (kelem == nullptr ) {
1064+ return ;
1065+ }
1066+ int rank = 0 ;
1067+ while (field_signature[rank] == JVM_SIGNATURE_ARRAY) {
1068+ rank++;
1069+ }
1070+ jint* dims = NEW_RESOURCE_ARRAY (jint, rank);
1071+ dims[0 ] = length;
1072+ for (int i = 1 ; i < rank; i++) {
1073+ dims[i] = 1 ; // These aren't relevant to the compiler
1074+ }
1075+ value = kelem->multi_allocate (rank, dims, CHECK);
10971076 } else {
1098- report_error (" unhandled array staticfield" );
1077+ if (strcmp (field_signature, " [B" ) == 0 ) {
1078+ value = oopFactory::new_byteArray (length, CHECK);
1079+ } else if (strcmp (field_signature, " [Z" ) == 0 ) {
1080+ value = oopFactory::new_boolArray (length, CHECK);
1081+ } else if (strcmp (field_signature, " [C" ) == 0 ) {
1082+ value = oopFactory::new_charArray (length, CHECK);
1083+ } else if (strcmp (field_signature, " [S" ) == 0 ) {
1084+ value = oopFactory::new_shortArray (length, CHECK);
1085+ } else if (strcmp (field_signature, " [F" ) == 0 ) {
1086+ value = oopFactory::new_floatArray (length, CHECK);
1087+ } else if (strcmp (field_signature, " [D" ) == 0 ) {
1088+ value = oopFactory::new_doubleArray (length, CHECK);
1089+ } else if (strcmp (field_signature, " [I" ) == 0 ) {
1090+ value = oopFactory::new_intArray (length, CHECK);
1091+ } else if (strcmp (field_signature, " [J" ) == 0 ) {
1092+ value = oopFactory::new_longArray (length, CHECK);
1093+ } else if (field_signature[0 ] == JVM_SIGNATURE_ARRAY &&
1094+ field_signature[1 ] == JVM_SIGNATURE_CLASS) {
1095+ Klass* actual_array_klass = parse_klass (CHECK);
1096+ Klass* kelem = ObjArrayKlass::cast (actual_array_klass)->element_klass ();
1097+ value = oopFactory::new_objArray (kelem, length, CHECK);
1098+ } else {
1099+ report_error (" unhandled array staticfield" );
1100+ }
10991101 }
11001102 }
11011103 java_mirror->obj_field_put (fd.offset (), value);
@@ -1133,8 +1135,11 @@ class CompileReplay : public StackObj {
11331135 Handle value = java_lang_String::create_from_str (string_value, CHECK);
11341136 java_mirror->obj_field_put (fd.offset (), value ());
11351137 } else if (field_signature[0 ] == JVM_SIGNATURE_CLASS) {
1136- Klass* k = resolve_klass (string_value, CHECK);
1137- oop value = InstanceKlass::cast (k)->allocate_instance (CHECK);
1138+ oop value = nullptr ;
1139+ if (string_value != nullptr ) {
1140+ Klass* k = resolve_klass (string_value, CHECK);
1141+ value = InstanceKlass::cast (k)->allocate_instance (CHECK);
1142+ }
11381143 java_mirror->obj_field_put (fd.offset (), value);
11391144 } else {
11401145 report_error (" unhandled staticfield" );
0 commit comments