Mercurial > hg > graal-jvmci-8
comparison src/share/vm/classfile/defaultMethods.cpp @ 8031:927a311d00f9
8007320: NPG: move method annotations
Summary: allocate method annotations and attach to ConstMethod if present
Reviewed-by: dcubed, jiangli, sspitsyn, iklam
author | coleenp |
---|---|
date | Mon, 11 Feb 2013 14:06:22 -0500 |
parents | 2dce7c34c564 |
children | 653d0346aa80 |
comparison
equal
deleted
inserted
replaced
8030:f989aff6946f | 8031:927a311d00f9 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
1144 Symbol* sig, AccessFlags flags, int max_stack, int params, | 1144 Symbol* sig, AccessFlags flags, int max_stack, int params, |
1145 ConstMethod::MethodType mt, TRAPS) { | 1145 ConstMethod::MethodType mt, TRAPS) { |
1146 | 1146 |
1147 address code_start = static_cast<address>(bytecodes->adr_at(0)); | 1147 address code_start = static_cast<address>(bytecodes->adr_at(0)); |
1148 int code_length = bytecodes->length(); | 1148 int code_length = bytecodes->length(); |
1149 InlineTableSizes sizes; | |
1149 | 1150 |
1150 Method* m = Method::allocate(cp->pool_holder()->class_loader_data(), | 1151 Method* m = Method::allocate(cp->pool_holder()->class_loader_data(), |
1151 code_length, flags, 0, 0, 0, 0, 0, 0, | 1152 code_length, flags, &sizes, |
1152 mt, CHECK_NULL); | 1153 mt, CHECK_NULL); |
1153 | 1154 |
1154 m->set_constants(NULL); // This will get filled in later | 1155 m->set_constants(NULL); // This will get filled in later |
1155 m->set_name_index(cp->utf8(name)); | 1156 m->set_name_index(cp->utf8(name)); |
1156 m->set_signature_index(cp->utf8(sig)); | 1157 m->set_signature_index(cp->utf8(sig)); |
1283 static void merge_in_new_methods(InstanceKlass* klass, | 1284 static void merge_in_new_methods(InstanceKlass* klass, |
1284 GrowableArray<Method*>* new_methods, TRAPS) { | 1285 GrowableArray<Method*>* new_methods, TRAPS) { |
1285 | 1286 |
1286 enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS }; | 1287 enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS }; |
1287 | 1288 |
1288 Array<AnnotationArray*>* original_annots[NUM_ARRAYS] = { NULL }; | |
1289 | |
1290 Array<Method*>* original_methods = klass->methods(); | 1289 Array<Method*>* original_methods = klass->methods(); |
1291 Annotations* annots = klass->annotations(); | |
1292 if (annots != NULL) { | |
1293 original_annots[ANNOTATIONS] = annots->methods_annotations(); | |
1294 original_annots[PARAMETERS] = annots->methods_parameter_annotations(); | |
1295 original_annots[DEFAULTS] = annots->methods_default_annotations(); | |
1296 } | |
1297 | |
1298 Array<int>* original_ordering = klass->method_ordering(); | 1290 Array<int>* original_ordering = klass->method_ordering(); |
1299 Array<int>* merged_ordering = Universe::the_empty_int_array(); | 1291 Array<int>* merged_ordering = Universe::the_empty_int_array(); |
1300 | 1292 |
1301 int new_size = klass->methods()->length() + new_methods->length(); | 1293 int new_size = klass->methods()->length() + new_methods->length(); |
1302 | 1294 |
1303 Array<AnnotationArray*>* merged_annots[NUM_ARRAYS]; | |
1304 | |
1305 Array<Method*>* merged_methods = MetadataFactory::new_array<Method*>( | 1295 Array<Method*>* merged_methods = MetadataFactory::new_array<Method*>( |
1306 klass->class_loader_data(), new_size, NULL, CHECK); | 1296 klass->class_loader_data(), new_size, NULL, CHECK); |
1307 for (int i = 0; i < NUM_ARRAYS; ++i) { | 1297 |
1308 if (original_annots[i] != NULL) { | |
1309 merged_annots[i] = MetadataFactory::new_array<AnnotationArray*>( | |
1310 klass->class_loader_data(), new_size, CHECK); | |
1311 } else { | |
1312 merged_annots[i] = NULL; | |
1313 } | |
1314 } | |
1315 if (original_ordering != NULL && original_ordering->length() > 0) { | 1298 if (original_ordering != NULL && original_ordering->length() > 0) { |
1316 merged_ordering = MetadataFactory::new_array<int>( | 1299 merged_ordering = MetadataFactory::new_array<int>( |
1317 klass->class_loader_data(), new_size, CHECK); | 1300 klass->class_loader_data(), new_size, CHECK); |
1318 } | 1301 } |
1319 int method_order_index = klass->methods()->length(); | 1302 int method_order_index = klass->methods()->length(); |
1336 | 1319 |
1337 if (orig_method != NULL && | 1320 if (orig_method != NULL && |
1338 (new_method == NULL || orig_method->name() < new_method->name())) { | 1321 (new_method == NULL || orig_method->name() < new_method->name())) { |
1339 merged_methods->at_put(i, orig_method); | 1322 merged_methods->at_put(i, orig_method); |
1340 original_methods->at_put(orig_idx, NULL); | 1323 original_methods->at_put(orig_idx, NULL); |
1341 for (int j = 0; j < NUM_ARRAYS; ++j) { | |
1342 if (merged_annots[j] != NULL) { | |
1343 merged_annots[j]->at_put(i, original_annots[j]->at(orig_idx)); | |
1344 original_annots[j]->at_put(orig_idx, NULL); | |
1345 } | |
1346 } | |
1347 if (merged_ordering->length() > 0) { | 1324 if (merged_ordering->length() > 0) { |
1348 merged_ordering->at_put(i, original_ordering->at(orig_idx)); | 1325 merged_ordering->at_put(i, original_ordering->at(orig_idx)); |
1349 } | 1326 } |
1350 ++orig_idx; | 1327 ++orig_idx; |
1351 } else { | 1328 } else { |
1370 } | 1347 } |
1371 #endif | 1348 #endif |
1372 | 1349 |
1373 // Replace klass methods with new merged lists | 1350 // Replace klass methods with new merged lists |
1374 klass->set_methods(merged_methods); | 1351 klass->set_methods(merged_methods); |
1375 if (annots != NULL) { | |
1376 annots->set_methods_annotations(merged_annots[ANNOTATIONS]); | |
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 } | |
1384 | 1352 |
1385 ClassLoaderData* cld = klass->class_loader_data(); | 1353 ClassLoaderData* cld = klass->class_loader_data(); |
1386 MetadataFactory::free_array(cld, original_methods); | 1354 MetadataFactory::free_array(cld, original_methods); |
1387 for (int i = 0; i < NUM_ARRAYS; ++i) { | |
1388 MetadataFactory::free_array(cld, original_annots[i]); | |
1389 } | |
1390 if (original_ordering->length() > 0) { | 1355 if (original_ordering->length() > 0) { |
1391 klass->set_method_ordering(merged_ordering); | 1356 klass->set_method_ordering(merged_ordering); |
1392 MetadataFactory::free_array(cld, original_ordering); | 1357 MetadataFactory::free_array(cld, original_ordering); |
1393 } | 1358 } |
1394 } | 1359 } |