hotspot/src/share/vm/ci/ciConstantPoolCache.cpp
author thartmann
Tue, 01 Jul 2014 09:02:45 +0200
changeset 25378 d9eeb53578f9
parent 7397 5b173b4ca846
child 36315 150a415079ae
permissions -rw-r--r--
8007987: ciConstantPoolCache::_keys should be array of 32bit int Summary: The type of ciConstantPoolCache::_keys is changed to int which is sufficient to store the 2 byte constant pool indices. Reviewed-by: twisti, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
     2
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "ci/ciConstantPoolCache.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "ci/ciUtilities.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "memory/allocation.inline.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// ciConstantPoolCache
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// This class caches indexed constant pool lookups.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// ciConstantPoolCache::ciConstantPoolCache
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
ciConstantPoolCache::ciConstantPoolCache(Arena* arena,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
                                 int expected_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  _elements =
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
    new (arena) GrowableArray<void*>(arena, expected_size, 0, 0);
25378
d9eeb53578f9 8007987: ciConstantPoolCache::_keys should be array of 32bit int
thartmann
parents: 7397
diff changeset
    41
  _keys = new (arena) GrowableArray<int>(arena, expected_size, 0, 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// ciConstantPoolCache::get
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
// Get the entry at some index
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
void* ciConstantPoolCache::get(int index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  ASSERT_IN_VM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  int pos = find(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  if (pos >= _keys->length() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
      _keys->at(pos) != index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    // This element is not present in the cache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  return _elements->at(pos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
// ciConstantPoolCache::find
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
// Use binary search to find the position of this index in the cache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
// If there is no entry in the cache corresponding to this oop, return
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// the position at which the index would be inserted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
int ciConstantPoolCache::find(int key) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  int min = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  int max = _keys->length()-1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  while (max >= min) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    int mid = (max + min) / 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    int value = _keys->at(mid);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    if (value < key) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
      min = mid + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    } else if (value > key) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
      max = mid - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
      return mid;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  return min;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
// ciConstantPoolCache::insert
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
// Insert a ciObject into the table at some index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
void ciConstantPoolCache::insert(int index, void* elem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  int pos = find(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  for (i = _keys->length()-1; i >= pos; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    _keys->at_put_grow(i+1, _keys->at(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    _elements->at_put_grow(i+1, _elements->at(i));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  _keys->at_put_grow(pos, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  _elements->at_put_grow(pos, elem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
// ciConstantPoolCache::print
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
// Print debugging information about the cache.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
void ciConstantPoolCache::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
}