src/share/vm/oops/cpCache.cpp

changeset 6081
41cb10cbfb3c
parent 5971
b8860472c377
child 6493
3205e78d8193
     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) {

mercurial