constantPool.hpp 38.2 KB
Newer Older
D
duke 已提交
1
/*
2
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
19 20 21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
D
duke 已提交
22 23 24
 *
 */

25 26 27 28
#ifndef SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
#define SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP

#include "oops/arrayOop.hpp"
29 30
#include "oops/cpCache.hpp"
#include "oops/objArrayOop.hpp"
31
#include "oops/symbol.hpp"
32
#include "oops/typeArrayOop.hpp"
33
#include "runtime/handles.hpp"
34 35 36 37 38 39 40 41 42 43
#include "utilities/constantTag.hpp"
#ifdef TARGET_ARCH_x86
# include "bytes_x86.hpp"
#endif
#ifdef TARGET_ARCH_sparc
# include "bytes_sparc.hpp"
#endif
#ifdef TARGET_ARCH_zero
# include "bytes_zero.hpp"
#endif
44 45 46 47 48 49
#ifdef TARGET_ARCH_arm
# include "bytes_arm.hpp"
#endif
#ifdef TARGET_ARCH_ppc
# include "bytes_ppc.hpp"
#endif
50

D
duke 已提交
51 52 53 54
// A constantPool is an array containing class constants as described in the
// class file.
//
// Most of the constant pool entries are written during class parsing, which
55 56
// is safe.  For klass types, the constant pool entry is
// modified when the entry is resolved.  If a klass constant pool
D
duke 已提交
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*.
D
duke 已提交
59 60 61

class SymbolHashMap;

62 63 64 65
class CPSlot VALUE_OBJ_CLASS_SPEC {
  intptr_t _ptr;
 public:
  CPSlot(intptr_t ptr): _ptr(ptr) {}
66
  CPSlot(Klass* ptr): _ptr((intptr_t)ptr) {}
67 68 69
  CPSlot(Symbol* ptr): _ptr((intptr_t)ptr | 1) {}

  intptr_t value()   { return _ptr; }
70 71
  bool is_resolved()   { return (_ptr & 1) == 0; }
  bool is_unresolved() { return (_ptr & 1) == 1; }
72 73

  Symbol* get_symbol() {
74
    assert(is_unresolved(), "bad call");
75 76
    return (Symbol*)(_ptr & ~1);
  }
77 78 79 80
  Klass* get_klass() {
    assert(is_resolved(), "bad call");
    return (Klass*)_ptr;
  }
81 82
};

83
class KlassSizeStats;
84
class ConstantPool : public Metadata {
D
duke 已提交
85 86
  friend class VMStructs;
  friend class BytecodeInterpreter;  // Directly extracts an oop in the pool for fast instanceof/checkcast
87
  friend class Universe;             // For null constructor
D
duke 已提交
88
 private:
89
  Array<u1>*           _tags;        // the tag array describing the constant pool's contents
90 91
  ConstantPoolCache*   _cache;       // the cache holding interpreter runtime information
  InstanceKlass*       _pool_holder; // the corresponding class
92 93 94 95 96 97 98
  Array<u2>*           _operands;    // for variable-sized (InvokeDynamic) nodes, usually empty

  // Array of resolved objects from the constant pool and map from resolved
  // object index to original constant pool index
  jobject              _resolved_references;
  Array<u2>*           _reference_map;

99
  enum {
100 101
    _has_preresolution = 1,           // Flags
    _on_stack          = 2
102
  };
103

104 105
  int                  _flags;  // old fashioned bit twiddling
  int                  _length; // number of elements in the array
106 107 108 109

  union {
    // set for CDS to restore resolved references
    int                _resolved_reference_length;
110 111
    // keeps version number for redefined classes (used in backtrace)
    int                _version;
112 113
  } _saved;

D
duke 已提交
114

115 116 117
  void set_tags(Array<u1>* tags)               { _tags = tags; }
  void tag_at_put(int which, jbyte t)          { tags()->at_put(which, t); }
  void release_tag_at_put(int which, jbyte t)  { tags()->release_at_put(which, t); }
D
duke 已提交
118

119
  void set_operands(Array<u2>* operands)       { _operands = operands; }
120

121 122
  int flags() const                            { return _flags; }
  void set_flags(int f)                        { _flags = f; }
123

D
duke 已提交
124
 private:
125
  intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
D
duke 已提交
126

127 128
  CPSlot slot_at(int which) {
    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 133 134 135 136
    return CPSlot(adr);
  }

  void slot_at_put(int which, CPSlot s) const {
    assert(is_within_bounds(which), "index out of bounds");
137
    assert(s.value() != 0, "Caught something");
138 139
    *(intptr_t*)&base()[which] = s.value();
  }
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 144
  }

D
duke 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  jint* int_at_addr(int which) const {
    assert(is_within_bounds(which), "index out of bounds");
    return (jint*) &base()[which];
  }

  jlong* long_at_addr(int which) const {
    assert(is_within_bounds(which), "index out of bounds");
    return (jlong*) &base()[which];
  }

  jfloat* float_at_addr(int which) const {
    assert(is_within_bounds(which), "index out of bounds");
    return (jfloat*) &base()[which];
  }

  jdouble* double_at_addr(int which) const {
    assert(is_within_bounds(which), "index out of bounds");
    return (jdouble*) &base()[which];
  }

165 166
  ConstantPool(Array<u1>* tags);
  ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
D
duke 已提交
167
 public:
168 169 170 171 172 173
  static ConstantPool* allocate(ClassLoaderData* loader_data, int length, TRAPS);

  bool is_constantPool() const volatile     { return true; }

  Array<u1>* tags() const                   { return _tags; }
  Array<u2>* operands() const               { return _operands; }
D
duke 已提交
174

175 176
  bool has_preresolution() const            { return (_flags & _has_preresolution) != 0; }
  void set_has_preresolution()              { _flags |= _has_preresolution; }
177

178 179 180 181
  // Redefine classes support.  If a method refering to this constant pool
  // is on the executing stack, or as a handle in vm code, this constant pool
  // can't be removed from the set of previous versions saved in the instance
  // class.
182
  bool on_stack() const                      { return (_flags &_on_stack) != 0; }
183 184
  void set_on_stack(const bool value);

D
duke 已提交
185
  // Klass holding pool
186 187 188
  InstanceKlass* pool_holder() const      { return _pool_holder; }
  void set_pool_holder(InstanceKlass* k)  { _pool_holder = k; }
  InstanceKlass** pool_holder_addr()      { return &_pool_holder; }
D
duke 已提交
189 190

  // Interpreter runtime support
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
  ConstantPoolCache* cache() const        { return _cache; }
  void set_cache(ConstantPoolCache* cache){ _cache = cache; }

  // Create object cache in the constant pool
  void initialize_resolved_references(ClassLoaderData* loader_data,
                                      intStack reference_map,
                                      int constant_pool_map_length,
                                      TRAPS);

  // resolved strings, methodHandles and callsite objects from the constant pool
  objArrayOop resolved_references()  const;
  // mapping resolved object array indexes to cp indexes and back.
  int object_to_cp_index(int index)         { return _reference_map->at(index); }
  int cp_to_object_index(int index);

  // Invokedynamic indexes.
  // They must look completely different from normal indexes.
  // The main reason is that byte swapping is sometimes done on normal indexes.
  // Finally, it is helpful for debugging to tell the two apart.
  static bool is_invokedynamic_index(int i) { return (i < 0); }
  static int  decode_invokedynamic_index(int i) { assert(is_invokedynamic_index(i),  ""); return ~i; }
  static int  encode_invokedynamic_index(int i) { assert(!is_invokedynamic_index(i), ""); return ~i; }


  // The invokedynamic points at a CP cache entry.  This entry points back
  // at the original CP entry (CONSTANT_InvokeDynamic) and also (via f2) at an entry
  // in the resolved_references array (which provides the appendix argument).
  int invokedynamic_cp_cache_index(int index) const {
    assert (is_invokedynamic_index(index), "should be a invokedynamic index");
    int cache_index = decode_invokedynamic_index(index);
    return cache_index;
  }
  ConstantPoolCacheEntry* invokedynamic_cp_cache_entry_at(int index) const {
    // decode index that invokedynamic points to.
    int cp_cache_index = invokedynamic_cp_cache_index(index);
    return cache()->entry_at(cp_cache_index);
  }
D
duke 已提交
228 229

  // Assembly code support
230 231 232 233
  static int tags_offset_in_bytes()         { return offset_of(ConstantPool, _tags); }
  static int cache_offset_in_bytes()        { return offset_of(ConstantPool, _cache); }
  static int pool_holder_offset_in_bytes()  { return offset_of(ConstantPool, _pool_holder); }
  static int resolved_references_offset_in_bytes() { return offset_of(ConstantPool, _resolved_references); }
D
duke 已提交
234 235 236

  // Storing constants

237
  void klass_at_put(int which, Klass* k) {
238
    assert(k != NULL, "resolved class shouldn't be null");
239 240
    assert(is_within_bounds(which), "index out of bounds");
    OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
D
duke 已提交
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
D
duke 已提交
243 244 245 246 247 248 249 250 251 252 253
    // hardware store ordering here.
    release_tag_at_put(which, JVM_CONSTANT_Class);
  }

  // For temporary use while constructing constant pool
  void klass_index_at_put(int which, int name_index) {
    tag_at_put(which, JVM_CONSTANT_ClassIndex);
    *int_at_addr(which) = name_index;
  }

  // Temporary until actual use
254
  void unresolved_klass_at_put(int which, Symbol* s) {
D
duke 已提交
255
    release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
256
    slot_at_put(which, s);
D
duke 已提交
257 258
  }

