constantPool.hpp 36.6 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 99 100 101 102 103
  enum {
    _has_invokedynamic = 1,           // Flags
    _has_pseudo_string = 2,
    _has_preresolution = 4,
    _on_stack          = 8
  };
104

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

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

  Monitor*             _lock;
D
duke 已提交
116

117 118 119
  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 已提交
120

121
  void set_operands(Array<u2>* operands)       { _operands = operands; }
122

123 124
  int flags() const                            { return _flags; }
  void set_flags(int f)                        { _flags = f; }
125

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

129 130
  CPSlot slot_at(int which) {
    assert(is_within_bounds(which), "index out of bounds");
131
    // Uses volatile because the klass slot changes without a lock.
132
    volatile intptr_t adr = (intptr_t)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which));
133
    assert(adr != 0 || which == 0, "cp entry for klass should not be zero");
134 135 136 137 138
    return CPSlot(adr);
  }

  void slot_at_put(int which, CPSlot s) const {
    assert(is_within_bounds(which), "index out of bounds");
139
    assert(s.value() != 0, "Caught something");
140 141
    *(intptr_t*)&base()[which] = s.value();
  }
142
  intptr_t* obj_at_addr_raw(int which) const {
143
    assert(is_within_bounds(which), "index out of bounds");
144
    return (intptr_t*) &base()[which];
145 146
  }

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

167 168
  ConstantPool(Array<u1>* tags);
  ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
D
duke 已提交
169
 public:
170 171 172 173 174 175
  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 已提交
176

177 178 179 180 181 182 183 184
  bool has_invokedynamic() const            { return (_flags & _has_invokedynamic) != 0; }
  void set_has_invokedynamic()              { _flags |= _has_invokedynamic; }

  bool has_pseudo_string() const            { return (_flags & _has_pseudo_string) != 0; }
  void set_has_pseudo_string()              { _flags |= _has_pseudo_string; }

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

186 187 188 189
  // 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.
190
  bool on_stack() const                      { return (_flags &_on_stack) != 0; }
191 192
  void set_on_stack(const bool value);

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

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

  // Assembly code support
238 239 240 241 242
  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 已提交
243 244 245

  // Storing constants

246
  void klass_at_put(int which, Klass* k) {
247
    assert(k != NULL, "resolved class shouldn't be null");
248 249
    assert(is_within_bounds(which), "index out of bounds");
    OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
D
duke 已提交
250
    // The interpreter assumes when the tag is stored, the klass is resolved
251
    // and the Klass* is a klass rather than a Symbol*, so we need
D
duke 已提交
252 253 254 255 256 257 258 259 260 261 262
    // 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
263
  void unresolved_klass_at_put(int which, Symbol* s) {
D
duke 已提交
264
    release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
265
    slot_at_put(which, s);
D
duke 已提交
266 267
  }

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

278
  void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) {
279
    tag_at_put(which, JVM_CONSTANT_InvokeDynamic);
280
    *int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index;
281
  }
282

283
  void unresolved_string_at_put(int which, Symbol* s) {
284 285
    release_tag_at_put(which, JVM_CONSTANT_String);
    *symbol_at_addr(which) = s;
D
duke 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
  }

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

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

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

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

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

D
duke 已提交
334 335 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
  // 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

362
  constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
363

D
duke 已提交
364 365
  // Fetching constants

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

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

373
  Klass* resolved_klass_at(int which) {  // Used by Compiler
D
duke 已提交
374 375 376
    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.
377
    return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
D
duke 已提交
378 379 380
  }

  // This method should only be used with a cpool lock or during parsing or gc
381
  Symbol* unresolved_klass_at(int which) {     // Temporary until actual use
382
    Symbol* s = CPSlot((Symbol*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_symbol();
D
duke 已提交
383 384 385 386 387 388
    // check that the klass is still unresolved.
    assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
    return s;
  }

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

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

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

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

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

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

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

444 445 446 447
  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;
  }
448

449
  oop pseudo_string_at(int which, int obj_index) {
450
    assert(tag_at(which).is_string(), "Corrupted constant pool");
451 452 453
    assert(unresolved_string_at(which) == NULL, "shouldn't have symbol");
    oop s = resolved_references()->obj_at(obj_index);
    return s;
454 455
  }

456
  void pseudo_string_at_put(int which, int obj_index, oop x) {
457
    assert(EnableInvokeDynamic, "");
458
    set_has_pseudo_string();        // mark header
459 460
    assert(tag_at(which).is_string(), "Corrupted constant pool");
    string_at_put(which, obj_index, x);    // this works just fine
461 462
  }

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

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

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

492 493 494 495 496 497 498 499 500 501 502 503 504
  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:
505
  Symbol* method_handle_name_ref_at(int which) {
506 507 508
    int member = method_handle_index_at(which);
    return impl_name_ref_at(member, true);
  }
509
  Symbol* method_handle_signature_ref_at(int which) {
510 511 512 513 514 515 516
    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);
  }
517
  Symbol* method_type_signature_at(int which) {
518 519 520
    int sym = method_type_index_at(which);
    return symbol_at(sym);
  }
521

522
  int invoke_dynamic_name_and_type_ref_index_at(int which) {
523
    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
524 525 526 527 528 529 530 531 532 533 534 535
    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.
536
  static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
537 538 539 540
    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.
541 542
    DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
                                                       operands->at(1)));
543
    assert(second_part == 0 || n+2 <= second_part, "oob (2)");
544 545
    int offset = build_int_from_shorts(operands->at(n+0),
                                       operands->at(n+1));
546 547 548 549
    // 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;
  }
550
  static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
551 552
    int n = bootstrap_specifier_index * 2;
    assert(n >= 0 && n+2 <= operands->length(), "oob");
553 554
    operands->at_put(n+0, extract_low_short_from_int(offset));
    operands->at_put(n+1, extract_high_short_from_int(offset));
555
  }
556
  static int operand_array_length(Array<u2>* operands) {
557 558 559
    if (operands == NULL || operands->length() == 0)  return 0;
    int second_part = operand_offset_at(operands, 0);
    return (second_part / 2);
560
  }
561 562 563

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

577
  // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
578 579
  enum {
         _indy_bsm_offset  = 0,  // CONSTANT_MethodHandle bsm
580 581
         _indy_argc_offset = 1,  // u2 argc
         _indy_argv_offset = 2   // u2 argv[argc]
582
  };
583 584
  int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
585
    int op_base = invoke_dynamic_operand_base(which);
586
    return operands()->at(op_base + _indy_bsm_offset);
587 588 589
  }
  int invoke_dynamic_argument_count_at(int which) {
    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
590
    int op_base = invoke_dynamic_operand_base(which);
591
    int argc = operands()->at(op_base + _indy_argc_offset);
592 593 594
    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");
595 596 597
    return argc;
  }
  int invoke_dynamic_argument_index_at(int which, int j) {
598
    int op_base = invoke_dynamic_operand_base(which);
599
    DEBUG_ONLY(int argc = operands()->at(op_base + _indy_argc_offset));
600
    assert((uint)j < (uint)argc, "oob");
601
    return operands()->at(op_base + _indy_argv_offset + j);
602
  }
603

604
  // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
605
  // name_and_type_ref_index_at) all expect to be passed indices obtained
606
  // directly from the bytecode.
607
  // If the indices are meant to refer to fields or methods, they are
608
  // actually rewritten constant pool cache indices.
609 610
  // The routine remap_instruction_operand_from_cache manages the adjustment
  // of these values back to constant pool indices.
611

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

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

625 626
  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 已提交
627 628

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

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

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

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

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

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

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

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

687 688 689
  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 已提交
690 691 692 693 694

  friend class ClassFileParser;
  friend class SystemDictionary;

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

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

  // Sharing
  int pre_resolve_shared_klasses(TRAPS);

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

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

726 727 728 729 730 731
  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;
  }
732

D
duke 已提交
733 734
 private:

735 736 737 738 739 740 741
  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);

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

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

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

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

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

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

  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 已提交
796

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

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

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

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

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

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

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

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

}; // End SymbolHashMapEntry class


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

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

 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 已提交
890
    _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
D
duke 已提交
891 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
    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();
  }

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

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

#endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP