blob: 75bca62917b8e79dd6124930e126b773c99f142b [file] [log] [blame]
J. Duke81537792007-12-01 00:00:00 +00001/*
Goetz Lindenmaierb26df6b2016-01-04 15:41:05 +01002 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
J. Duke81537792007-12-01 00:00:00 +00003 * 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 *
Erik Trimbleba7c1732010-05-27 19:08:38 -070019 * 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.
J. Duke81537792007-12-01 00:00:00 +000022 *
23 */
24
Stefan Karlsson8006fe82010-11-23 13:22:55 -080025#ifndef SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
26#define SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
27
28#include "oops/arrayOop.hpp"
Jon Masamitsu5c58d272012-09-01 13:25:18 -040029#include "oops/cpCache.hpp"
30#include "oops/objArrayOop.hpp"
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080031#include "oops/symbol.hpp"
Stefan Karlsson8006fe82010-11-23 13:22:55 -080032#include "oops/typeArrayOop.hpp"
Jon Masamitsu5c58d272012-09-01 13:25:18 -040033#include "runtime/handles.hpp"
Goetz Lindenmaier25f33c02014-07-04 11:46:01 +020034#include "utilities/bytes.hpp"
Stefan Karlsson8006fe82010-11-23 13:22:55 -080035#include "utilities/constantTag.hpp"
Stefan Karlsson8006fe82010-11-23 13:22:55 -080036
Coleen Phillimore472622d2014-03-26 21:47:45 -040037// A ConstantPool is an array containing class constants as described in the
J. Duke81537792007-12-01 00:00:00 +000038// class file.
39//
40// Most of the constant pool entries are written during class parsing, which
Jon Masamitsu5c58d272012-09-01 13:25:18 -040041// is safe. For klass types, the constant pool entry is
42// modified when the entry is resolved. If a klass constant pool
J. Duke81537792007-12-01 00:00:00 +000043// entry is read without a lock, only the resolved state guarantees that
Jon Masamitsu5c58d272012-09-01 13:25:18 -040044// the entry in the constant pool is a klass object and not a Symbol*.
J. Duke81537792007-12-01 00:00:00 +000045
46class SymbolHashMap;
47
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080048class CPSlot VALUE_OBJ_CLASS_SPEC {
49 intptr_t _ptr;
50 public:
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -080051 enum TagBits { _resolved_value = 0, _symbol_bit = 1, _pseudo_bit = 2, _symbol_mask = 3 };
52
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080053 CPSlot(intptr_t ptr): _ptr(ptr) {}
Jon Masamitsu5c58d272012-09-01 13:25:18 -040054 CPSlot(Klass* ptr): _ptr((intptr_t)ptr) {}
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -080055 CPSlot(Symbol* ptr): _ptr((intptr_t)ptr | _symbol_bit) {}
56 CPSlot(Symbol* ptr, int tag_bits): _ptr((intptr_t)ptr | tag_bits) {}
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080057
58 intptr_t value() { return _ptr; }
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -080059 bool is_resolved() { return (_ptr & _symbol_bit ) == _resolved_value; }
60 bool is_unresolved() { return (_ptr & _symbol_bit ) != _resolved_value; }
61 bool is_pseudo_string() { return (_ptr & _symbol_mask) == _symbol_bit + _pseudo_bit; }
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080062
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080063 Symbol* get_symbol() {
Jon Masamitsu5c58d272012-09-01 13:25:18 -040064 assert(is_unresolved(), "bad call");
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -080065 return (Symbol*)(_ptr & ~_symbol_mask);
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080066 }
Jon Masamitsu5c58d272012-09-01 13:25:18 -040067 Klass* get_klass() {
68 assert(is_resolved(), "bad call");
69 return (Klass*)_ptr;
70 }
Coleen Phillimore7b4f8072011-01-27 16:11:27 -080071};
72
Ioi Lam93b845e2013-01-25 15:06:18 -050073class KlassSizeStats;
Coleen Phillimore472622d2014-03-26 21:47:45 -040074
Jon Masamitsu5c58d272012-09-01 13:25:18 -040075class ConstantPool : public Metadata {
J. Duke81537792007-12-01 00:00:00 +000076 friend class VMStructs;
Christian Thalingerbf5db722015-12-14 17:02:02 -100077 friend class JVMCIVMStructs;
Coleen Phillimore472622d2014-03-26 21:47:45 -040078 friend class BytecodeInterpreter; // Directly extracts a klass in the pool for fast instanceof/checkcast
Jon Masamitsu5c58d272012-09-01 13:25:18 -040079 friend class Universe; // For null constructor
J. Duke81537792007-12-01 00:00:00 +000080 private:
Jon Masamitsu5c58d272012-09-01 13:25:18 -040081 Array<u1>* _tags; // the tag array describing the constant pool's contents
Harold Seigel7fee66f2012-11-06 15:09:37 -050082 ConstantPoolCache* _cache; // the cache holding interpreter runtime information
83 InstanceKlass* _pool_holder; // the corresponding class
Jon Masamitsu5c58d272012-09-01 13:25:18 -040084 Array<u2>* _operands; // for variable-sized (InvokeDynamic) nodes, usually empty
85
86 // Array of resolved objects from the constant pool and map from resolved
87 // object index to original constant pool index
88 jobject _resolved_references;
89 Array<u2>* _reference_map;
90
Coleen Phillimore99039562013-01-23 10:34:29 -050091 enum {
Coleen Phillimoreb8b94342013-02-22 08:36:42 -050092 _has_preresolution = 1, // Flags
93 _on_stack = 2
Coleen Phillimore99039562013-01-23 10:34:29 -050094 };
Jon Masamitsu5c58d272012-09-01 13:25:18 -040095
Coleen Phillimore99039562013-01-23 10:34:29 -050096 int _flags; // old fashioned bit twiddling
97 int _length; // number of elements in the array
Jon Masamitsu5c58d272012-09-01 13:25:18 -040098
99 union {
100 // set for CDS to restore resolved references
101 int _resolved_reference_length;
Coleen Phillimoree508ba92013-01-17 13:40:31 -0500102 // keeps version number for redefined classes (used in backtrace)
103 int _version;
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400104 } _saved;
J. Duke81537792007-12-01 00:00:00 +0000105
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400106 void set_tags(Array<u1>* tags) { _tags = tags; }
107 void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); }
108 void release_tag_at_put(int which, jbyte t) { tags()->release_at_put(which, t); }
109
Coleen Phillimore243d6972014-06-19 11:16:10 -0400110 u1* tag_addr_at(int which) const { return tags()->adr_at(which); }
111
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400112 void set_operands(Array<u2>* operands) { _operands = operands; }
John R Rosece0125e2010-10-30 13:08:23 -0700113
Coleen Phillimore99039562013-01-23 10:34:29 -0500114 int flags() const { return _flags; }
115 void set_flags(int f) { _flags = f; }
John R Rose849e0ff2008-11-12 22:33:26 -0800116
J. Duke81537792007-12-01 00:00:00 +0000117 private:
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400118 intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
J. Duke81537792007-12-01 00:00:00 +0000119
Markus Grönlund2ad9d312015-12-08 20:04:03 +0100120 CPSlot slot_at(int which) const {
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800121 assert(is_within_bounds(which), "index out of bounds");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400122 // Uses volatile because the klass slot changes without a lock.
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800123 volatile intptr_t adr = (intptr_t)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which));
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400124 assert(adr != 0 || which == 0, "cp entry for klass should not be zero");
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800125 return CPSlot(adr);
126 }
127
128 void slot_at_put(int which, CPSlot s) const {
129 assert(is_within_bounds(which), "index out of bounds");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400130 assert(s.value() != 0, "Caught something");
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800131 *(intptr_t*)&base()[which] = s.value();
132 }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400133 intptr_t* obj_at_addr_raw(int which) const {
J. Duke81537792007-12-01 00:00:00 +0000134 assert(is_within_bounds(which), "index out of bounds");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400135 return (intptr_t*) &base()[which];
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800136 }
137
J. Duke81537792007-12-01 00:00:00 +0000138 jint* int_at_addr(int which) const {
139 assert(is_within_bounds(which), "index out of bounds");
140 return (jint*) &base()[which];
141 }
142
143 jlong* long_at_addr(int which) const {
144 assert(is_within_bounds(which), "index out of bounds");
145 return (jlong*) &base()[which];
146 }
147
148 jfloat* float_at_addr(int which) const {
149 assert(is_within_bounds(which), "index out of bounds");
150 return (jfloat*) &base()[which];
151 }
152
153 jdouble* double_at_addr(int which) const {
154 assert(is_within_bounds(which), "index out of bounds");
155 return (jdouble*) &base()[which];
156 }
157
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400158 ConstantPool(Array<u1>* tags);
159 ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
J. Duke81537792007-12-01 00:00:00 +0000160 public:
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400161 static ConstantPool* allocate(ClassLoaderData* loader_data, int length, TRAPS);
162
163 bool is_constantPool() const volatile { return true; }
164
165 Array<u1>* tags() const { return _tags; }
166 Array<u2>* operands() const { return _operands; }
J. Duke81537792007-12-01 00:00:00 +0000167
Coleen Phillimore99039562013-01-23 10:34:29 -0500168 bool has_preresolution() const { return (_flags & _has_preresolution) != 0; }
169 void set_has_preresolution() { _flags |= _has_preresolution; }
John R Rose849e0ff2008-11-12 22:33:26 -0800170
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400171 // Redefine classes support. If a method refering to this constant pool
172 // is on the executing stack, or as a handle in vm code, this constant pool
173 // can't be removed from the set of previous versions saved in the instance
174 // class.
Coleen Phillimore99039562013-01-23 10:34:29 -0500175 bool on_stack() const { return (_flags &_on_stack) != 0; }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400176 void set_on_stack(const bool value);
177
J. Duke81537792007-12-01 00:00:00 +0000178 // Klass holding pool
Harold Seigel7fee66f2012-11-06 15:09:37 -0500179 InstanceKlass* pool_holder() const { return _pool_holder; }
180 void set_pool_holder(InstanceKlass* k) { _pool_holder = k; }
181 InstanceKlass** pool_holder_addr() { return &_pool_holder; }
J. Duke81537792007-12-01 00:00:00 +0000182
183 // Interpreter runtime support
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400184 ConstantPoolCache* cache() const { return _cache; }
185 void set_cache(ConstantPoolCache* cache){ _cache = cache; }
186
187 // Create object cache in the constant pool
188 void initialize_resolved_references(ClassLoaderData* loader_data,
Mikael Gerdind2811882015-10-26 17:13:40 -0400189 const intStack& reference_map,
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400190 int constant_pool_map_length,
191 TRAPS);
192
193 // resolved strings, methodHandles and callsite objects from the constant pool
194 objArrayOop resolved_references() const;
195 // mapping resolved object array indexes to cp indexes and back.
196 int object_to_cp_index(int index) { return _reference_map->at(index); }
197 int cp_to_object_index(int index);
198
199 // Invokedynamic indexes.
200 // They must look completely different from normal indexes.
201 // The main reason is that byte swapping is sometimes done on normal indexes.
202 // Finally, it is helpful for debugging to tell the two apart.
203 static bool is_invokedynamic_index(int i) { return (i < 0); }
204 static int decode_invokedynamic_index(int i) { assert(is_invokedynamic_index(i), ""); return ~i; }
205 static int encode_invokedynamic_index(int i) { assert(!is_invokedynamic_index(i), ""); return ~i; }
206
207
208 // The invokedynamic points at a CP cache entry. This entry points back
209 // at the original CP entry (CONSTANT_InvokeDynamic) and also (via f2) at an entry
210 // in the resolved_references array (which provides the appendix argument).
211 int invokedynamic_cp_cache_index(int index) const {
212 assert (is_invokedynamic_index(index), "should be a invokedynamic index");
213 int cache_index = decode_invokedynamic_index(index);
214 return cache_index;
215 }
216 ConstantPoolCacheEntry* invokedynamic_cp_cache_entry_at(int index) const {
217 // decode index that invokedynamic points to.
218 int cp_cache_index = invokedynamic_cp_cache_index(index);
219 return cache()->entry_at(cp_cache_index);
220 }
J. Duke81537792007-12-01 00:00:00 +0000221
222 // Assembly code support
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400223 static int tags_offset_in_bytes() { return offset_of(ConstantPool, _tags); }
224 static int cache_offset_in_bytes() { return offset_of(ConstantPool, _cache); }
225 static int pool_holder_offset_in_bytes() { return offset_of(ConstantPool, _pool_holder); }
226 static int resolved_references_offset_in_bytes() { return offset_of(ConstantPool, _resolved_references); }
J. Duke81537792007-12-01 00:00:00 +0000227
228 // Storing constants
229
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400230 void klass_at_put(int which, Klass* k) {
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800231 assert(k != NULL, "resolved class shouldn't be null");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400232 assert(is_within_bounds(which), "index out of bounds");
233 OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
J. Duke81537792007-12-01 00:00:00 +0000234 // The interpreter assumes when the tag is stored, the klass is resolved
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400235 // and the Klass* is a klass rather than a Symbol*, so we need
J. Duke81537792007-12-01 00:00:00 +0000236 // hardware store ordering here.
237 release_tag_at_put(which, JVM_CONSTANT_Class);
J. Duke81537792007-12-01 00:00:00 +0000238 }
239
240 // For temporary use while constructing constant pool
241 void klass_index_at_put(int which, int name_index) {
242 tag_at_put(which, JVM_CONSTANT_ClassIndex);
243 *int_at_addr(which) = name_index;
244 }
245
246 // Temporary until actual use
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800247 void unresolved_klass_at_put(int which, Symbol* s) {
J. Duke81537792007-12-01 00:00:00 +0000248 release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800249 slot_at_put(which, s);
J. Duke81537792007-12-01 00:00:00 +0000250 }
251
John R Rose1f4cfb02010-06-09 18:50:45 -0700252 void method_handle_index_at_put(int which, int ref_kind, int ref_index) {
253 tag_at_put(which, JVM_CONSTANT_MethodHandle);
254 *int_at_addr(which) = ((jint) ref_index<<16) | ref_kind;
255 }
256
257 void method_type_index_at_put(int which, int ref_index) {
258 tag_at_put(which, JVM_CONSTANT_MethodType);
259 *int_at_addr(which) = ref_index;
260 }
261
John R Rosecc7c58e2010-12-03 15:53:57 -0800262 void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) {
John R Rosea4e41492010-07-15 18:40:45 -0700263 tag_at_put(which, JVM_CONSTANT_InvokeDynamic);
John R Rosecc7c58e2010-12-03 15:53:57 -0800264 *int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index;
John R Rosea4e41492010-07-15 18:40:45 -0700265 }
John R Rosecc7c58e2010-12-03 15:53:57 -0800266
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800267 void unresolved_string_at_put(int which, Symbol* s) {
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400268 release_tag_at_put(which, JVM_CONSTANT_String);
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -0800269 slot_at_put(which, CPSlot(s, CPSlot::_symbol_bit));
J. Duke81537792007-12-01 00:00:00 +0000270 }
271
272 void int_at_put(int which, jint i) {
273 tag_at_put(which, JVM_CONSTANT_Integer);
274 *int_at_addr(which) = i;
275 }
276
277 void long_at_put(int which, jlong l) {
278 tag_at_put(which, JVM_CONSTANT_Long);
279 // *long_at_addr(which) = l;
280 Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
281 }
282
283 void float_at_put(int which, jfloat f) {
284 tag_at_put(which, JVM_CONSTANT_Float);
285 *float_at_addr(which) = f;
286 }
287
288 void double_at_put(int which, jdouble d) {
289 tag_at_put(which, JVM_CONSTANT_Double);
290 // *double_at_addr(which) = d;
291 // u8 temp = *(u8*) &d;
292 Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
293 }
294
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800295 Symbol** symbol_at_addr(int which) const {
296 assert(is_within_bounds(which), "index out of bounds");
297 return (Symbol**) &base()[which];
298 }
299
300 void symbol_at_put(int which, Symbol* s) {
301 assert(s->refcount() != 0, "should have nonzero refcount");
J. Duke81537792007-12-01 00:00:00 +0000302 tag_at_put(which, JVM_CONSTANT_Utf8);
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400303 *symbol_at_addr(which) = s;
J. Duke81537792007-12-01 00:00:00 +0000304 }
305
Goetz Lindenmaierb26df6b2016-01-04 15:41:05 +0100306 void string_at_put(int which, int obj_index, oop str);
J. Duke81537792007-12-01 00:00:00 +0000307
308 // For temporary use while constructing constant pool
309 void string_index_at_put(int which, int string_index) {
310 tag_at_put(which, JVM_CONSTANT_StringIndex);
311 *int_at_addr(which) = string_index;
312 }
313
314 void field_at_put(int which, int class_index, int name_and_type_index) {
315 tag_at_put(which, JVM_CONSTANT_Fieldref);
316 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
317 }
318
319 void method_at_put(int which, int class_index, int name_and_type_index) {
320 tag_at_put(which, JVM_CONSTANT_Methodref);
321 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
322 }
323
324 void interface_method_at_put(int which, int class_index, int name_and_type_index) {
325 tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
326 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; // Not so nice
327 }
328
329 void name_and_type_at_put(int which, int name_index, int signature_index) {
330 tag_at_put(which, JVM_CONSTANT_NameAndType);
331 *int_at_addr(which) = ((jint) signature_index<<16) | name_index; // Not so nice
332 }
333
334 // Tag query
335
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400336 constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800337
J. Duke81537792007-12-01 00:00:00 +0000338 // Fetching constants
339
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400340 Klass* klass_at(int which, TRAPS) {
J. Duke81537792007-12-01 00:00:00 +0000341 constantPoolHandle h_this(THREAD, this);
Stefan Karlsson692dbfd2014-11-12 13:55:59 +0100342 return klass_at_impl(h_this, which, true, THREAD);
Coleen Phillimore63080522014-10-28 17:02:08 -0400343 }
344
345 // Version of klass_at that doesn't save the resolution error, called during deopt
346 Klass* klass_at_ignore_error(int which, TRAPS) {
347 constantPoolHandle h_this(THREAD, this);
Stefan Karlsson692dbfd2014-11-12 13:55:59 +0100348 return klass_at_impl(h_this, which, false, THREAD);
J. Duke81537792007-12-01 00:00:00 +0000349 }
350
Markus Grönlund2ad9d312015-12-08 20:04:03 +0100351 Symbol* klass_name_at(int which) const; // Returns the name, w/o resolving.
J. Duke81537792007-12-01 00:00:00 +0000352
Yumin Qic6aa9c62013-05-10 08:27:30 -0700353 Klass* resolved_klass_at(int which) const { // Used by Compiler
J. Duke81537792007-12-01 00:00:00 +0000354 guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
355 // Must do an acquire here in case another thread resolved the klass
356 // behind our back, lest we later load stale values thru the oop.
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400357 return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
J. Duke81537792007-12-01 00:00:00 +0000358 }
359
J. Duke81537792007-12-01 00:00:00 +0000360 // RedefineClasses() API support:
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800361 Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
J. Duke81537792007-12-01 00:00:00 +0000362
363 jint int_at(int which) {
364 assert(tag_at(which).is_int(), "Corrupted constant pool");
365 return *int_at_addr(which);
366 }
367
368 jlong long_at(int which) {
369 assert(tag_at(which).is_long(), "Corrupted constant pool");
370 // return *long_at_addr(which);
371 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
372 return *((jlong*)&tmp);
373 }
374
375 jfloat float_at(int which) {
376 assert(tag_at(which).is_float(), "Corrupted constant pool");
377 return *float_at_addr(which);
378 }
379
380 jdouble double_at(int which) {
381 assert(tag_at(which).is_double(), "Corrupted constant pool");
382 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
383 return *((jdouble*)&tmp);
384 }
385
Markus Grönlund2ad9d312015-12-08 20:04:03 +0100386 Symbol* symbol_at(int which) const {
J. Duke81537792007-12-01 00:00:00 +0000387 assert(tag_at(which).is_utf8(), "Corrupted constant pool");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400388 return *symbol_at_addr(which);
J. Duke81537792007-12-01 00:00:00 +0000389 }
390
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400391 oop string_at(int which, int obj_index, TRAPS) {
J. Duke81537792007-12-01 00:00:00 +0000392 constantPoolHandle h_this(THREAD, this);
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400393 return string_at_impl(h_this, which, obj_index, THREAD);
J. Duke81537792007-12-01 00:00:00 +0000394 }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400395 oop string_at(int which, TRAPS) {
396 int obj_index = cp_to_object_index(which);
397 return string_at(which, obj_index, THREAD);
398 }
399
400 // Version that can be used before string oop array is created.
401 oop uncached_string_at(int which, TRAPS);
J. Duke81537792007-12-01 00:00:00 +0000402
Tobias Hartmann06c26b62014-04-29 08:08:44 +0200403 // A "pseudo-string" is an non-string oop that has found its way into
John R Rose849e0ff2008-11-12 22:33:26 -0800404 // a String entry.
Tobias Hartmann06c26b62014-04-29 08:08:44 +0200405 // This can happen if the user patches a live
John R Rose849e0ff2008-11-12 22:33:26 -0800406 // object into a CONSTANT_String entry of an anonymous class.
407 // Method oops internally created for method handles may also
408 // use pseudo-strings to link themselves to related metaobjects.
409
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400410 bool is_pseudo_string_at(int which) {
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -0800411 assert(tag_at(which).is_string(), "Corrupted constant pool");
412 return slot_at(which).is_pseudo_string();
John R Rose849e0ff2008-11-12 22:33:26 -0800413 }
414
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400415 oop pseudo_string_at(int which, int obj_index) {
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -0800416 assert(is_pseudo_string_at(which), "must be a pseudo-string");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400417 oop s = resolved_references()->obj_at(obj_index);
418 return s;
419 }
420
Coleen Phillimoreb8b94342013-02-22 08:36:42 -0500421 oop pseudo_string_at(int which) {
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -0800422 assert(is_pseudo_string_at(which), "must be a pseudo-string");
Coleen Phillimoreb8b94342013-02-22 08:36:42 -0500423 int obj_index = cp_to_object_index(which);
424 oop s = resolved_references()->obj_at(obj_index);
425 return s;
426 }
427
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400428 void pseudo_string_at_put(int which, int obj_index, oop x) {
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400429 assert(tag_at(which).is_string(), "Corrupted constant pool");
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -0800430 Symbol* sym = unresolved_string_at(which);
431 slot_at_put(which, CPSlot(sym, (CPSlot::_symbol_bit | CPSlot::_pseudo_bit)));
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400432 string_at_put(which, obj_index, x); // this works just fine
John R Rose849e0ff2008-11-12 22:33:26 -0800433 }
434
J. Duke81537792007-12-01 00:00:00 +0000435 // only called when we are sure a string entry is already resolved (via an
436 // earlier string_at call.
437 oop resolved_string_at(int which) {
438 assert(tag_at(which).is_string(), "Corrupted constant pool");
439 // Must do an acquire here in case another thread resolved the klass
440 // behind our back, lest we later load stale values thru the oop.
Coleen Phillimore28047d62012-09-29 06:40:00 -0400441 // we might want a volatile_obj_at in ObjArrayKlass.
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400442 int obj_index = cp_to_object_index(which);
443 return resolved_references()->obj_at(obj_index);
J. Duke81537792007-12-01 00:00:00 +0000444 }
445
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400446 Symbol* unresolved_string_at(int which) {
447 assert(tag_at(which).is_string(), "Corrupted constant pool");
Serguei Spitsyn8be0bb52015-01-29 03:11:01 -0800448 Symbol* sym = slot_at(which).get_symbol();
449 return sym;
J. Duke81537792007-12-01 00:00:00 +0000450 }
451
452 // Returns an UTF8 for a CONSTANT_String entry at a given index.
453 // UTF8 char* representation was chosen to avoid conversion of
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800454 // java_lang_Strings at resolved entries into Symbol*s
J. Duke81537792007-12-01 00:00:00 +0000455 // or vice versa.
456 char* string_at_noresolve(int which);
457
458 jint name_and_type_at(int which) {
459 assert(tag_at(which).is_name_and_type(), "Corrupted constant pool");
460 return *int_at_addr(which);
461 }
462
Coleen Phillimore8e63a102016-04-13 12:57:31 -0400463 int method_handle_ref_kind_at(int which) {
Ioi Lam52205142013-09-23 08:56:19 -0700464 assert(tag_at(which).is_method_handle() ||
Coleen Phillimore8e63a102016-04-13 12:57:31 -0400465 tag_at(which).is_method_handle_in_error(), "Corrupted constant pool");
John R Rose1f4cfb02010-06-09 18:50:45 -0700466 return extract_low_short_from_int(*int_at_addr(which)); // mask out unwanted ref_index bits
467 }
Coleen Phillimore8e63a102016-04-13 12:57:31 -0400468 int method_handle_index_at(int which) {
Ioi Lam52205142013-09-23 08:56:19 -0700469 assert(tag_at(which).is_method_handle() ||
Coleen Phillimore8e63a102016-04-13 12:57:31 -0400470 tag_at(which).is_method_handle_in_error(), "Corrupted constant pool");
John R Rose1f4cfb02010-06-09 18:50:45 -0700471 return extract_high_short_from_int(*int_at_addr(which)); // shift out unwanted ref_kind bits
472 }
Ioi Lam52205142013-09-23 08:56:19 -0700473 int method_type_index_at(int which) {
Coleen Phillimore8e63a102016-04-13 12:57:31 -0400474 assert(tag_at(which).is_method_type() ||
475 tag_at(which).is_method_type_in_error(), "Corrupted constant pool");
476 return *int_at_addr(which);
Ioi Lam52205142013-09-23 08:56:19 -0700477 }
478
John R Rose1f4cfb02010-06-09 18:50:45 -0700479 // Derived queries:
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800480 Symbol* method_handle_name_ref_at(int which) {
John R Rose1f4cfb02010-06-09 18:50:45 -0700481 int member = method_handle_index_at(which);
482 return impl_name_ref_at(member, true);
483 }
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800484 Symbol* method_handle_signature_ref_at(int which) {
John R Rose1f4cfb02010-06-09 18:50:45 -0700485 int member = method_handle_index_at(which);
486 return impl_signature_ref_at(member, true);
487 }
488 int method_handle_klass_index_at(int which) {
489 int member = method_handle_index_at(which);
490 return impl_klass_ref_index_at(member, true);
491 }
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800492 Symbol* method_type_signature_at(int which) {
John R Rose1f4cfb02010-06-09 18:50:45 -0700493 int sym = method_type_index_at(which);
494 return symbol_at(sym);
495 }
John R Rosece0125e2010-10-30 13:08:23 -0700496
John R Rosecc7c58e2010-12-03 15:53:57 -0800497 int invoke_dynamic_name_and_type_ref_index_at(int which) {
John R Rosece0125e2010-10-30 13:08:23 -0700498 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
John R Rosecc7c58e2010-12-03 15:53:57 -0800499 return extract_high_short_from_int(*int_at_addr(which));
John R Rosece0125e2010-10-30 13:08:23 -0700500 }
John R Rosecc7c58e2010-12-03 15:53:57 -0800501 int invoke_dynamic_bootstrap_specifier_index(int which) {
502 assert(tag_at(which).value() == JVM_CONSTANT_InvokeDynamic, "Corrupted constant pool");
503 return extract_low_short_from_int(*int_at_addr(which));
John R Rosece0125e2010-10-30 13:08:23 -0700504 }
John R Rosecc7c58e2010-12-03 15:53:57 -0800505 int invoke_dynamic_operand_base(int which) {
506 int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
507 return operand_offset_at(operands(), bootstrap_specifier_index);
John R Rosece0125e2010-10-30 13:08:23 -0700508 }
John R Rosecc7c58e2010-12-03 15:53:57 -0800509 // The first part of the operands array consists of an index into the second part.
510 // Extract a 32-bit index value from the first part.
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400511 static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
John R Rosecc7c58e2010-12-03 15:53:57 -0800512 int n = (bootstrap_specifier_index * 2);
513 assert(n >= 0 && n+2 <= operands->length(), "oob");
514 // The first 32-bit index points to the beginning of the second part
515 // of the operands array. Make sure this index is in the first part.
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400516 DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
517 operands->at(1)));
John R Rosecc7c58e2010-12-03 15:53:57 -0800518 assert(second_part == 0 || n+2 <= second_part, "oob (2)");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400519 int offset = build_int_from_shorts(operands->at(n+0),
520 operands->at(n+1));
John R Rosecc7c58e2010-12-03 15:53:57 -0800521 // The offset itself must point into the second part of the array.
522 assert(offset == 0 || offset >= second_part && offset <= operands->length(), "oob (3)");
523 return offset;
524 }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400525 static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
John R Rosecc7c58e2010-12-03 15:53:57 -0800526 int n = bootstrap_specifier_index * 2;
527 assert(n >= 0 && n+2 <= operands->length(), "oob");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400528 operands->at_put(n+0, extract_low_short_from_int(offset));
529 operands->at_put(n+1, extract_high_short_from_int(offset));
John R Rosecc7c58e2010-12-03 15:53:57 -0800530 }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400531 static int operand_array_length(Array<u2>* operands) {
John R Rosecc7c58e2010-12-03 15:53:57 -0800532 if (operands == NULL || operands->length() == 0) return 0;
533 int second_part = operand_offset_at(operands, 0);
534 return (second_part / 2);
John R Rosece0125e2010-10-30 13:08:23 -0700535 }
536
John R Rosecc7c58e2010-12-03 15:53:57 -0800537#ifdef ASSERT
538 // operand tuples fit together exactly, end to end
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400539 static int operand_limit_at(Array<u2>* operands, int bootstrap_specifier_index) {
John R Rosecc7c58e2010-12-03 15:53:57 -0800540 int nextidx = bootstrap_specifier_index + 1;
541 if (nextidx == operand_array_length(operands))
542 return operands->length();
543 else
544 return operand_offset_at(operands, nextidx);
545 }
546 int invoke_dynamic_operand_limit(int which) {
547 int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
548 return operand_limit_at(operands(), bootstrap_specifier_index);
549 }
550#endif //ASSERT
551
552 // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
John R Rosece0125e2010-10-30 13:08:23 -0700553 enum {
554 _indy_bsm_offset = 0, // CONSTANT_MethodHandle bsm
John R Rosecc7c58e2010-12-03 15:53:57 -0800555 _indy_argc_offset = 1, // u2 argc
556 _indy_argv_offset = 2 // u2 argv[argc]
John R Rosece0125e2010-10-30 13:08:23 -0700557 };
Serguei Spitsyn333cf9a2013-04-25 03:58:53 -0700558
559 // These functions are used in RedefineClasses for CP merge
560
561 int operand_offset_at(int bootstrap_specifier_index) {
562 assert(0 <= bootstrap_specifier_index &&
563 bootstrap_specifier_index < operand_array_length(operands()),
564 "Corrupted CP operands");
565 return operand_offset_at(operands(), bootstrap_specifier_index);
566 }
567 int operand_bootstrap_method_ref_index_at(int bootstrap_specifier_index) {
568 int offset = operand_offset_at(bootstrap_specifier_index);
569 return operands()->at(offset + _indy_bsm_offset);
570 }
571 int operand_argument_count_at(int bootstrap_specifier_index) {
572 int offset = operand_offset_at(bootstrap_specifier_index);
573 int argc = operands()->at(offset + _indy_argc_offset);
574 return argc;
575 }
576 int operand_argument_index_at(int bootstrap_specifier_index, int j) {
577 int offset = operand_offset_at(bootstrap_specifier_index);
578 return operands()->at(offset + _indy_argv_offset + j);
579 }
580 int operand_next_offset_at(int bootstrap_specifier_index) {
581 int offset = operand_offset_at(bootstrap_specifier_index) + _indy_argv_offset
582 + operand_argument_count_at(bootstrap_specifier_index);
583 return offset;
584 }
585 // Compare a bootsrap specifier in the operands arrays
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400586 bool compare_operand_to(int bootstrap_specifier_index1, const constantPoolHandle& cp2,
Serguei Spitsyn333cf9a2013-04-25 03:58:53 -0700587 int bootstrap_specifier_index2, TRAPS);
588 // Find a bootsrap specifier in the operands array
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400589 int find_matching_operand(int bootstrap_specifier_index, const constantPoolHandle& search_cp,
Serguei Spitsyn333cf9a2013-04-25 03:58:53 -0700590 int operands_cur_len, TRAPS);
591 // Resize the operands array with delta_len and delta_size
592 void resize_operands(int delta_len, int delta_size, TRAPS);
593 // Extend the operands array with the length and size of the ext_cp operands
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400594 void extend_operands(const constantPoolHandle& ext_cp, TRAPS);
Serguei Spitsyn333cf9a2013-04-25 03:58:53 -0700595 // Shrink the operands array to a smaller array with new_len length
596 void shrink_operands(int new_len, TRAPS);
597
598
John R Rosea4e41492010-07-15 18:40:45 -0700599 int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
600 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
John R Rosecc7c58e2010-12-03 15:53:57 -0800601 int op_base = invoke_dynamic_operand_base(which);
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400602 return operands()->at(op_base + _indy_bsm_offset);
John R Rosece0125e2010-10-30 13:08:23 -0700603 }
604 int invoke_dynamic_argument_count_at(int which) {
605 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
John R Rosecc7c58e2010-12-03 15:53:57 -0800606 int op_base = invoke_dynamic_operand_base(which);
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400607 int argc = operands()->at(op_base + _indy_argc_offset);
John R Rosecc7c58e2010-12-03 15:53:57 -0800608 DEBUG_ONLY(int end_offset = op_base + _indy_argv_offset + argc;
609 int next_offset = invoke_dynamic_operand_limit(which));
610 assert(end_offset == next_offset, "matched ending");
John R Rosece0125e2010-10-30 13:08:23 -0700611 return argc;
612 }
613 int invoke_dynamic_argument_index_at(int which, int j) {
John R Rosecc7c58e2010-12-03 15:53:57 -0800614 int op_base = invoke_dynamic_operand_base(which);
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400615 DEBUG_ONLY(int argc = operands()->at(op_base + _indy_argc_offset));
John R Rosecc7c58e2010-12-03 15:53:57 -0800616 assert((uint)j < (uint)argc, "oob");
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400617 return operands()->at(op_base + _indy_argv_offset + j);
John R Rosea4e41492010-07-15 18:40:45 -0700618 }
John R Rose1f4cfb02010-06-09 18:50:45 -0700619
John R Rose34c1d722009-04-21 23:21:04 -0700620 // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
John R Rose903247c2009-10-30 16:22:59 -0700621 // name_and_type_ref_index_at) all expect to be passed indices obtained
John R Roseb22ecee2010-10-30 11:45:35 -0700622 // directly from the bytecode.
John R Rose903247c2009-10-30 16:22:59 -0700623 // If the indices are meant to refer to fields or methods, they are
John R Roseb22ecee2010-10-30 11:45:35 -0700624 // actually rewritten constant pool cache indices.
John R Rose903247c2009-10-30 16:22:59 -0700625 // The routine remap_instruction_operand_from_cache manages the adjustment
626 // of these values back to constant pool indices.
John R Rose34c1d722009-04-21 23:21:04 -0700627
John R Rose903247c2009-10-30 16:22:59 -0700628 // There are also "uncached" versions which do not adjust the operand index; see below.
J. Duke81537792007-12-01 00:00:00 +0000629
John R Roseb22ecee2010-10-30 11:45:35 -0700630 // FIXME: Consider renaming these with a prefix "cached_" to make the distinction clear.
631 // In a few cases (the verifier) there are uses before a cpcache has been built,
632 // which are handled by a dynamic check in remap_instruction_operand_from_cache.
633 // FIXME: Remove the dynamic check, and adjust all callers to specify the correct mode.
634
J. Duke81537792007-12-01 00:00:00 +0000635 // Lookup for entries consisting of (klass_index, name_and_type index)
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400636 Klass* klass_ref_at(int which, TRAPS);
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800637 Symbol* klass_ref_at_noresolve(int which);
638 Symbol* name_ref_at(int which) { return impl_name_ref_at(which, false); }
639 Symbol* signature_ref_at(int which) { return impl_signature_ref_at(which, false); }
J. Duke81537792007-12-01 00:00:00 +0000640
John R Rose34c1d722009-04-21 23:21:04 -0700641 int klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, false); }
642 int name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, false); }
J. Duke81537792007-12-01 00:00:00 +0000643
Christian Thalinger16526e02015-10-08 12:49:30 -1000644 int remap_instruction_operand_from_cache(int operand); // operand must be biased by CPCACHE_INDEX_TAG
645
J. Duke81537792007-12-01 00:00:00 +0000646 // Lookup for entries consisting of (name_index, signature_index)
John R Rose34c1d722009-04-21 23:21:04 -0700647 int name_ref_index_at(int which_nt); // == low-order jshort of name_and_type_at(which_nt)
648 int signature_ref_index_at(int which_nt); // == high-order jshort of name_and_type_at(which_nt)
J. Duke81537792007-12-01 00:00:00 +0000649
Markus Grönlund2ad9d312015-12-08 20:04:03 +0100650 BasicType basic_type_for_signature_at(int which) const;
J. Duke81537792007-12-01 00:00:00 +0000651
652 // Resolve string constants (to prevent allocation during compilation)
653 void resolve_string_constants(TRAPS) {
654 constantPoolHandle h_this(THREAD, this);
655 resolve_string_constants_impl(h_this, CHECK);
656 }
657
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400658 // CDS support
659 void remove_unshareable_info();
660 void restore_unshareable_info(TRAPS);
661 bool resolve_class_constants(TRAPS);
Coleen Phillimore8536f542012-09-05 20:08:08 -0400662 // The ConstantPool vtable is restored by this call when the ConstantPool is
663 // in the shared archive. See patch_klass_vtables() in metaspaceShared.cpp for
664 // all the gory details. SA, dtrace and pstack helpers distinguish metadata
665 // by their vtable.
666 void restore_vtable() { guarantee(is_constantPool(), "vtable restored by this call"); }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400667
John R Rosece0125e2010-10-30 13:08:23 -0700668 private:
669 enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
670 public:
671
John R Rose1f4cfb02010-06-09 18:50:45 -0700672 // Resolve late bound constants.
673 oop resolve_constant_at(int index, TRAPS) {
674 constantPoolHandle h_this(THREAD, this);
John R Rosece0125e2010-10-30 13:08:23 -0700675 return resolve_constant_at_impl(h_this, index, _no_index_sentinel, THREAD);
John R Rose1f4cfb02010-06-09 18:50:45 -0700676 }
677
678 oop resolve_cached_constant_at(int cache_index, TRAPS) {
679 constantPoolHandle h_this(THREAD, this);
John R Rosece0125e2010-10-30 13:08:23 -0700680 return resolve_constant_at_impl(h_this, _no_index_sentinel, cache_index, THREAD);
681 }
682
683 oop resolve_possibly_cached_constant_at(int pool_index, TRAPS) {
684 constantPoolHandle h_this(THREAD, this);
685 return resolve_constant_at_impl(h_this, pool_index, _possible_index_sentinel, THREAD);
John R Rose1f4cfb02010-06-09 18:50:45 -0700686 }
687
Christian Thalinger12901d02012-07-24 10:51:00 -0700688 oop resolve_bootstrap_specifier_at(int index, TRAPS) {
689 constantPoolHandle h_this(THREAD, this);
690 return resolve_bootstrap_specifier_at_impl(h_this, index, THREAD);
691 }
692
J. Duke81537792007-12-01 00:00:00 +0000693 // Klass name matches name at offset
694 bool klass_name_at_matches(instanceKlassHandle k, int which);
695
696 // Sizing
Coleen Phillimore4a831d42008-04-13 17:43:42 -0400697 int length() const { return _length; }
698 void set_length(int length) { _length = length; }
699
700 // Tells whether index is within bounds.
701 bool is_within_bounds(int index) const {
702 return 0 <= index && index < length();
703 }
704
Ioi Lam93b845e2013-01-25 15:06:18 -0500705 // Sizing (in words)
Coleen Phillimore97e169a2016-01-30 11:02:29 -0500706 static int header_size() { return sizeof(ConstantPool)/wordSize; }
707 static int size(int length) { return align_metadata_size(header_size() + length); }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400708 int size() const { return size(length()); }
Ioi Lam93b845e2013-01-25 15:06:18 -0500709#if INCLUDE_SERVICES
710 void collect_statistics(KlassSizeStats *sz) const;
711#endif
J. Duke81537792007-12-01 00:00:00 +0000712
J. Duke81537792007-12-01 00:00:00 +0000713 friend class ClassFileParser;
714 friend class SystemDictionary;
715
716 // Used by compiler to prevent classloading.
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400717 static Method* method_at_if_loaded (const constantPoolHandle& this_cp, int which);
718 static bool has_appendix_at_if_loaded (const constantPoolHandle& this_cp, int which);
719 static oop appendix_at_if_loaded (const constantPoolHandle& this_cp, int which);
720 static bool has_method_type_at_if_loaded (const constantPoolHandle& this_cp, int which);
721 static oop method_type_at_if_loaded (const constantPoolHandle& this_cp, int which);
722 static Klass* klass_at_if_loaded (const constantPoolHandle& this_cp, int which);
723 static Klass* klass_ref_at_if_loaded (const constantPoolHandle& this_cp, int which);
J. Duke81537792007-12-01 00:00:00 +0000724
725 // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
John R Roseb22ecee2010-10-30 11:45:35 -0700726 // future by other Java code. These take constant pool indices rather than
J. Duke81537792007-12-01 00:00:00 +0000727 // constant pool cache indices as do the peer methods above.
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800728 Symbol* uncached_klass_ref_at_noresolve(int which);
729 Symbol* uncached_name_ref_at(int which) { return impl_name_ref_at(which, true); }
730 Symbol* uncached_signature_ref_at(int which) { return impl_signature_ref_at(which, true); }
John R Rose34c1d722009-04-21 23:21:04 -0700731 int uncached_klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, true); }
732 int uncached_name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, true); }
J. Duke81537792007-12-01 00:00:00 +0000733
734 // Sharing
735 int pre_resolve_shared_klasses(TRAPS);
J. Duke81537792007-12-01 00:00:00 +0000736
737 // Debugging
738 const char* printable_name_at(int which) PRODUCT_RETURN0;
739
John R Rose581521b2010-05-23 01:38:26 -0700740#ifdef ASSERT
741 enum { CPCACHE_INDEX_TAG = 0x10000 }; // helps keep CP cache indices distinct from CP indices
John R Rose1f4cfb02010-06-09 18:50:45 -0700742#else
743 enum { CPCACHE_INDEX_TAG = 0 }; // in product mode, this zero value is a no-op
John R Rose581521b2010-05-23 01:38:26 -0700744#endif //ASSERT
745
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400746 static int decode_cpcache_index(int raw_index, bool invokedynamic_ok = false) {
747 if (invokedynamic_ok && is_invokedynamic_index(raw_index))
748 return decode_invokedynamic_index(raw_index);
749 else
750 return raw_index - CPCACHE_INDEX_TAG;
751 }
Christian Thalinger12901d02012-07-24 10:51:00 -0700752
J. Duke81537792007-12-01 00:00:00 +0000753 private:
754
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400755 void set_resolved_references(jobject s) { _resolved_references = s; }
756 Array<u2>* reference_map() const { return _reference_map; }
757 void set_reference_map(Array<u2>* o) { _reference_map = o; }
758
759 // patch JSR 292 resolved references after the class is linked.
760 void patch_resolved_references(GrowableArray<Handle>* cp_patches);
761
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800762 Symbol* impl_name_ref_at(int which, bool uncached);
763 Symbol* impl_signature_ref_at(int which, bool uncached);
John R Rose34c1d722009-04-21 23:21:04 -0700764 int impl_klass_ref_index_at(int which, bool uncached);
765 int impl_name_and_type_ref_index_at(int which, bool uncached);
766
J. Duke81537792007-12-01 00:00:00 +0000767 // Used while constructing constant pool (only by ClassFileParser)
768 jint klass_index_at(int which) {
769 assert(tag_at(which).is_klass_index(), "Corrupted constant pool");
770 return *int_at_addr(which);
771 }
772
773 jint string_index_at(int which) {
774 assert(tag_at(which).is_string_index(), "Corrupted constant pool");
775 return *int_at_addr(which);
776 }
777
778 // Performs the LinkResolver checks
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400779 static void verify_constant_pool_resolve(const constantPoolHandle& this_cp, KlassHandle klass, TRAPS);
J. Duke81537792007-12-01 00:00:00 +0000780
781 // Implementation of methods that needs an exposed 'this' pointer, in order to
782 // handle GC while executing the method
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400783 static Klass* klass_at_impl(const constantPoolHandle& this_cp, int which,
Coleen Phillimore63080522014-10-28 17:02:08 -0400784 bool save_resolution_error, TRAPS);
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400785 static oop string_at_impl(const constantPoolHandle& this_cp, int which, int obj_index, TRAPS);
J. Duke81537792007-12-01 00:00:00 +0000786
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400787 static void trace_class_resolution(const constantPoolHandle& this_cp, KlassHandle k);
Coleen Phillimore243d6972014-06-19 11:16:10 -0400788
J. Duke81537792007-12-01 00:00:00 +0000789 // Resolve string constants (to prevent allocation during compilation)
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400790 static void resolve_string_constants_impl(const constantPoolHandle& this_cp, TRAPS);
J. Duke81537792007-12-01 00:00:00 +0000791
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400792 static oop resolve_constant_at_impl(const constantPoolHandle& this_cp, int index, int cache_index, TRAPS);
793 static oop resolve_bootstrap_specifier_at_impl(const constantPoolHandle& this_cp, int index, TRAPS);
John R Rose1f4cfb02010-06-09 18:50:45 -0700794
Coleen Phillimore7e2463e2014-05-05 19:53:00 -0400795 // Exception handling
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400796 static void throw_resolution_error(const constantPoolHandle& this_cp, int which, TRAPS);
797 static Symbol* exception_message(const constantPoolHandle& this_cp, int which, constantTag tag, oop pending_exception);
798 static void save_and_throw_exception(const constantPoolHandle& this_cp, int which, constantTag tag, TRAPS);
Coleen Phillimore7e2463e2014-05-05 19:53:00 -0400799
J. Duke81537792007-12-01 00:00:00 +0000800 public:
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400801 // Merging ConstantPool* support:
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400802 bool compare_entry_to(int index1, const constantPoolHandle& cp2, int index2, TRAPS);
803 void copy_cp_to(int start_i, int end_i, const constantPoolHandle& to_cp, int to_i, TRAPS) {
John R Rosecc7c58e2010-12-03 15:53:57 -0800804 constantPoolHandle h_this(THREAD, this);
805 copy_cp_to_impl(h_this, start_i, end_i, to_cp, to_i, THREAD);
806 }
Coleen Phillimoref1e89ea2015-10-23 16:48:38 -0400807 static void copy_cp_to_impl(const constantPoolHandle& from_cp, int start_i, int end_i, const constantPoolHandle& to_cp, int to_i, TRAPS);
808 static void copy_entry_to(const constantPoolHandle& from_cp, int from_i, const constantPoolHandle& to_cp, int to_i, TRAPS);
809 static void copy_operands(const constantPoolHandle& from_cp, const constantPoolHandle& to_cp, TRAPS);
810 int find_matching_entry(int pattern_i, const constantPoolHandle& search_cp, TRAPS);
Coleen Phillimoree508ba92013-01-17 13:40:31 -0500811 int version() const { return _saved._version; }
812 void set_version(int version) { _saved._version = version; }
813 void increment_and_save_version(int version) {
Coleen Phillimore833b7fc2013-01-17 22:11:57 -0500814 _saved._version = version >= 0 ? (version + 1) : version; // keep overflow
Coleen Phillimoree508ba92013-01-17 13:40:31 -0500815 }
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400816
817 void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
818 int resolved_reference_length() const { return _saved._resolved_reference_length; }
J. Duke81537792007-12-01 00:00:00 +0000819
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800820 // Decrease ref counts of symbols that are in the constant pool
821 // when the holder class is unloaded
822 void unreference_symbols();
J. Duke81537792007-12-01 00:00:00 +0000823
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400824 // Deallocate constant pool for RedefineClasses
825 void deallocate_contents(ClassLoaderData* loader_data);
826 void release_C_heap_structures();
827
J. Duke81537792007-12-01 00:00:00 +0000828 // JVMTI accesss - GetConstantPool, RetransformClasses, ...
829 friend class JvmtiConstantPoolReconstituter;
830
831 private:
832 jint cpool_entry_size(jint idx);
833 jint hash_entries_to(SymbolHashMap *symmap, SymbolHashMap *classmap);
834
835 // Copy cpool bytes into byte array.
836 // Returns:
837 // int > 0, count of the raw cpool bytes that have been copied
838 // 0, OutOfMemory error
839 // -1, Internal error
840 int copy_cpool_bytes(int cpool_size,
841 SymbolHashMap* tbl,
842 unsigned char *bytes);
Jon Masamitsu5c58d272012-09-01 13:25:18 -0400843
844 public:
845 // Verify
846 void verify_on(outputStream* st);
847
848 // Printing
849 void print_on(outputStream* st) const;
850 void print_value_on(outputStream* st) const;
851 void print_entry_on(int index, outputStream* st);
852
853 const char* internal_name() const { return "{constant pool}"; }
854
855#ifndef PRODUCT
856 // Compile the world support
857 static void preload_and_initialize_all_classes(ConstantPool* constant_pool, TRAPS);
858#endif
J. Duke81537792007-12-01 00:00:00 +0000859};
860
Zhengyu Gua39b1762012-06-28 17:03:16 -0400861class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
J. Duke81537792007-12-01 00:00:00 +0000862 private:
863 unsigned int _hash; // 32-bit hash for item
864 SymbolHashMapEntry* _next; // Next element in the linked list for this bucket
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800865 Symbol* _symbol; // 1-st part of the mapping: symbol => value
J. Duke81537792007-12-01 00:00:00 +0000866 u2 _value; // 2-nd part of the mapping: symbol => value
867
868 public:
869 unsigned int hash() const { return _hash; }
870 void set_hash(unsigned int hash) { _hash = hash; }
871
872 SymbolHashMapEntry* next() const { return _next; }
873 void set_next(SymbolHashMapEntry* next) { _next = next; }
874
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800875 Symbol* symbol() const { return _symbol; }
876 void set_symbol(Symbol* sym) { _symbol = sym; }
J. Duke81537792007-12-01 00:00:00 +0000877
878 u2 value() const { return _value; }
879 void set_value(u2 value) { _value = value; }
880
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800881 SymbolHashMapEntry(unsigned int hash, Symbol* symbol, u2 value)
J. Duke81537792007-12-01 00:00:00 +0000882 : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}
883
884}; // End SymbolHashMapEntry class
885
886
Zhengyu Gua39b1762012-06-28 17:03:16 -0400887class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
J. Duke81537792007-12-01 00:00:00 +0000888
889private:
890 SymbolHashMapEntry* _entry;
891
892public:
893 SymbolHashMapEntry* entry() const { return _entry; }
894 void set_entry(SymbolHashMapEntry* entry) { _entry = entry; }
895 void clear() { _entry = NULL; }
896
897}; // End SymbolHashMapBucket class
898
899
Zhengyu Gua39b1762012-06-28 17:03:16 -0400900class SymbolHashMap: public CHeapObj<mtSymbol> {
J. Duke81537792007-12-01 00:00:00 +0000901
902 private:
903 // Default number of entries in the table
904 enum SymbolHashMap_Constants {
905 _Def_HashMap_Size = 256
906 };
907
908 int _table_size;
909 SymbolHashMapBucket* _buckets;
910
911 void initialize_table(int table_size) {
912 _table_size = table_size;
Zhengyu Gua39b1762012-06-28 17:03:16 -0400913 _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
J. Duke81537792007-12-01 00:00:00 +0000914 for (int index = 0; index < table_size; index++) {
915 _buckets[index].clear();
916 }
917 }
918
919 public:
920
921 int table_size() const { return _table_size; }
922
923 SymbolHashMap() { initialize_table(_Def_HashMap_Size); }
924 SymbolHashMap(int table_size) { initialize_table(table_size); }
925
926 // hash P(31) from Kernighan & Ritchie
927 static unsigned int compute_hash(const char* str, int len) {
928 unsigned int hash = 0;
929 while (len-- > 0) {
930 hash = 31*hash + (unsigned) *str;
931 str++;
932 }
933 return hash;
934 }
935
936 SymbolHashMapEntry* bucket(int i) {
937 return _buckets[i].entry();
938 }
939
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800940 void add_entry(Symbol* sym, u2 value);
941 SymbolHashMapEntry* find_entry(Symbol* sym);
J. Duke81537792007-12-01 00:00:00 +0000942
Coleen Phillimore7b4f8072011-01-27 16:11:27 -0800943 u2 symbol_to_value(Symbol* sym) {
J. Duke81537792007-12-01 00:00:00 +0000944 SymbolHashMapEntry *entry = find_entry(sym);
945 return (entry == NULL) ? 0 : entry->value();
946 }
947
948 ~SymbolHashMap() {
949 SymbolHashMapEntry* next;
950 for (int i = 0; i < _table_size; i++) {
951 for (SymbolHashMapEntry* cur = bucket(i); cur != NULL; cur = next) {
952 next = cur->next();
953 delete(cur);
954 }
955 }
956 delete _buckets;
957 }
958}; // End SymbolHashMap class
Stefan Karlsson8006fe82010-11-23 13:22:55 -0800959
960#endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP