812 report_error(field_name); |
812 report_error(field_name); |
813 return; |
813 return; |
814 } |
814 } |
815 |
815 |
816 oop java_mirror = k->java_mirror(); |
816 oop java_mirror = k->java_mirror(); |
817 if (field_signature[0] == '[') { |
817 if (field_signature[0] == JVM_SIGNATURE_ARRAY) { |
818 int length = parse_int("array length"); |
818 int length = parse_int("array length"); |
819 oop value = NULL; |
819 oop value = NULL; |
820 |
820 |
821 if (field_signature[1] == '[') { |
821 if (field_signature[1] == JVM_SIGNATURE_ARRAY) { |
822 // multi dimensional array |
822 // multi dimensional array |
823 ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK); |
823 ArrayKlass* kelem = (ArrayKlass *)parse_klass(CHECK); |
824 if (kelem == NULL) { |
824 if (kelem == NULL) { |
825 return; |
825 return; |
826 } |
826 } |
827 int rank = 0; |
827 int rank = 0; |
828 while (field_signature[rank] == '[') { |
828 while (field_signature[rank] == JVM_SIGNATURE_ARRAY) { |
829 rank++; |
829 rank++; |
830 } |
830 } |
831 jint* dims = NEW_RESOURCE_ARRAY(jint, rank); |
831 jint* dims = NEW_RESOURCE_ARRAY(jint, rank); |
832 dims[0] = length; |
832 dims[0] = length; |
833 for (int i = 1; i < rank; i++) { |
833 for (int i = 1; i < rank; i++) { |
849 value = oopFactory::new_doubleArray(length, CHECK); |
849 value = oopFactory::new_doubleArray(length, CHECK); |
850 } else if (strcmp(field_signature, "[I") == 0) { |
850 } else if (strcmp(field_signature, "[I") == 0) { |
851 value = oopFactory::new_intArray(length, CHECK); |
851 value = oopFactory::new_intArray(length, CHECK); |
852 } else if (strcmp(field_signature, "[J") == 0) { |
852 } else if (strcmp(field_signature, "[J") == 0) { |
853 value = oopFactory::new_longArray(length, CHECK); |
853 value = oopFactory::new_longArray(length, CHECK); |
854 } else if (field_signature[0] == '[' && field_signature[1] == 'L') { |
854 } else if (field_signature[0] == JVM_SIGNATURE_ARRAY && |
|
855 field_signature[1] == JVM_SIGNATURE_CLASS) { |
855 Klass* kelem = resolve_klass(field_signature + 1, CHECK); |
856 Klass* kelem = resolve_klass(field_signature + 1, CHECK); |
856 value = oopFactory::new_objArray(kelem, length, CHECK); |
857 value = oopFactory::new_objArray(kelem, length, CHECK); |
857 } else { |
858 } else { |
858 report_error("unhandled array staticfield"); |
859 report_error("unhandled array staticfield"); |
859 } |
860 } |
890 double value = atof(string_value); |
891 double value = atof(string_value); |
891 java_mirror->double_field_put(fd.offset(), value); |
892 java_mirror->double_field_put(fd.offset(), value); |
892 } else if (strcmp(field_signature, "Ljava/lang/String;") == 0) { |
893 } else if (strcmp(field_signature, "Ljava/lang/String;") == 0) { |
893 Handle value = java_lang_String::create_from_str(string_value, CHECK); |
894 Handle value = java_lang_String::create_from_str(string_value, CHECK); |
894 java_mirror->obj_field_put(fd.offset(), value()); |
895 java_mirror->obj_field_put(fd.offset(), value()); |
895 } else if (field_signature[0] == 'L') { |
896 } else if (field_signature[0] == JVM_SIGNATURE_CLASS) { |
896 Klass* k = resolve_klass(string_value, CHECK); |
897 Klass* k = resolve_klass(string_value, CHECK); |
897 oop value = InstanceKlass::cast(k)->allocate_instance(CHECK); |
898 oop value = InstanceKlass::cast(k)->allocate_instance(CHECK); |
898 java_mirror->obj_field_put(fd.offset(), value); |
899 java_mirror->obj_field_put(fd.offset(), value); |
899 } else { |
900 } else { |
900 report_error("unhandled staticfield"); |
901 report_error("unhandled staticfield"); |