259 260 261 262 263 264 265 266 267 268
  void method_handle_index_at_put(int which, int ref_kind, int ref_index) {
    tag_at_put(which, JVM_CONSTANT_MethodHandle);
    *int_at_addr(which) = ((jint) ref_index<<16) | ref_kind;
  }

  void method_type_index_at_put(int which, int ref_index) {
    tag_at_put(which, JVM_CONSTANT_MethodType);
    *int_at_addr(which) = ref_index;
  }

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
  }
273

274
  void unresolved_string_at_put(int which, Symbol* s) {
275 276
    release_tag_at_put(which, JVM_CONSTANT_String);
    *symbol_at_addr(which) = s;
D
duke 已提交
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
  }

  void int_at_put(int which, jint i) {
    tag_at_put(which, JVM_CONSTANT_Integer);
    *int_at_addr(which) = i;
  }

  void long_at_put(int which, jlong l) {
    tag_at_put(which, JVM_CONSTANT_Long);
    // *long_at_addr(which) = l;
    Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
  }

  void float_at_put(int which, jfloat f) {
    tag_at_put(which, JVM_CONSTANT_Float);
    *float_at_addr(which) = f;
  }

  void double_at_put(int which, jdouble d) {
    tag_at_put(which, JVM_CONSTANT_Double);
    // *double_at_addr(which) = d;
    // u8 temp = *(u8*) &d;
    Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
  }

302 303 304 305 306 307 308
  Symbol** symbol_at_addr(int which) const {
    assert(is_within_bounds(which), "index out of bounds");
    return (Symbol**) &base()[which];
  }

  void symbol_at_put(int which, Symbol* s) {
    assert(s->refcount() != 0, "should have nonzero refcount");
D
duke 已提交
309
    tag_at_put(which, JVM_CONSTANT_Utf8);
310
    *symbol_at_addr(which) = s;
D
duke 已提交
311 312
  }

313 314
  void string_at_put(int which, int obj_index, oop str) {
    resolved_references()->obj_at_put(obj_index, str);
D
duke 已提交
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
  }

  // For temporary use while constructing constant pool
  void string_index_at_put(int which, int string_index) {
    tag_at_put(which, JVM_CONSTANT_StringIndex);
    *int_at_addr(which) = string_index;
  }

  void field_at_put(int which, int class_index, int name_and_type_index) {
    tag_at_put(which, JVM_CONSTANT_Fieldref);
    *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
  }

  void method_at_put(int which, int class_index, int name_and_type_index) {
    tag_at_put(which, JVM_CONSTANT_Methodref);
    *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
  }

  void interface_method_at_put(int which, int class_index, int name_and_type_index) {
    tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
    *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;  // Not so nice
  }

  void name_and_type_at_put(int which, int name_index, int signature_index) {
    tag_at_put(which, JVM_CONSTANT_NameAndType);
    *int_at_addr(which) = ((jint) signature_index<<16) | name_index;  // Not so nice
  }

  // Tag query

345
  constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
346

D
duke 已提交
347 348
  // Fetching constants

349
  Klass* klass_at(int which, TRAPS) {
D
duke 已提交
350 351 352 353
    constantPoolHandle h_this(THREAD, this);
    return klass_at_impl(h_this, which, CHECK_NULL);
  }

354
  Symbol* klass_name_at(int which);  // Returns the name, w/o resolving.
D
duke 已提交
355

356
  Klass* resolved_klass_at(int which) const {  // Used by Compiler
D
duke 已提交
357 358 359
    guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
    // Must do an acquire here in case another thread resolved the klass
    // 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();
D
duke 已提交
361 362 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();
D
duke 已提交
366 367 368 369 370 371
    // check that the klass is still unresolved.
    assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
    return s;
  }

  // RedefineClasses() API support:
372
  Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
D
duke 已提交
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396

  jint int_at(int which) {
    assert(tag_at(which).is_int(), "Corrupted constant pool");
    return *int_at_addr(which);
  }

  jlong long_at(int which) {
    assert(tag_at(which).is_long(), "Corrupted constant pool");
    // return *long_at_addr(which);
    u8 tmp = Bytes::get_native_u8((address)&base()[which]);
    return *((jlong*)&tmp);
  }

  jfloat float_at(int which) {
    assert(tag_at(which).is_float(), "Corrupted constant pool");
    return *float_at_addr(which);
  }

  jdouble double_at(int which) {
    assert(tag_at(which).is_double(), "Corrupted constant pool");
    u8 tmp = Bytes::get_native_u8((address)&base()[which]);
    return *((jdouble*)&tmp);
  }

397
  Symbol* symbol_at(int which) {
D
duke 已提交
398
    assert(tag_at(which).is_utf8(), "Corrupted constant pool");
399
    return *symbol_at_addr(which);
D
duke 已提交
400 401
  }

402
  oop string_at(int which, int obj_index, TRAPS) {
D
duke 已提交
403
    constantPoolHandle h_this(THREAD, this);
404 405 406 407 408
    return string_at_impl(h_this, which, obj_index, THREAD);
  }
  oop string_at(int which, TRAPS) {
    int obj_index = cp_to_object_index(which);
    return string_at(which, obj_index, THREAD);
D
duke 已提交
409 410
  }

411 412 413
  // Version that can be used before string oop array is created.
  oop uncached_string_at(int which, TRAPS);

414 415
  // A "pseudo-string" is an non-string oop that has found is way into
  // a String entry.
416
  // Under EnableInvokeDynamic this can happen if the user patches a live
417 418 419 420
  // object into a CONSTANT_String entry of an anonymous class.
  // Method oops internally created for method handles may also
  // use pseudo-strings to link themselves to related metaobjects.

421 422 423 424
  bool is_pseudo_string_at(int which) {
    // A pseudo string is a string that doesn't have a symbol in the cpSlot
    return unresolved_string_at(which) == NULL;
  }
425

426
  oop pseudo_string_at(int which, int obj_index) {
427
    assert(tag_at(which).is_string(), "Corrupted constant pool");
428 429 430
    assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
    oop s = resolved_references()->obj_at(obj_index);
    return s;
431 432
  }

433 434 435 436 437 438 439 440
  oop pseudo_string_at(int which) {
    assert(tag_at(which).is_string(), "Corrupted constant pool");
    assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
    int obj_index = cp_to_object_index(which);
    oop s = resolved_references()->obj_at(obj_index);
    return s;
  }

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 447
  }

D
duke 已提交
448 449 450 451 452 453
  // only called when we are sure a string entry is already resolved (via an
  // earlier string_at call.
  oop resolved_string_at(int which) {
    assert(tag_at(which).is_string(), "Corrupted constant pool");
    // Must do an acquire here in case another thread resolved the klass
    // behind our back, lest we later load stale values thru the oop.
454
    // we might want a volatile_obj_at in ObjArrayKlass.
455 456
    int obj_index = cp_to_object_index(which);
    return resolved_references()->obj_at(obj_index);
D
duke 已提交
457 458
  }

459 460 461
  Symbol* unresolved_string_at(int which) {
    assert(tag_at(which).is_string(), "Corrupted constant pool");
    Symbol* s = *symbol_at_addr(which);
D
duke 已提交
462 463 464 465 466
    return s;
  }

  // Returns an UTF8 for a CONSTANT_String entry at a given index.
  // UTF8 char* representation was chosen to avoid conversion of
467
  // java_lang_Strings at resolved entries into Symbol*s
D
duke 已提交
468
  // or vice versa.
469
  // Caller is responsible for checking for pseudo-strings.
D
duke 已提交
470 471 472 473 474 475 476
  char* string_at_noresolve(int which);

  jint name_and_type_at(int which) {
    assert(tag_at(which).is_name_and_type(), "Corrupted constant pool");
    return *int_at_addr(which);
  }

477 478 479 480 481 482 483 484 485 486 487 488 489
  int method_handle_ref_kind_at(int which) {
    assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
    return extract_low_short_from_int(*int_at_addr(which));  // mask out unwanted ref_index bits
  }
  int method_handle_index_at(int which) {
    assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
    return extract_high_short_from_int(*int_at_addr(which));  // shift out unwanted ref_kind bits
  }
  int method_type_index_at(int which) {
    assert(tag_at(which).is_method_type(), "Corrupted constant pool");
    return *int_at_addr(which);
  }
  // Derived queries:
490
  Symbol* method_handle_name_ref_at(int which) {
491 492 493
    int member = method_handle_index_at(which);
    return impl_name_ref_at(member, true);
  }
494
  Symbol* method_handle_signature_ref_at(int which) {
495 496 497 498 499 500 501
    int member = method_handle_index_at(which);
    return impl_signature_ref_at(member, true);
  }
  int method_handle_klass_index_at(int which) {
    int member = method_handle_index_at(which);
    return impl_klass_ref_index_at(member, true);
  }
502
  Symbol* method_type_signature_at(int which) {
503 504 505
    int sym = method_type_index_at(which);
    return symbol_at(sym);
  }
506

507
  int invoke_dynamic_name_and_type_ref_index_at(int which) {
508
    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
509 510 511 512 513 514 515 516 517 518 519 520
    return extract_high_short_from_int(*int_at_addr(which));
  }
  int invoke_dynamic_bootstrap_specifier_index(int which) {
    assert(tag_at(which).value() == JVM_CONSTANT_InvokeDynamic, "Corrupted constant pool");
    return extract_low_short_from_int(*int_at_addr(which));
  }
  int invoke_dynamic_operand_base(int which) {
    int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
    return operand_offset_at(operands(), bootstrap_specifier_index);
  }
  // The first part of the operands array consists of an index into the second part.
  // Extract a 32-bit index value from the first part.
