constantPool.hpp 36.7 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 ConstantPool : public Metadata {
D
duke 已提交
84 85
  friend class VMStructs;
  friend class BytecodeInterpreter;  // Directly extracts an oop in the pool for fast instanceof/checkcast
86
  friend class Universe;             // For null constructor
D
duke 已提交
87
 private:
88
  Array<u1>*           _tags;        // the tag array describing the constant pool's contents
89 90
  ConstantPoolCache*   _cache;       // the cache holding interpreter runtime information
  InstanceKlass*       _pool_holder; // the corresponding class
91 92 93 94 95 96 97
  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;

98
  int                  _flags;         // a few header bits to describe contents for GC
99
  int                  _length; // number of elements in the array
100 101 102 103 104 105

  bool                 _on_stack;     // Redefined method still executing refers to this constant pool.

  union {
    // set for CDS to restore resolved references
    int                _resolved_reference_length;
106 107
    // keeps version number for redefined classes (used in backtrace)
    int                _version;
108 109 110
  } _saved;

  Monitor*             _lock;
D
duke 已提交
111

112 113 114
  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 已提交
115

116
  void set_operands(Array<u2>* operands)       { _operands = operands; }
117

118
  enum FlagBit {
119
    FB_has_invokedynamic = 1,
120 121
    FB_has_pseudo_string = 2,
    FB_has_preresolution = 3
122 123 124 125 126 127 128 129
  };

  int flags() const                         { return _flags; }
  void set_flags(int f)                     { _flags = f; }
  bool flag_at(FlagBit fb) const            { return (_flags & (1 << (int)fb)) != 0; }
  void set_flag_at(FlagBit fb);
  // no clear_flag_at function; they only increase

D
duke 已提交
130
 private:
131
  intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
D
duke 已提交
132

133 134
  CPSlot slot_at(int which) {
    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 139 140 141 142
    return CPSlot(adr);
  }

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

D
duke 已提交
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
  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];
  }

171 172
  ConstantPool(Array<u1>* tags);
  ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
D
duke 已提交
173
 public:
174 175 176 177 178 179
  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 已提交
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 189 190 191 192 193 194
  // 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.
  bool on_stack() const                     { return _on_stack; }
  void set_on_stack(const bool value);

D
duke 已提交
195
  // Klass holding pool
196 197 198
  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 已提交
199 200

  // Interpreter runtime support
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 228 229 230 231 232 233 234 235 236 237
  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 已提交
238 239

  // Assembly code support
240 241 242 243 244
  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); }
  static int reference_map_offset_in_bytes() { return offset_of(ConstantPool, _reference_map); }
D
duke 已提交
245 246 247

  // Storing constants

248
  void klass_at_put(int which, Klass* k) {
249
    assert(k != NULL, "resolved class shouldn't be null");
250 251
    assert(is_within_bounds(which), "index out of bounds");
    OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
D
duke 已提交
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
D
duke 已提交
254 255 256 257 258 259 260 261 262 263 264
    // 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
265
  void unresolved_klass_at_put(int which, Symbol* s) {
D
duke 已提交
266
    release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
267
    slot_at_put(which, s);
D
duke 已提交
268 269
  }

270 271 272 273 274 275 276 277 278 279
  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;
  }

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 287
    release_tag_at_put(which, JVM_CONSTANT_String);
    *symbol_at_addr(which) = s;
D
duke 已提交
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
  }

  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));
  }

313 314 315 316 317 318 319
  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 已提交
320
    tag_at_put(which, JVM_CONSTANT_Utf8);
321
    *symbol_at_addr(which) = s;
D
duke 已提交
322 323
  }

324 325
  void string_at_put(int which, int obj_index, oop str) {
    resolved_references()->obj_at_put(obj_index, str);
D
duke 已提交
326 327
  }

328
  void set_object_tag_at(int which) {
329 330
    release_tag_at_put(which, JVM_CONSTANT_Object);
    }
331 332 333

  void object_at_put(int which, oop obj) {
    resolved_references()->obj_at_put(cp_to_object_index(which), obj);
334 335
  }

D
duke 已提交
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
  // 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

364
  constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
365

D
duke 已提交
366 367
  // Fetching constants

368
  Klass* klass_at(int which, TRAPS) {
D
duke 已提交
369 370 371 372
    constantPoolHandle h_this(THREAD, this);
    return klass_at_impl(h_this, which, CHECK_NULL);
  }

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

375
  Klass* resolved_klass_at(int which) {  // Used by Compiler
D
duke 已提交
376 377 378
    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.
379
    return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
D
duke 已提交
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();
D
duke 已提交
385 386 387 388 389 390
    // check that the klass is still unresolved.
    assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
    return s;
  }

  // RedefineClasses() API support:
391
  Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
D
duke 已提交
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415

  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);
  }

416
  Symbol* symbol_at(int which) {
D
duke 已提交
417
    assert(tag_at(which).is_utf8(), "Corrupted constant pool");
418
    return *symbol_at_addr(which);
D
duke 已提交
419 420
  }

421
  oop string_at(int which, int obj_index, TRAPS) {
D
duke 已提交
422
    constantPoolHandle h_this(THREAD, this);
423 424 425 426 427
    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 已提交
428 429
  }

430 431 432
  // Version that can be used before string oop array is created.
  oop uncached_string_at(int which, TRAPS);

433 434
  oop object_at(int which) {
    assert(tag_at(which).is_object(), "Corrupted constant pool");
435 436
    int obj_index = cp_to_object_index(which);
    return resolved_references()->obj_at(obj_index);
437 438
  }

439 440
  // A "pseudo-string" is an non-string oop that has found is way into
  // a String entry.
441
  // Under EnableInvokeDynamic this can happen if the user patches a live
442 443 444 445
  // 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.

446 447 448 449
  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;
  }
450

451
  oop pseudo_string_at(int which, int obj_index) {
452
    assert(tag_at(which).is_string(), "Corrupted constant pool");
453 454 455
    assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
    oop s = resolved_references()->obj_at(obj_index);
    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 462
    assert(tag_at(which).is_string(), "Corrupted constant pool");
    string_at_put(which, obj_index, x);    // this works just fine
463 464
  }

D
duke 已提交
465 466 467 468 469 470
  // 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.
471
    // we might want a volatile_obj_at in ObjArrayKlass.
472 473
    int obj_index = cp_to_object_index(which);
    return resolved_references()->obj_at(obj_index);
D
duke 已提交
474 475
  }

476 477 478
  Symbol* unresolved_string_at(int which) {
    assert(tag_at(which).is_string(), "Corrupted constant pool");
    Symbol* s = *symbol_at_addr(which);
D
duke 已提交
479 480 481 482 483
    return s;
  }

  // Returns an UTF8 for a CONSTANT_String entry at a given index.
  // UTF8 char* representation was chosen to avoid conversion of
484
  // java_lang_Strings at resolved entries into Symbol*s
D
duke 已提交
485
  // or vice versa.
486
  // Caller is responsible for checking for pseudo-strings.
D
duke 已提交
487 488 489 490 491 492 493
  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);
  }

494 495 496 497 498 499 500 501 502 503 504 505 506
  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:
507
  Symbol* method_handle_name_ref_at(int which) {
508 509 510
    int member = method_handle_index_at(which);
    return impl_name_ref_at(member, true);
  }
511
  Symbol* method_handle_signature_ref_at(int which) {
512 513 514 515 516 517 518
    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);
  }
519
  Symbol* method_type_signature_at(int which) {
520 521 522
    int sym = method_type_index_at(which);
    return symbol_at(sym);
  }
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 527 528 529 530 531 532 533 534 535 536 537
    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.
538
  static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
539 540 541 542
    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.
543 544
    DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
                                                       operands->at(1)));
545
    assert(second_part == 0 || n+2 <= second_part, "oob (2)");
546 547
    int offset = build_int_from_shorts(operands->at(n+0),
                                       operands->at(n+1));
548 549 550 551
    // 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;
  }
552
  static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
553 554
    int n = bootstrap_specifier_index * 2;
    assert(n >= 0 && n+2 <= operands->length(), "oob");
555 556
    operands->at_put(n+0, extract_low_short_from_int(offset));
    operands->at_put(n+1, extract_high_short_from_int(offset));
557
  }
558
  static int operand_array_length(Array<u2>* operands) {
559 560 561
    if (operands == NULL || operands->length() == 0)  return 0;
    int second_part = operand_offset_at(operands, 0);
    return (second_part / 2);
562
  }
563 564 565

#ifdef ASSERT
  // operand tuples fit together exactly, end to end
566
  static int operand_limit_at(Array<u2>* operands, int bootstrap_specifier_index) {
567 568 569 570 571 572 573 574 575
    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);
576
  }
577
#endif //ASSERT
578

579
  // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
580 581
  enum {
         _indy_bsm_offset  = 0,  // CONSTANT_MethodHandle bsm
582 583
         _indy_argc_offset = 1,  // u2 argc
         _indy_argv_offset = 2   // u2 argv[argc]
584
  };
585 586
  int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
    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 591
  }
  int invoke_dynamic_argument_count_at(int which) {
    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 595 596
    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");
597 598 599
    return argc;
  }
  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 612
  // The routine remap_instruction_operand_from_cache manages the adjustment
  // of these values back to constant pool indices.
613

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

616 617 618 619 620
  // 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 已提交
621
  // Lookup for entries consisting of (klass_index, name_and_type index)
622
  Klass* klass_ref_at(int which, TRAPS);
623 624 625
  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 已提交
626

627 628
  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 已提交
629 630

  // Lookup for entries consisting of (name_index, signature_index)
631 632
  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 已提交
633 634 635 636 637 638 639 640 641

  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);
  }

642 643 644 645
  // CDS support
  void remove_unshareable_info();
  void restore_unshareable_info(TRAPS);
  bool resolve_class_constants(TRAPS);
646 647 648 649 650
  // 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"); }
651

652 653 654 655
 private:
  enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
 public:

656 657 658
  // Resolve late bound constants.
  oop resolve_constant_at(int index, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
659
    return resolve_constant_at_impl(h_this, index, _no_index_sentinel, THREAD);
660 661 662 663
  }

  oop resolve_cached_constant_at(int cache_index, TRAPS) {
    constantPoolHandle h_this(THREAD, this);
664 665 666 667 668 669
    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);
670 671
  }

672 673 674 675 676
  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 已提交
677 678 679 680
  // Klass name matches name at offset
  bool klass_name_at_matches(instanceKlassHandle k, int which);

  // Sizing
681 682 683 684 685 686 687 688
  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();
  }

689 690 691
  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()); }
D
duke 已提交
692 693 694 695 696

  friend class ClassFileParser;
  friend class SystemDictionary;

  // Used by compiler to prevent classloading.
697 698 699 700 701 702 703
  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 已提交
704
  // Same as above - but does LinkResolving.
705
  static Klass*        klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int which, TRAPS);
D
duke 已提交
706 707

  // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
708
  // future by other Java code. These take constant pool indices rather than
D
duke 已提交
709
  // constant pool cache indices as do the peer methods above.
710 711 712
  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); }
713 714
  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 已提交
715 716 717 718 719 720 721

  // Sharing
  int pre_resolve_shared_klasses(TRAPS);

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

722 723
#ifdef ASSERT
  enum { CPCACHE_INDEX_TAG = 0x10000 };  // helps keep CP cache indices distinct from CP indices
724 725
#else
  enum { CPCACHE_INDEX_TAG = 0 };        // in product mode, this zero value is a no-op
726 727
#endif //ASSERT

728 729 730 731 732 733
  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;
  }
734

D
duke 已提交
735 736
 private:

737 738 739 740 741 742 743
  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);

744 745
  Symbol* impl_name_ref_at(int which, bool uncached);
  Symbol* impl_signature_ref_at(int which, bool uncached);
746 747 748
  int       impl_klass_ref_index_at(int which, bool uncached);
  int       impl_name_and_type_ref_index_at(int which, bool uncached);

749
  int remap_instruction_operand_from_cache(int operand);  // operand must be biased by CPCACHE_INDEX_TAG
D
duke 已提交
750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766

  // 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
767 768
  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 已提交
769 770 771 772

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

773
  static oop resolve_constant_at_impl(constantPoolHandle this_oop, int index, int cache_index, TRAPS);
774
  static void save_and_throw_exception(constantPoolHandle this_oop, int which, int tag_value, TRAPS);
775
  static oop resolve_bootstrap_specifier_at_impl(constantPoolHandle this_oop, int index, TRAPS);
776

D
duke 已提交
777
 public:
778
  // Merging ConstantPool* support:
D
duke 已提交
779
  bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS);
780 781 782 783 784 785
  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);
D
duke 已提交
786
  int  find_matching_entry(int pattern_i, constantPoolHandle search_cp, TRAPS);
787 788 789
  int  version() const                    { return _saved._version; }
  void set_version(int version)           { _saved._version = version; }
  void increment_and_save_version(int version) {
790
    _saved._version = version >= 0 ? (version + 1) : version;  // keep overflow
791
  }
792 793 794 795 796

  void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
  int  resolved_reference_length() const  { return _saved._resolved_reference_length; }
  void set_lock(Monitor* lock)            { _lock = lock; }
  Monitor* lock()                         { return _lock; }
D
duke 已提交
797

798 799 800
  // Decrease ref counts of symbols that are in the constant pool
  // when the holder class is unloaded
  void unreference_symbols();
D
duke 已提交
801

802 803 804 805
  // Deallocate constant pool for RedefineClasses
  void deallocate_contents(ClassLoaderData* loader_data);
  void release_C_heap_structures();

D
duke 已提交
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820
  // 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);
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836

 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 已提交
837 838
};

Z
zgu 已提交
839
class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
D
duke 已提交
840 841 842
 private:
  unsigned int        _hash;   // 32-bit hash for item
  SymbolHashMapEntry* _next;   // Next element in the linked list for this bucket
843
  Symbol*             _symbol; // 1-st part of the mapping: symbol => value
D
duke 已提交
844 845 846 847 848 849 850 851 852
  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;   }

853 854
  Symbol*    symbol() const               { return _symbol; }
  void       set_symbol(Symbol* sym)      { _symbol = sym;  }
D
duke 已提交
855 856 857 858

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

859
  SymbolHashMapEntry(unsigned int hash, Symbol* symbol, u2 value)
D
duke 已提交
860 861 862 863 864
    : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}

}; // End SymbolHashMapEntry class


Z
zgu 已提交
865
class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
D
duke 已提交
866 867 868 869 870 871 872 873 874 875 876 877

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 已提交
878
class SymbolHashMap: public CHeapObj<mtSymbol> {
D
duke 已提交
879 880 881 882 883 884 885 886 887 888 889 890

 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 已提交
891
    _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
D
duke 已提交
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
    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();
  }

918 919
  void add_entry(Symbol* sym, u2 value);
  SymbolHashMapEntry* find_entry(Symbol* sym);
D
duke 已提交
920

921
  u2 symbol_to_value(Symbol* sym) {
D
duke 已提交
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
    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
937 938

#endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP