ciConstantPoolCache.cpp revision 1472:c18cbe5936b8
1/* 2 * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 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 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25#include "incls/_precompiled.incl" 26#include "incls/_ciConstantPoolCache.cpp.incl" 27 28// ciConstantPoolCache 29// 30// This class caches indexed constant pool lookups. 31 32// ------------------------------------------------------------------ 33// ciConstantPoolCache::ciConstantPoolCache 34ciConstantPoolCache::ciConstantPoolCache(Arena* arena, 35 int expected_size) { 36 _elements = 37 new (arena) GrowableArray<void*>(arena, expected_size, 0, 0); 38 _keys = new (arena) GrowableArray<intptr_t>(arena, expected_size, 0, 0); 39} 40 41// ------------------------------------------------------------------ 42// ciConstantPoolCache::get 43// 44// Get the entry at some index 45void* ciConstantPoolCache::get(int index) { 46 ASSERT_IN_VM; 47 int pos = find(index); 48 if (pos >= _keys->length() || 49 _keys->at(pos) != index) { 50 // This element is not present in the cache. 51 return NULL; 52 } 53 return _elements->at(pos); 54} 55 56// ------------------------------------------------------------------ 57// ciConstantPoolCache::find 58// 59// Use binary search to find the position of this index in the cache. 60// If there is no entry in the cache corresponding to this oop, return 61// the position at which the index would be inserted. 62int ciConstantPoolCache::find(int key) { 63 int min = 0; 64 int max = _keys->length()-1; 65 66 while (max >= min) { 67 int mid = (max + min) / 2; 68 int value = _keys->at(mid); 69 if (value < key) { 70 min = mid + 1; 71 } else if (value > key) { 72 max = mid - 1; 73 } else { 74 return mid; 75 } 76 } 77 return min; 78} 79 80// ------------------------------------------------------------------ 81// ciConstantPoolCache::insert 82// 83// Insert a ciObject into the table at some index. 84void ciConstantPoolCache::insert(int index, void* elem) { 85 int i; 86 int pos = find(index); 87 for (i = _keys->length()-1; i >= pos; i--) { 88 _keys->at_put_grow(i+1, _keys->at(i)); 89 _elements->at_put_grow(i+1, _elements->at(i)); 90 } 91 _keys->at_put_grow(pos, index); 92 _elements->at_put_grow(pos, elem); 93} 94 95// ------------------------------------------------------------------ 96// ciConstantPoolCache::print 97// 98// Print debugging information about the cache. 99void ciConstantPoolCache::print() { 100 Unimplemented(); 101} 102