521
  static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
522 523 524 525
    int n = (bootstrap_specifier_index * 2);
    assert(n >= 0 && n+2 <= operands->length(), "oob");
    // The first 32-bit index points to the beginning of the second part
    // of the operands array.  Make sure this index is in the first part.
526 527
    DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
                                                       operands->at(1)));
528
    assert(second_part == 0 || n+2 <= second_part, "oob (2)");
529 530
    int offset = build_int_from_shorts(operands->at(n+0),
                                       operands->at(n+1));
531 532 533 534
    // The offset itself must point into the second part of the array.
    assert(offset == 0 || offset >= second_part && offset <= operands->length(), "oob (3)");
    return offset;
  }
535
  static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
536 537
    int n = bootstrap_specifier_index * 2;
    assert(n >= 0 && n+2 <= operands->length(), "oob");
538 539
    operands->at_put(n+0, extract_low_short_from_int(offset));
    operands->at_put(n+1, extract_high_short_from_int(offset));
540
  }
541
  static int operand_array_length(Array<u2>* operands) {
542 543 544
    if (operands == NULL || operands->length() == 0)  return 0;
    int second_part = operand_offset_at(operands, 0);
    return (second_part / 2);
545
  }
546 547 548

#ifdef ASSERT
  // operand tuples fit together exactly, end to end
549
  static int operand_limit_at(Array<u2>* operands, int bootstrap_specifier_index) {
550 551 552 553 554 555 556 557 558
    int nextidx = bootstrap_specifier_index + 1;
    if (nextidx == operand_array_length(operands))
      return operands->length();
    else
      return operand_offset_at(operands, nextidx);
  }
  int invoke_dynamic_operand_limit(int which) {
    int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
    return operand_limit_at(operands(), bootstrap_specifier_index);
559
  }
560
#endif //ASSERT
561

562
  // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
563 564
  enum {
         _indy_bsm_offset  = 0,  // CONSTANT_MethodHandle bsm
565 566
         _indy_argc_offset = 1,  // u2 argc
         _indy_argv_offset = 2   // u2 argv[argc]
567
  };
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608

  // These functions are used in RedefineClasses for CP merge

  int operand_offset_at(int bootstrap_specifier_index) {
    assert(0 <= bootstrap_specifier_index &&
           bootstrap_specifier_index < operand_array_length(operands()),
           "Corrupted CP operands");
    return operand_offset_at(operands(), bootstrap_specifier_index);
  }
  int operand_bootstrap_method_ref_index_at(int bootstrap_specifier_index) {
    int offset = operand_offset_at(bootstrap_specifier_index);
    return operands()->at(offset + _indy_bsm_offset);
  }
  int operand_argument_count_at(int bootstrap_specifier_index) {
    int offset = operand_offset_at(bootstrap_specifier_index);
    int argc = operands()->at(offset + _indy_argc_offset);
    return argc;
  }
  int operand_argument_index_at(int bootstrap_specifier_index, int j) {
    int offset = operand_offset_at(bootstrap_specifier_index);
    return operands()->at(offset + _indy_argv_offset + j);
  }
  int operand_next_offset_at(int bootstrap_specifier_index) {
    int offset = operand_offset_at(bootstrap_specifier_index) + _indy_argv_offset
                   + operand_argument_count_at(bootstrap_specifier_index);
    return offset;
  }
  // Compare a bootsrap specifier in the operands arrays
  bool compare_operand_to(int bootstrap_specifier_index1, constantPoolHandle cp2,
                          int bootstrap_specifier_index2, TRAPS);
  // Find a bootsrap specifier in the operands array
  int find_matching_operand(int bootstrap_specifier_index, constantPoolHandle search_cp,
                            int operands_cur_len, TRAPS);
  // Resize the operands array with delta_len and delta_size
  void resize_operands(int delta_len, int delta_size, TRAPS);
  // Extend the operands array with the length and size of the ext_cp operands
  void extend_operands(constantPoolHandle ext_cp, TRAPS);
  // Shrink the operands array to a smaller array with new_len length
  void shrink_operands(int new_len, TRAPS);


609 610
  int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
    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 615
  }
  int invoke_dynamic_argument_count_at(int which) {
    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 619 620
    DEBUG_ONLY(int end_offset = op_base + _indy_argv_offset + argc;
               int next_offset = invoke_dynamic_operand_limit(which));
    assert(end_offset == next_offset, "matched ending");
621 622 623
    return argc;
  }
  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
  }
629

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 636
  // The routine remap_instruction_operand_from_cache manages the adjustment
  // of these values back to constant pool indices.
637

638
  // There are also "uncached" versions which do not adjust the operand index; see below.
D
duke 已提交
639

640 641 642 643 644
  // FIXME: Consider renaming these with a prefix "cached_" to make the distinction clear.
  // In a few cases (the verifier) there are uses before a cpcache has been built,
  // which are handled by a dynamic check in remap_instruction_operand_from_cache.
  // FIXME: Remove the dynamic check, and adjust all callers to specify the correct mode.

