hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
changeset 15229 5341188db763
parent 15099 b31d40895bbb
child 15430 7c35f12cf1e5
equal deleted inserted replaced
15228:e92acc84ade3 15229:5341188db763
     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