comparison src/share/vm/oops/constantPool.hpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents src/share/vm/oops/constantPoolOop.hpp@1d7922586cf6
children fa6e618671d7
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /*
2 * Copyright (c) 1997, 2012, 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_VM_OOPS_CONSTANTPOOLOOP_HPP
26 #define SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
27
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
50
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*.
59
60 class SymbolHashMap;
61
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) {}
68
69 intptr_t value() { return _ptr; }
70 bool is_resolved() { return (_ptr & 1) == 0; }
71 bool is_unresolved() { return (_ptr & 1) == 1; }
72
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 };
82
83 class ConstantPool : public Metadata {
84 friend class VMStructs;
85 friend class BytecodeInterpreter; // Directly extracts an oop in the pool for fast instanceof/checkcast
86 friend class Universe; // For null constructor
87 private:
88 Array<u1>* _tags; // the tag array describing the constant pool's contents
89 ConstantPoolCache* _cache; // the cache holding interpreter runtime information
90 Klass* _pool_holder; // the corresponding class
91 Array<u2>* _operands; // for variable-sized (InvokeDynamic) nodes, usually empty
92
93 // Array of resolved objects from the constant pool and map from resolved
94 // object index to original constant pool index
95 jobject _resolved_references;
96 Array<u2>* _reference_map;
97
98 int _flags; // a few header bits to describe contents for GC
99 int _length; // number of elements in the array
100
101 bool _on_stack; // Redefined method still executing refers to this constant pool.
102
103 union {
104 // set for CDS to restore resolved references
105 int _resolved_reference_length;
106 // only set to non-zero if constant pool is merged by RedefineClasses
107 int _orig_length;
108 } _saved;
109
110 Monitor* _lock;
111
112 void set_tags(Array<u1>* tags) { _tags = tags; }
113 void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); }
114 void release_tag_at_put(int which, jbyte t) { tags()->release_at_put(which, t); }
115
116 void set_operands(Array<u2>* operands) { _operands = operands; }
117
118 enum FlagBit {
119 FB_has_invokedynamic = 1,
120 FB_has_pseudo_string = 2,
121 FB_has_preresolution = 3
122 };
123
124 int flags() const { return _flags; }
125 void set_flags(int f) { _flags = f; }
126 bool flag_at(FlagBit fb) const { return (_flags & (1 << (int)fb)) != 0; }
127 void set_flag_at(FlagBit fb);
128 // no clear_flag_at function; they only increase
129
130 private:
131 intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
132
133 CPSlot slot_at(int which) {
134 assert(is_within_bounds(which), "index out of bounds");
135 // Uses volatile because the klass slot changes without a lock.
136 volatile intptr_t adr = (intptr_t)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which));
137 assert(adr != 0 || which == 0, "cp entry for klass should not be zero");
138 return CPSlot(adr);
139 }
140
141 void slot_at_put(int which, CPSlot s) const {
142 assert(is_within_bounds(which), "index out of bounds");
143 assert(s.value() != 0, "Caught something");
144 *(intptr_t*)&base()[which] = s.value();
145 }
146 intptr_t* obj_at_addr_raw(int which) const {
147 assert(is_within_bounds(which), "index out of bounds");
148 return (intptr_t*) &base()[which];
149 }
150
151 jint* int_at_addr(int which) const {
152 assert(is_within_bounds(which), "index out of bounds");
153 return (jint*) &base()[which];
154 }
155
156 jlong* long_at_addr(int which) const {
157 assert(is_within_bounds(which), "index out of bounds");
158 return (jlong*) &base()[which];
159 }
160
161 jfloat* float_at_addr(int which) const {
162 assert(is_within_bounds(which), "index out of bounds");
163 return (jfloat*) &base()[which];
164 }
165
166 jdouble* double_at_addr(int which) const {
167 assert(is_within_bounds(which), "index out of bounds");
168 return (jdouble*) &base()[which];
169 }
170
171 ConstantPool(Array<u1>* tags);
172 ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
173 public:
174 static ConstantPool* allocate(ClassLoaderData* loader_data, int length, TRAPS);
175
176 bool is_constantPool() const volatile { return true; }
177
178 Array<u1>* tags() const { return _tags; }
179 Array<u2>* operands() const { return _operands; }
180
181 bool has_pseudo_string() const { return flag_at(FB_has_pseudo_string); }
182 bool has_invokedynamic() const { return flag_at(FB_has_invokedynamic); }
183 bool has_preresolution() const { return flag_at(FB_has_preresolution); }
184 void set_pseudo_string() { set_flag_at(FB_has_pseudo_string); }
185 void set_invokedynamic() { set_flag_at(FB_has_invokedynamic); }
186 void set_preresolution() { set_flag_at(FB_has_preresolution); }
187
188 // Redefine classes support. If a method refering to this constant pool
189 // is on the executing stack, or as a handle in vm code, this constant pool
190 // can't be removed from the set of previous versions saved in the instance
191 // class.
192 bool on_stack() const { return _on_stack; }
193 void set_on_stack(const bool value);
194
195 // Klass holding pool
196 Klass* pool_holder() const { return _pool_holder; }
197 void set_pool_holder(Klass* k) { _pool_holder = k; }
198 Klass** pool_holder_addr() { return &_pool_holder; }
199
200 // Interpreter runtime support
201 ConstantPoolCache* cache() const { return _cache; }
202 void set_cache(ConstantPoolCache* cache){ _cache = cache; }
203
204 // Create object cache in the constant pool
205 void initialize_resolved_references(ClassLoaderData* loader_data,
206 intStack reference_map,
207 int constant_pool_map_length,
208 TRAPS);
209
210 // resolved strings, methodHandles and callsite objects from the constant pool
211 objArrayOop resolved_references() const;
212 // mapping resolved object array indexes to cp indexes and back.
213 int object_to_cp_index(int index) { return _reference_map->at(index); }
214 int cp_to_object_index(int index);
215
216 // Invokedynamic indexes.
217 // They must look completely different from normal indexes.
218 // The main reason is that byte swapping is sometimes done on normal indexes.
219 // Finally, it is helpful for debugging to tell the two apart.
220 static bool is_invokedynamic_index(int i) { return (i < 0); }
221 static int decode_invokedynamic_index(int i) { assert(is_invokedynamic_index(i), ""); return ~i; }
222 static int encode_invokedynamic_index(int i) { assert(!is_invokedynamic_index(i), ""); return ~i; }
223
224
225 // The invokedynamic points at a CP cache entry. This entry points back
226 // at the original CP entry (CONSTANT_InvokeDynamic) and also (via f2) at an entry
227 // in the resolved_references array (which provides the appendix argument).
228 int invokedynamic_cp_cache_index(int index) const {
229 assert (is_invokedynamic_index(index), "should be a invokedynamic index");
230 int cache_index = decode_invokedynamic_index(index);
231 return cache_index;
232 }
233 ConstantPoolCacheEntry* invokedynamic_cp_cache_entry_at(int index) const {
234 // decode index that invokedynamic points to.
235 int cp_cache_index = invokedynamic_cp_cache_index(index);
236 return cache()->entry_at(cp_cache_index);
237 }
238
239 // Assembly code support
240 static int tags_offset_in_bytes() { return offset_of(ConstantPool, _tags); }
241 static int cache_offset_in_bytes() { return offset_of(ConstantPool, _cache); }
242 static int pool_holder_offset_in_bytes() { return offset_of(ConstantPool, _pool_holder); }
243 static int resolved_references_offset_in_bytes() { return offset_of(ConstantPool, _resolved_references); }
244 static int reference_map_offset_in_bytes() { return offset_of(ConstantPool, _reference_map); }
245
246 // Storing constants
247
248 void klass_at_put(int which, Klass* k) {
249 assert(k != NULL, "resolved class shouldn't be null");
250 assert(is_within_bounds(which), "index out of bounds");
251 OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
252 // The interpreter assumes when the tag is stored, the klass is resolved
253 // and the Klass* is a klass rather than a Symbol*, so we need
254 // hardware store ordering here.
255 release_tag_at_put(which, JVM_CONSTANT_Class);
256 }
257
258 // For temporary use while constructing constant pool
259 void klass_index_at_put(int which, int name_index) {
260 tag_at_put(which, JVM_CONSTANT_ClassIndex);
261 *int_at_addr(which) = name_index;
262 }
263
264 // Temporary until actual use
265 void unresolved_klass_at_put(int which, Symbol* s) {
266 release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
267 slot_at_put(which, s);
268 }
269
270 void method_handle_index_at_put(int which, int ref_kind, int ref_index) {
271 tag_at_put(which, JVM_CONSTANT_MethodHandle);
272 *int_at_addr(which) = ((jint) ref_index<<16) | ref_kind;
273 }
274
275 void method_type_index_at_put(int which, int ref_index) {
276 tag_at_put(which, JVM_CONSTANT_MethodType);
277 *int_at_addr(which) = ref_index;
278 }
279
280 void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) {
281 tag_at_put(which, JVM_CONSTANT_InvokeDynamic);
282 *int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index;
283 }
284
285 void unresolved_string_at_put(int which, Symbol* s) {
286 release_tag_at_put(which, JVM_CONSTANT_String);
287 *symbol_at_addr(which) = s;
288 }
289
290 void int_at_put(int which, jint i) {
291 tag_at_put(which, JVM_CONSTANT_Integer);
292 *int_at_addr(which) = i;
293 }
294
295 void long_at_put(int which, jlong l) {
296 tag_at_put(which, JVM_CONSTANT_Long);
297 // *long_at_addr(which) = l;
298 Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
299 }
300
301 void float_at_put(int which, jfloat f) {
302 tag_at_put(which, JVM_CONSTANT_Float);
303 *float_at_addr(which) = f;
304 }
305
306 void double_at_put(int which, jdouble d) {
307 tag_at_put(which, JVM_CONSTANT_Double);
308 // *double_at_addr(which) = d;
309 // u8 temp = *(u8*) &d;
310 Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
311 }
312
313 Symbol** symbol_at_addr(int which) const {
314 assert(is_within_bounds(which), "index out of bounds");
315 return (Symbol**) &base()[which];
316 }
317
318 void symbol_at_put(int which, Symbol* s) {
319 assert(s->refcount() != 0, "should have nonzero refcount");
320 tag_at_put(which, JVM_CONSTANT_Utf8);
321 *symbol_at_addr(which) = s;
322 }
323
324 void string_at_put(int which, int obj_index, oop str) {
325 resolved_references()->obj_at_put(obj_index, str);
326 }
327
328 void set_object_tag_at(int which) {
329 release_tag_at_put(which, JVM_CONSTANT_Object);
330 }
331
332 void object_at_put(int which, oop obj) {
333 resolved_references()->obj_at_put(cp_to_object_index(which), obj);
334 }
335
336 // For temporary use while constructing constant pool
337 void string_index_at_put(int which, int string_index) {
338 tag_at_put(which, JVM_CONSTANT_StringIndex);
339 *int_at_addr(which) = string_index;
340 }
341
342 void field_at_put(int which, int class_index, int name_and_type_index) {
343 tag_at_put(which, JVM_CONSTANT_Fieldref);
344 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
345 }
346
347 void method_at_put(int which, int class_index, int name_and_type_index) {
348 tag_at_put(which, JVM_CONSTANT_Methodref);
349 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
350 }
351
352 void interface_method_at_put(int which, int class_index, int name_and_type_index) {
353 tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
354 *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index; // Not so nice
355 }
356
357 void name_and_type_at_put(int which, int name_index, int signature_index) {
358 tag_at_put(which, JVM_CONSTANT_NameAndType);
359 *int_at_addr(which) = ((jint) signature_index<<16) | name_index; // Not so nice
360 }
361
362 // Tag query
363
364 constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
365
366 // Fetching constants
367
368 Klass* klass_at(int which, TRAPS) {
369 constantPoolHandle h_this(THREAD, this);
370 return klass_at_impl(h_this, which, CHECK_NULL);
371 }
372
373 Symbol* klass_name_at(int which); // Returns the name, w/o resolving.
374
375 Klass* resolved_klass_at(int which) { // Used by Compiler
376 guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
377 // Must do an acquire here in case another thread resolved the klass
378 // behind our back, lest we later load stale values thru the oop.
379 return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
380 }
381
382 // This method should only be used with a cpool lock or during parsing or gc
383 Symbol* unresolved_klass_at(int which) { // Temporary until actual use
384 Symbol* s = CPSlot((Symbol*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_symbol();
385 // check that the klass is still unresolved.
386 assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
387 return s;
388 }
389
390 // RedefineClasses() API support:
391 Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
392
393 jint int_at(int which) {
394 assert(tag_at(which).is_int(), "Corrupted constant pool");
395 return *int_at_addr(which);
396 }
397
398 jlong long_at(int which) {
399 assert(tag_at(which).is_long(), "Corrupted constant pool");
400 // return *long_at_addr(which);
401 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
402 return *((jlong*)&tmp);
403 }
404
405 jfloat float_at(int which) {
406 assert(tag_at(which).is_float(), "Corrupted constant pool");
407 return *float_at_addr(which);
408 }
409
410 jdouble double_at(int which) {
411 assert(tag_at(which).is_double(), "Corrupted constant pool");
412 u8 tmp = Bytes::get_native_u8((address)&base()[which]);
413 return *((jdouble*)&tmp);
414 }
415
416 Symbol* symbol_at(int which) {
417 assert(tag_at(which).is_utf8(), "Corrupted constant pool");
418 return *symbol_at_addr(which);
419 }
420
421 oop string_at(int which, int obj_index, TRAPS) {
422 constantPoolHandle h_this(THREAD, this);
423 return string_at_impl(h_this, which, obj_index, THREAD);
424 }
425 oop string_at(int which, TRAPS) {
426 int obj_index = cp_to_object_index(which);
427 return string_at(which, obj_index, THREAD);
428 }
429
430 // Version that can be used before string oop array is created.
431 oop uncached_string_at(int which, TRAPS);
432
433 oop object_at(int which) {
434 assert(tag_at(which).is_object(), "Corrupted constant pool");
435 int obj_index = cp_to_object_index(which);
436 return resolved_references()->obj_at(obj_index);
437 }
438
439 // A "pseudo-string" is an non-string oop that has found is way into
440 // a String entry.
441 // Under EnableInvokeDynamic this can happen if the user patches a live
442 // object into a CONSTANT_String entry of an anonymous class.
443 // Method oops internally created for method handles may also
444 // use pseudo-strings to link themselves to related metaobjects.
445
446 bool is_pseudo_string_at(int which) {
447 // A pseudo string is a string that doesn't have a symbol in the cpSlot
448 return unresolved_string_at(which) == NULL;
449 }
450
451 oop pseudo_string_at(int which, int obj_index) {
452 assert(tag_at(which).is_string(), "Corrupted constant pool");
453 assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
454 oop s = resolved_references()->obj_at(obj_index);
455 return s;
456 }
457
458 void pseudo_string_at_put(int which, int obj_index, oop x) {
459 assert(EnableInvokeDynamic, "");
460 set_pseudo_string(); // mark header
461 assert(tag_at(which).is_string(), "Corrupted constant pool");
462 string_at_put(which, obj_index, x); // this works just fine
463 }
464
465 // only called when we are sure a string entry is already resolved (via an
466 // earlier string_at call.
467 oop resolved_string_at(int which) {
468 assert(tag_at(which).is_string(), "Corrupted constant pool");
469 // Must do an acquire here in case another thread resolved the klass
470 // behind our back, lest we later load stale values thru the oop.
471 // we might want a volatile_obj_at in objArrayKlass.
472 int obj_index = cp_to_object_index(which);
473 return resolved_references()->obj_at(obj_index);
474 }
475
476 Symbol* unresolved_string_at(int which) {
477 assert(tag_at(which).is_string(), "Corrupted constant pool");
478 Symbol* s = *symbol_at_addr(which);
479 return s;
480 }
481
482 // Returns an UTF8 for a CONSTANT_String entry at a given index.
483 // UTF8 char* representation was chosen to avoid conversion of
484 // java_lang_Strings at resolved entries into Symbol*s
485 // or vice versa.
486 // Caller is responsible for checking for pseudo-strings.
487 char* string_at_noresolve(int which);
488
489 jint name_and_type_at(int which) {
490 assert(tag_at(which).is_name_and_type(), "Corrupted constant pool");
491 return *int_at_addr(which);
492 }
493
494 int method_handle_ref_kind_at(int which) {
495 assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
496 return extract_low_short_from_int(*int_at_addr(which)); // mask out unwanted ref_index bits
497 }
498 int method_handle_index_at(int which) {
499 assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
500 return extract_high_short_from_int(*int_at_addr(which)); // shift out unwanted ref_kind bits
501 }
502 int method_type_index_at(int which) {
503 assert(tag_at(which).is_method_type(), "Corrupted constant pool");
504 return *int_at_addr(which);
505 }
506 // Derived queries:
507 Symbol* method_handle_name_ref_at(int which) {
508 int member = method_handle_index_at(which);
509 return impl_name_ref_at(member, true);
510 }
511 Symbol* method_handle_signature_ref_at(int which) {
512 int member = method_handle_index_at(which);
513 return impl_signature_ref_at(member, true);
514 }
515 int method_handle_klass_index_at(int which) {
516 int member = method_handle_index_at(which);
517 return impl_klass_ref_index_at(member, true);
518 }
519 Symbol* method_type_signature_at(int which) {
520 int sym = method_type_index_at(which);
521 return symbol_at(sym);
522 }
523
524 int invoke_dynamic_name_and_type_ref_index_at(int which) {
525 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
526 return extract_high_short_from_int(*int_at_addr(which));
527 }
528 int invoke_dynamic_bootstrap_specifier_index(int which) {
529 assert(tag_at(which).value() == JVM_CONSTANT_InvokeDynamic, "Corrupted constant pool");
530 return extract_low_short_from_int(*int_at_addr(which));
531 }
532 int invoke_dynamic_operand_base(int which) {
533 int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
534 return operand_offset_at(operands(), bootstrap_specifier_index);
535 }
536 // The first part of the operands array consists of an index into the second part.
537 // Extract a 32-bit index value from the first part.
538 static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
539 int n = (bootstrap_specifier_index * 2);
540 assert(n >= 0 && n+2 <= operands->length(), "oob");
541 // The first 32-bit index points to the beginning of the second part
542 // of the operands array. Make sure this index is in the first part.
543 DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
544 operands->at(1)));
545 assert(second_part == 0 || n+2 <= second_part, "oob (2)");
546 int offset = build_int_from_shorts(operands->at(n+0),
547 operands->at(n+1));
548 // The offset itself must point into the second part of the array.
549 assert(offset == 0 || offset >= second_part && offset <= operands->length(), "oob (3)");
550 return offset;
551 }
552 static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
553 int n = bootstrap_specifier_index * 2;
554 assert(n >= 0 && n+2 <= operands->length(), "oob");
555 operands->at_put(n+0, extract_low_short_from_int(offset));
556 operands->at_put(n+1, extract_high_short_from_int(offset));
557 }
558 static int operand_array_length(Array<u2>* operands) {
559 if (operands == NULL || operands->length() == 0) return 0;
560 int second_part = operand_offset_at(operands, 0);
561 return (second_part / 2);
562 }
563
564 #ifdef ASSERT
565 // operand tuples fit together exactly, end to end
566 static int operand_limit_at(Array<u2>* operands, int bootstrap_specifier_index) {
567 int nextidx = bootstrap_specifier_index + 1;
568 if (nextidx == operand_array_length(operands))
569 return operands->length();
570 else
571 return operand_offset_at(operands, nextidx);
572 }
573 int invoke_dynamic_operand_limit(int which) {
574 int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
575 return operand_limit_at(operands(), bootstrap_specifier_index);
576 }
577 #endif //ASSERT
578
579 // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
580 enum {
581 _indy_bsm_offset = 0, // CONSTANT_MethodHandle bsm
582 _indy_argc_offset = 1, // u2 argc
583 _indy_argv_offset = 2 // u2 argv[argc]
584 };
585 int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
586 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
587 int op_base = invoke_dynamic_operand_base(which);
588 return operands()->at(op_base + _indy_bsm_offset);
589 }
590 int invoke_dynamic_argument_count_at(int which) {
591 assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
592 int op_base = invoke_dynamic_operand_base(which);
593 int argc = operands()->at(op_base + _indy_argc_offset);
594 DEBUG_ONLY(int end_offset = op_base + _indy_argv_offset + argc;
595 int next_offset = invoke_dynamic_operand_limit(which));
596 assert(end_offset == next_offset, "matched ending");
597 return argc;
598 }
599 int invoke_dynamic_argument_index_at(int which, int j) {
600 int op_base = invoke_dynamic_operand_base(which);
601 DEBUG_ONLY(int argc = operands()->at(op_base + _indy_argc_offset));
602 assert((uint)j < (uint)argc, "oob");
603 return operands()->at(op_base + _indy_argv_offset + j);
604 }
605
606 // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
607 // name_and_type_ref_index_at) all expect to be passed indices obtained
608 // directly from the bytecode.
609 // If the indices are meant to refer to fields or methods, they are
610 // actually rewritten constant pool cache indices.
611 // The routine remap_instruction_operand_from_cache manages the adjustment
612 // of these values back to constant pool indices.
613
614 // There are also "uncached" versions which do not adjust the operand index; see below.
615
616 // FIXME: Consider renaming these with a prefix "cached_" to make the distinction clear.
617 // In a few cases (the verifier) there are uses before a cpcache has been built,
618 // which are handled by a dynamic check in remap_instruction_operand_from_cache.
619 // FIXME: Remove the dynamic check, and adjust all callers to specify the correct mode.
620
621 // Lookup for entries consisting of (klass_index, name_and_type index)
622 Klass* klass_ref_at(int which, TRAPS);
623 Symbol* klass_ref_at_noresolve(int which);
624 Symbol* name_ref_at(int which) { return impl_name_ref_at(which, false); }
625 Symbol* signature_ref_at(int which) { return impl_signature_ref_at(which, false); }
626
627 int klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, false); }
628 int name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, false); }
629
630 // Lookup for entries consisting of (name_index, signature_index)
631 int name_ref_index_at(int which_nt); // == low-order jshort of name_and_type_at(which_nt)
632 int signature_ref_index_at(int which_nt); // == high-order jshort of name_and_type_at(which_nt)
633
634 BasicType basic_type_for_signature_at(int which);
635
636 // Resolve string constants (to prevent allocation during compilation)
637 void resolve_string_constants(TRAPS) {
638 constantPoolHandle h_this(THREAD, this);
639 resolve_string_constants_impl(h_this, CHECK);
640 }
641
642 // CDS support
643 void remove_unshareable_info();
644 void restore_unshareable_info(TRAPS);
645 bool resolve_class_constants(TRAPS);
646
647 private:
648 enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
649 public:
650
651 // Resolve late bound constants.
652 oop resolve_constant_at(int index, TRAPS) {
653 constantPoolHandle h_this(THREAD, this);
654 return resolve_constant_at_impl(h_this, index, _no_index_sentinel, THREAD);
655 }
656
657 oop resolve_cached_constant_at(int cache_index, TRAPS) {
658 constantPoolHandle h_this(THREAD, this);
659 return resolve_constant_at_impl(h_this, _no_index_sentinel, cache_index, THREAD);
660 }
661
662 oop resolve_possibly_cached_constant_at(int pool_index, TRAPS) {
663 constantPoolHandle h_this(THREAD, this);
664 return resolve_constant_at_impl(h_this, pool_index, _possible_index_sentinel, THREAD);
665 }
666
667 oop resolve_bootstrap_specifier_at(int index, TRAPS) {
668 constantPoolHandle h_this(THREAD, this);
669 return resolve_bootstrap_specifier_at_impl(h_this, index, THREAD);
670 }
671
672 // Klass name matches name at offset
673 bool klass_name_at_matches(instanceKlassHandle k, int which);
674
675 // Sizing
676 int length() const { return _length; }
677 void set_length(int length) { _length = length; }
678
679 // Tells whether index is within bounds.
680 bool is_within_bounds(int index) const {
681 return 0 <= index && index < length();
682 }
683
684 static int header_size() { return sizeof(ConstantPool)/HeapWordSize; }
685 static int size(int length) { return align_object_size(header_size() + length); }
686 int size() const { return size(length()); }
687
688 friend class ClassFileParser;
689 friend class SystemDictionary;
690
691 // Used by compiler to prevent classloading.
692 static Method* method_at_if_loaded (constantPoolHandle this_oop, int which);
693 static bool has_appendix_at_if_loaded (constantPoolHandle this_oop, int which);
694 static oop appendix_at_if_loaded (constantPoolHandle this_oop, int which);
695 static Klass* klass_at_if_loaded (constantPoolHandle this_oop, int which);
696 static Klass* klass_ref_at_if_loaded (constantPoolHandle this_oop, int which);
697 // Same as above - but does LinkResolving.
698 static Klass* klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int which, TRAPS);
699
700 // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
701 // future by other Java code. These take constant pool indices rather than
702 // constant pool cache indices as do the peer methods above.
703 Symbol* uncached_klass_ref_at_noresolve(int which);
704 Symbol* uncached_name_ref_at(int which) { return impl_name_ref_at(which, true); }
705 Symbol* uncached_signature_ref_at(int which) { return impl_signature_ref_at(which, true); }
706 int uncached_klass_ref_index_at(int which) { return impl_klass_ref_index_at(which, true); }
707 int uncached_name_and_type_ref_index_at(int which) { return impl_name_and_type_ref_index_at(which, true); }
708
709 // Sharing
710 int pre_resolve_shared_klasses(TRAPS);
711
712 // Debugging
713 const char* printable_name_at(int which) PRODUCT_RETURN0;
714
715 #ifdef ASSERT
716 enum { CPCACHE_INDEX_TAG = 0x10000 }; // helps keep CP cache indices distinct from CP indices
717 #else
718 enum { CPCACHE_INDEX_TAG = 0 }; // in product mode, this zero value is a no-op
719 #endif //ASSERT
720
721 static int decode_cpcache_index(int raw_index, bool invokedynamic_ok = false) {
722 if (invokedynamic_ok && is_invokedynamic_index(raw_index))
723 return decode_invokedynamic_index(raw_index);
724 else
725 return raw_index - CPCACHE_INDEX_TAG;
726 }
727
728 private:
729
730 void set_resolved_references(jobject s) { _resolved_references = s; }
731 Array<u2>* reference_map() const { return _reference_map; }
732 void set_reference_map(Array<u2>* o) { _reference_map = o; }
733
734 // patch JSR 292 resolved references after the class is linked.
735 void patch_resolved_references(GrowableArray<Handle>* cp_patches);
736
737 Symbol* impl_name_ref_at(int which, bool uncached);
738 Symbol* impl_signature_ref_at(int which, bool uncached);
739 int impl_klass_ref_index_at(int which, bool uncached);
740 int impl_name_and_type_ref_index_at(int which, bool uncached);
741
742 int remap_instruction_operand_from_cache(int operand); // operand must be biased by CPCACHE_INDEX_TAG
743
744 // Used while constructing constant pool (only by ClassFileParser)
745 jint klass_index_at(int which) {
746 assert(tag_at(which).is_klass_index(), "Corrupted constant pool");
747 return *int_at_addr(which);
748 }
749
750 jint string_index_at(int which) {
751 assert(tag_at(which).is_string_index(), "Corrupted constant pool");
752 return *int_at_addr(which);
753 }
754
755 // Performs the LinkResolver checks
756 static void verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle klass, TRAPS);
757
758 // Implementation of methods that needs an exposed 'this' pointer, in order to
759 // handle GC while executing the method
760 static Klass* klass_at_impl(constantPoolHandle this_oop, int which, TRAPS);
761 static oop string_at_impl(constantPoolHandle this_oop, int which, int obj_index, TRAPS);
762
763 // Resolve string constants (to prevent allocation during compilation)
764 static void resolve_string_constants_impl(constantPoolHandle this_oop, TRAPS);
765
766 static oop resolve_constant_at_impl(constantPoolHandle this_oop, int index, int cache_index, TRAPS);
767 static void save_and_throw_exception(constantPoolHandle this_oop, int which, int tag_value, TRAPS);
768 static oop resolve_bootstrap_specifier_at_impl(constantPoolHandle this_oop, int index, TRAPS);
769
770 public:
771 // Merging ConstantPool* support:
772 bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS);
773 void copy_cp_to(int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS) {
774 constantPoolHandle h_this(THREAD, this);
775 copy_cp_to_impl(h_this, start_i, end_i, to_cp, to_i, THREAD);
776 }
777 static void copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS);
778 static void copy_entry_to(constantPoolHandle from_cp, int from_i, constantPoolHandle to_cp, int to_i, TRAPS);
779 int find_matching_entry(int pattern_i, constantPoolHandle search_cp, TRAPS);
780 int orig_length() const { return _saved._orig_length; }
781 void set_orig_length(int orig_length) { _saved._orig_length = orig_length; }
782
783 void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
784 int resolved_reference_length() const { return _saved._resolved_reference_length; }
785 void set_lock(Monitor* lock) { _lock = lock; }
786 Monitor* lock() { return _lock; }
787
788 // Decrease ref counts of symbols that are in the constant pool
789 // when the holder class is unloaded
790 void unreference_symbols();
791
792 // Deallocate constant pool for RedefineClasses
793 void deallocate_contents(ClassLoaderData* loader_data);
794 void release_C_heap_structures();
795
796 // JVMTI accesss - GetConstantPool, RetransformClasses, ...
797 friend class JvmtiConstantPoolReconstituter;
798
799 private:
800 jint cpool_entry_size(jint idx);
801 jint hash_entries_to(SymbolHashMap *symmap, SymbolHashMap *classmap);
802
803 // Copy cpool bytes into byte array.
804 // Returns:
805 // int > 0, count of the raw cpool bytes that have been copied
806 // 0, OutOfMemory error
807 // -1, Internal error
808 int copy_cpool_bytes(int cpool_size,
809 SymbolHashMap* tbl,
810 unsigned char *bytes);
811
812 public:
813 // Verify
814 void verify_on(outputStream* st);
815
816 // Printing
817 void print_on(outputStream* st) const;
818 void print_value_on(outputStream* st) const;
819 void print_entry_on(int index, outputStream* st);
820
821 const char* internal_name() const { return "{constant pool}"; }
822
823 #ifndef PRODUCT
824 // Compile the world support
825 static void preload_and_initialize_all_classes(ConstantPool* constant_pool, TRAPS);
826 #endif
827 };
828
829 class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
830 private:
831 unsigned int _hash; // 32-bit hash for item
832 SymbolHashMapEntry* _next; // Next element in the linked list for this bucket
833 Symbol* _symbol; // 1-st part of the mapping: symbol => value
834 u2 _value; // 2-nd part of the mapping: symbol => value
835
836 public:
837 unsigned int hash() const { return _hash; }
838 void set_hash(unsigned int hash) { _hash = hash; }
839
840 SymbolHashMapEntry* next() const { return _next; }
841 void set_next(SymbolHashMapEntry* next) { _next = next; }
842
843 Symbol* symbol() const { return _symbol; }
844 void set_symbol(Symbol* sym) { _symbol = sym; }
845
846 u2 value() const { return _value; }
847 void set_value(u2 value) { _value = value; }
848
849 SymbolHashMapEntry(unsigned int hash, Symbol* symbol, u2 value)
850 : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}
851
852 }; // End SymbolHashMapEntry class
853
854
855 class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
856
857 private:
858 SymbolHashMapEntry* _entry;
859
860 public:
861 SymbolHashMapEntry* entry() const { return _entry; }
862 void set_entry(SymbolHashMapEntry* entry) { _entry = entry; }
863 void clear() { _entry = NULL; }
864
865 }; // End SymbolHashMapBucket class
866
867
868 class SymbolHashMap: public CHeapObj<mtSymbol> {
869
870 private:
871 // Default number of entries in the table
872 enum SymbolHashMap_Constants {
873 _Def_HashMap_Size = 256
874 };
875
876 int _table_size;
877 SymbolHashMapBucket* _buckets;
878
879 void initialize_table(int table_size) {
880 _table_size = table_size;
881 _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
882 for (int index = 0; index < table_size; index++) {
883 _buckets[index].clear();
884 }
885 }
886
887 public:
888
889 int table_size() const { return _table_size; }
890
891 SymbolHashMap() { initialize_table(_Def_HashMap_Size); }
892 SymbolHashMap(int table_size) { initialize_table(table_size); }
893
894 // hash P(31) from Kernighan & Ritchie
895 static unsigned int compute_hash(const char* str, int len) {
896 unsigned int hash = 0;
897 while (len-- > 0) {
898 hash = 31*hash + (unsigned) *str;
899 str++;
900 }
901 return hash;
902 }
903
904 SymbolHashMapEntry* bucket(int i) {
905 return _buckets[i].entry();
906 }
907
908 void add_entry(Symbol* sym, u2 value);
909 SymbolHashMapEntry* find_entry(Symbol* sym);
910
911 u2 symbol_to_value(Symbol* sym) {
912 SymbolHashMapEntry *entry = find_entry(sym);
913 return (entry == NULL) ? 0 : entry->value();
914 }
915
916 ~SymbolHashMap() {
917 SymbolHashMapEntry* next;
918 for (int i = 0; i < _table_size; i++) {
919 for (SymbolHashMapEntry* cur = bucket(i); cur != NULL; cur = next) {
920 next = cur->next();
921 delete(cur);
922 }
923 }
924 delete _buckets;
925 }
926 }; // End SymbolHashMap class
927
928 #endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP