Index: vm/vmcore/src/reflection/annotations.cpp =================================================================== --- vm/vmcore/src/reflection/annotations.cpp (revision 595257) +++ vm/vmcore/src/reflection/annotations.cpp (working copy) @@ -46,41 +46,56 @@ unsigned num = table_num + inv_table_num; + // HARMONY-5086 resolution - because there can be annotations which can't + // be resolved (and must be just ignored) the size of result array is + // unknown actually, so temporary location is used. + jobject* tmp_array = (jobject*) malloc(sizeof(jobject) * num); + unsigned result_array_size = 0; + + for (unsigned i = 0; i < table_num; i++) { + jobject element = resolve_annotation(jenv, table->table[i], clss); + + if (!element) { // just ignore unresolved annotation silently + assert(exn_raised()); + exn_clear(); + continue; + } + tmp_array[result_array_size] = element; + result_array_size++; + } + for (unsigned i = 0; i < inv_table_num; i++) { + jobject element = resolve_annotation(jenv, inv_table->table[i], clss); + + if (!element) { // just ignore unresolved annotation silently + assert(exn_raised()); + exn_clear(); + continue; + } + tmp_array[result_array_size] = element; + result_array_size++; + } + + // copy resolved annotations to result java array static Class* antn_class; - if(antn_class == NULL) { + + if (antn_class == NULL) { antn_class = jni_get_vm_env(jenv)->LoadCoreClass( "java/lang/annotation/Annotation"); } - - jobjectArray array = NewObjectArray(jenv, num, + jobjectArray array = NewObjectArray(jenv, result_array_size, struct_Class_to_java_lang_Class_Handle(antn_class), NULL); if (!array) { assert(exn_raised()); + free(tmp_array); return NULL; } - unsigned i; - for (i = 0; i < table_num; ++i) { - jobject element = resolve_annotation(jenv, table->table[i], clss); - if (!element) { - assert(exn_raised()); - return NULL; - } else { - SetObjectArrayElement(jenv, array, i, element); - assert(!exn_raised()); - } + for (unsigned i = 0; i < result_array_size; i++) { + SetObjectArrayElement(jenv, array, i, tmp_array[i]); + assert(!exn_raised()); } - for (i = table_num; i < num; ++i) { - jobject element = resolve_annotation(jenv, inv_table->table[i - table_num], clss); - if (!element) { - assert(exn_raised()); - return NULL; - } else { - SetObjectArrayElement(jenv, array, i, element); - assert(!exn_raised()); - } - } + free(tmp_array); return array; } Index: vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMGenericsAndAnnotations.cpp =================================================================== --- vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMGenericsAndAnnotations.cpp (revision 595257) +++ vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMGenericsAndAnnotations.cpp (working copy) @@ -124,6 +124,9 @@ return NULL; } + // According to J2SE specification the 0-length array must be added for + // the parameter w/o annotation (still this no-annotation-parameter is not + // skipped from thr resulted arry). unsigned i; for (i = 0; i < param_num; ++i) { jobject element = get_annotations(jenv,