comparison src/share/vm/prims/jvmtiRedefineClasses.cpp @ 7624:b14da2e6f2dc

7174978: NPG: Fix bactrace builder for class redefinition Summary: Remove Method* from backtrace but save version so redefine classes doesn't give inaccurate line numbers. Removed old Merlin API with duplicate code. Reviewed-by: dholmes, sspitsyn
author coleenp
date Thu, 17 Jan 2013 13:40:31 -0500
parents cc6a617fffd2
children 5daaddd917a1
comparison
equal deleted inserted replaced
7623:203f64878aab 7624:b14da2e6f2dc
1 /* 1 /*
2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 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.
1332 if (merge_cp_length != the_class->constants()->length() 1332 if (merge_cp_length != the_class->constants()->length()
1333 + scratch_class->constants()->length()) { 1333 + scratch_class->constants()->length()) {
1334 return JVMTI_ERROR_INTERNAL; 1334 return JVMTI_ERROR_INTERNAL;
1335 } 1335 }
1336 1336
1337 int orig_length = old_cp->orig_length(); 1337 // Update the version number of the constant pool
1338 if (orig_length == 0) { 1338 merge_cp->increment_and_save_version(old_cp->version());
1339 // This old_cp is an actual original constant pool. We save
1340 // the original length in the merged constant pool so that
1341 // merge_constant_pools() can be more efficient. If a constant
1342 // pool has a non-zero orig_length() value, then that constant
1343 // pool was created by a merge operation in RedefineClasses.
1344 merge_cp->set_orig_length(old_cp->length());
1345 } else {
1346 // This old_cp is a merged constant pool from a previous
1347 // RedefineClasses() calls so just copy the orig_length()
1348 // value.
1349 merge_cp->set_orig_length(old_cp->orig_length());
1350 }
1351 1339
1352 ResourceMark rm(THREAD); 1340 ResourceMark rm(THREAD);
1353 _index_map_count = 0; 1341 _index_map_count = 0;
1354 _index_map_p = new intArray(scratch_cp->length(), -1); 1342 _index_map_p = new intArray(scratch_cp->length(), -1);
1355 1343
2415 ClassLoaderData* loader_data, 2403 ClassLoaderData* loader_data,
2416 instanceKlassHandle scratch_class, constantPoolHandle scratch_cp, 2404 instanceKlassHandle scratch_class, constantPoolHandle scratch_cp,
2417 int scratch_cp_length, TRAPS) { 2405 int scratch_cp_length, TRAPS) {
2418 assert(scratch_cp->length() >= scratch_cp_length, "sanity check"); 2406 assert(scratch_cp->length() >= scratch_cp_length, "sanity check");
2419 2407
2420 // scratch_cp is a merged constant pool and has enough space for a 2408 // scratch_cp is a merged constant pool and has enough space for a
2421 // worst case merge situation. We want to associate the minimum 2409 // worst case merge situation. We want to associate the minimum
2422 // sized constant pool with the klass to save space. 2410 // sized constant pool with the klass to save space.
2423 constantPoolHandle smaller_cp(THREAD, 2411 constantPoolHandle smaller_cp(THREAD,
2424 ConstantPool::allocate(loader_data, scratch_cp_length, 2412 ConstantPool::allocate(loader_data, scratch_cp_length, THREAD));
2425 THREAD)); 2413
2426 // preserve orig_length() value in the smaller copy 2414 // preserve version() value in the smaller copy
2427 int orig_length = scratch_cp->orig_length(); 2415 int version = scratch_cp->version();
2428 assert(orig_length != 0, "sanity check"); 2416 assert(version != 0, "sanity check");
2429 smaller_cp->set_orig_length(orig_length); 2417 smaller_cp->set_version(version);
2430 scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD); 2418
2431 scratch_cp = smaller_cp; 2419 scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD);
2420 scratch_cp = smaller_cp;
2432 2421
2433 // attach new constant pool to klass 2422 // attach new constant pool to klass
2434 scratch_cp->set_pool_holder(scratch_class()); 2423 scratch_cp->set_pool_holder(scratch_class());
2435 2424
2436 // attach klass to new constant pool 2425 // attach klass to new constant pool