1.1 --- a/src/share/vm/oops/cpCache.cpp Wed Nov 13 07:31:26 2013 -0800 1.2 +++ b/src/share/vm/oops/cpCache.cpp Wed Nov 13 16:42:24 2013 -0500 1.3 @@ -554,24 +554,37 @@ 1.4 // Implementation of ConstantPoolCache 1.5 1.6 ConstantPoolCache* ConstantPoolCache::allocate(ClassLoaderData* loader_data, 1.7 - int length, 1.8 const intStack& index_map, 1.9 + const intStack& invokedynamic_index_map, 1.10 const intStack& invokedynamic_map, TRAPS) { 1.11 + 1.12 + const int length = index_map.length() + invokedynamic_index_map.length(); 1.13 int size = ConstantPoolCache::size(length); 1.14 1.15 return new (loader_data, size, false, MetaspaceObj::ConstantPoolCacheType, THREAD) 1.16 - ConstantPoolCache(length, index_map, invokedynamic_map); 1.17 + ConstantPoolCache(length, index_map, invokedynamic_index_map, invokedynamic_map); 1.18 } 1.19 1.20 void ConstantPoolCache::initialize(const intArray& inverse_index_map, 1.21 + const intArray& invokedynamic_inverse_index_map, 1.22 const intArray& invokedynamic_references_map) { 1.23 - assert(inverse_index_map.length() == length(), "inverse index map must have same length as cache"); 1.24 - for (int i = 0; i < length(); i++) { 1.25 + for (int i = 0; i < inverse_index_map.length(); i++) { 1.26 ConstantPoolCacheEntry* e = entry_at(i); 1.27 int original_index = inverse_index_map[i]; 1.28 e->initialize_entry(original_index); 1.29 assert(entry_at(i) == e, "sanity"); 1.30 } 1.31 + 1.32 + // Append invokedynamic entries at the end 1.33 + int invokedynamic_offset = inverse_index_map.length(); 1.34 + for (int i = 0; i < invokedynamic_inverse_index_map.length(); i++) { 1.35 + int offset = i + invokedynamic_offset; 1.36 + ConstantPoolCacheEntry* e = entry_at(offset); 1.37 + int original_index = invokedynamic_inverse_index_map[i]; 1.38 + e->initialize_entry(original_index); 1.39 + assert(entry_at(offset) == e, "sanity"); 1.40 + } 1.41 + 1.42 for (int ref = 0; ref < invokedynamic_references_map.length(); ref++) { 1.43 const int cpci = invokedynamic_references_map[ref]; 1.44 if (cpci >= 0) {