Fri, 20 Sep 2013 18:34:00 -0400
8014956: nashorn/api/javaaccess/MethodAccessTest.java test fails on sparc-solaris 64
Summary: reference_map[] array had uninitialized junk that was causing a bogus bootstrap method to be found.
Reviewed-by: hseigel, dcubed, sspitsyn
1 /*
2 * Copyright (c) 1997, 2013, 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 */
25 #ifndef SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
26 #define SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
28 #include "oops/arrayOop.hpp"
29 #include "oops/cpCache.hpp"
30 #include "oops/objArrayOop.hpp"
31 #include "oops/symbol.hpp"
32 #include "oops/typeArrayOop.hpp"
33 #include "runtime/handles.hpp"
34 #include "utilities/constantTag.hpp"
35 #ifdef TARGET_ARCH_x86
36 # include "bytes_x86.hpp"
37 #endif
38 #ifdef TARGET_ARCH_sparc
39 # include "bytes_sparc.hpp"
40 #endif
41 #ifdef TARGET_ARCH_zero
42 # include "bytes_zero.hpp"
43 #endif
44 #ifdef TARGET_ARCH_arm
45 # include "bytes_arm.hpp"
46 #endif
47 #ifdef TARGET_ARCH_ppc
48 # include "bytes_ppc.hpp"
49 #endif
51 // A constantPool is an array containing class constants as described in the
52 // class file.
53 //
54 // Most of the constant pool entries are written during class parsing, which
55 // is safe. For klass types, the constant pool entry is
56 // modified when the entry is resolved. If a klass constant pool
57 // entry is read without a lock, only the resolved state guarantees that
58 // the entry in the constant pool is a klass object and not a Symbol*.
60 class SymbolHashMap;
62 class CPSlot VALUE_OBJ_CLASS_SPEC {
63 intptr_t _ptr;
64 public:
65 CPSlot(intptr_t ptr): _ptr(ptr) {}
66 CPSlot(Klass* ptr): _ptr((intptr_t)ptr) {}
67 CPSlot(Symbol* ptr): _ptr((intptr_t)ptr | 1) {}
69 intptr_t value() { return _ptr; }
70 bool is_resolved() { return (_ptr & 1) == 0; }
71 bool is_unresolved() { return (_ptr & 1) == 1; }
73 Symbol* get_symbol() {
74 assert(is_unresolved(), "bad call");
75 return (Symbol*)(_ptr & ~1);
76 }
77 Klass* get_klass() {
78 assert(is_resolved(), "bad call");
79 return (Klass*)_ptr;
80 }
81 };
83 class KlassSizeStats;
84 class ConstantPool : public Metadata {
85 friend class VMStructs;
86 friend class BytecodeInterpreter; // Directly extracts an oop in the pool for fast instanceof/checkcast
87 friend class Universe; // For null constructor
88 private:
89 Array<u1>* _tags; // the tag array describing the constant pool's contents
90 ConstantPoolCache* _cache; // the cache holding interpreter runtime information
91 InstanceKlass* _pool_holder; // the corresponding class
92 Array<u2>* _operands; // for variable-sized (InvokeDynamic) nodes, usually empty
94 // Array of resolved objects from the constant pool and map from resolved
95 // object index to original constant pool index
96 jobject _resolved_references;
97 Array<u2>* _reference_map;
99 enum {
100 _has_preresolution = 1, // Flags
101 _on_stack = 2
102 };
104 int _flags; // old fashioned bit twiddling
105 int _length; // number of elements in the array
107 union {
108 // set for CDS to restore resolved references
109 int _resolved_reference_length;
110 // keeps version number for redefined classes (used in backtrace)
111 int _version;
112 } _saved;
115 void set_tags(Array<u1>* tags) { _tags = tags; }
116 void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); }
117 void release_tag_at_put(int which, jbyte t) { tags()->release_at_put(which, t); }
119 void set_operands(Array<u2>* operands) { _operands = operands; }
121 int flags() const { return _flags; }
122 void set_flags(int f) { _flags = f; }
124 private:
125 intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
127 CPSlot slot_at(int which) {
128 assert(is_within_bounds(which), "index out of bounds");
129 // Uses volatile because the klass slot changes without a lock.
130 volatile intptr_t adr = (intptr_t)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which));
131 assert(adr != 0 || which == 0, "cp entry for klass should not be zero");
132 return CPSlot(adr);
133 }
135 void slot_at_put(int which, CPSlot s) const {
136 assert(is_within_bounds(which), "index out of bounds");
137 assert(s.value() != 0, "Caught something");
138 *(intptr_t*)&base()[which] = s.value();
139 }
140 intptr_t* obj_at_addr_raw(int which) const {
141 assert(is_within_bounds(which), "index out of bounds");
142 return (intptr_t*) &base()[which];
143 }
145 jint* int_at_addr(int which) const {
146 assert(is_within_bounds(which), "index out of bounds");
147 return (jint*) &base()[which];
148 }
150 jlong* long_at_addr(int which) const {
151 assert(is_within_bounds(which), "index out of bounds");
152 return (jlong*) &base()[which];
153 }
155 jfloat* float_at_addr(int which) const {
156 assert(is_within_bounds(which), "index out of bounds");
157 return (jfloat*) &base()[which];
158 }
160 jdouble* double_at_addr(int which) const {
161 assert(is_within_bounds(which), "index out of bounds");
162 return (jdouble*) &base()[which];
163 }
165 ConstantPool(Array<u1>* tags);
166 ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
167 public:
168 static ConstantPool* allocate(ClassLoaderData* loader_data, int length, TRAPS);
170 bool is_constantPool() const volatile { return true; }
172 Array<u1>* tags() const { return _tags; }
173 Array<u2>* operands() const { return _operands; }
175 bool has_preresolution() const { return (_flags & _has_preresolution) != 0; }
176 void set_has_preresolution() { _flags |= _has_preresolution; }
178 // Redefine classes support. If a method refering to this constant pool
179 // is on the executing stack, or as a handle in vm code, this constant pool
180 // can't be removed from the set of previous versions saved in the instance
181 // class.
182 bool on_stack() const { return (_flags &_on_stack) != 0; }
183 void set_on_stack(const bool value);
185 // Klass holding pool
186 InstanceKlass* pool_holder() const { return _pool_holder; }
187 void set_pool_holder(InstanceKlass* k) { _pool_holder = k; }
188 InstanceKlass** pool_holder_addr() { return &_pool_holder; }
190 // Interpreter runtime support
191 ConstantPoolCache* cache() const { return _cache; }
192 void set_cache(ConstantPoolCache* cache){ _cache = cache; }
194 // Create object cache in the constant pool
195 void initialize_resolved_references(ClassLoaderData* loader_data,
196 intStack reference_map,
197 int constant_pool_map_length,
198 TRAPS);
200 // resolved strings, methodHandles and callsite objects from the constant pool
201 objArrayOop resolved_references() const;
202 // mapping resolved object array indexes to cp indexes and back.
203 int object_to_cp_index(int index) { return _reference_map->at(index); }
204 int cp_to_object_index(int index);
206 // Invokedynamic indexes.
207 // They must look completely different from normal indexes.
208 // The main reason is that byte swapping is sometimes done on normal indexes.
209 // Finally, it is helpful for debugging to tell the two apart.
210 static bool is_invokedynamic_index(int i) { return (i < 0); }
211 static int decode_invokedynamic_index(int i) { assert(is_invokedynamic_index(i), ""); return ~i; }
212 static int encode_invokedynamic_index(int i) { assert(!is_invokedynamic_index(i), ""); return ~i; }
215 // The invokedynamic points at a CP cache entry. This entry points back
216 // at the original CP entry (CONSTANT_InvokeDynamic) and also (via f2) at an entry
217 // in the resolved_references array (which provides the appendix argument).
218 int invokedynamic_cp_cache_index(int index) const {
219 assert (is_invokedynamic_index(index), "should be a invokedynamic index");
220 int cache_index = decode_invokedynamic_index(index);
221 return cache_index;
222 }
223 ConstantPoolCacheEntry* invokedynamic_cp_cache_entry_at(int index) const {
224 // decode index that invokedynamic points to.
225 int cp_cache_index = invokedynamic_cp_cache_index(index);
226 return cache()->entry_at(cp_cache_index);
227 }
229 // Assembly code support
230 static int tags_offset_in_bytes() { return offset_of(ConstantPool, _tags); }
231 static int cache_offset_in_bytes() { return offset_of(ConstantPool, _cache); }
232 static int pool_holder_offset_in_bytes() { return offset_of(ConstantPool, _pool_holder); }
233 static int resolved_references_offset_in_bytes() { return offset_of(ConstantPool, _resolved_references); }
235 // Storing constants
237 void klass_at_put(int which, Klass* k) {
238 assert(k != NULL, "resolved class shouldn't be null");
239 assert(is_within_bounds(which), "index out of bounds");
240 OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
241 // The interpreter assumes when the tag is stored, the klass is resolved
242 // and the Klass* is a klass rather than a Symbol*, so we need
243 // hardware store ordering here.
244 release_tag_at_put(which, JVM_CONSTANT_Class);
245 }
247 // For temporary use while constructing constant pool
248 void klass_index_at_put(int which, int name_index) {
249 tag_at_put(which, JVM_CONSTANT_ClassIndex);
250 *int_at_addr(which) = name_index;
251 }
253 // Temporary until actual use
254 void unresolved_klass_at_put(int which, Symbol* s) {
255 release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
256 slot_at_put(which, s);
257 }
259 void method_handle_index_at_put(int which, int ref_kind, int ref_index) {
260 tag_at_put(which, JVM_CONSTANT_MethodHandle);
261 *int_at_addr(which) = ((jint) ref_index<<16) | ref_kind;
262 }
264 void method_type_index_at_put(int which, int ref_index) {
265 tag_at_put(which, JVM_CONSTANT_MethodType);
266 *int_at_addr(which) = ref_index;
267 }
269 void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) {
270 tag_at_put(which, JVM_CONSTANT_InvokeDynamic);
271 *int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index;
272 }
274 void unresolved_string_at_put(int which, Symbol* s) {
275 release_tag_at_put(which, JVM_CONSTANT_String);
276 *symbol_at_addr(which) = s;
277 }
279 void int_at_put(int which, jint i) {
280 tag_at_put(which, JVM_CONSTANT_Integer);
281 *int_at_addr(which) = i;
282 }
284 void long_at_put(int which, jlong l) {
285 tag_at_put(which, JVM_CONSTANT_Long);
286 // *long_at_addr(which) = l;
287 Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
288 }
290 void float_at_put(int which, jfloat f) {
291 tag_at_put(which, JVM_CONSTANT_Float);
292 *float_at_addr(which) = f;
293 }
295 void double_at_put(int which, jdouble d) {
296 tag_at_put(which, JVM_CONSTANT_Double);
297 // *double_at_addr(which) = d;
298 // u8 temp = *(u8*) &d;
299 Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
300 }
302 Symbol** symbol_at_addr(int which) const {
303 assert(is_within_bounds(which), "index out of bounds");
304 return (Symbol**) &base()[which];
305 }
307 void symbol_at_put(int which, Symbol* s) {
308 assert(s->refcount() != 0, "should have nonzero refcount");
309 tag_at_put(which, JVM_CONSTANT_Utf8);
310 *symbol_at_addr(which) = s;
311 }
313 void string_at_put(int which, int obj_index, oop str) {
314 resolved_references()->obj_at_put(obj_index, str);
315 }
317 // For temporary use while constructing constant pool
318 void string_index_at_put(int which, int string_index) {
319 tag_at_put(which, JVM_CONSTANT_StringIndex);
320 *int_at_addr(which) = string_index;
321 }
323 void field_at_put(int which, int class_index, int name_and_type_index) {
324 tag_at_put(which, JVM_CONSTANT_Fieldref);
325 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
326 }
328 void method_at_put(int which, int class_index, int name_and_type_index) {
329 tag_at_put(which, JVM_CONSTANT_Methodref);
330 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
331 }
333 void interface_method_at_put(int which, int class_index, int name_and_type_index) {
334 tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
335 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; // Not so nice
336 }
338 void name_and_type_at_put(int which, int name_index, int signature_index) {
339 tag_at_put(which, JVM_CONSTANT_NameAndType);
340 *int_at_addr(which) = ((jint) signature_index<<16) | name_index; // Not so nice
341 }
343 // Tag query
345 constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
347 // Fetching constants
349 Klass* klass_at(int which, TRAPS) {
350 constantPoolHandle h_this(THREAD, this);
351 return klass_at_impl(h_this, which, CHECK_NULL);
352 }
354 Symbol* klass_name_at(int which); // Returns the name, w/o resolving.
356 Klass* resolved_klass_at(int which) const { // Used by Compiler
357 guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
358 // Must do an acquire here in case another thread resolved the klass
359 // behind our back, lest we later load stale values thru the oop.
360 return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
361 }
363 // This method should only be used with a cpool lock or during parsing or gc
364 Symbol* unresolved_klass_at(int which) { // Temporary until actual use
365 Symbol* s = CPSlot((Symbol*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_symbol();
366 // check that the klass is still unresolved.
367 assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
368 return s;
369 }
371 // RedefineClasses() API support:
372 Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
374 jint int_at(int which) {
375 assert(tag_at(which).is_int(), "Corrupted constant pool");
376 return *int_at_addr(which);
377 }
379 jlong long_at(int which) {
380 assert(tag_at(which).is_long(), "Corrupted constant pool");
381 // return *long_at_addr(which);
382 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
383 return *((jlong*)&tmp);
384 }
386 jfloat float_at(int which) {
387 assert(tag_at(which).is_float(), "Corrupted constant pool");
388 return *float_at_addr(which);
389 }
391 jdouble double_at(int which) {
392 assert(tag_at(which).is_double(), "Corrupted constant pool");
393 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
394 return *((jdouble*)&tmp);
395 }
397 Symbol* symbol_at(int which) {
398 assert(tag_at(which).is_utf8(), "Corrupted constant pool");
399 return *symbol_at_addr(which);
400 }
402 oop string_at(int which, int obj_index, TRAPS) {
403 constantPoolHandle h_this(THREAD, this);
404 return string_at_impl(h_this, which, obj_index, THREAD);
405 }
406 oop string_at(int which, TRAPS) {
407 int obj_index = cp_to_object_index(which);
408 return string_at(which, obj_index, THREAD);
409 }
411 // Version that can be used before string oop array is created.
412 oop uncached_string_at(int which, TRAPS);
414 // A "pseudo-string" is an non-string oop that has found is way into
415 // a String entry.
416 // Under EnableInvokeDynamic this can happen if the user patches a live
417 // object into a CONSTANT_String entry of an anonymous class.
418 // Method oops internally created for method handles may also
419 // use pseudo-strings to link themselves to related metaobjects.
421 bool is_pseudo_string_at(int which) {
422 // A pseudo string is a string that doesn't have a symbol in the cpSlot
423 return unresolved_string_at(which) == NULL;
424 }
426 oop pseudo_string_at(int which, int obj_index) {
427 assert(tag_at(which).is_string(), "Corrupted constant pool");
428 assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
429 oop s = resolved_references()->obj_at(obj_index);
430 return s;
431 }
433 oop pseudo_string_at(int which) {
434 assert(tag_at(which).is_string(), "Corrupted constant pool");
435 assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
436 int obj_index = cp_to_object_index(which);
437 oop s = resolved_references()->obj_at(obj_index);
438 return s;
439 }
441 void pseudo_string_at_put(int which, int obj_index, oop x) {
442 assert(EnableInvokeDynamic, "");
443 assert(tag_at(which).is_string(), "Corrupted constant pool");
444 unresolved_string_at_put(which, NULL); // indicates patched string
445 string_at_put(which, obj_index, x); // this works just fine
446 }
448 // only called when we are sure a string entry is already resolved (via an
449 // earlier string_at call.
450 oop resolved_string_at(int which) {
451 assert(tag_at(which).is_string(), "Corrupted constant pool");
452 // Must do an acquire here in case another thread resolved the klass
453 // behind our back, lest we later load stale values thru the oop.
454 // we might want a volatile_obj_at in ObjArrayKlass.
455 int obj_index = cp_to_object_index(which);
456 return resolved_references()->obj_at(obj_index);
457 }
459 Symbol* unresolved_string_at(int which) {
460 assert(tag_at(which).is_string(), "Corrupted constant pool");
461 Symbol* s = *symbol_at_addr(which);
462 return s;
463 }
465 // Returns an UTF8 for a CONSTANT_String entry at a given index.
466 // UTF8 char* representation was chosen to avoid conversion of
467 // java_lang_Strings at resolved entries into Symbol*s
468 // or vice versa.
469 // Caller is responsible for checking for pseudo-strings.
470 char* string_at_noresolve(int which);
472 jint name_and_type_at(int which) {
473 assert(tag_at(which).is_name_and_type(), "Corrupted constant pool");
474 return *int_at_addr(which);
475 }
477 int method_handle_ref_kind_at(int which) {
478 assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
479 return extract_low_short_from_int(*int_at_addr(which)); // mask out unwanted ref_index bits
480 }
481 int method_handle_index_at(int which) {
482 assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
483 return extract_high_short_from_int(*int_at_addr(which)); // shift out unwanted ref_kind bits
484 }
485 int method_type_index_at(int which) {
486 assert(tag_at(which).is_method_type(), "Corrupted constant pool");
487 return *int_at_addr(which);
488 }
489 // Derived queries:
490 Symbol* method_handle_name_ref_at(int which) {
491 int member = method_handle_index_at(which);
492 return impl_name_ref_at(member, true);
493 }
494 Symbol* method_handle_signature_ref_at(int which) {
495 int member = method_handle_index_at(which);
496 return impl_signature_ref_at(member, true);
497 }
498 int method_handle_klass_index_at(int which) {
499 int member = method_handle_index_at(which);
500 return impl_klass_ref_index_at(member, true);
501 }
502 Symbol* method_type_signature_at(int which) {
503 int sym = method_type_index_at(which);
504 return symbol_at(sym);
505 }
507 int invoke_dynamic_name_and_type_ref_index_at(int which) {
508 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
509 return extract_high_short_from_int(*int_at_addr(which));
510 }
511 int invoke_dynamic_bootstrap_specifier_index(int which) {
512 assert(tag_at(which).value() == JVM_CONSTANT_InvokeDynamic, "Corrupted constant pool");
513 return extract_low_short_from_int(*int_at_addr(which));
514 }
515 int invoke_dynamic_operand_base(int which) {
516 int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
517 return operand_offset_at(operands(), bootstrap_specifier_index);
518 }
519 // The first part of the operands array consists of an index into the second part.
520 // Extract a 32-bit index value from the first part.
521 static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
522 int n = (bootstrap_specifier_index * 2);
523 assert(n >= 0 && n+2 <= operands->length(), "oob");
524 // The first 32-bit index points to the beginning of the second part
525 // of the operands array. Make sure this index is in the first part.
526 DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
527 operands->at(1)));
528 assert(second_part == 0 || n+2 <= second_part, "oob (2)");
529 int offset = build_int_from_shorts(operands->at(n+0),
530 operands->at(n+1));
531 // The offset itself must point into the second part of the array.
532 assert(offset == 0 || offset >= second_part && offset <= operands->length(), "oob (3)");
533 return offset;
534 }
535 static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
536 int n = bootstrap_specifier_index * 2;
537 assert(n >= 0 && n+2 <= operands->length(), "oob");
538 operands->at_put(n+0, extract_low_short_from_int(offset));
539 operands->at_put(n+1, extract_high_short_from_int(offset));
540 }
541 static int operand_array_length(Array<u2>* operands) {
542 if (operands == NULL || operands->length() == 0) return 0;
543 int second_part = operand_offset_at(operands, 0);
544 return (second_part / 2);
545 }
547 #ifdef ASSERT
548 // operand tuples fit together exactly, end to end
549 static int operand_limit_at(Array<u2>* operands, int bootstrap_specifier_index) {
550 int nextidx = bootstrap_specifier_index + 1;
551 if (nextidx == operand_array_length(operands))
552 return operands->length();
553 else
554 return operand_offset_at(operands, nextidx);
555 }
556 int invoke_dynamic_operand_limit(int which) {
557 int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
558 return operand_limit_at(operands(), bootstrap_specifier_index);
559 }
560 #endif //ASSERT
562 // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
563 enum {
564 _indy_bsm_offset = 0, // CONSTANT_MethodHandle bsm
565 _indy_argc_offset = 1, // u2 argc
566 _indy_argv_offset = 2 // u2 argv[argc]
567 };
569 // These functions are used in RedefineClasses for CP merge
571 int operand_offset_at(int bootstrap_specifier_index) {
572 assert(0 <= bootstrap_specifier_index &&
573 bootstrap_specifier_index < operand_array_length(operands()),
574 "Corrupted CP operands");
575 return operand_offset_at(operands(), bootstrap_specifier_index);
576 }
577 int operand_bootstrap_method_ref_index_at(int bootstrap_specifier_index) {
578 int offset = operand_offset_at(bootstrap_specifier_index);
579 return operands()->at(offset + _indy_bsm_offset);
580 }
581 int operand_argument_count_at(int bootstrap_specifier_index) {
582 int offset = operand_offset_at(bootstrap_specifier_index);
583 int argc = operands()->at(offset + _indy_argc_offset);
584 return argc;
585 }
586 int operand_argument_index_at(int bootstrap_specifier_index, int j) {
587 int offset = operand_offset_at(bootstrap_specifier_index);
588 return operands()->at(offset + _indy_argv_offset + j);
589 }
590 int operand_next_offset_at(int bootstrap_specifier_index) {
591 int offset = operand_offset_at(bootstrap_specifier_index) + _indy_argv_offset
592 + operand_argument_count_at(bootstrap_specifier_index);
593 return offset;
594 }
595 // Compare a bootsrap specifier in the operands arrays
596 bool compare_operand_to(int bootstrap_specifier_index1, constantPoolHandle cp2,
597 int bootstrap_specifier_index2, TRAPS);
598 // Find a bootsrap specifier in the operands array
599 int find_matching_operand(int bootstrap_specifier_index, constantPoolHandle search_cp,
600 int operands_cur_len, TRAPS);
601 // Resize the operands array with delta_len and delta_size
602 void resize_operands(int delta_len, int delta_size, TRAPS);
603 // Extend the operands array with the length and size of the ext_cp operands
604 void extend_operands(constantPoolHandle ext_cp, TRAPS);
605 // Shrink the operands array to a smaller array with new_len length
606 void shrink_operands(int new_len, TRAPS);
609 int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
610 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
611 int op_base = invoke_dynamic_operand_base(which);
612 return operands()->at(op_base + _indy_bsm_offset);
613 }
614 int invoke_dynamic_argument_count_at(int which) {
615 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
616 int op_base = invoke_dynamic_operand_base(which);
617 int argc = operands()->at(op_base + _indy_argc_offset);
618 DEBUG_ONLY(int end_offset = op_base + _indy_argv_offset + argc;
619 int next_offset = invoke_dynamic_operand_limit(which));
620 assert(end_offset == next_offset, "matched ending");
621 return argc;
622 }
623 int invoke_dynamic_argument_index_at(int which, int j) {
624 int op_base = invoke_dynamic_operand_base(which);
625 DEBUG_ONLY(int argc = operands()->at(op_base + _indy_argc_offset));
626 assert((uint)j < (uint)argc, "oob");
627 return operands()->at(op_base + _indy_argv_offset + j);
628 }
630 // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
631 // name_and_type_ref_index_at) all expect to be passed indices obtained
632 // directly from the bytecode.
633 // If the indices are meant to refer to fields or methods, they are
634 // actually rewritten constant pool cache indices.
635 // The routine remap_instruction_operand_from_cache manages the adjustment
636 // of these values back to constant pool indices.
638 // There are also "uncached" versions which do not adjust the operand index; see below.
640 // FIXME: Consider renaming these with a prefix "cached_" to make the distinction clear.
641 // In a few cases (the verifier) there are uses before a cpcache has been built,
642 // which are handled by a dynamic check in remap_instruction_operand_from_cache.
643 // FIXME: Remove the dynamic check, and adjust all callers to specify the correct mode.
645 // Lookup for entries consisting of (klass_index, name_and_type index)
646 Klass* klass_ref_at(int which, TRAPS);
647 Symbol* klass_ref_at_noresolve(int which);
648 Symbol* name_ref_at(int which) { return impl_name_ref_at(which, false); }
649 Symbol* signature_ref_at(int which) { return impl_signature_ref_at(which, false); }
651 int klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, false); }
652 int name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, false); }
654 // Lookup for entries consisting of (name_index, signature_index)
655 int name_ref_index_at(int which_nt); // == low-order jshort of name_and_type_at(which_nt)
656 int signature_ref_index_at(int which_nt); // == high-order jshort of name_and_type_at(which_nt)
658 BasicType basic_type_for_signature_at(int which);
660 // Resolve string constants (to prevent allocation during compilation)
661 void resolve_string_constants(TRAPS) {
662 constantPoolHandle h_this(THREAD, this);
663 resolve_string_constants_impl(h_this, CHECK);
664 }
666 // CDS support
667 void remove_unshareable_info();
668 void restore_unshareable_info(TRAPS);
669 bool resolve_class_constants(TRAPS);
670 // The ConstantPool vtable is restored by this call when the ConstantPool is
671 // in the shared archive. See patch_klass_vtables() in metaspaceShared.cpp for
672 // all the gory details. SA, dtrace and pstack helpers distinguish metadata
673 // by their vtable.
674 void restore_vtable() { guarantee(is_constantPool(), "vtable restored by this call"); }
676 private:
677 enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
678 public:
680 // Resolve late bound constants.
681 oop resolve_constant_at(int index, TRAPS) {
682 constantPoolHandle h_this(THREAD, this);
683 return resolve_constant_at_impl(h_this, index, _no_index_sentinel, THREAD);
684 }
686 oop resolve_cached_constant_at(int cache_index, TRAPS) {
687 constantPoolHandle h_this(THREAD, this);
688 return resolve_constant_at_impl(h_this, _no_index_sentinel, cache_index, THREAD);
689 }
691 oop resolve_possibly_cached_constant_at(int pool_index, TRAPS) {
692 constantPoolHandle h_this(THREAD, this);
693 return resolve_constant_at_impl(h_this, pool_index, _possible_index_sentinel, THREAD);
694 }
696 oop resolve_bootstrap_specifier_at(int index, TRAPS) {
697 constantPoolHandle h_this(THREAD, this);
698 return resolve_bootstrap_specifier_at_impl(h_this, index, THREAD);
699 }
701 // Klass name matches name at offset
702 bool klass_name_at_matches(instanceKlassHandle k, int which);
704 // Sizing
705 int length() const { return _length; }
706 void set_length(int length) { _length = length; }
708 // Tells whether index is within bounds.
709 bool is_within_bounds(int index) const {
710 return 0 <= index && index < length();
711 }
713 // Sizing (in words)
714 static int header_size() { return sizeof(ConstantPool)/HeapWordSize; }
715 static int size(int length) { return align_object_size(header_size() + length); }
716 int size() const { return size(length()); }
717 #if INCLUDE_SERVICES
718 void collect_statistics(KlassSizeStats *sz) const;
719 #endif
721 friend class ClassFileParser;
722 friend class SystemDictionary;
724 // Used by compiler to prevent classloading.
725 static Method* method_at_if_loaded (constantPoolHandle this_oop, int which);
726 static bool has_appendix_at_if_loaded (constantPoolHandle this_oop, int which);
727 static oop appendix_at_if_loaded (constantPoolHandle this_oop, int which);
728 static bool has_method_type_at_if_loaded (constantPoolHandle this_oop, int which);
729 static oop method_type_at_if_loaded (constantPoolHandle this_oop, int which);
730 static Klass* klass_at_if_loaded (constantPoolHandle this_oop, int which);
731 static Klass* klass_ref_at_if_loaded (constantPoolHandle this_oop, int which);
732 // Same as above - but does LinkResolving.
733 static Klass* klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int which, TRAPS);
735 // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
736 // future by other Java code. These take constant pool indices rather than
737 // constant pool cache indices as do the peer methods above.
738 Symbol* uncached_klass_ref_at_noresolve(int which);
739 Symbol* uncached_name_ref_at(int which) { return impl_name_ref_at(which, true); }
740 Symbol* uncached_signature_ref_at(int which) { return impl_signature_ref_at(which, true); }
741 int uncached_klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, true); }
742 int uncached_name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, true); }
744 // Sharing
745 int pre_resolve_shared_klasses(TRAPS);
747 // Debugging
748 const char* printable_name_at(int which) PRODUCT_RETURN0;
750 #ifdef ASSERT
751 enum { CPCACHE_INDEX_TAG = 0x10000 }; // helps keep CP cache indices distinct from CP indices
752 #else
753 enum { CPCACHE_INDEX_TAG = 0 }; // in product mode, this zero value is a no-op
754 #endif //ASSERT
756 static int decode_cpcache_index(int raw_index, bool invokedynamic_ok = false) {
757 if (invokedynamic_ok && is_invokedynamic_index(raw_index))
758 return decode_invokedynamic_index(raw_index);
759 else
760 return raw_index - CPCACHE_INDEX_TAG;
761 }
763 private:
765 void set_resolved_references(jobject s) { _resolved_references = s; }
766 Array<u2>* reference_map() const { return _reference_map; }
767 void set_reference_map(Array<u2>* o) { _reference_map = o; }
769 // patch JSR 292 resolved references after the class is linked.
770 void patch_resolved_references(GrowableArray<Handle>* cp_patches);
772 Symbol* impl_name_ref_at(int which, bool uncached);
773 Symbol* impl_signature_ref_at(int which, bool uncached);
774 int impl_klass_ref_index_at(int which, bool uncached);
775 int impl_name_and_type_ref_index_at(int which, bool uncached);
777 int remap_instruction_operand_from_cache(int operand); // operand must be biased by CPCACHE_INDEX_TAG
779 // Used while constructing constant pool (only by ClassFileParser)
780 jint klass_index_at(int which) {
781 assert(tag_at(which).is_klass_index(), "Corrupted constant pool");
782 return *int_at_addr(which);
783 }
785 jint string_index_at(int which) {
786 assert(tag_at(which).is_string_index(), "Corrupted constant pool");
787 return *int_at_addr(which);
788 }
790 // Performs the LinkResolver checks
791 static void verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle klass, TRAPS);
793 // Implementation of methods that needs an exposed 'this' pointer, in order to
794 // handle GC while executing the method
795 static Klass* klass_at_impl(constantPoolHandle this_oop, int which, TRAPS);
796 static oop string_at_impl(constantPoolHandle this_oop, int which, int obj_index, TRAPS);
798 // Resolve string constants (to prevent allocation during compilation)
799 static void resolve_string_constants_impl(constantPoolHandle this_oop, TRAPS);
801 static oop resolve_constant_at_impl(constantPoolHandle this_oop, int index, int cache_index, TRAPS);
802 static void save_and_throw_exception(constantPoolHandle this_oop, int which, int tag_value, TRAPS);
803 static oop resolve_bootstrap_specifier_at_impl(constantPoolHandle this_oop, int index, TRAPS);
805 public:
806 // Merging ConstantPool* support:
807 bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS);
808 void copy_cp_to(int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS) {
809 constantPoolHandle h_this(THREAD, this);
810 copy_cp_to_impl(h_this, start_i, end_i, to_cp, to_i, THREAD);
811 }
812 static void copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS);
813 static void copy_entry_to(constantPoolHandle from_cp, int from_i, constantPoolHandle to_cp, int to_i, TRAPS);
814 static void copy_operands(constantPoolHandle from_cp, constantPoolHandle to_cp, TRAPS);
815 int find_matching_entry(int pattern_i, constantPoolHandle search_cp, TRAPS);
816 int version() const { return _saved._version; }
817 void set_version(int version) { _saved._version = version; }
818 void increment_and_save_version(int version) {
819 _saved._version = version >= 0 ? (version + 1) : version; // keep overflow
820 }
822 void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
823 int resolved_reference_length() const { return _saved._resolved_reference_length; }
825 // lock() may return null -- constant pool updates may happen before this lock is
826 // initialized, because the _pool_holder has not been fully initialized and
827 // has not been registered into the system dictionary. In this case, no other
828 // thread can be modifying this constantpool, so no synchronization is
829 // necessary.
830 //
831 // Use cplock() like this:
832 // oop cplock = cp->lock();
833 // ObjectLocker ol(cplock , THREAD, cplock != NULL);
834 oop lock();
836 // Decrease ref counts of symbols that are in the constant pool
837 // when the holder class is unloaded
838 void unreference_symbols();
840 // Deallocate constant pool for RedefineClasses
841 void deallocate_contents(ClassLoaderData* loader_data);
842 void release_C_heap_structures();
844 // JVMTI accesss - GetConstantPool, RetransformClasses, ...
845 friend class JvmtiConstantPoolReconstituter;
847 private:
848 jint cpool_entry_size(jint idx);
849 jint hash_entries_to(SymbolHashMap *symmap, SymbolHashMap *classmap);
851 // Copy cpool bytes into byte array.
852 // Returns:
853 // int > 0, count of the raw cpool bytes that have been copied
854 // 0, OutOfMemory error
855 // -1, Internal error
856 int copy_cpool_bytes(int cpool_size,
857 SymbolHashMap* tbl,
858 unsigned char *bytes);
860 public:
861 // Verify
862 void verify_on(outputStream* st);
864 // Printing
865 void print_on(outputStream* st) const;
866 void print_value_on(outputStream* st) const;
867 void print_entry_on(int index, outputStream* st);
869 const char* internal_name() const { return "{constant pool}"; }
871 #ifndef PRODUCT
872 // Compile the world support
873 static void preload_and_initialize_all_classes(ConstantPool* constant_pool, TRAPS);
874 #endif
875 };
877 class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
878 private:
879 unsigned int _hash; // 32-bit hash for item
880 SymbolHashMapEntry* _next; // Next element in the linked list for this bucket
881 Symbol* _symbol; // 1-st part of the mapping: symbol => value
882 u2 _value; // 2-nd part of the mapping: symbol => value
884 public:
885 unsigned int hash() const { return _hash; }
886 void set_hash(unsigned int hash) { _hash = hash; }
888 SymbolHashMapEntry* next() const { return _next; }
889 void set_next(SymbolHashMapEntry* next) { _next = next; }
891 Symbol* symbol() const { return _symbol; }
892 void set_symbol(Symbol* sym) { _symbol = sym; }
894 u2 value() const { return _value; }
895 void set_value(u2 value) { _value = value; }
897 SymbolHashMapEntry(unsigned int hash, Symbol* symbol, u2 value)
898 : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}
900 }; // End SymbolHashMapEntry class
903 class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
905 private:
906 SymbolHashMapEntry* _entry;
908 public:
909 SymbolHashMapEntry* entry() const { return _entry; }
910 void set_entry(SymbolHashMapEntry* entry) { _entry = entry; }
911 void clear() { _entry = NULL; }
913 }; // End SymbolHashMapBucket class
916 class SymbolHashMap: public CHeapObj<mtSymbol> {
918 private:
919 // Default number of entries in the table
920 enum SymbolHashMap_Constants {
921 _Def_HashMap_Size = 256
922 };
924 int _table_size;
925 SymbolHashMapBucket* _buckets;
927 void initialize_table(int table_size) {
928 _table_size = table_size;
929 _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
930 for (int index = 0; index < table_size; index++) {
931 _buckets[index].clear();
932 }
933 }
935 public:
937 int table_size() const { return _table_size; }
939 SymbolHashMap() { initialize_table(_Def_HashMap_Size); }
940 SymbolHashMap(int table_size) { initialize_table(table_size); }
942 // hash P(31) from Kernighan & Ritchie
943 static unsigned int compute_hash(const char* str, int len) {
944 unsigned int hash = 0;
945 while (len-- > 0) {
946 hash = 31*hash + (unsigned) *str;
947 str++;
948 }
949 return hash;
950 }
952 SymbolHashMapEntry* bucket(int i) {
953 return _buckets[i].entry();
954 }
956 void add_entry(Symbol* sym, u2 value);
957 SymbolHashMapEntry* find_entry(Symbol* sym);
959 u2 symbol_to_value(Symbol* sym) {
960 SymbolHashMapEntry *entry = find_entry(sym);
961 return (entry == NULL) ? 0 : entry->value();
962 }
964 ~SymbolHashMap() {
965 SymbolHashMapEntry* next;
966 for (int i = 0; i < _table_size; i++) {
967 for (SymbolHashMapEntry* cur = bucket(i); cur != NULL; cur = next) {
968 next = cur->next();
969 delete(cur);
970 }
971 }
972 delete _buckets;
973 }
974 }; // End SymbolHashMap class
976 #endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP