comparison src/share/vm/classfile/defaultMethods.cpp @ 7613:2dce7c34c564

8006513: Null pointer in DefaultMethods::generate_default_methods when merging annotations Reviewed-by: brutisso, jfranck
author stefank
date Thu, 17 Jan 2013 11:39:48 +0100
parents ade95d680b42
children 927a311d00f9
comparison
equal deleted inserted replaced
7612:4967eb4f67a9 7613:2dce7c34c564
1283 static void merge_in_new_methods(InstanceKlass* klass, 1283 static void merge_in_new_methods(InstanceKlass* klass,
1284 GrowableArray<Method*>* new_methods, TRAPS) { 1284 GrowableArray<Method*>* new_methods, TRAPS) {
1285 1285
1286 enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS }; 1286 enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS };
1287 1287
1288 Array<AnnotationArray*>* original_annots[NUM_ARRAYS]; 1288 Array<AnnotationArray*>* original_annots[NUM_ARRAYS] = { NULL };
1289 1289
1290 Array<Method*>* original_methods = klass->methods(); 1290 Array<Method*>* original_methods = klass->methods();
1291 Annotations* annots = klass->annotations(); 1291 Annotations* annots = klass->annotations();
1292 original_annots[ANNOTATIONS] = annots->methods_annotations(); 1292 if (annots != NULL) {
1293 original_annots[PARAMETERS] = annots->methods_parameter_annotations(); 1293 original_annots[ANNOTATIONS] = annots->methods_annotations();
1294 original_annots[DEFAULTS] = annots->methods_default_annotations(); 1294 original_annots[PARAMETERS] = annots->methods_parameter_annotations();
1295 original_annots[DEFAULTS] = annots->methods_default_annotations();
1296 }
1295 1297
1296 Array<int>* original_ordering = klass->method_ordering(); 1298 Array<int>* original_ordering = klass->method_ordering();
1297 Array<int>* merged_ordering = Universe::the_empty_int_array(); 1299 Array<int>* merged_ordering = Universe::the_empty_int_array();
1298 1300
1299 int new_size = klass->methods()->length() + new_methods->length(); 1301 int new_size = klass->methods()->length() + new_methods->length();
1368 } 1370 }
1369 #endif 1371 #endif
1370 1372
1371 // Replace klass methods with new merged lists 1373 // Replace klass methods with new merged lists
1372 klass->set_methods(merged_methods); 1374 klass->set_methods(merged_methods);
1373 annots->set_methods_annotations(merged_annots[ANNOTATIONS]); 1375 if (annots != NULL) {
1374 annots->set_methods_parameter_annotations(merged_annots[PARAMETERS]); 1376 annots->set_methods_annotations(merged_annots[ANNOTATIONS]);
1375 annots->set_methods_default_annotations(merged_annots[DEFAULTS]); 1377 annots->set_methods_parameter_annotations(merged_annots[PARAMETERS]);
1378 annots->set_methods_default_annotations(merged_annots[DEFAULTS]);
1379 } else {
1380 assert(merged_annots[ANNOTATIONS] == NULL, "Must be");
1381 assert(merged_annots[PARAMETERS] == NULL, "Must be");
1382 assert(merged_annots[DEFAULTS] == NULL, "Must be");
1383 }
1376 1384
1377 ClassLoaderData* cld = klass->class_loader_data(); 1385 ClassLoaderData* cld = klass->class_loader_data();
1378 MetadataFactory::free_array(cld, original_methods); 1386 MetadataFactory::free_array(cld, original_methods);
1379 for (int i = 0; i < NUM_ARRAYS; ++i) { 1387 for (int i = 0; i < NUM_ARRAYS; ++i) {
1380 MetadataFactory::free_array(cld, original_annots[i]); 1388 MetadataFactory::free_array(cld, original_annots[i]);