1 /*
2 * Copyright (c) 1997, 2025, 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 #ifndef SHARE_OOPS_CONSTANTPOOL_HPP
26 #define SHARE_OOPS_CONSTANTPOOL_HPP
27
28 #include "memory/allocation.hpp"
29 #include "oops/arrayOop.hpp"
30 #include "oops/cpCache.hpp"
31 #include "oops/objArrayOop.hpp"
32 #include "oops/oopHandle.hpp"
33 #include "oops/symbol.hpp"
34 #include "oops/typeArrayOop.hpp"
35 #include "runtime/handles.hpp"
36 #include "runtime/javaThread.hpp"
37 #include "utilities/align.hpp"
38 #include "utilities/bytes.hpp"
39 #include "utilities/constantTag.hpp"
40 #include "utilities/hashTable.hpp"
41 #include "utilities/macros.hpp"
42
43 // A ConstantPool is an array containing class constants as described in the
44 // class file.
45 //
46 // Most of the constant pool entries are written during class parsing, which
47 // is safe. For klass types, the constant pool entry is
48 // modified when the entry is resolved. If a klass constant pool
49 // entry is read without a lock, only the resolved state guarantees that
50 // the entry in the constant pool is a klass object and not a Symbol*.
51
52 // This represents a JVM_CONSTANT_Class, JVM_CONSTANT_UnresolvedClass, or
53 // JVM_CONSTANT_UnresolvedClassInError slot in the constant pool.
54 class CPKlassSlot {
55 // cp->symbol_at(_name_index) gives the name of the class.
56 int _name_index;
57
58 // cp->_resolved_klasses->at(_resolved_klass_index) gives the Klass* for the class.
59 int _resolved_klass_index;
60 public:
61 enum {
62 // This is used during constant pool merging where the resolved klass index is
63 // not yet known, and will be computed at a later stage (during a call to
64 // initialize_unresolved_klasses()).
65 _temp_resolved_klass_index = 0xffff
66 };
67 CPKlassSlot(int n, int rk) {
68 _name_index = n;
69 _resolved_klass_index = rk;
70 }
71 int name_index() const {
72 return _name_index;
73 }
74 int resolved_klass_index() const {
75 assert(_resolved_klass_index != _temp_resolved_klass_index, "constant pool merging was incomplete");
76 return _resolved_klass_index;
77 }
78 };
79
80 class BSMAttributeEntry {
81 friend class ConstantPool;
82 u2 _bootstrap_method_index;
83 u2 _argument_count;
84
85 // The argument indexes are stored right after the object, in a contiguous array.
86 // [ bsmi_0 argc_0 arg_00 arg_01 ... arg_0N bsmi_1 argc_1 arg_10 ... arg_1N ... ]
87 // So in order to find the argument array, jump over ourselves.
88 const u2* argument_indexes() const {
89 return reinterpret_cast<const u2*>(this + 1);
90 }
91 u2* argument_indexes() {
92 return reinterpret_cast<u2*>(this + 1);
93 }
94 // These are overlays on top of the operands array. Do not construct.
95 BSMAttributeEntry() = delete;
96
97 public:
98 // Offsets for SA
99 enum {
100 _bsmi_offset = 0,
101 _argc_offset = 1,
102 _argv_offset = 2
103 };
104
105 int bootstrap_method_index() const {
106 return _bootstrap_method_index;
107 }
108 int argument_count() const {
109 return _argument_count;
110 }
111 int argument_index(int n) const {
112 assert(checked_cast<u2>(n) < _argument_count, "oob");
113 return argument_indexes()[n];
114 }
115 };
116
117 class ConstantPool : public Metadata {
118 friend class VMStructs;
119 friend class JVMCIVMStructs;
120 friend class BytecodeInterpreter; // Directly extracts a klass in the pool for fast instanceof/checkcast
121 friend class Universe; // For null constructor
122 friend class AOTConstantPoolResolver;
123 private:
124 // If you add a new field that points to any metaspace object, you
125 // must add this field to ConstantPool::metaspace_pointers_do().
126 Array<u1>* _tags; // the tag array describing the constant pool's contents
127 ConstantPoolCache* _cache; // the cache holding interpreter runtime information
128 InstanceKlass* _pool_holder; // the corresponding class
129 Array<u2>* _operands; // for variable-sized (InvokeDynamic) nodes, usually empty
130
131 // Consider using an array of compressed klass pointers to
132 // save space on 64-bit platforms.
133 Array<Klass*>* _resolved_klasses;
134
135 u2 _major_version; // major version number of class file
136 u2 _minor_version; // minor version number of class file
137
138 // Constant pool index to the utf8 entry of the Generic signature,
139 // or 0 if none.
140 u2 _generic_signature_index;
141 // Constant pool index to the utf8 entry for the name of source file
142 // containing this klass, 0 if not specified.
143 u2 _source_file_name_index;
144
145 enum {
146 _has_preresolution = 1, // Flags
147 _on_stack = 2,
148 _in_aot_cache = 4,
149 _has_dynamic_constant = 8,
150 _is_for_method_handle_intrinsic = 16
151 };
152
153 u2 _flags; // old fashioned bit twiddling
154
155 int _length; // number of elements in the array
156
157 union {
158 // set for CDS to restore resolved references
159 int _resolved_reference_length;
160 // keeps version number for redefined classes (used in backtrace)
161 int _version;
162 } _saved;
163
164 void set_tags(Array<u1>* tags) { _tags = tags; }
165 void tag_at_put(int cp_index, jbyte t) { tags()->at_put(cp_index, t); }
166 void release_tag_at_put(int cp_index, jbyte t) { tags()->release_at_put(cp_index, t); }
167
168 u1* tag_addr_at(int cp_index) const { return tags()->adr_at(cp_index); }
169
170 void set_operands(Array<u2>* operands) { _operands = operands; }
171
172 u2 flags() const { return _flags; }
173 void set_flags(u2 f) { _flags = f; }
174
175 private:
176 intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
177
178 intptr_t* obj_at_addr(int cp_index) const {
179 assert(is_within_bounds(cp_index), "index out of bounds");
180 return (intptr_t*) &base()[cp_index];
181 }
182
183 jint* int_at_addr(int cp_index) const {
184 assert(is_within_bounds(cp_index), "index out of bounds");
185 return (jint*) &base()[cp_index];
186 }
187
188 jlong* long_at_addr(int cp_index) const {
189 assert(is_within_bounds(cp_index), "index out of bounds");
190 return (jlong*) &base()[cp_index];
191 }
192
193 jfloat* float_at_addr(int cp_index) const {
194 assert(is_within_bounds(cp_index), "index out of bounds");
195 return (jfloat*) &base()[cp_index];
196 }
197
198 jdouble* double_at_addr(int cp_index) const {
199 assert(is_within_bounds(cp_index), "index out of bounds");
200 return (jdouble*) &base()[cp_index];
201 }
202
203 ConstantPool(Array<u1>* tags);
204 ConstantPool();
205 public:
206 static ConstantPool* allocate(ClassLoaderData* loader_data, int length, TRAPS);
207
208 virtual bool is_constantPool() const { return true; }
209
210 Array<u1>* tags() const { return _tags; }
211 Array<u2>* operands() const { return _operands; }
212
213 bool has_preresolution() const { return (_flags & _has_preresolution) != 0; }
214 void set_has_preresolution() {
215 assert(!in_aot_cache(), "should never be called on ConstantPools in AOT cache");
216 _flags |= _has_preresolution;
217 }
218
219 // minor and major version numbers of class file
220 u2 major_version() const { return _major_version; }
221 void set_major_version(u2 major_version) { _major_version = major_version; }
222 u2 minor_version() const { return _minor_version; }
223 void set_minor_version(u2 minor_version) { _minor_version = minor_version; }
224
225 // generics support
226 Symbol* generic_signature() const {
227 return (_generic_signature_index == 0) ?
228 nullptr : symbol_at(_generic_signature_index);
229 }
230 u2 generic_signature_index() const { return _generic_signature_index; }
231 void set_generic_signature_index(u2 sig_index) { _generic_signature_index = sig_index; }
232
233 // source file name
234 Symbol* source_file_name() const {
235 return (_source_file_name_index == 0) ?
236 nullptr : symbol_at(_source_file_name_index);
237 }
238 u2 source_file_name_index() const { return _source_file_name_index; }
239 void set_source_file_name_index(u2 sourcefile_index) { _source_file_name_index = sourcefile_index; }
240
241 void copy_fields(const ConstantPool* orig);
242
243 // Redefine classes support. If a method referring to this constant pool
244 // is on the executing stack, or as a handle in vm code, this constant pool
245 // can't be removed from the set of previous versions saved in the instance
246 // class.
247 bool on_stack() const;
248 bool is_maybe_on_stack() const;
249 void set_on_stack(const bool value);
250
251 // Shadows MetaspaceObj::in_aot_cache(). It's faster and is used by set_on_stack()
252 bool in_aot_cache() const { return (_flags & _in_aot_cache) != 0; }
253
254 bool has_dynamic_constant() const { return (_flags & _has_dynamic_constant) != 0; }
255 void set_has_dynamic_constant() { _flags |= _has_dynamic_constant; }
256
257 bool is_for_method_handle_intrinsic() const { return (_flags & _is_for_method_handle_intrinsic) != 0; }
258 void set_is_for_method_handle_intrinsic() { _flags |= _is_for_method_handle_intrinsic; }
259
260 // Klass holding pool
261 InstanceKlass* pool_holder() const { return _pool_holder; }
262 void set_pool_holder(InstanceKlass* k) { _pool_holder = k; }
263 InstanceKlass** pool_holder_addr() { return &_pool_holder; }
264
265 // Interpreter runtime support
266 ConstantPoolCache* cache() const { return _cache; }
267 void set_cache(ConstantPoolCache* cache){ _cache = cache; }
268
269 virtual void metaspace_pointers_do(MetaspaceClosure* iter);
270 virtual MetaspaceObj::Type type() const { return ConstantPoolType; }
271
272 // Create object cache in the constant pool
273 void initialize_resolved_references(ClassLoaderData* loader_data,
274 const intStack& reference_map,
275 int constant_pool_map_length,
276 TRAPS);
277
278 // resolved strings, methodHandles and callsite objects from the constant pool
279 objArrayOop resolved_references() const;
280 objArrayOop resolved_references_or_null() const;
281 oop resolved_reference_at(int obj_index) const;
282 oop set_resolved_reference_at(int index, oop new_value);
283
284 // mapping resolved object array indexes to cp indexes and back.
285 int object_to_cp_index(int index) { return reference_map()->at(index); }
286 int cp_to_object_index(int index);
287
288 void set_resolved_klasses(Array<Klass*>* rk) { _resolved_klasses = rk; }
289 Array<Klass*>* resolved_klasses() const { return _resolved_klasses; }
290 void allocate_resolved_klasses(ClassLoaderData* loader_data, int num_klasses, TRAPS);
291 void initialize_unresolved_klasses(ClassLoaderData* loader_data, TRAPS);
292
293 // Given the per-instruction index of an indy instruction, report the
294 // main constant pool entry for its bootstrap specifier.
295 // From there, uncached_name/signature_ref_at will get the name/type.
296 inline u2 invokedynamic_bootstrap_ref_index_at(int indy_index) const;
297
298 // Assembly code support
299 static ByteSize tags_offset() { return byte_offset_of(ConstantPool, _tags); }
300 static ByteSize cache_offset() { return byte_offset_of(ConstantPool, _cache); }
301 static ByteSize pool_holder_offset() { return byte_offset_of(ConstantPool, _pool_holder); }
302 static ByteSize resolved_klasses_offset() { return byte_offset_of(ConstantPool, _resolved_klasses); }
303
304 // Storing constants
305
306 // For temporary use while constructing constant pool
307 void klass_index_at_put(int cp_index, int name_index) {
308 tag_at_put(cp_index, JVM_CONSTANT_ClassIndex);
309 *int_at_addr(cp_index) = name_index;
310 }
311
312 // Hidden class support:
313 void klass_at_put(int class_index, Klass* k);
314
315 void unresolved_klass_at_put(int cp_index, int name_index, int resolved_klass_index) {
316 release_tag_at_put(cp_index, JVM_CONSTANT_UnresolvedClass);
317
318 assert((name_index & 0xffff0000) == 0, "must be");
319 assert((resolved_klass_index & 0xffff0000) == 0, "must be");
320 *int_at_addr(cp_index) =
321 build_int_from_shorts((jushort)resolved_klass_index, (jushort)name_index);
322 }
323
324 void method_handle_index_at_put(int cp_index, int ref_kind, int ref_index) {
325 tag_at_put(cp_index, JVM_CONSTANT_MethodHandle);
326 *int_at_addr(cp_index) = ((jint) ref_index<<16) | ref_kind;
327 }
328
329 void method_type_index_at_put(int cp_index, int ref_index) {
330 tag_at_put(cp_index, JVM_CONSTANT_MethodType);
331 *int_at_addr(cp_index) = ref_index;
332 }
333
334 void dynamic_constant_at_put(int cp_index, int bsms_attribute_index, int name_and_type_index) {
335 tag_at_put(cp_index, JVM_CONSTANT_Dynamic);
336 *int_at_addr(cp_index) = ((jint) name_and_type_index<<16) | bsms_attribute_index;
337 }
338
339 void invoke_dynamic_at_put(int cp_index, int bsms_attribute_index, int name_and_type_index) {
340 tag_at_put(cp_index, JVM_CONSTANT_InvokeDynamic);
341 *int_at_addr(cp_index) = ((jint) name_and_type_index<<16) | bsms_attribute_index;
342 }
343
344 void unresolved_string_at_put(int cp_index, Symbol* s) {
345 assert(s->refcount() != 0, "should have nonzero refcount");
346 // Note that release_tag_at_put is not needed here because this is called only
347 // when constructing a ConstantPool in a single thread, with no possibility
348 // of concurrent access.
349 tag_at_put(cp_index, JVM_CONSTANT_String);
350 *symbol_at_addr(cp_index) = s;
351 }
352
353 void int_at_put(int cp_index, jint i) {
354 tag_at_put(cp_index, JVM_CONSTANT_Integer);
355 *int_at_addr(cp_index) = i;
356 }
357
358 void long_at_put(int cp_index, jlong l) {
359 tag_at_put(cp_index, JVM_CONSTANT_Long);
360 // *long_at_addr(which) = l;
361 Bytes::put_native_u8((address)long_at_addr(cp_index), *((u8*) &l));
362 }
363
364 void float_at_put(int cp_index, jfloat f) {
365 tag_at_put(cp_index, JVM_CONSTANT_Float);
366 *float_at_addr(cp_index) = f;
367 }
368
369 void double_at_put(int cp_index, jdouble d) {
370 tag_at_put(cp_index, JVM_CONSTANT_Double);
371 // *double_at_addr(which) = d;
372 // u8 temp = *(u8*) &d;
373 Bytes::put_native_u8((address) double_at_addr(cp_index), *((u8*) &d));
374 }
375
376 Symbol** symbol_at_addr(int cp_index) const {
377 assert(is_within_bounds(cp_index), "index out of bounds");
378 return (Symbol**) &base()[cp_index];
379 }
380
381 void symbol_at_put(int cp_index, Symbol* s) {
382 assert(s->refcount() != 0, "should have nonzero refcount");
383 tag_at_put(cp_index, JVM_CONSTANT_Utf8);
384 *symbol_at_addr(cp_index) = s;
385 }
386
387 void string_at_put(int obj_index, oop str);
388
389 // For temporary use while constructing constant pool
390 void string_index_at_put(int cp_index, int string_index) {
391 tag_at_put(cp_index, JVM_CONSTANT_StringIndex);
392 *int_at_addr(cp_index) = string_index;
393 }
394
395 void field_at_put(int cp_index, int class_index, int name_and_type_index) {
396 tag_at_put(cp_index, JVM_CONSTANT_Fieldref);
397 *int_at_addr(cp_index) = ((jint) name_and_type_index<<16) | class_index;
398 }
399
400 void method_at_put(int cp_index, int class_index, int name_and_type_index) {
401 tag_at_put(cp_index, JVM_CONSTANT_Methodref);
402 *int_at_addr(cp_index) = ((jint) name_and_type_index<<16) | class_index;
403 }
404
405 void interface_method_at_put(int cp_index, int class_index, int name_and_type_index) {
406 tag_at_put(cp_index, JVM_CONSTANT_InterfaceMethodref);
407 *int_at_addr(cp_index) = ((jint) name_and_type_index<<16) | class_index; // Not so nice
408 }
409
410 void name_and_type_at_put(int cp_index, int name_index, int signature_index) {
411 tag_at_put(cp_index, JVM_CONSTANT_NameAndType);
412 *int_at_addr(cp_index) = ((jint) signature_index<<16) | name_index; // Not so nice
413 }
414
415 // Tag query
416
417 constantTag tag_at(int cp_index) const { return (constantTag)tags()->at_acquire(cp_index); }
418
419 // Fetching constants
420
421 Klass* klass_at(int cp_index, TRAPS) {
422 constantPoolHandle h_this(THREAD, this);
423 return klass_at_impl(h_this, cp_index, THREAD);
424 }
425
426 CPKlassSlot klass_slot_at(int cp_index) const {
427 assert(tag_at(cp_index).is_unresolved_klass() || tag_at(cp_index).is_klass(),
428 "Corrupted constant pool");
429 int value = *int_at_addr(cp_index);
430 int name_index = extract_high_short_from_int(value);
431 int resolved_klass_index = extract_low_short_from_int(value);
432 return CPKlassSlot(name_index, resolved_klass_index);
433 }
434
435 Symbol* klass_name_at(int cp_index) const; // Returns the name, w/o resolving.
436 int klass_name_index_at(int cp_index) const {
437 return klass_slot_at(cp_index).name_index();
438 }
439
440 Klass* resolved_klass_at(int cp_index) const; // Used by Compiler
441
442 // RedefineClasses() API support:
443 Symbol* klass_at_noresolve(int cp_index) { return klass_name_at(cp_index); }
444 void temp_unresolved_klass_at_put(int cp_index, int name_index) {
445 // Used only during constant pool merging for class redefinition. The resolved klass index
446 // will be initialized later by a call to initialize_unresolved_klasses().
447 unresolved_klass_at_put(cp_index, name_index, CPKlassSlot::_temp_resolved_klass_index);
448 }
449
450 jint int_at(int cp_index) const {
451 assert(tag_at(cp_index).is_int(), "Corrupted constant pool");
452 return *int_at_addr(cp_index);
453 }
454
455 jlong long_at(int cp_index) {
456 assert(tag_at(cp_index).is_long(), "Corrupted constant pool");
457 // return *long_at_addr(cp_index);
458 u8 tmp = Bytes::get_native_u8((address)&base()[cp_index]);
459 return *((jlong*)&tmp);
460 }
461
462 jfloat float_at(int cp_index) {
463 assert(tag_at(cp_index).is_float(), "Corrupted constant pool");
464 return *float_at_addr(cp_index);
465 }
466
467 jdouble double_at(int cp_index) {
468 assert(tag_at(cp_index).is_double(), "Corrupted constant pool");
469 u8 tmp = Bytes::get_native_u8((address)&base()[cp_index]);
470 return *((jdouble*)&tmp);
471 }
472
473 Symbol* symbol_at(int cp_index) const {
474 assert(tag_at(cp_index).is_utf8(), "Corrupted constant pool");
475 return *symbol_at_addr(cp_index);
476 }
477
478 oop string_at(int cp_index, int obj_index, TRAPS) {
479 constantPoolHandle h_this(THREAD, this);
480 return string_at_impl(h_this, cp_index, obj_index, THREAD);
481 }
482 oop string_at(int cp_index, TRAPS) {
483 int obj_index = cp_to_object_index(cp_index);
484 return string_at(cp_index, obj_index, THREAD);
485 }
486
487 // Version that can be used before string oop array is created.
488 oop uncached_string_at(int cp_index, TRAPS);
489
490 // only called when we are sure a string entry is already resolved (via an
491 // earlier string_at call.
492 oop resolved_string_at(int cp_index) {
493 assert(tag_at(cp_index).is_string(), "Corrupted constant pool");
494 // Must do an acquire here in case another thread resolved the klass
495 // behind our back, lest we later load stale values thru the oop.
496 // we might want a volatile_obj_at in ObjArrayKlass.
497 int obj_index = cp_to_object_index(cp_index);
498 return resolved_reference_at(obj_index);
499 }
500
501 Symbol* unresolved_string_at(int cp_index) {
502 assert(tag_at(cp_index).is_string(), "Corrupted constant pool");
503 return *symbol_at_addr(cp_index);
504 }
505
506 // Returns an UTF8 for a CONSTANT_String entry at a given index.
507 // UTF8 char* representation was chosen to avoid conversion of
508 // java_lang_Strings at resolved entries into Symbol*s
509 // or vice versa.
510 char* string_at_noresolve(int cp_index);
511
512 jint name_and_type_at(int cp_index) {
513 assert(tag_at(cp_index).is_name_and_type(), "Corrupted constant pool");
514 return *int_at_addr(cp_index);
515 }
516
517 int method_handle_ref_kind_at(int cp_index) {
518 assert(tag_at(cp_index).is_method_handle() ||
519 tag_at(cp_index).is_method_handle_in_error(), "Corrupted constant pool");
520 return extract_low_short_from_int(*int_at_addr(cp_index)); // mask out unwanted ref_index bits
521 }
522 int method_handle_index_at(int cp_index) {
523 assert(tag_at(cp_index).is_method_handle() ||
524 tag_at(cp_index).is_method_handle_in_error(), "Corrupted constant pool");
525 return extract_high_short_from_int(*int_at_addr(cp_index)); // shift out unwanted ref_kind bits
526 }
527 int method_type_index_at(int cp_index) {
528 assert(tag_at(cp_index).is_method_type() ||
529 tag_at(cp_index).is_method_type_in_error(), "Corrupted constant pool");
530 return *int_at_addr(cp_index);
531 }
532
533 // Derived queries:
534 Symbol* method_handle_name_ref_at(int cp_index) {
535 int member = method_handle_index_at(cp_index);
536 return uncached_name_ref_at(member);
537 }
538 Symbol* method_handle_signature_ref_at(int cp_index) {
539 int member = method_handle_index_at(cp_index);
540 return uncached_signature_ref_at(member);
541 }
542 u2 method_handle_klass_index_at(int cp_index) {
543 int member = method_handle_index_at(cp_index);
544 return uncached_klass_ref_index_at(member);
545 }
546 Symbol* method_type_signature_at(int cp_index) {
547 int sym = method_type_index_at(cp_index);
548 return symbol_at(sym);
549 }
550
551 u2 bootstrap_name_and_type_ref_index_at(int cp_index) {
552 assert(tag_at(cp_index).has_bootstrap(), "Corrupted constant pool");
553 return extract_high_short_from_int(*int_at_addr(cp_index));
554 }
555 u2 bootstrap_methods_attribute_index(int cp_index) {
556 assert(tag_at(cp_index).has_bootstrap(), "Corrupted constant pool");
557 return extract_low_short_from_int(*int_at_addr(cp_index));
558 }
559 // The first part of the operands array consists of an index into the second part.
560 // Extract a 32-bit index value from the first part.
561 static int operand_offset_at(Array<u2>* operands, int bsms_attribute_index) {
562 int n = (bsms_attribute_index * 2);
563 assert(n >= 0 && n+2 <= operands->length(), "oob");
564 // The first 32-bit index points to the beginning of the second part
565 // of the operands array. Make sure this index is in the first part.
566 DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
567 operands->at(1)));
568 assert(second_part == 0 || n+2 <= second_part, "oob (2)");
569 int offset = build_int_from_shorts(operands->at(n+0),
570 operands->at(n+1));
571 // The offset itself must point into the second part of the array.
572 assert(offset == 0 || (offset >= second_part && offset <= operands->length()), "oob (3)");
573 return offset;
574 }
575 static void operand_offset_at_put(Array<u2>* operands, int bsms_attribute_index, int offset) {
576 int n = bsms_attribute_index * 2;
577 assert(n >= 0 && n+2 <= operands->length(), "oob");
578 operands->at_put(n+0, extract_low_short_from_int(offset));
579 operands->at_put(n+1, extract_high_short_from_int(offset));
580 }
581 static int operand_array_length(Array<u2>* operands) {
582 if (operands == nullptr || operands->length() == 0) return 0;
583 int second_part = operand_offset_at(operands, 0);
584 return (second_part / 2);
585 }
586
587 #ifdef ASSERT
588 // operand tuples fit together exactly, end to end
589 static int operand_limit_at(Array<u2>* operands, int bsms_attribute_index) {
590 int nextidx = bsms_attribute_index + 1;
591 if (nextidx == operand_array_length(operands))
592 return operands->length();
593 else
594 return operand_offset_at(operands, nextidx);
595 }
596 #endif //ASSERT
597
598 // These functions are used in RedefineClasses for CP merge
599 int operand_offset_at(int bsms_attribute_index) {
600 assert(0 <= bsms_attribute_index &&
601 bsms_attribute_index < operand_array_length(operands()),
602 "Corrupted CP operands");
603 return operand_offset_at(operands(), bsms_attribute_index);
604 }
605
606 BSMAttributeEntry* bsm_attribute_entry(int bsms_attribute_index) {
607 int offset = operand_offset_at(bsms_attribute_index);
608 return reinterpret_cast<BSMAttributeEntry*>(operands()->adr_at(offset));
609 }
610
611 int operand_next_offset_at(int bsms_attribute_index) {
612 BSMAttributeEntry* bsme = bsm_attribute_entry(bsms_attribute_index);
613 u2* argv_start = bsme->argument_indexes();
614 int offset = argv_start - operands()->data();
615 return offset + bsme->argument_count();
616 }
617 // Compare a bootstrap specifier data in the operands arrays
618 bool compare_operand_to(int bsms_attribute_index1, const constantPoolHandle& cp2,
619 int bsms_attribute_index2);
620 // Find a bootstrap specifier data in the operands array
621 int find_matching_operand(int bsms_attribute_index, const constantPoolHandle& search_cp,
622 int operands_cur_len);
623 // Resize the operands array with delta_len and delta_size
624 void resize_operands(int delta_len, int delta_size, TRAPS);
625 // Extend the operands array with the length and size of the ext_cp operands
626 void extend_operands(const constantPoolHandle& ext_cp, TRAPS);
627 // Shrink the operands array to a smaller array with new_len length
628 void shrink_operands(int new_len, TRAPS);
629
630 u2 bootstrap_method_ref_index_at(int cp_index) {
631 assert(tag_at(cp_index).has_bootstrap(), "Corrupted constant pool");
632 int bsmai = bootstrap_methods_attribute_index(cp_index);
633 return bsm_attribute_entry(bsmai)->bootstrap_method_index();
634 }
635 u2 bootstrap_argument_count_at(int cp_index) {
636 assert(tag_at(cp_index).has_bootstrap(), "Corrupted constant pool");
637 int bsmai = bootstrap_methods_attribute_index(cp_index);
638 return bsm_attribute_entry(bsmai)->argument_count();
639 }
640 u2 bootstrap_argument_index_at(int cp_index, int j) {
641 int bsmai = bootstrap_methods_attribute_index(cp_index);
642 BSMAttributeEntry* bsme = bsm_attribute_entry(bsmai);
643 assert((uint)j < (uint)bsme->argument_count(), "oob");
644 return bsm_attribute_entry(bsmai)->argument_index(j);
645 }
646
647 // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
648 // name_and_type_ref_index_at) all expect to be passed indices obtained
649 // directly from the bytecode.
650 // If the indices are meant to refer to fields or methods, they are
651 // actually rewritten indices that point to entries in their respective structures
652 // i.e. ResolvedMethodEntries or ResolvedFieldEntries.
653 // The routine to_cp_index manages the adjustment
654 // of these values back to constant pool indices.
655
656 // There are also "uncached" versions which do not adjust the operand index; see below.
657
658 // Lookup for entries consisting of (klass_index, name_and_type index)
659 Klass* klass_ref_at(int which, Bytecodes::Code code, TRAPS);
660 Symbol* klass_ref_at_noresolve(int which, Bytecodes::Code code);
661 Symbol* name_ref_at(int which, Bytecodes::Code code) {
662 int name_index = name_ref_index_at(name_and_type_ref_index_at(which, code));
663 return symbol_at(name_index);
664 }
665 Symbol* signature_ref_at(int which, Bytecodes::Code code) {
666 int signature_index = signature_ref_index_at(name_and_type_ref_index_at(which, code));
667 return symbol_at(signature_index);
668 }
669
670 u2 klass_ref_index_at(int which, Bytecodes::Code code);
671 u2 name_and_type_ref_index_at(int which, Bytecodes::Code code);
672
673 constantTag tag_ref_at(int cp_cache_index, Bytecodes::Code code);
674
675 int to_cp_index(int which, Bytecodes::Code code);
676
677 bool is_resolved(int which, Bytecodes::Code code);
678
679 // Lookup for entries consisting of (name_index, signature_index)
680 u2 name_ref_index_at(int cp_index); // == low-order jshort of name_and_type_at(cp_index)
681 u2 signature_ref_index_at(int cp_index); // == high-order jshort of name_and_type_at(cp_index)
682
683 BasicType basic_type_for_signature_at(int cp_index) const;
684
685 // Resolve string constants (to prevent allocation during compilation)
686 void resolve_string_constants(TRAPS) {
687 constantPoolHandle h_this(THREAD, this);
688 resolve_string_constants_impl(h_this, CHECK);
689 }
690
691 #if INCLUDE_CDS
692 // CDS support
693 objArrayOop prepare_resolved_references_for_archiving() NOT_CDS_JAVA_HEAP_RETURN_(nullptr);
694 void remove_unshareable_info();
695 void restore_unshareable_info(TRAPS);
696 private:
697 void remove_unshareable_entries();
698 void remove_resolved_klass_if_non_deterministic(int cp_index);
699 template <typename Function> void iterate_archivable_resolved_references(Function function);
700 #endif
701
702 private:
703 enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
704 public:
705
706 // Get the tag for a constant, which may involve a constant dynamic
707 constantTag constant_tag_at(int cp_index);
708 // Get the basic type for a constant, which may involve a constant dynamic
709 BasicType basic_type_for_constant_at(int cp_index);
710
711 // Resolve late bound constants.
712 oop resolve_constant_at(int cp_index, TRAPS) {
713 constantPoolHandle h_this(THREAD, this);
714 return resolve_constant_at_impl(h_this, cp_index, _no_index_sentinel, nullptr, THREAD);
715 }
716
717 oop resolve_cached_constant_at(int cache_index, TRAPS) {
718 constantPoolHandle h_this(THREAD, this);
719 return resolve_constant_at_impl(h_this, _no_index_sentinel, cache_index, nullptr, THREAD);
720 }
721
722 oop resolve_possibly_cached_constant_at(int cp_index, TRAPS) {
723 constantPoolHandle h_this(THREAD, this);
724 return resolve_constant_at_impl(h_this, cp_index, _possible_index_sentinel, nullptr, THREAD);
725 }
726
727 oop find_cached_constant_at(int cp_index, bool& found_it, TRAPS) {
728 constantPoolHandle h_this(THREAD, this);
729 return resolve_constant_at_impl(h_this, cp_index, _possible_index_sentinel, &found_it, THREAD);
730 }
731
732 void copy_bootstrap_arguments_at(int cp_index,
733 int start_arg, int end_arg,
734 objArrayHandle info, int pos,
735 bool must_resolve, Handle if_not_available, TRAPS) {
736 constantPoolHandle h_this(THREAD, this);
737 copy_bootstrap_arguments_at_impl(h_this, cp_index, start_arg, end_arg,
738 info, pos, must_resolve, if_not_available, THREAD);
739 }
740
741 // Klass name matches name at offset
742 bool klass_name_at_matches(const InstanceKlass* k, int cp_index);
743
744 // Sizing
745 int length() const { return _length; }
746 void set_length(int length) { _length = length; }
747
748 // Tells whether index is within bounds.
749 bool is_within_bounds(int index) const {
750 return 0 <= index && index < length();
751 }
752
753 // Sizing (in words)
754 static int header_size() {
755 return align_up((int)sizeof(ConstantPool), wordSize) / wordSize;
756 }
757 static int size(int length) { return align_metadata_size(header_size() + length); }
758 int size() const { return size(length()); }
759
760 // ConstantPools should be stored in the read-only region of CDS archive.
761 static bool is_read_only_by_default() { return true; }
762
763 friend class ClassFileParser;
764 friend class SystemDictionary;
765
766 // Used by CDS. These classes need to access the private ConstantPool() constructor.
767 template <class T> friend class CppVtableTesterA;
768 template <class T> friend class CppVtableTesterB;
769 template <class T> friend class CppVtableCloner;
770
771 // Used by compiler to prevent classloading.
772 static Method* method_at_if_loaded (const constantPoolHandle& this_cp, int which);
773 static bool has_appendix_at_if_loaded (const constantPoolHandle& this_cp, int which, Bytecodes::Code code);
774 static oop appendix_at_if_loaded (const constantPoolHandle& this_cp, int which, Bytecodes::Code code);
775 static bool has_local_signature_at_if_loaded (const constantPoolHandle& this_cp, int which, Bytecodes::Code code);
776 static Klass* klass_at_if_loaded (const constantPoolHandle& this_cp, int which);
777
778 // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
779 // future by other Java code. These take constant pool indices rather than
780 // constant pool cache indices as do the peer methods above.
781 Symbol* uncached_klass_ref_at_noresolve(int cp_index);
782 Symbol* uncached_name_ref_at(int cp_index) {
783 int name_index = name_ref_index_at(uncached_name_and_type_ref_index_at(cp_index));
784 return symbol_at(name_index);
785 }
786 Symbol* uncached_signature_ref_at(int cp_index) {
787 int signature_index = signature_ref_index_at(uncached_name_and_type_ref_index_at(cp_index));
788 return symbol_at(signature_index);
789 }
790 u2 uncached_klass_ref_index_at(int cp_index);
791 u2 uncached_name_and_type_ref_index_at(int cp_index);
792
793 // Sharing
794 int pre_resolve_shared_klasses(TRAPS);
795
796 // Debugging
797 const char* printable_name_at(int cp_index) PRODUCT_RETURN_NULL;
798
799 private:
800
801 void set_resolved_references(OopHandle s) { _cache->set_resolved_references(s); }
802 Array<u2>* reference_map() const { return (_cache == nullptr) ? nullptr : _cache->reference_map(); }
803 void set_reference_map(Array<u2>* o) { _cache->set_reference_map(o); }
804
805 // Used while constructing constant pool (only by ClassFileParser)
806 jint klass_index_at(int cp_index) {
807 assert(tag_at(cp_index).is_klass_index(), "Corrupted constant pool");
808 return *int_at_addr(cp_index);
809 }
810
811 jint string_index_at(int cp_index) {
812 assert(tag_at(cp_index).is_string_index(), "Corrupted constant pool");
813 return *int_at_addr(cp_index);
814 }
815
816 // Performs the LinkResolver checks
817 static void verify_constant_pool_resolve(const constantPoolHandle& this_cp, Klass* klass, TRAPS);
818
819 // Implementation of methods that needs an exposed 'this' pointer, in order to
820 // handle GC while executing the method
821 static Klass* klass_at_impl(const constantPoolHandle& this_cp, int cp_index, TRAPS);
822 static oop string_at_impl(const constantPoolHandle& this_cp, int cp_index, int obj_index, TRAPS);
823
824 static void trace_class_resolution(const constantPoolHandle& this_cp, Klass* k);
825
826 // Resolve string constants (to prevent allocation during compilation)
827 static void resolve_string_constants_impl(const constantPoolHandle& this_cp, TRAPS);
828
829 static oop resolve_constant_at_impl(const constantPoolHandle& this_cp, int cp_index, int cache_index,
830 bool* status_return, TRAPS);
831 static void copy_bootstrap_arguments_at_impl(const constantPoolHandle& this_cp, int cp_index,
832 int start_arg, int end_arg,
833 objArrayHandle info, int pos,
834 bool must_resolve, Handle if_not_available, TRAPS);
835
836 // Exception handling
837 static void save_and_throw_exception(const constantPoolHandle& this_cp, int cp_index, constantTag tag, TRAPS);
838
839 public:
840 // Exception handling
841 static void throw_resolution_error(const constantPoolHandle& this_cp, int which, TRAPS);
842
843 // Merging ConstantPool* support:
844 bool compare_entry_to(int index1, const constantPoolHandle& cp2, int index2);
845 void copy_cp_to(int start_cpi, int end_cpi, const constantPoolHandle& to_cp, int to_cpi, TRAPS) {
846 constantPoolHandle h_this(THREAD, this);
847 copy_cp_to_impl(h_this, start_cpi, end_cpi, to_cp, to_cpi, THREAD);
848 }
849 static void copy_cp_to_impl(const constantPoolHandle& from_cp, int start_cpi, int end_cpi, const constantPoolHandle& to_cp, int to_cpi, TRAPS);
850 static void copy_entry_to(const constantPoolHandle& from_cp, int from_cpi, const constantPoolHandle& to_cp, int to_cpi);
851 static void copy_operands(const constantPoolHandle& from_cp, const constantPoolHandle& to_cp, TRAPS);
852 int find_matching_entry(int pattern_i, const constantPoolHandle& search_cp);
853 int version() const { return _saved._version; }
854 void set_version(int version) { _saved._version = version; }
855 void increment_and_save_version(int version) {
856 _saved._version = version >= 0 ? (version + 1) : version; // keep overflow
857 }
858
859 void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
860 int resolved_reference_length() const { return _saved._resolved_reference_length; }
861
862 // Decrease ref counts of symbols that are in the constant pool
863 // when the holder class is unloaded
864 void unreference_symbols();
865
866 // Deallocate constant pool for RedefineClasses
867 void deallocate_contents(ClassLoaderData* loader_data);
868 void release_C_heap_structures();
869
870 // JVMTI access - GetConstantPool, RetransformClasses, ...
871 friend class JvmtiConstantPoolReconstituter;
872
873 private:
874 class SymbolHash: public CHeapObj<mtSymbol> {
875 HashTable<const Symbol*, u2, 256, AnyObj::C_HEAP, mtSymbol, Symbol::compute_hash> _table;
876
877 public:
878 void add_if_absent(const Symbol* sym, u2 value) {
879 bool created;
880 _table.put_if_absent(sym, value, &created);
881 }
882
883 u2 symbol_to_value(const Symbol* sym) {
884 u2* value = _table.get(sym);
885 return (value == nullptr) ? 0 : *value;
886 }
887 }; // End SymbolHash class
888
889 jint cpool_entry_size(jint idx);
890 jint hash_entries_to(SymbolHash *symmap, SymbolHash *classmap);
891
892 // Copy cpool bytes into byte array.
893 // Returns:
894 // int > 0, count of the raw cpool bytes that have been copied
895 // 0, OutOfMemory error
896 // -1, Internal error
897 int copy_cpool_bytes(int cpool_size,
898 SymbolHash* tbl,
899 unsigned char *bytes);
900
901 public:
902 // Verify
903 void verify_on(outputStream* st);
904
905 // Printing
906 void print_on(outputStream* st) const;
907 void print_value_on(outputStream* st) const;
908 void print_entry_on(int index, outputStream* st);
909
910 const char* internal_name() const { return "{constant pool}"; }
911
912 // ResolvedFieldEntry getters
913 inline ResolvedFieldEntry* resolved_field_entry_at(int field_index);
914 inline int resolved_field_entries_length() const;
915
916 // ResolvedMethodEntry getters
917 inline ResolvedMethodEntry* resolved_method_entry_at(int method_index);
918 inline int resolved_method_entries_length() const;
919 inline oop appendix_if_resolved(int method_index) const;
920
921 // ResolvedIndyEntry getters
922 inline ResolvedIndyEntry* resolved_indy_entry_at(int index);
923 inline int resolved_indy_entries_length() const;
924 inline oop resolved_reference_from_indy(int index) const;
925 inline oop resolved_reference_from_method(int index) const;
926 };
927
928 #endif // SHARE_OOPS_CONSTANTPOOL_HPP