D
duke 已提交
645
  // Lookup for entries consisting of (klass_index, name_and_type index)
646
  Klass* klass_ref_at(int which, TRAPS);
647 648 649
  Symbol* klass_ref_at_noresolve(int which);
  Symbol* name_ref_at(int which)                { return impl_name_ref_at(which, false); }
  Symbol* signature_ref_at(int which)           { return impl_signature_ref_at(which, false); }
D
duke 已提交
650

651 652
  int klass_ref_index_at(int which)               { return impl_klass_ref_index_at(which, false); }
  int name_and_type_ref_index_at(int which)       { return impl_name_and_type_ref_index_at(which, false); }
D
duke 已提交
653 654

  // Lookup for entries consisting of (name_index, signature_index)
655 656
  int name_ref_index_at(int which_nt);            // ==  low-order jshort of name_and_type_at(which_nt)
  int signature_ref_index_at(int which_nt);       // == high-order jshort of name_and_type_at(which_nt)
D
duke 已提交
657 658 659 660 661 662 663 664 665

  BasicType basic_type_for_signature_at(int which);

  // Resolve string constants (to prevent allocation during compilation)
  void resolve_string_constants(TRAPS) {
    constantPoolHandle h_this(THREAD, this);
    resolve_string_constants_impl(h_this, CHECK);
  }

666 667 668 669
  // CDS support
  void remove_unshareable_info();
  void restore_unshareable_info(TRAPS);
  bool resolve_class_constants(TRAPS);
670 671 672 673 674
  // The ConstantPool vtable is restored by this call when the ConstantPool is
  // in the shared archive.  See patch_klass_vtables() in metaspaceShared.cpp for
  // all the gory details.  SA, dtrace and pstack helpers distinguish metadata
  // by their vtable.
  void restore_vtable() { guarantee(is_constantPool(), "vtable restored by this call"); }
675

676 677 678 679
 private:
  enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
 public:

680 681 682
  // Resolve late bound constants.
  oop resolve_constant_at(int index, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
683
    return resolve_constant_at_impl(h_this, index, _no_index_sentinel, THREAD);
684 685 686 687
  }

  oop resolve_cached_constant_at(int cache_index, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
688 689 690 691 692 693
    return resolve_constant_at_impl(h_this, _no_index_sentinel, cache_index, THREAD);
  }

  oop resolve_possibly_cached_constant_at(int pool_index, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
    return resolve_constant_at_impl(h_this, pool_index, _possible_index_sentinel, THREAD);
694 695
  }

696 697 698 699 700
  oop resolve_bootstrap_specifier_at(int index, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
    return resolve_bootstrap_specifier_at_impl(h_this, index, THREAD);
  }

D
duke 已提交
701 702 703 704
  // Klass name matches name at offset
  bool klass_name_at_matches(instanceKlassHandle k, int which);

  // Sizing
705 706 707 708 709 710 711 712
  int length() const                   { return _length; }
  void set_length(int length)          { _length = length; }

  // Tells whether index is within bounds.
  bool is_within_bounds(int index) const {
    return 0 <= index && index < length();
  }

713
  // Sizing (in words)
714 715 716
  static int header_size()             { return sizeof(ConstantPool)/HeapWordSize; }
  static int size(int length)          { return align_object_size(header_size() + length); }
  int size() const                     { return size(length()); }
717 718 719
#if INCLUDE_SERVICES
  void collect_statistics(KlassSizeStats *sz) const;
#endif
D
duke 已提交
720 721 722 723 724

  friend class ClassFileParser;
  friend class SystemDictionary;

  // Used by compiler to prevent classloading.
725 726 727 728 729 730 731
  static Method*          method_at_if_loaded      (constantPoolHandle this_oop, int which);
  static bool       has_appendix_at_if_loaded      (constantPoolHandle this_oop, int which);
  static oop            appendix_at_if_loaded      (constantPoolHandle this_oop, int which);
  static bool    has_method_type_at_if_loaded      (constantPoolHandle this_oop, int which);
  static oop         method_type_at_if_loaded      (constantPoolHandle this_oop, int which);
  static Klass*            klass_at_if_loaded      (constantPoolHandle this_oop, int which);
  static Klass*        klass_ref_at_if_loaded      (constantPoolHandle this_oop, int which);
D
duke 已提交
732 733

  // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
734
  // future by other Java code. These take constant pool indices rather than
D
duke 已提交
735
  // constant pool cache indices as do the peer methods above.
736 737 738
  Symbol* uncached_klass_ref_at_noresolve(int which);
  Symbol* uncached_name_ref_at(int which)                 { return impl_name_ref_at(which, true); }
  Symbol* uncached_signature_ref_at(int which)            { return impl_signature_ref_at(which, true); }
739 740
  int       uncached_klass_ref_index_at(int which)          { return impl_klass_ref_index_at(which, true); }
  int       uncached_name_and_type_ref_index_at(int which)  { return impl_name_and_type_ref_index_at(which, true); }
D
duke 已提交
741 742 743 744 745 746 747

  // Sharing
  int pre_resolve_shared_klasses(TRAPS);

  // Debugging
  const char* printable_name_at(int which) PRODUCT_RETURN0;

748 749
#ifdef ASSERT
  enum { CPCACHE_INDEX_TAG = 0x10000 };  // helps keep CP cache indices distinct from CP indices
750 751
#else
  enum { CPCACHE_INDEX_TAG = 0 };        // in product mode, this zero value is a no-op
752 753
#endif //ASSERT

754 755 756 757 758 759
  static int decode_cpcache_index(int raw_index, bool invokedynamic_ok = false) {
    if (invokedynamic_ok && is_invokedynamic_index(raw_index))
      return decode_invokedynamic_index(raw_index);
    else
      return raw_index - CPCACHE_INDEX_TAG;
  }
760

D
duke 已提交
761 762
 private:

763 764 765 766 767 768 769
  void set_resolved_references(jobject s) { _resolved_references = s; }
  Array<u2>* reference_map() const        { return _reference_map; }
  void set_reference_map(Array<u2>* o)    { _reference_map = o; }

  // patch JSR 292 resolved references after the class is linked.
  void patch_resolved_references(GrowableArray<Handle>* cp_patches);

770 771
  Symbol* impl_name_ref_at(int which, bool uncached);
  Symbol* impl_signature_ref_at(int which, bool uncached);
772 773 774
  int       impl_klass_ref_index_at(int which, bool uncached);
  int       impl_name_and_type_ref_index_at(int which, bool uncached);

775
  int remap_instruction_operand_from_cache(int operand);  // operand must be biased by CPCACHE_INDEX_TAG
D
duke 已提交
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792

  // Used while constructing constant pool (only by ClassFileParser)
  jint klass_index_at(int which) {
    assert(tag_at(which).is_klass_index(), "Corrupted constant pool");
    return *int_at_addr(which);
  }

  jint string_index_at(int which) {
    assert(tag_at(which).is_string_index(), "Corrupted constant pool");
    return *int_at_addr(which);
  }

  // Performs the LinkResolver checks
  static void verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle klass, TRAPS);

  // Implementation of methods that needs an exposed 'this' pointer, in order to
  // handle GC while executing the method
793 794
  static Klass* klass_at_impl(constantPoolHandle this_oop, int which, TRAPS);
  static oop string_at_impl(constantPoolHandle this_oop, int which, int obj_index, TRAPS);
D
duke 已提交
795 796 797 798

  // Resolve string constants (to prevent allocation during compilation)
  static void resolve_string_constants_impl(constantPoolHandle this_oop, TRAPS);

799
  static oop resolve_constant_at_impl(constantPoolHandle this_oop, int index, int cache_index, TRAPS);
800
  static void save_and_throw_exception(constantPoolHandle this_oop, int which, int tag_value, TRAPS);
801
  static oop resolve_bootstrap_specifier_at_impl(constantPoolHandle this_oop, int index, TRAPS);
802

D
duke 已提交
803
 public:
804
  // Merging ConstantPool* support:
D
duke 已提交
805
  bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS);
806 807 808 809 810 811
  void copy_cp_to(int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
    copy_cp_to_impl(h_this, start_i, end_i, to_cp, to_i, THREAD);
  }
  static void copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS);
  static void copy_entry_to(constantPoolHandle from_cp, int from_i, constantPoolHandle to_cp, int to_i, TRAPS);
812
  static void copy_operands(constantPoolHandle from_cp, constantPoolHandle to_cp, TRAPS);
D
duke 已提交
813
  int  find_matching_entry(int pattern_i, constantPoolHandle search_cp, TRAPS);
814 815 816
  int  version() const                    { return _saved._version; }
  void set_version(int version)           { _saved._version = version; }
  void increment_and_save_version(int version) {
817
    _saved._version = version >= 0 ? (version + 1) : version;  // keep overflow
818
  }
819 820 821

  void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
  int  resolved_reference_length() const  { return _saved._resolved_reference_length; }
822 823 824 825 826 827 828 829 830 831 832

  // lock() may return null -- constant pool updates may happen before this lock is
  // initialized, because the _pool_holder has not been fully initialized and
  // has not been registered into the system dictionary. In this case, no other
  // thread can be modifying this constantpool, so no synchronization is
  // necessary.
  //
  // Use cplock() like this:
  //    oop cplock = cp->lock();
  //    ObjectLocker ol(cplock , THREAD, cplock != NULL);
  oop lock();
D
duke 已提交
833

834 835 836
  // Decrease ref counts of symbols that are in the constant pool
  // when the holder class is unloaded
  void unreference_symbols();
D
duke 已提交
837

838 839 840 841
  // Deallocate constant pool for RedefineClasses
  void deallocate_contents(ClassLoaderData* loader_data);
  void release_C_heap_structures();

D
duke 已提交
842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
  // JVMTI accesss - GetConstantPool, RetransformClasses, ...
  friend class JvmtiConstantPoolReconstituter;

 private:
  jint cpool_entry_size(jint idx);
  jint hash_entries_to(SymbolHashMap *symmap, SymbolHashMap *classmap);

  // Copy cpool bytes into byte array.
  // Returns:
  //  int > 0, count of the raw cpool bytes that have been copied
  //        0, OutOfMemory error
  //       -1, Internal error
  int  copy_cpool_bytes(int cpool_size,
                        SymbolHashMap* tbl,
                        unsigned char *bytes);
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872

 public:
  // Verify
  void verify_on(outputStream* st);

  // Printing
  void print_on(outputStream* st) const;
  void print_value_on(outputStream* st) const;
  void print_entry_on(int index, outputStream* st);

  const char* internal_name() const { return "{constant pool}"; }

#ifndef PRODUCT
  // Compile the world support
  static void preload_and_initialize_all_classes(ConstantPool* constant_pool, TRAPS);
#endif
D
duke 已提交
873 874
};

Z
zgu 已提交
875
class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
D
duke 已提交
876 877 878
 private:
  unsigned int        _hash;   // 32-bit hash for item
  SymbolHashMapEntry* _next;   // Next element in the linked list for this bucket
879
  Symbol*             _symbol; // 1-st part of the mapping: symbol => value
D
duke 已提交
880 881 882 883 884 885 886 887 888
  u2                  _value;  // 2-nd part of the mapping: symbol => value

 public:
  unsigned   int hash() const             { return _hash;   }
  void       set_hash(unsigned int hash)  { _hash = hash;   }

  SymbolHashMapEntry* next() const        { return _next;   }
  void set_next(SymbolHashMapEntry* next) { _next = next;   }

889 890
  Symbol*    symbol() const               { return _symbol; }
  void       set_symbol(Symbol* sym)      { _symbol = sym;  }
D
duke 已提交
891 892 893 894

  u2         value() const                {  return _value; }
  void       set_value(u2 value)          { _value = value; }

895
  SymbolHashMapEntry(unsigned int hash, Symbol* symbol, u2 value)
D
duke 已提交
896 897 898 899 900
    : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}

}; // End SymbolHashMapEntry class


Z
zgu 已提交
901
class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
D
duke 已提交
902 903 904 905 906 907 908 909 910 911 912 913

private:
  SymbolHashMapEntry*    _entry;

public:
  SymbolHashMapEntry* entry() const         {  return _entry; }
  void set_entry(SymbolHashMapEntry* entry) { _entry = entry; }
  void clear()                              { _entry = NULL;  }

}; // End SymbolHashMapBucket class


Z
zgu 已提交
914
class SymbolHashMap: public CHeapObj<mtSymbol> {
D
duke 已提交
915 916 917 918 919 920 921 922 923 924 925 926

 private:
  // Default number of entries in the table
  enum SymbolHashMap_Constants {
    _Def_HashMap_Size = 256
  };

  int                   _table_size;
  SymbolHashMapBucket*  _buckets;

  void initialize_table(int table_size) {
    _table_size = table_size;
Z
zgu 已提交
927
    _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
D
duke 已提交
928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
    for (int index = 0; index < table_size; index++) {
      _buckets[index].clear();
    }
  }

 public:

  int table_size() const        { return _table_size; }

  SymbolHashMap()               { initialize_table(_Def_HashMap_Size); }
  SymbolHashMap(int table_size) { initialize_table(table_size); }

  // hash P(31) from Kernighan & Ritchie
  static unsigned int compute_hash(const char* str, int len) {
    unsigned int hash = 0;
    while (len-- > 0) {
      hash = 31*hash + (unsigned) *str;
      str++;
    }
    return hash;
  }

  SymbolHashMapEntry* bucket(int i) {
    return _buckets[i].entry();
  }

954 955
  void add_entry(Symbol* sym, u2 value);
  SymbolHashMapEntry* find_entry(Symbol* sym);
D
duke 已提交
956

957
  u2 symbol_to_value(Symbol* sym) {
D
duke 已提交
958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
    SymbolHashMapEntry *entry = find_entry(sym);
    return (entry == NULL) ? 0 : entry->value();
  }

  ~SymbolHashMap() {
    SymbolHashMapEntry* next;
    for (int i = 0; i < _table_size; i++) {
      for (SymbolHashMapEntry* cur = bucket(i); cur != NULL; cur = next) {
        next = cur->next();
        delete(cur);
      }
    }
    delete _buckets;
  }
}; // End SymbolHashMap class
973 974

#endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP