src/share/vm/oops/constantPoolOop.cpp

Tue, 24 Jul 2012 10:51:00 -0700

author
twisti
date
Tue, 24 Jul 2012 10:51:00 -0700
changeset 3969
1d7922586cf6
parent 3489
f457154eee8b
permissions
-rw-r--r--

7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>

     1 /*
     2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "classfile/javaClasses.hpp"
    27 #include "classfile/symbolTable.hpp"
    28 #include "classfile/systemDictionary.hpp"
    29 #include "classfile/vmSymbols.hpp"
    30 #include "interpreter/linkResolver.hpp"
    31 #include "memory/oopFactory.hpp"
    32 #include "memory/universe.inline.hpp"
    33 #include "oops/constantPoolOop.hpp"
    34 #include "oops/instanceKlass.hpp"
    35 #include "oops/objArrayKlass.hpp"
    36 #include "oops/oop.inline.hpp"
    37 #include "runtime/fieldType.hpp"
    38 #include "runtime/init.hpp"
    39 #include "runtime/signature.hpp"
    40 #include "runtime/vframe.hpp"
    42 void constantPoolOopDesc::set_flag_at(FlagBit fb) {
    43   const int MAX_STATE_CHANGES = 2;
    44   for (int i = MAX_STATE_CHANGES + 10; i > 0; i--) {
    45     int oflags = _flags;
    46     int nflags = oflags | (1 << (int)fb);
    47     if (Atomic::cmpxchg(nflags, &_flags, oflags) == oflags)
    48       return;
    49   }
    50   assert(false, "failed to cmpxchg flags");
    51   _flags |= (1 << (int)fb);     // better than nothing
    52 }
    54 klassOop constantPoolOopDesc::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS) {
    55   // A resolved constantPool entry will contain a klassOop, otherwise a Symbol*.
    56   // It is not safe to rely on the tag bit's here, since we don't have a lock, and the entry and
    57   // tag is not updated atomicly.
    58   CPSlot entry = this_oop->slot_at(which);
    59   if (entry.is_oop()) {
    60     assert(entry.get_oop()->is_klass(), "must be");
    61     // Already resolved - return entry.
    62     return (klassOop)entry.get_oop();
    63   }
    65   // Acquire lock on constant oop while doing update. After we get the lock, we check if another object
    66   // already has updated the object
    67   assert(THREAD->is_Java_thread(), "must be a Java thread");
    68   bool do_resolve = false;
    69   bool in_error = false;
    71   Symbol* name = NULL;
    72   Handle       loader;
    73   { ObjectLocker ol(this_oop, THREAD);
    75     if (this_oop->tag_at(which).is_unresolved_klass()) {
    76       if (this_oop->tag_at(which).is_unresolved_klass_in_error()) {
    77         in_error = true;
    78       } else {
    79         do_resolve = true;
    80         name   = this_oop->unresolved_klass_at(which);
    81         loader = Handle(THREAD, instanceKlass::cast(this_oop->pool_holder())->class_loader());
    82       }
    83     }
    84   } // unlocking constantPool
    87   // The original attempt to resolve this constant pool entry failed so find the
    88   // original error and throw it again (JVMS 5.4.3).
    89   if (in_error) {
    90     Symbol* error = SystemDictionary::find_resolution_error(this_oop, which);
    91     guarantee(error != (Symbol*)NULL, "tag mismatch with resolution error table");
    92     ResourceMark rm;
    93     // exception text will be the class name
    94     const char* className = this_oop->unresolved_klass_at(which)->as_C_string();
    95     THROW_MSG_0(error, className);
    96   }
    98   if (do_resolve) {
    99     // this_oop must be unlocked during resolve_or_fail
   100     oop protection_domain = Klass::cast(this_oop->pool_holder())->protection_domain();
   101     Handle h_prot (THREAD, protection_domain);
   102     klassOop k_oop = SystemDictionary::resolve_or_fail(name, loader, h_prot, true, THREAD);
   103     KlassHandle k;
   104     if (!HAS_PENDING_EXCEPTION) {
   105       k = KlassHandle(THREAD, k_oop);
   106       // Do access check for klasses
   107       verify_constant_pool_resolve(this_oop, k, THREAD);
   108     }
   110     // Failed to resolve class. We must record the errors so that subsequent attempts
   111     // to resolve this constant pool entry fail with the same error (JVMS 5.4.3).
   112     if (HAS_PENDING_EXCEPTION) {
   113       ResourceMark rm;
   114       Symbol* error = PENDING_EXCEPTION->klass()->klass_part()->name();
   116       bool throw_orig_error = false;
   117       {
   118         ObjectLocker ol (this_oop, THREAD);
   120         // some other thread has beaten us and has resolved the class.
   121         if (this_oop->tag_at(which).is_klass()) {
   122           CLEAR_PENDING_EXCEPTION;
   123           entry = this_oop->resolved_klass_at(which);
   124           return (klassOop)entry.get_oop();
   125         }
   127         if (!PENDING_EXCEPTION->
   128               is_a(SystemDictionary::LinkageError_klass())) {
   129           // Just throw the exception and don't prevent these classes from
   130           // being loaded due to virtual machine errors like StackOverflow
   131           // and OutOfMemoryError, etc, or if the thread was hit by stop()
   132           // Needs clarification to section 5.4.3 of the VM spec (see 6308271)
   133         }
   134         else if (!this_oop->tag_at(which).is_unresolved_klass_in_error()) {
   135           SystemDictionary::add_resolution_error(this_oop, which, error);
   136           this_oop->tag_at_put(which, JVM_CONSTANT_UnresolvedClassInError);
   137         } else {
   138           // some other thread has put the class in error state.
   139           error = SystemDictionary::find_resolution_error(this_oop, which);
   140           assert(error != NULL, "checking");
   141           throw_orig_error = true;
   142         }
   143       } // unlocked
   145       if (throw_orig_error) {
   146         CLEAR_PENDING_EXCEPTION;
   147         ResourceMark rm;
   148         const char* className = this_oop->unresolved_klass_at(which)->as_C_string();
   149         THROW_MSG_0(error, className);
   150       }
   152       return 0;
   153     }
   155     if (TraceClassResolution && !k()->klass_part()->oop_is_array()) {
   156       // skip resolving the constant pool so that this code get's
   157       // called the next time some bytecodes refer to this class.
   158       ResourceMark rm;
   159       int line_number = -1;
   160       const char * source_file = NULL;
   161       if (JavaThread::current()->has_last_Java_frame()) {
   162         // try to identify the method which called this function.
   163         vframeStream vfst(JavaThread::current());
   164         if (!vfst.at_end()) {
   165           line_number = vfst.method()->line_number_from_bci(vfst.bci());
   166           Symbol* s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name();
   167           if (s != NULL) {
   168             source_file = s->as_C_string();
   169           }
   170         }
   171       }
   172       if (k() != this_oop->pool_holder()) {
   173         // only print something if the classes are different
   174         if (source_file != NULL) {
   175           tty->print("RESOLVE %s %s %s:%d\n",
   176                      instanceKlass::cast(this_oop->pool_holder())->external_name(),
   177                      instanceKlass::cast(k())->external_name(), source_file, line_number);
   178         } else {
   179           tty->print("RESOLVE %s %s\n",
   180                      instanceKlass::cast(this_oop->pool_holder())->external_name(),
   181                      instanceKlass::cast(k())->external_name());
   182         }
   183       }
   184       return k();
   185     } else {
   186       ObjectLocker ol (this_oop, THREAD);
   187       // Only updated constant pool - if it is resolved.
   188       do_resolve = this_oop->tag_at(which).is_unresolved_klass();
   189       if (do_resolve) {
   190         this_oop->klass_at_put(which, k());
   191       }
   192     }
   193   }
   195   entry = this_oop->resolved_klass_at(which);
   196   assert(entry.is_oop() && entry.get_oop()->is_klass(), "must be resolved at this point");
   197   return (klassOop)entry.get_oop();
   198 }
   201 // Does not update constantPoolOop - to avoid any exception throwing. Used
   202 // by compiler and exception handling.  Also used to avoid classloads for
   203 // instanceof operations. Returns NULL if the class has not been loaded or
   204 // if the verification of constant pool failed
   205 klassOop constantPoolOopDesc::klass_at_if_loaded(constantPoolHandle this_oop, int which) {
   206   CPSlot entry = this_oop->slot_at(which);
   207   if (entry.is_oop()) {
   208     assert(entry.get_oop()->is_klass(), "must be");
   209     return (klassOop)entry.get_oop();
   210   } else {
   211     assert(entry.is_metadata(), "must be either symbol or klass");
   212     Thread *thread = Thread::current();
   213     Symbol* name = entry.get_symbol();
   214     oop loader = instanceKlass::cast(this_oop->pool_holder())->class_loader();
   215     oop protection_domain = Klass::cast(this_oop->pool_holder())->protection_domain();
   216     Handle h_prot (thread, protection_domain);
   217     Handle h_loader (thread, loader);
   218     klassOop k = SystemDictionary::find(name, h_loader, h_prot, thread);
   220     if (k != NULL) {
   221       // Make sure that resolving is legal
   222       EXCEPTION_MARK;
   223       KlassHandle klass(THREAD, k);
   224       // return NULL if verification fails
   225       verify_constant_pool_resolve(this_oop, klass, THREAD);
   226       if (HAS_PENDING_EXCEPTION) {
   227         CLEAR_PENDING_EXCEPTION;
   228         return NULL;
   229       }
   230       return klass();
   231     } else {
   232       return k;
   233     }
   234   }
   235 }
   238 klassOop constantPoolOopDesc::klass_ref_at_if_loaded(constantPoolHandle this_oop, int which) {
   239   return klass_at_if_loaded(this_oop, this_oop->klass_ref_index_at(which));
   240 }
   243 // This is an interface for the compiler that allows accessing non-resolved entries
   244 // in the constant pool - but still performs the validations tests. Must be used
   245 // in a pre-parse of the compiler - to determine what it can do and not do.
   246 // Note: We cannot update the ConstantPool from the vm_thread.
   247 klassOop constantPoolOopDesc::klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int index, TRAPS) {
   248   int which = this_oop->klass_ref_index_at(index);
   249   CPSlot entry = this_oop->slot_at(which);
   250   if (entry.is_oop()) {
   251     assert(entry.get_oop()->is_klass(), "must be");
   252     return (klassOop)entry.get_oop();
   253   } else {
   254     assert(entry.is_metadata(), "must be either symbol or klass");
   255     Symbol*  name  = entry.get_symbol();
   256     oop loader = instanceKlass::cast(this_oop->pool_holder())->class_loader();
   257     oop protection_domain = Klass::cast(this_oop->pool_holder())->protection_domain();
   258     Handle h_loader(THREAD, loader);
   259     Handle h_prot  (THREAD, protection_domain);
   260     KlassHandle k(THREAD, SystemDictionary::find(name, h_loader, h_prot, THREAD));
   262     // Do access check for klasses
   263     if( k.not_null() ) verify_constant_pool_resolve(this_oop, k, CHECK_NULL);
   264     return k();
   265   }
   266 }
   269 methodOop constantPoolOopDesc::method_at_if_loaded(constantPoolHandle cpool,
   270                                                    int which) {
   271   assert(!constantPoolCacheOopDesc::is_secondary_index(which), "no indy instruction here");
   272   if (cpool->cache() == NULL)  return NULL;  // nothing to load yet
   273   int cache_index = get_cpcache_index(which);
   274   if (!(cache_index >= 0 && cache_index < cpool->cache()->length())) {
   275     if (PrintMiscellaneous && (Verbose||WizardMode)) {
   276       tty->print_cr("bad operand %d in:", which); cpool->print();
   277     }
   278     return NULL;
   279   }
   280   ConstantPoolCacheEntry* e = cpool->cache()->entry_at(cache_index);
   281   return e->method_if_resolved(cpool);
   282 }
   285 bool constantPoolOopDesc::has_appendix_at_if_loaded(constantPoolHandle cpool, int which) {
   286   if (cpool->cache() == NULL)  return false;  // nothing to load yet
   287   // XXX Is there a simpler way to get to the secondary entry?
   288   ConstantPoolCacheEntry* e;
   289   if (constantPoolCacheOopDesc::is_secondary_index(which)) {
   290     e = cpool->cache()->secondary_entry_at(which);
   291   } else {
   292     int cache_index = get_cpcache_index(which);
   293     if (!(cache_index >= 0 && cache_index < cpool->cache()->length())) {
   294       if (PrintMiscellaneous && (Verbose||WizardMode)) {
   295         tty->print_cr("bad operand %d in:", which); cpool->print();
   296       }
   297       return false;
   298     }
   299     e = cpool->cache()->entry_at(cache_index);
   300   }
   301   return e->has_appendix();
   302 }
   305 oop constantPoolOopDesc::appendix_at_if_loaded(constantPoolHandle cpool, int which) {
   306   if (cpool->cache() == NULL)  return NULL;  // nothing to load yet
   307   // XXX Is there a simpler way to get to the secondary entry?
   308   ConstantPoolCacheEntry* e;
   309   if (constantPoolCacheOopDesc::is_secondary_index(which)) {
   310     e = cpool->cache()->secondary_entry_at(which);
   311   } else {
   312     int cache_index = get_cpcache_index(which);
   313     if (!(cache_index >= 0 && cache_index < cpool->cache()->length())) {
   314       if (PrintMiscellaneous && (Verbose||WizardMode)) {
   315         tty->print_cr("bad operand %d in:", which); cpool->print();
   316       }
   317       return NULL;
   318     }
   319     e = cpool->cache()->entry_at(cache_index);
   320   }
   321   if (!e->has_appendix()) {
   322     return NULL;
   323   }
   324   return e->f1_as_instance();
   325 }
   328 Symbol* constantPoolOopDesc::impl_name_ref_at(int which, bool uncached) {
   329   int name_index = name_ref_index_at(impl_name_and_type_ref_index_at(which, uncached));
   330   return symbol_at(name_index);
   331 }
   334 Symbol* constantPoolOopDesc::impl_signature_ref_at(int which, bool uncached) {
   335   int signature_index = signature_ref_index_at(impl_name_and_type_ref_index_at(which, uncached));
   336   return symbol_at(signature_index);
   337 }
   340 int constantPoolOopDesc::impl_name_and_type_ref_index_at(int which, bool uncached) {
   341   int i = which;
   342   if (!uncached && cache() != NULL) {
   343     if (constantPoolCacheOopDesc::is_secondary_index(which)) {
   344       // Invokedynamic index.
   345       int pool_index = cache()->main_entry_at(which)->constant_pool_index();
   346       pool_index = invoke_dynamic_name_and_type_ref_index_at(pool_index);
   347       assert(tag_at(pool_index).is_name_and_type(), "");
   348       return pool_index;
   349     }
   350     // change byte-ordering and go via cache
   351     i = remap_instruction_operand_from_cache(which);
   352   } else {
   353     if (tag_at(which).is_invoke_dynamic()) {
   354       int pool_index = invoke_dynamic_name_and_type_ref_index_at(which);
   355       assert(tag_at(pool_index).is_name_and_type(), "");
   356       return pool_index;
   357     }
   358   }
   359   assert(tag_at(i).is_field_or_method(), "Corrupted constant pool");
   360   assert(!tag_at(i).is_invoke_dynamic(), "Must be handled above");
   361   jint ref_index = *int_at_addr(i);
   362   return extract_high_short_from_int(ref_index);
   363 }
   366 int constantPoolOopDesc::impl_klass_ref_index_at(int which, bool uncached) {
   367   guarantee(!constantPoolCacheOopDesc::is_secondary_index(which),
   368             "an invokedynamic instruction does not have a klass");
   369   int i = which;
   370   if (!uncached && cache() != NULL) {
   371     // change byte-ordering and go via cache
   372     i = remap_instruction_operand_from_cache(which);
   373   }
   374   assert(tag_at(i).is_field_or_method(), "Corrupted constant pool");
   375   jint ref_index = *int_at_addr(i);
   376   return extract_low_short_from_int(ref_index);
   377 }
   381 int constantPoolOopDesc::remap_instruction_operand_from_cache(int operand) {
   382   int cpc_index = operand;
   383   DEBUG_ONLY(cpc_index -= CPCACHE_INDEX_TAG);
   384   assert((int)(u2)cpc_index == cpc_index, "clean u2");
   385   int member_index = cache()->entry_at(cpc_index)->constant_pool_index();
   386   return member_index;
   387 }
   390 void constantPoolOopDesc::verify_constant_pool_resolve(constantPoolHandle this_oop, KlassHandle k, TRAPS) {
   391  if (k->oop_is_instance() || k->oop_is_objArray()) {
   392     instanceKlassHandle holder (THREAD, this_oop->pool_holder());
   393     klassOop elem_oop = k->oop_is_instance() ? k() : objArrayKlass::cast(k())->bottom_klass();
   394     KlassHandle element (THREAD, elem_oop);
   396     // The element type could be a typeArray - we only need the access check if it is
   397     // an reference to another class
   398     if (element->oop_is_instance()) {
   399       LinkResolver::check_klass_accessability(holder, element, CHECK);
   400     }
   401   }
   402 }
   405 int constantPoolOopDesc::name_ref_index_at(int which_nt) {
   406   jint ref_index = name_and_type_at(which_nt);
   407   return extract_low_short_from_int(ref_index);
   408 }
   411 int constantPoolOopDesc::signature_ref_index_at(int which_nt) {
   412   jint ref_index = name_and_type_at(which_nt);
   413   return extract_high_short_from_int(ref_index);
   414 }
   417 klassOop constantPoolOopDesc::klass_ref_at(int which, TRAPS) {
   418   return klass_at(klass_ref_index_at(which), CHECK_NULL);
   419 }
   422 Symbol* constantPoolOopDesc::klass_name_at(int which) {
   423   assert(tag_at(which).is_unresolved_klass() || tag_at(which).is_klass(),
   424          "Corrupted constant pool");
   425   // A resolved constantPool entry will contain a klassOop, otherwise a Symbol*.
   426   // It is not safe to rely on the tag bit's here, since we don't have a lock, and the entry and
   427   // tag is not updated atomicly.
   428   CPSlot entry = slot_at(which);
   429   if (entry.is_oop()) {
   430     // Already resolved - return entry's name.
   431     assert(entry.get_oop()->is_klass(), "must be");
   432     return klassOop(entry.get_oop())->klass_part()->name();
   433   } else {
   434     assert(entry.is_metadata(), "must be either symbol or klass");
   435     return entry.get_symbol();
   436   }
   437 }
   439 Symbol* constantPoolOopDesc::klass_ref_at_noresolve(int which) {
   440   jint ref_index = klass_ref_index_at(which);
   441   return klass_at_noresolve(ref_index);
   442 }
   444 Symbol* constantPoolOopDesc::uncached_klass_ref_at_noresolve(int which) {
   445   jint ref_index = uncached_klass_ref_index_at(which);
   446   return klass_at_noresolve(ref_index);
   447 }
   449 char* constantPoolOopDesc::string_at_noresolve(int which) {
   450   // Test entry type in case string is resolved while in here.
   451   CPSlot entry = slot_at(which);
   452   if (entry.is_metadata()) {
   453     return (entry.get_symbol())->as_C_string();
   454   } else if (java_lang_String::is_instance(entry.get_oop())) {
   455     return java_lang_String::as_utf8_string(entry.get_oop());
   456   } else {
   457     return (char*)"<pseudo-string>";
   458   }
   459 }
   462 BasicType constantPoolOopDesc::basic_type_for_signature_at(int which) {
   463   return FieldType::basic_type(symbol_at(which));
   464 }
   467 void constantPoolOopDesc::resolve_string_constants_impl(constantPoolHandle this_oop, TRAPS) {
   468   for (int index = 1; index < this_oop->length(); index++) { // Index 0 is unused
   469     if (this_oop->tag_at(index).is_unresolved_string()) {
   470       this_oop->string_at(index, CHECK);
   471     }
   472   }
   473 }
   475 // A resolved constant value in the CP cache is represented as a non-null
   476 // value.  As a special case, this value can be a 'systemObjArray'
   477 // which masks an exception object to throw.
   478 // This allows a MethodHandle constant reference to throw a consistent
   479 // exception every time, if it fails to resolve.
   480 static oop decode_exception_from_f1(oop result_oop, TRAPS) {
   481   if (result_oop->klass() != Universe::systemObjArrayKlassObj())
   482     return result_oop;
   484   // Special cases here:  Masked null, saved exception.
   485   objArrayOop sys_array = (objArrayOop) result_oop;
   486   assert(sys_array->length() == 1, "bad system array");
   487   if (sys_array->length() == 1) {
   488     THROW_OOP_(sys_array->obj_at(0), NULL);
   489   }
   490   return NULL;
   491 }
   493 oop constantPoolOopDesc::resolve_constant_at_impl(constantPoolHandle this_oop, int index, int cache_index, TRAPS) {
   494   oop result_oop = NULL;
   495   Handle throw_exception;
   497   if (cache_index == _possible_index_sentinel) {
   498     // It is possible that this constant is one which is cached in the CP cache.
   499     // We'll do a linear search.  This should be OK because this usage is rare.
   500     assert(index > 0, "valid index");
   501     constantPoolCacheOop cache = this_oop()->cache();
   502     for (int i = 0, len = cache->length(); i < len; i++) {
   503       ConstantPoolCacheEntry* cpc_entry = cache->entry_at(i);
   504       if (!cpc_entry->is_secondary_entry() && cpc_entry->constant_pool_index() == index) {
   505         // Switch the query to use this CPC entry.
   506         cache_index = i;
   507         index = _no_index_sentinel;
   508         break;
   509       }
   510     }
   511     if (cache_index == _possible_index_sentinel)
   512       cache_index = _no_index_sentinel;  // not found
   513   }
   514   assert(cache_index == _no_index_sentinel || cache_index >= 0, "");
   515   assert(index == _no_index_sentinel || index >= 0, "");
   517   if (cache_index >= 0) {
   518     assert(index == _no_index_sentinel, "only one kind of index at a time");
   519     ConstantPoolCacheEntry* cpc_entry = this_oop->cache()->entry_at(cache_index);
   520     result_oop = cpc_entry->f1_as_instance();
   521     if (result_oop != NULL) {
   522       return decode_exception_from_f1(result_oop, THREAD);
   523       // That was easy...
   524     }
   525     index = cpc_entry->constant_pool_index();
   526   }
   528   jvalue prim_value;  // temp used only in a few cases below
   530   int tag_value = this_oop->tag_at(index).value();
   531   switch (tag_value) {
   533   case JVM_CONSTANT_UnresolvedClass:
   534   case JVM_CONSTANT_UnresolvedClassInError:
   535   case JVM_CONSTANT_Class:
   536     {
   537       klassOop resolved = klass_at_impl(this_oop, index, CHECK_NULL);
   538       // ldc wants the java mirror.
   539       result_oop = resolved->java_mirror();
   540       break;
   541     }
   543   case JVM_CONSTANT_String:
   544   case JVM_CONSTANT_UnresolvedString:
   545     if (this_oop->is_pseudo_string_at(index)) {
   546       result_oop = this_oop->pseudo_string_at(index);
   547       break;
   548     }
   549     result_oop = string_at_impl(this_oop, index, CHECK_NULL);
   550     break;
   552   case JVM_CONSTANT_Object:
   553     result_oop = this_oop->object_at(index);
   554     break;
   556   case JVM_CONSTANT_MethodHandle:
   557     {
   558       int ref_kind                 = this_oop->method_handle_ref_kind_at(index);
   559       int callee_index             = this_oop->method_handle_klass_index_at(index);
   560       Symbol*  name =      this_oop->method_handle_name_ref_at(index);
   561       Symbol*  signature = this_oop->method_handle_signature_ref_at(index);
   562       if (PrintMiscellaneous)
   563         tty->print_cr("resolve JVM_CONSTANT_MethodHandle:%d [%d/%d/%d] %s.%s",
   564                       ref_kind, index, this_oop->method_handle_index_at(index),
   565                       callee_index, name->as_C_string(), signature->as_C_string());
   566       KlassHandle callee;
   567       { klassOop k = klass_at_impl(this_oop, callee_index, CHECK_NULL);
   568         callee = KlassHandle(THREAD, k);
   569       }
   570       KlassHandle klass(THREAD, this_oop->pool_holder());
   571       Handle value = SystemDictionary::link_method_handle_constant(klass, ref_kind,
   572                                                                    callee, name, signature,
   573                                                                    THREAD);
   574       if (HAS_PENDING_EXCEPTION) {
   575         throw_exception = Handle(THREAD, PENDING_EXCEPTION);
   576         CLEAR_PENDING_EXCEPTION;
   577         break;
   578       }
   579       result_oop = value();
   580       assert(result_oop != NULL, "");
   581       break;
   582     }
   584   case JVM_CONSTANT_MethodType:
   585     {
   586       Symbol*  signature = this_oop->method_type_signature_at(index);
   587       if (PrintMiscellaneous)
   588         tty->print_cr("resolve JVM_CONSTANT_MethodType [%d/%d] %s",
   589                       index, this_oop->method_type_index_at(index),
   590                       signature->as_C_string());
   591       KlassHandle klass(THREAD, this_oop->pool_holder());
   592       Handle value = SystemDictionary::find_method_handle_type(signature, klass, THREAD);
   593       if (HAS_PENDING_EXCEPTION) {
   594         throw_exception = Handle(THREAD, PENDING_EXCEPTION);
   595         CLEAR_PENDING_EXCEPTION;
   596         break;
   597       }
   598       result_oop = value();
   599       assert(result_oop != NULL, "");
   600       break;
   601     }
   603   case JVM_CONSTANT_Integer:
   604     prim_value.i = this_oop->int_at(index);
   605     result_oop = java_lang_boxing_object::create(T_INT, &prim_value, CHECK_NULL);
   606     break;
   608   case JVM_CONSTANT_Float:
   609     prim_value.f = this_oop->float_at(index);
   610     result_oop = java_lang_boxing_object::create(T_FLOAT, &prim_value, CHECK_NULL);
   611     break;
   613   case JVM_CONSTANT_Long:
   614     prim_value.j = this_oop->long_at(index);
   615     result_oop = java_lang_boxing_object::create(T_LONG, &prim_value, CHECK_NULL);
   616     break;
   618   case JVM_CONSTANT_Double:
   619     prim_value.d = this_oop->double_at(index);
   620     result_oop = java_lang_boxing_object::create(T_DOUBLE, &prim_value, CHECK_NULL);
   621     break;
   623   default:
   624     DEBUG_ONLY( tty->print_cr("*** %p: tag at CP[%d/%d] = %d",
   625                               this_oop(), index, cache_index, tag_value) );
   626     assert(false, "unexpected constant tag");
   627     break;
   628   }
   630   if (cache_index >= 0) {
   631     // Cache the oop here also.
   632     if (throw_exception.not_null()) {
   633       objArrayOop sys_array = oopFactory::new_system_objArray(1, CHECK_NULL);
   634       sys_array->obj_at_put(0, throw_exception());
   635       result_oop = sys_array;
   636       throw_exception = Handle();  // be tidy
   637     }
   638     Handle result_handle(THREAD, result_oop);
   639     result_oop = NULL;  // safety
   640     ObjectLocker ol(this_oop, THREAD);
   641     ConstantPoolCacheEntry* cpc_entry = this_oop->cache()->entry_at(cache_index);
   642     result_oop = cpc_entry->f1_as_instance();
   643     // Benign race condition:  f1 may already be filled in while we were trying to lock.
   644     // The important thing here is that all threads pick up the same result.
   645     // It doesn't matter which racing thread wins, as long as only one
   646     // result is used by all threads, and all future queries.
   647     // That result may be either a resolved constant or a failure exception.
   648     if (result_oop == NULL) {
   649       result_oop = result_handle();
   650       cpc_entry->set_f1(result_oop);
   651     }
   652     return decode_exception_from_f1(result_oop, THREAD);
   653   } else {
   654     if (throw_exception.not_null()) {
   655       THROW_HANDLE_(throw_exception, NULL);
   656     }
   657     return result_oop;
   658   }
   659 }
   662 oop constantPoolOopDesc::resolve_bootstrap_specifier_at_impl(constantPoolHandle this_oop, int index, TRAPS) {
   663   assert(this_oop->tag_at(index).is_invoke_dynamic(), "Corrupted constant pool");
   665   Handle bsm;
   666   int argc;
   667   {
   668     // JVM_CONSTANT_InvokeDynamic is an ordered pair of [bootm, name&type], plus optional arguments
   669     // The bootm, being a JVM_CONSTANT_MethodHandle, has its own cache entry.
   670     // It is accompanied by the optional arguments.
   671     int bsm_index = this_oop->invoke_dynamic_bootstrap_method_ref_index_at(index);
   672     oop bsm_oop = this_oop->resolve_possibly_cached_constant_at(bsm_index, CHECK_NULL);
   673     if (!java_lang_invoke_MethodHandle::is_instance(bsm_oop)) {
   674       THROW_MSG_NULL(vmSymbols::java_lang_LinkageError(), "BSM not an MethodHandle");
   675     }
   677     // Extract the optional static arguments.
   678     argc = this_oop->invoke_dynamic_argument_count_at(index);
   679     if (argc == 0)  return bsm_oop;
   681     bsm = Handle(THREAD, bsm_oop);
   682   }
   684   objArrayHandle info;
   685   {
   686     objArrayOop info_oop = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1+argc, CHECK_NULL);
   687     info = objArrayHandle(THREAD, info_oop);
   688   }
   690   info->obj_at_put(0, bsm());
   691   for (int i = 0; i < argc; i++) {
   692     int arg_index = this_oop->invoke_dynamic_argument_index_at(index, i);
   693     oop arg_oop = this_oop->resolve_possibly_cached_constant_at(arg_index, CHECK_NULL);
   694     info->obj_at_put(1+i, arg_oop);
   695   }
   697   return info();
   698 }
   700 oop constantPoolOopDesc::string_at_impl(constantPoolHandle this_oop, int which, TRAPS) {
   701   oop str = NULL;
   702   CPSlot entry = this_oop->slot_at(which);
   703   if (entry.is_metadata()) {
   704     ObjectLocker ol(this_oop, THREAD);
   705     if (this_oop->tag_at(which).is_unresolved_string()) {
   706       // Intern string
   707       Symbol* sym = this_oop->unresolved_string_at(which);
   708       str = StringTable::intern(sym, CHECK_(constantPoolOop(NULL)));
   709       this_oop->string_at_put(which, str);
   710     } else {
   711       // Another thread beat us and interned string, read string from constant pool
   712       str = this_oop->resolved_string_at(which);
   713     }
   714   } else {
   715     str = entry.get_oop();
   716   }
   717   assert(java_lang_String::is_instance(str), "must be string");
   718   return str;
   719 }
   722 bool constantPoolOopDesc::is_pseudo_string_at(int which) {
   723   CPSlot entry = slot_at(which);
   724   if (entry.is_metadata())
   725     // Not yet resolved, but it will resolve to a string.
   726     return false;
   727   else if (java_lang_String::is_instance(entry.get_oop()))
   728     return false; // actually, it might be a non-interned or non-perm string
   729   else
   730     // truly pseudo
   731     return true;
   732 }
   735 bool constantPoolOopDesc::klass_name_at_matches(instanceKlassHandle k,
   736                                                 int which) {
   737   // Names are interned, so we can compare Symbol*s directly
   738   Symbol* cp_name = klass_name_at(which);
   739   return (cp_name == k->name());
   740 }
   743 int constantPoolOopDesc::pre_resolve_shared_klasses(TRAPS) {
   744   ResourceMark rm;
   745   int count = 0;
   746   for (int index = 1; index < tags()->length(); index++) { // Index 0 is unused
   747     if (tag_at(index).is_unresolved_string()) {
   748       // Intern string
   749       Symbol* sym = unresolved_string_at(index);
   750       oop entry = StringTable::intern(sym, CHECK_(-1));
   751       string_at_put(index, entry);
   752     }
   753   }
   754   return count;
   755 }
   757 // Iterate over symbols and decrement ones which are Symbol*s.
   758 // This is done during GC so do not need to lock constantPool unless we
   759 // have per-thread safepoints.
   760 // Only decrement the UTF8 symbols. Unresolved classes and strings point to
   761 // these symbols but didn't increment the reference count.
   762 void constantPoolOopDesc::unreference_symbols() {
   763   for (int index = 1; index < length(); index++) { // Index 0 is unused
   764     constantTag tag = tag_at(index);
   765     if (tag.is_symbol()) {
   766       symbol_at(index)->decrement_refcount();
   767     }
   768   }
   769 }
   771 // Iterate over symbols which are used as class, field, method names and
   772 // signatures (in preparation for writing to the shared archive).
   774 void constantPoolOopDesc::shared_symbols_iterate(SymbolClosure* closure) {
   775   for (int index = 1; index < length(); index++) { // Index 0 is unused
   776     switch (tag_at(index).value()) {
   778     case JVM_CONSTANT_UnresolvedClass:
   779     case JVM_CONSTANT_UnresolvedString:
   780     case JVM_CONSTANT_Utf8:
   781       assert(slot_at(index).is_metadata(), "must be symbol");
   782       closure->do_symbol(symbol_at_addr(index));
   783       break;
   785     case JVM_CONSTANT_NameAndType:
   786       {
   787         int i = *int_at_addr(index);
   788         closure->do_symbol(symbol_at_addr((unsigned)i >> 16));
   789         closure->do_symbol(symbol_at_addr((unsigned)i & 0xffff));
   790       }
   791       break;
   793     case JVM_CONSTANT_Class:
   794     case JVM_CONSTANT_InterfaceMethodref:
   795     case JVM_CONSTANT_Fieldref:
   796     case JVM_CONSTANT_Methodref:
   797     case JVM_CONSTANT_Integer:
   798     case JVM_CONSTANT_Float:
   799       // Do nothing!  Not an oop.
   800       // These constant types do not reference symbols at this point.
   801       break;
   803     case JVM_CONSTANT_String:
   804       // Do nothing!  Not a symbol.
   805       break;
   807     case JVM_CONSTANT_Long:
   808     case JVM_CONSTANT_Double:
   809       // Do nothing!  Not an oop. (But takes two pool entries.)
   810       ++index;
   811       break;
   813     default:
   814       ShouldNotReachHere();
   815       break;
   816     }
   817   }
   818 }
   821 // Iterate over the [one] tags array (in preparation for writing to the
   822 // shared archive).
   824 void constantPoolOopDesc::shared_tags_iterate(OopClosure* closure) {
   825   closure->do_oop(tags_addr());
   826   closure->do_oop(operands_addr());
   827 }
   830 // Iterate over String objects (in preparation for writing to the shared
   831 // archive).
   833 void constantPoolOopDesc::shared_strings_iterate(OopClosure* closure) {
   834   for (int index = 1; index < length(); index++) { // Index 0 is unused
   835     switch (tag_at(index).value()) {
   837     case JVM_CONSTANT_UnresolvedClass:
   838     case JVM_CONSTANT_NameAndType:
   839       // Do nothing!  Not a String.
   840       break;
   842     case JVM_CONSTANT_Class:
   843     case JVM_CONSTANT_InterfaceMethodref:
   844     case JVM_CONSTANT_Fieldref:
   845     case JVM_CONSTANT_Methodref:
   846     case JVM_CONSTANT_Integer:
   847     case JVM_CONSTANT_Float:
   848       // Do nothing!  Not an oop.
   849       // These constant types do not reference symbols at this point.
   850       break;
   852     case JVM_CONSTANT_String:
   853       closure->do_oop(obj_at_addr_raw(index));
   854       break;
   856     case JVM_CONSTANT_UnresolvedString:
   857     case JVM_CONSTANT_Utf8:
   858       // These constants are symbols, but unless these symbols are
   859       // actually to be used for something, we don't want to mark them.
   860       break;
   862     case JVM_CONSTANT_Long:
   863     case JVM_CONSTANT_Double:
   864       // Do nothing!  Not an oop. (But takes two pool entries.)
   865       ++index;
   866       break;
   868     default:
   869       ShouldNotReachHere();
   870       break;
   871     }
   872   }
   873 }
   876 // Compare this constant pool's entry at index1 to the constant pool
   877 // cp2's entry at index2.
   878 bool constantPoolOopDesc::compare_entry_to(int index1, constantPoolHandle cp2,
   879        int index2, TRAPS) {
   881   jbyte t1 = tag_at(index1).value();
   882   jbyte t2 = cp2->tag_at(index2).value();
   885   // JVM_CONSTANT_UnresolvedClassInError is equal to JVM_CONSTANT_UnresolvedClass
   886   // when comparing
   887   if (t1 == JVM_CONSTANT_UnresolvedClassInError) {
   888     t1 = JVM_CONSTANT_UnresolvedClass;
   889   }
   890   if (t2 == JVM_CONSTANT_UnresolvedClassInError) {
   891     t2 = JVM_CONSTANT_UnresolvedClass;
   892   }
   894   if (t1 != t2) {
   895     // Not the same entry type so there is nothing else to check. Note
   896     // that this style of checking will consider resolved/unresolved
   897     // class pairs and resolved/unresolved string pairs as different.
   898     // From the constantPoolOop API point of view, this is correct
   899     // behavior. See constantPoolKlass::merge() to see how this plays
   900     // out in the context of constantPoolOop merging.
   901     return false;
   902   }
   904   switch (t1) {
   905   case JVM_CONSTANT_Class:
   906   {
   907     klassOop k1 = klass_at(index1, CHECK_false);
   908     klassOop k2 = cp2->klass_at(index2, CHECK_false);
   909     if (k1 == k2) {
   910       return true;
   911     }
   912   } break;
   914   case JVM_CONSTANT_ClassIndex:
   915   {
   916     int recur1 = klass_index_at(index1);
   917     int recur2 = cp2->klass_index_at(index2);
   918     bool match = compare_entry_to(recur1, cp2, recur2, CHECK_false);
   919     if (match) {
   920       return true;
   921     }
   922   } break;
   924   case JVM_CONSTANT_Double:
   925   {
   926     jdouble d1 = double_at(index1);
   927     jdouble d2 = cp2->double_at(index2);
   928     if (d1 == d2) {
   929       return true;
   930     }
   931   } break;
   933   case JVM_CONSTANT_Fieldref:
   934   case JVM_CONSTANT_InterfaceMethodref:
   935   case JVM_CONSTANT_Methodref:
   936   {
   937     int recur1 = uncached_klass_ref_index_at(index1);
   938     int recur2 = cp2->uncached_klass_ref_index_at(index2);
   939     bool match = compare_entry_to(recur1, cp2, recur2, CHECK_false);
   940     if (match) {
   941       recur1 = uncached_name_and_type_ref_index_at(index1);
   942       recur2 = cp2->uncached_name_and_type_ref_index_at(index2);
   943       match = compare_entry_to(recur1, cp2, recur2, CHECK_false);
   944       if (match) {
   945         return true;
   946       }
   947     }
   948   } break;
   950   case JVM_CONSTANT_Float:
   951   {
   952     jfloat f1 = float_at(index1);
   953     jfloat f2 = cp2->float_at(index2);
   954     if (f1 == f2) {
   955       return true;
   956     }
   957   } break;
   959   case JVM_CONSTANT_Integer:
   960   {
   961     jint i1 = int_at(index1);
   962     jint i2 = cp2->int_at(index2);
   963     if (i1 == i2) {
   964       return true;
   965     }
   966   } break;
   968   case JVM_CONSTANT_Long:
   969   {
   970     jlong l1 = long_at(index1);
   971     jlong l2 = cp2->long_at(index2);
   972     if (l1 == l2) {
   973       return true;
   974     }
   975   } break;
   977   case JVM_CONSTANT_NameAndType:
   978   {
   979     int recur1 = name_ref_index_at(index1);
   980     int recur2 = cp2->name_ref_index_at(index2);
   981     bool match = compare_entry_to(recur1, cp2, recur2, CHECK_false);
   982     if (match) {
   983       recur1 = signature_ref_index_at(index1);
   984       recur2 = cp2->signature_ref_index_at(index2);
   985       match = compare_entry_to(recur1, cp2, recur2, CHECK_false);
   986       if (match) {
   987         return true;
   988       }
   989     }
   990   } break;
   992   case JVM_CONSTANT_String:
   993   {
   994     oop s1 = string_at(index1, CHECK_false);
   995     oop s2 = cp2->string_at(index2, CHECK_false);
   996     if (s1 == s2) {
   997       return true;
   998     }
   999   } break;
  1001   case JVM_CONSTANT_StringIndex:
  1003     int recur1 = string_index_at(index1);
  1004     int recur2 = cp2->string_index_at(index2);
  1005     bool match = compare_entry_to(recur1, cp2, recur2, CHECK_false);
  1006     if (match) {
  1007       return true;
  1009   } break;
  1011   case JVM_CONSTANT_UnresolvedClass:
  1013     Symbol* k1 = unresolved_klass_at(index1);
  1014     Symbol* k2 = cp2->unresolved_klass_at(index2);
  1015     if (k1 == k2) {
  1016       return true;
  1018   } break;
  1020   case JVM_CONSTANT_MethodType:
  1022     int k1 = method_type_index_at(index1);
  1023     int k2 = cp2->method_type_index_at(index2);
  1024     bool match = compare_entry_to(k1, cp2, k2, CHECK_false);
  1025     if (match) {
  1026       return true;
  1028   } break;
  1030   case JVM_CONSTANT_MethodHandle:
  1032     int k1 = method_handle_ref_kind_at(index1);
  1033     int k2 = cp2->method_handle_ref_kind_at(index2);
  1034     if (k1 == k2) {
  1035       int i1 = method_handle_index_at(index1);
  1036       int i2 = cp2->method_handle_index_at(index2);
  1037       bool match = compare_entry_to(i1, cp2, i2, CHECK_false);
  1038       if (match) {
  1039         return true;
  1042   } break;
  1044   case JVM_CONSTANT_InvokeDynamic:
  1046     int k1 = invoke_dynamic_bootstrap_method_ref_index_at(index1);
  1047     int k2 = cp2->invoke_dynamic_bootstrap_method_ref_index_at(index2);
  1048     bool match = compare_entry_to(k1, cp2, k2, CHECK_false);
  1049     if (!match)  return false;
  1050     k1 = invoke_dynamic_name_and_type_ref_index_at(index1);
  1051     k2 = cp2->invoke_dynamic_name_and_type_ref_index_at(index2);
  1052     match = compare_entry_to(k1, cp2, k2, CHECK_false);
  1053     if (!match)  return false;
  1054     int argc = invoke_dynamic_argument_count_at(index1);
  1055     if (argc == cp2->invoke_dynamic_argument_count_at(index2)) {
  1056       for (int j = 0; j < argc; j++) {
  1057         k1 = invoke_dynamic_argument_index_at(index1, j);
  1058         k2 = cp2->invoke_dynamic_argument_index_at(index2, j);
  1059         match = compare_entry_to(k1, cp2, k2, CHECK_false);
  1060         if (!match)  return false;
  1062       return true;           // got through loop; all elements equal
  1064   } break;
  1066   case JVM_CONSTANT_UnresolvedString:
  1068     Symbol* s1 = unresolved_string_at(index1);
  1069     Symbol* s2 = cp2->unresolved_string_at(index2);
  1070     if (s1 == s2) {
  1071       return true;
  1073   } break;
  1075   case JVM_CONSTANT_Utf8:
  1077     Symbol* s1 = symbol_at(index1);
  1078     Symbol* s2 = cp2->symbol_at(index2);
  1079     if (s1 == s2) {
  1080       return true;
  1082   } break;
  1084   // Invalid is used as the tag for the second constant pool entry
  1085   // occupied by JVM_CONSTANT_Double or JVM_CONSTANT_Long. It should
  1086   // not be seen by itself.
  1087   case JVM_CONSTANT_Invalid: // fall through
  1089   default:
  1090     ShouldNotReachHere();
  1091     break;
  1094   return false;
  1095 } // end compare_entry_to()
  1098 // Copy this constant pool's entries at start_i to end_i (inclusive)
  1099 // to the constant pool to_cp's entries starting at to_i. A total of
  1100 // (end_i - start_i) + 1 entries are copied.
  1101 void constantPoolOopDesc::copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int end_i,
  1102        constantPoolHandle to_cp, int to_i, TRAPS) {
  1104   int dest_i = to_i;  // leave original alone for debug purposes
  1106   for (int src_i = start_i; src_i <= end_i; /* see loop bottom */ ) {
  1107     copy_entry_to(from_cp, src_i, to_cp, dest_i, CHECK);
  1109     switch (from_cp->tag_at(src_i).value()) {
  1110     case JVM_CONSTANT_Double:
  1111     case JVM_CONSTANT_Long:
  1112       // double and long take two constant pool entries
  1113       src_i += 2;
  1114       dest_i += 2;
  1115       break;
  1117     default:
  1118       // all others take one constant pool entry
  1119       src_i++;
  1120       dest_i++;
  1121       break;
  1125   int from_oplen = operand_array_length(from_cp->operands());
  1126   int old_oplen  = operand_array_length(to_cp->operands());
  1127   if (from_oplen != 0) {
  1128     // append my operands to the target's operands array
  1129     if (old_oplen == 0) {
  1130       to_cp->set_operands(from_cp->operands());  // reuse; do not merge
  1131     } else {
  1132       int old_len  = to_cp->operands()->length();
  1133       int from_len = from_cp->operands()->length();
  1134       int old_off  = old_oplen * sizeof(u2);
  1135       int from_off = from_oplen * sizeof(u2);
  1136       typeArrayHandle new_operands = oopFactory::new_permanent_shortArray(old_len + from_len, CHECK);
  1137       int fillp = 0, len = 0;
  1138       // first part of dest
  1139       Copy::conjoint_memory_atomic(to_cp->operands()->short_at_addr(0),
  1140                                    new_operands->short_at_addr(fillp),
  1141                                    (len = old_off) * sizeof(u2));
  1142       fillp += len;
  1143       // first part of src
  1144       Copy::conjoint_memory_atomic(to_cp->operands()->short_at_addr(0),
  1145                                    new_operands->short_at_addr(fillp),
  1146                                    (len = from_off) * sizeof(u2));
  1147       fillp += len;
  1148       // second part of dest
  1149       Copy::conjoint_memory_atomic(to_cp->operands()->short_at_addr(old_off),
  1150                                    new_operands->short_at_addr(fillp),
  1151                                    (len = old_len - old_off) * sizeof(u2));
  1152       fillp += len;
  1153       // second part of src
  1154       Copy::conjoint_memory_atomic(to_cp->operands()->short_at_addr(from_off),
  1155                                    new_operands->short_at_addr(fillp),
  1156                                    (len = from_len - from_off) * sizeof(u2));
  1157       fillp += len;
  1158       assert(fillp == new_operands->length(), "");
  1160       // Adjust indexes in the first part of the copied operands array.
  1161       for (int j = 0; j < from_oplen; j++) {
  1162         int offset = operand_offset_at(new_operands(), old_oplen + j);
  1163         assert(offset == operand_offset_at(from_cp->operands(), j), "correct copy");
  1164         offset += old_len;  // every new tuple is preceded by old_len extra u2's
  1165         operand_offset_at_put(new_operands(), old_oplen + j, offset);
  1168       // replace target operands array with combined array
  1169       to_cp->set_operands(new_operands());
  1173 } // end copy_cp_to()
  1176 // Copy this constant pool's entry at from_i to the constant pool
  1177 // to_cp's entry at to_i.
  1178 void constantPoolOopDesc::copy_entry_to(constantPoolHandle from_cp, int from_i,
  1179                                         constantPoolHandle to_cp, int to_i,
  1180                                         TRAPS) {
  1182   int tag = from_cp->tag_at(from_i).value();
  1183   switch (tag) {
  1184   case JVM_CONSTANT_Class:
  1186     klassOop k = from_cp->klass_at(from_i, CHECK);
  1187     to_cp->klass_at_put(to_i, k);
  1188   } break;
  1190   case JVM_CONSTANT_ClassIndex:
  1192     jint ki = from_cp->klass_index_at(from_i);
  1193     to_cp->klass_index_at_put(to_i, ki);
  1194   } break;
  1196   case JVM_CONSTANT_Double:
  1198     jdouble d = from_cp->double_at(from_i);
  1199     to_cp->double_at_put(to_i, d);
  1200     // double takes two constant pool entries so init second entry's tag
  1201     to_cp->tag_at_put(to_i + 1, JVM_CONSTANT_Invalid);
  1202   } break;
  1204   case JVM_CONSTANT_Fieldref:
  1206     int class_index = from_cp->uncached_klass_ref_index_at(from_i);
  1207     int name_and_type_index = from_cp->uncached_name_and_type_ref_index_at(from_i);
  1208     to_cp->field_at_put(to_i, class_index, name_and_type_index);
  1209   } break;
  1211   case JVM_CONSTANT_Float:
  1213     jfloat f = from_cp->float_at(from_i);
  1214     to_cp->float_at_put(to_i, f);
  1215   } break;
  1217   case JVM_CONSTANT_Integer:
  1219     jint i = from_cp->int_at(from_i);
  1220     to_cp->int_at_put(to_i, i);
  1221   } break;
  1223   case JVM_CONSTANT_InterfaceMethodref:
  1225     int class_index = from_cp->uncached_klass_ref_index_at(from_i);
  1226     int name_and_type_index = from_cp->uncached_name_and_type_ref_index_at(from_i);
  1227     to_cp->interface_method_at_put(to_i, class_index, name_and_type_index);
  1228   } break;
  1230   case JVM_CONSTANT_Long:
  1232     jlong l = from_cp->long_at(from_i);
  1233     to_cp->long_at_put(to_i, l);
  1234     // long takes two constant pool entries so init second entry's tag
  1235     to_cp->tag_at_put(to_i + 1, JVM_CONSTANT_Invalid);
  1236   } break;
  1238   case JVM_CONSTANT_Methodref:
  1240     int class_index = from_cp->uncached_klass_ref_index_at(from_i);
  1241     int name_and_type_index = from_cp->uncached_name_and_type_ref_index_at(from_i);
  1242     to_cp->method_at_put(to_i, class_index, name_and_type_index);
  1243   } break;
  1245   case JVM_CONSTANT_NameAndType:
  1247     int name_ref_index = from_cp->name_ref_index_at(from_i);
  1248     int signature_ref_index = from_cp->signature_ref_index_at(from_i);
  1249     to_cp->name_and_type_at_put(to_i, name_ref_index, signature_ref_index);
  1250   } break;
  1252   case JVM_CONSTANT_String:
  1254     oop s = from_cp->string_at(from_i, CHECK);
  1255     to_cp->string_at_put(to_i, s);
  1256   } break;
  1258   case JVM_CONSTANT_StringIndex:
  1260     jint si = from_cp->string_index_at(from_i);
  1261     to_cp->string_index_at_put(to_i, si);
  1262   } break;
  1264   case JVM_CONSTANT_UnresolvedClass:
  1266     // Can be resolved after checking tag, so check the slot first.
  1267     CPSlot entry = from_cp->slot_at(from_i);
  1268     if (entry.is_oop()) {
  1269       assert(entry.get_oop()->is_klass(), "must be");
  1270       // Already resolved
  1271       to_cp->klass_at_put(to_i, (klassOop)entry.get_oop());
  1272     } else {
  1273       to_cp->unresolved_klass_at_put(to_i, entry.get_symbol());
  1275   } break;
  1277   case JVM_CONSTANT_UnresolvedClassInError:
  1279     Symbol* k = from_cp->unresolved_klass_at(from_i);
  1280     to_cp->unresolved_klass_at_put(to_i, k);
  1281     to_cp->tag_at_put(to_i, JVM_CONSTANT_UnresolvedClassInError);
  1282   } break;
  1285   case JVM_CONSTANT_UnresolvedString:
  1287     // Can be resolved after checking tag, so check the slot first.
  1288     CPSlot entry = from_cp->slot_at(from_i);
  1289     if (entry.is_oop()) {
  1290       // Already resolved (either string or pseudo-string)
  1291       to_cp->string_at_put(to_i, entry.get_oop());
  1292     } else {
  1293       to_cp->unresolved_string_at_put(to_i, entry.get_symbol());
  1295   } break;
  1297   case JVM_CONSTANT_Utf8:
  1299     Symbol* s = from_cp->symbol_at(from_i);
  1300     to_cp->symbol_at_put(to_i, s);
  1301     // This constantPool has the same lifetime as the original, so don't
  1302     // increase reference counts for the copy.
  1303   } break;
  1305   case JVM_CONSTANT_MethodType:
  1307     jint k = from_cp->method_type_index_at(from_i);
  1308     to_cp->method_type_index_at_put(to_i, k);
  1309   } break;
  1311   case JVM_CONSTANT_MethodHandle:
  1313     int k1 = from_cp->method_handle_ref_kind_at(from_i);
  1314     int k2 = from_cp->method_handle_index_at(from_i);
  1315     to_cp->method_handle_index_at_put(to_i, k1, k2);
  1316   } break;
  1318   case JVM_CONSTANT_InvokeDynamic:
  1320     int k1 = from_cp->invoke_dynamic_bootstrap_specifier_index(from_i);
  1321     int k2 = from_cp->invoke_dynamic_name_and_type_ref_index_at(from_i);
  1322     k1 += operand_array_length(to_cp->operands());  // to_cp might already have operands
  1323     to_cp->invoke_dynamic_at_put(to_i, k1, k2);
  1324   } break;
  1326   // Invalid is used as the tag for the second constant pool entry
  1327   // occupied by JVM_CONSTANT_Double or JVM_CONSTANT_Long. It should
  1328   // not be seen by itself.
  1329   case JVM_CONSTANT_Invalid: // fall through
  1331   default:
  1333     ShouldNotReachHere();
  1334   } break;
  1336 } // end copy_entry_to()
  1339 // Search constant pool search_cp for an entry that matches this
  1340 // constant pool's entry at pattern_i. Returns the index of a
  1341 // matching entry or zero (0) if there is no matching entry.
  1342 int constantPoolOopDesc::find_matching_entry(int pattern_i,
  1343       constantPoolHandle search_cp, TRAPS) {
  1345   // index zero (0) is not used
  1346   for (int i = 1; i < search_cp->length(); i++) {
  1347     bool found = compare_entry_to(pattern_i, search_cp, i, CHECK_0);
  1348     if (found) {
  1349       return i;
  1353   return 0;  // entry not found; return unused index zero (0)
  1354 } // end find_matching_entry()
  1357 #ifndef PRODUCT
  1359 const char* constantPoolOopDesc::printable_name_at(int which) {
  1361   constantTag tag = tag_at(which);
  1363   if (tag.is_unresolved_string() || tag.is_string()) {
  1364     return string_at_noresolve(which);
  1365   } else if (tag.is_klass() || tag.is_unresolved_klass()) {
  1366     return klass_name_at(which)->as_C_string();
  1367   } else if (tag.is_symbol()) {
  1368     return symbol_at(which)->as_C_string();
  1370   return "";
  1373 #endif // PRODUCT
  1376 // JVMTI GetConstantPool support
  1378 // For temporary use until code is stable.
  1379 #define DBG(code)
  1381 static const char* WARN_MSG = "Must not be such entry!";
  1383 static void print_cpool_bytes(jint cnt, u1 *bytes) {
  1384   jint size = 0;
  1385   u2   idx1, idx2;
  1387   for (jint idx = 1; idx < cnt; idx++) {
  1388     jint ent_size = 0;
  1389     u1   tag  = *bytes++;
  1390     size++;                       // count tag
  1392     printf("const #%03d, tag: %02d ", idx, tag);
  1393     switch(tag) {
  1394       case JVM_CONSTANT_Invalid: {
  1395         printf("Invalid");
  1396         break;
  1398       case JVM_CONSTANT_Unicode: {
  1399         printf("Unicode      %s", WARN_MSG);
  1400         break;
  1402       case JVM_CONSTANT_Utf8: {
  1403         u2 len = Bytes::get_Java_u2(bytes);
  1404         char str[128];
  1405         if (len > 127) {
  1406            len = 127;
  1408         strncpy(str, (char *) (bytes+2), len);
  1409         str[len] = '\0';
  1410         printf("Utf8          \"%s\"", str);
  1411         ent_size = 2 + len;
  1412         break;
  1414       case JVM_CONSTANT_Integer: {
  1415         u4 val = Bytes::get_Java_u4(bytes);
  1416         printf("int          %d", *(int *) &val);
  1417         ent_size = 4;
  1418         break;
  1420       case JVM_CONSTANT_Float: {
  1421         u4 val = Bytes::get_Java_u4(bytes);
  1422         printf("float        %5.3ff", *(float *) &val);
  1423         ent_size = 4;
  1424         break;
  1426       case JVM_CONSTANT_Long: {
  1427         u8 val = Bytes::get_Java_u8(bytes);
  1428         printf("long         "INT64_FORMAT, (int64_t) *(jlong *) &val);
  1429         ent_size = 8;
  1430         idx++; // Long takes two cpool slots
  1431         break;
  1433       case JVM_CONSTANT_Double: {
  1434         u8 val = Bytes::get_Java_u8(bytes);
  1435         printf("double       %5.3fd", *(jdouble *)&val);
  1436         ent_size = 8;
  1437         idx++; // Double takes two cpool slots
  1438         break;
  1440       case JVM_CONSTANT_Class: {
  1441         idx1 = Bytes::get_Java_u2(bytes);
  1442         printf("class        #%03d", idx1);
  1443         ent_size = 2;
  1444         break;
  1446       case JVM_CONSTANT_String: {
  1447         idx1 = Bytes::get_Java_u2(bytes);
  1448         printf("String       #%03d", idx1);
  1449         ent_size = 2;
  1450         break;
  1452       case JVM_CONSTANT_Fieldref: {
  1453         idx1 = Bytes::get_Java_u2(bytes);
  1454         idx2 = Bytes::get_Java_u2(bytes+2);
  1455         printf("Field        #%03d, #%03d", (int) idx1, (int) idx2);
  1456         ent_size = 4;
  1457         break;
  1459       case JVM_CONSTANT_Methodref: {
  1460         idx1 = Bytes::get_Java_u2(bytes);
  1461         idx2 = Bytes::get_Java_u2(bytes+2);
  1462         printf("Method       #%03d, #%03d", idx1, idx2);
  1463         ent_size = 4;
  1464         break;
  1466       case JVM_CONSTANT_InterfaceMethodref: {
  1467         idx1 = Bytes::get_Java_u2(bytes);
  1468         idx2 = Bytes::get_Java_u2(bytes+2);
  1469         printf("InterfMethod #%03d, #%03d", idx1, idx2);
  1470         ent_size = 4;
  1471         break;
  1473       case JVM_CONSTANT_NameAndType: {
  1474         idx1 = Bytes::get_Java_u2(bytes);
  1475         idx2 = Bytes::get_Java_u2(bytes+2);
  1476         printf("NameAndType  #%03d, #%03d", idx1, idx2);
  1477         ent_size = 4;
  1478         break;
  1480       case JVM_CONSTANT_ClassIndex: {
  1481         printf("ClassIndex  %s", WARN_MSG);
  1482         break;
  1484       case JVM_CONSTANT_UnresolvedClass: {
  1485         printf("UnresolvedClass: %s", WARN_MSG);
  1486         break;
  1488       case JVM_CONSTANT_UnresolvedClassInError: {
  1489         printf("UnresolvedClassInErr: %s", WARN_MSG);
  1490         break;
  1492       case JVM_CONSTANT_StringIndex: {
  1493         printf("StringIndex: %s", WARN_MSG);
  1494         break;
  1496       case JVM_CONSTANT_UnresolvedString: {
  1497         printf("UnresolvedString: %s", WARN_MSG);
  1498         break;
  1501     printf(";\n");
  1502     bytes += ent_size;
  1503     size  += ent_size;
  1505   printf("Cpool size: %d\n", size);
  1506   fflush(0);
  1507   return;
  1508 } /* end print_cpool_bytes */
  1511 // Returns size of constant pool entry.
  1512 jint constantPoolOopDesc::cpool_entry_size(jint idx) {
  1513   switch(tag_at(idx).value()) {
  1514     case JVM_CONSTANT_Invalid:
  1515     case JVM_CONSTANT_Unicode:
  1516       return 1;
  1518     case JVM_CONSTANT_Utf8:
  1519       return 3 + symbol_at(idx)->utf8_length();
  1521     case JVM_CONSTANT_Class:
  1522     case JVM_CONSTANT_String:
  1523     case JVM_CONSTANT_ClassIndex:
  1524     case JVM_CONSTANT_UnresolvedClass:
  1525     case JVM_CONSTANT_UnresolvedClassInError:
  1526     case JVM_CONSTANT_StringIndex:
  1527     case JVM_CONSTANT_UnresolvedString:
  1528     case JVM_CONSTANT_MethodType:
  1529       return 3;
  1531     case JVM_CONSTANT_MethodHandle:
  1532       return 4; //tag, ref_kind, ref_index
  1534     case JVM_CONSTANT_Integer:
  1535     case JVM_CONSTANT_Float:
  1536     case JVM_CONSTANT_Fieldref:
  1537     case JVM_CONSTANT_Methodref:
  1538     case JVM_CONSTANT_InterfaceMethodref:
  1539     case JVM_CONSTANT_NameAndType:
  1540       return 5;
  1542     case JVM_CONSTANT_InvokeDynamic:
  1543       // u1 tag, u2 bsm, u2 nt
  1544       return 5;
  1546     case JVM_CONSTANT_Long:
  1547     case JVM_CONSTANT_Double:
  1548       return 9;
  1550   assert(false, "cpool_entry_size: Invalid constant pool entry tag");
  1551   return 1;
  1552 } /* end cpool_entry_size */
  1555 // SymbolHashMap is used to find a constant pool index from a string.
  1556 // This function fills in SymbolHashMaps, one for utf8s and one for
  1557 // class names, returns size of the cpool raw bytes.
  1558 jint constantPoolOopDesc::hash_entries_to(SymbolHashMap *symmap,
  1559                                           SymbolHashMap *classmap) {
  1560   jint size = 0;
  1562   for (u2 idx = 1; idx < length(); idx++) {
  1563     u2 tag = tag_at(idx).value();
  1564     size += cpool_entry_size(idx);
  1566     switch(tag) {
  1567       case JVM_CONSTANT_Utf8: {
  1568         Symbol* sym = symbol_at(idx);
  1569         symmap->add_entry(sym, idx);
  1570         DBG(printf("adding symbol entry %s = %d\n", sym->as_utf8(), idx));
  1571         break;
  1573       case JVM_CONSTANT_Class:
  1574       case JVM_CONSTANT_UnresolvedClass:
  1575       case JVM_CONSTANT_UnresolvedClassInError: {
  1576         Symbol* sym = klass_name_at(idx);
  1577         classmap->add_entry(sym, idx);
  1578         DBG(printf("adding class entry %s = %d\n", sym->as_utf8(), idx));
  1579         break;
  1581       case JVM_CONSTANT_Long:
  1582       case JVM_CONSTANT_Double: {
  1583         idx++; // Both Long and Double take two cpool slots
  1584         break;
  1588   return size;
  1589 } /* end hash_utf8_entries_to */
  1592 // Copy cpool bytes.
  1593 // Returns:
  1594 //    0, in case of OutOfMemoryError
  1595 //   -1, in case of internal error
  1596 //  > 0, count of the raw cpool bytes that have been copied
  1597 int constantPoolOopDesc::copy_cpool_bytes(int cpool_size,
  1598                                           SymbolHashMap* tbl,
  1599                                           unsigned char *bytes) {
  1600   u2   idx1, idx2;
  1601   jint size  = 0;
  1602   jint cnt   = length();
  1603   unsigned char *start_bytes = bytes;
  1605   for (jint idx = 1; idx < cnt; idx++) {
  1606     u1   tag      = tag_at(idx).value();
  1607     jint ent_size = cpool_entry_size(idx);
  1609     assert(size + ent_size <= cpool_size, "Size mismatch");
  1611     *bytes = tag;
  1612     DBG(printf("#%03hd tag=%03hd, ", idx, tag));
  1613     switch(tag) {
  1614       case JVM_CONSTANT_Invalid: {
  1615         DBG(printf("JVM_CONSTANT_Invalid"));
  1616         break;
  1618       case JVM_CONSTANT_Unicode: {
  1619         assert(false, "Wrong constant pool tag: JVM_CONSTANT_Unicode");
  1620         DBG(printf("JVM_CONSTANT_Unicode"));
  1621         break;
  1623       case JVM_CONSTANT_Utf8: {
  1624         Symbol* sym = symbol_at(idx);
  1625         char*     str = sym->as_utf8();
  1626         // Warning! It's crashing on x86 with len = sym->utf8_length()
  1627         int       len = (int) strlen(str);
  1628         Bytes::put_Java_u2((address) (bytes+1), (u2) len);
  1629         for (int i = 0; i < len; i++) {
  1630             bytes[3+i] = (u1) str[i];
  1632         DBG(printf("JVM_CONSTANT_Utf8: %s ", str));
  1633         break;
  1635       case JVM_CONSTANT_Integer: {
  1636         jint val = int_at(idx);
  1637         Bytes::put_Java_u4((address) (bytes+1), *(u4*)&val);
  1638         break;
  1640       case JVM_CONSTANT_Float: {
  1641         jfloat val = float_at(idx);
  1642         Bytes::put_Java_u4((address) (bytes+1), *(u4*)&val);
  1643         break;
  1645       case JVM_CONSTANT_Long: {
  1646         jlong val = long_at(idx);
  1647         Bytes::put_Java_u8((address) (bytes+1), *(u8*)&val);
  1648         idx++;             // Long takes two cpool slots
  1649         break;
  1651       case JVM_CONSTANT_Double: {
  1652         jdouble val = double_at(idx);
  1653         Bytes::put_Java_u8((address) (bytes+1), *(u8*)&val);
  1654         idx++;             // Double takes two cpool slots
  1655         break;
  1657       case JVM_CONSTANT_Class:
  1658       case JVM_CONSTANT_UnresolvedClass:
  1659       case JVM_CONSTANT_UnresolvedClassInError: {
  1660         *bytes = JVM_CONSTANT_Class;
  1661         Symbol* sym = klass_name_at(idx);
  1662         idx1 = tbl->symbol_to_value(sym);
  1663         assert(idx1 != 0, "Have not found a hashtable entry");
  1664         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1665         DBG(printf("JVM_CONSTANT_Class: idx=#%03hd, %s", idx1, sym->as_utf8()));
  1666         break;
  1668       case JVM_CONSTANT_String: {
  1669         unsigned int hash;
  1670         char *str = string_at_noresolve(idx);
  1671         TempNewSymbol sym = SymbolTable::lookup_only(str, (int) strlen(str), hash);
  1672         if (sym == NULL) {
  1673           // sym can be NULL if string refers to incorrectly encoded JVM_CONSTANT_Utf8
  1674           // this can happen with JVM TI; see CR 6839599 for more details
  1675           oop string = *(obj_at_addr_raw(idx));
  1676           assert(java_lang_String::is_instance(string),"Not a String");
  1677           DBG(printf("Error #%03hd tag=%03hd\n", idx, tag));
  1678           idx1 = 0;
  1679           for (int j = 0; j < tbl->table_size() && idx1 == 0; j++) {
  1680             for (SymbolHashMapEntry* cur = tbl->bucket(j); cur != NULL; cur = cur->next()) {
  1681               int length;
  1682               Symbol* s = cur->symbol();
  1683               jchar* chars = s->as_unicode(length);
  1684               if (java_lang_String::equals(string, chars, length)) {
  1685                 idx1 = cur->value();
  1686                 DBG(printf("Index found: %d\n",idx1));
  1687                 break;
  1691         } else {
  1692           idx1 = tbl->symbol_to_value(sym);
  1694         assert(idx1 != 0, "Have not found a hashtable entry");
  1695         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1696         DBG(printf("JVM_CONSTANT_String: idx=#%03hd, %s", idx1, str));
  1697         break;
  1699       case JVM_CONSTANT_UnresolvedString: {
  1700         *bytes = JVM_CONSTANT_String;
  1701         Symbol* sym = unresolved_string_at(idx);
  1702         idx1 = tbl->symbol_to_value(sym);
  1703         assert(idx1 != 0, "Have not found a hashtable entry");
  1704         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1705         DBG(char *str = sym->as_utf8());
  1706         DBG(printf("JVM_CONSTANT_UnresolvedString: idx=#%03hd, %s", idx1, str));
  1707         break;
  1709       case JVM_CONSTANT_Fieldref:
  1710       case JVM_CONSTANT_Methodref:
  1711       case JVM_CONSTANT_InterfaceMethodref: {
  1712         idx1 = uncached_klass_ref_index_at(idx);
  1713         idx2 = uncached_name_and_type_ref_index_at(idx);
  1714         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1715         Bytes::put_Java_u2((address) (bytes+3), idx2);
  1716         DBG(printf("JVM_CONSTANT_Methodref: %hd %hd", idx1, idx2));
  1717         break;
  1719       case JVM_CONSTANT_NameAndType: {
  1720         idx1 = name_ref_index_at(idx);
  1721         idx2 = signature_ref_index_at(idx);
  1722         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1723         Bytes::put_Java_u2((address) (bytes+3), idx2);
  1724         DBG(printf("JVM_CONSTANT_NameAndType: %hd %hd", idx1, idx2));
  1725         break;
  1727       case JVM_CONSTANT_ClassIndex: {
  1728         *bytes = JVM_CONSTANT_Class;
  1729         idx1 = klass_index_at(idx);
  1730         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1731         DBG(printf("JVM_CONSTANT_ClassIndex: %hd", idx1));
  1732         break;
  1734       case JVM_CONSTANT_StringIndex: {
  1735         *bytes = JVM_CONSTANT_String;
  1736         idx1 = string_index_at(idx);
  1737         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1738         DBG(printf("JVM_CONSTANT_StringIndex: %hd", idx1));
  1739         break;
  1741       case JVM_CONSTANT_MethodHandle: {
  1742         *bytes = JVM_CONSTANT_MethodHandle;
  1743         int kind = method_handle_ref_kind_at(idx);
  1744         idx1 = method_handle_index_at(idx);
  1745         *(bytes+1) = (unsigned char) kind;
  1746         Bytes::put_Java_u2((address) (bytes+2), idx1);
  1747         DBG(printf("JVM_CONSTANT_MethodHandle: %d %hd", kind, idx1));
  1748         break;
  1750       case JVM_CONSTANT_MethodType: {
  1751         *bytes = JVM_CONSTANT_MethodType;
  1752         idx1 = method_type_index_at(idx);
  1753         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1754         DBG(printf("JVM_CONSTANT_MethodType: %hd", idx1));
  1755         break;
  1757       case JVM_CONSTANT_InvokeDynamic: {
  1758         *bytes = tag;
  1759         idx1 = extract_low_short_from_int(*int_at_addr(idx));
  1760         idx2 = extract_high_short_from_int(*int_at_addr(idx));
  1761         assert(idx2 == invoke_dynamic_name_and_type_ref_index_at(idx), "correct half of u4");
  1762         Bytes::put_Java_u2((address) (bytes+1), idx1);
  1763         Bytes::put_Java_u2((address) (bytes+3), idx2);
  1764         DBG(printf("JVM_CONSTANT_InvokeDynamic: %hd %hd", idx1, idx2));
  1765         break;
  1768     DBG(printf("\n"));
  1769     bytes += ent_size;
  1770     size  += ent_size;
  1772   assert(size == cpool_size, "Size mismatch");
  1774   // Keep temorarily for debugging until it's stable.
  1775   DBG(print_cpool_bytes(cnt, start_bytes));
  1776   return (int)(bytes - start_bytes);
  1777 } /* end copy_cpool_bytes */
  1780 void SymbolHashMap::add_entry(Symbol* sym, u2 value) {
  1781   char *str = sym->as_utf8();
  1782   unsigned int hash = compute_hash(str, sym->utf8_length());
  1783   unsigned int index = hash % table_size();
  1785   // check if already in map
  1786   // we prefer the first entry since it is more likely to be what was used in
  1787   // the class file
  1788   for (SymbolHashMapEntry *en = bucket(index); en != NULL; en = en->next()) {
  1789     assert(en->symbol() != NULL, "SymbolHashMapEntry symbol is NULL");
  1790     if (en->hash() == hash && en->symbol() == sym) {
  1791         return;  // already there
  1795   SymbolHashMapEntry* entry = new SymbolHashMapEntry(hash, sym, value);
  1796   entry->set_next(bucket(index));
  1797   _buckets[index].set_entry(entry);
  1798   assert(entry->symbol() != NULL, "SymbolHashMapEntry symbol is NULL");
  1801 SymbolHashMapEntry* SymbolHashMap::find_entry(Symbol* sym) {
  1802   assert(sym != NULL, "SymbolHashMap::find_entry - symbol is NULL");
  1803   char *str = sym->as_utf8();
  1804   int   len = sym->utf8_length();
  1805   unsigned int hash = SymbolHashMap::compute_hash(str, len);
  1806   unsigned int index = hash % table_size();
  1807   for (SymbolHashMapEntry *en = bucket(index); en != NULL; en = en->next()) {
  1808     assert(en->symbol() != NULL, "SymbolHashMapEntry symbol is NULL");
  1809     if (en->hash() == hash && en->symbol() == sym) {
  1810       return en;
  1813   return NULL;

mercurial