# HG changeset patch # User jrose # Date 1299907155 28800 # Node ID 799d8ccf63cf0aa21ee1250ec0b510ae067c2d5a # Parent df1347358fe65fc749b13d570107727b9e26de59# Parent 83f08886981c253707d31cbfed7d56002108664a Merge diff -r 83f08886981c -r 799d8ccf63cf .hgtags --- a/.hgtags Fri Mar 11 07:50:51 2011 -0800 +++ b/.hgtags Fri Mar 11 21:19:15 2011 -0800 @@ -151,3 +151,5 @@ e9aa2ca89ad6c53420623d579765f9706ec523d7 jdk7-b130 0aa3b49089112d5faa77902ad680c582ab53f651 jdk7-b131 e9aa2ca89ad6c53420623d579765f9706ec523d7 hs21-b02 +0e531ab5ba04967a0e9aa6aef65e6eb3a0dcf632 jdk7-b132 +a8d643a4db47c7b58e0bcb49c77b5c3610de86a8 hs21-b03 diff -r 83f08886981c -r 799d8ccf63cf make/hotspot_version --- a/make/hotspot_version Fri Mar 11 07:50:51 2011 -0800 +++ b/make/hotspot_version Fri Mar 11 21:19:15 2011 -0800 @@ -35,7 +35,7 @@ HS_MAJOR_VER=21 HS_MINOR_VER=0 -HS_BUILD_NUMBER=03 +HS_BUILD_NUMBER=04 JDK_MAJOR_VER=1 JDK_MINOR_VER=7 diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/classfile/classFileParser.cpp --- a/src/share/vm/classfile/classFileParser.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/classfile/classFileParser.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -1616,8 +1616,13 @@ AccessFlags access_flags; if (name == vmSymbols::class_initializer_name()) { - // We ignore the access flags for a class initializer. (JVM Spec. p. 116) - flags = JVM_ACC_STATIC; + // We ignore the other access flags for a valid class initializer. + // (JVM Spec 2nd ed., chapter 4.6) + if (_major_version < 51) { // backward compatibility + flags = JVM_ACC_STATIC; + } else if ((flags & JVM_ACC_STATIC) == JVM_ACC_STATIC) { + flags &= JVM_ACC_STATIC | JVM_ACC_STRICT; + } } else { verify_legal_method_modifiers(flags, is_interface, name, CHECK_(nullHandle)); } diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/classfile/symbolTable.cpp --- a/src/share/vm/classfile/symbolTable.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/classfile/symbolTable.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -88,7 +88,7 @@ void SymbolTable::unlink() { int removed = 0; int total = 0; - int memory_total = 0; + size_t memory_total = 0; for (int i = 0; i < the_table()->table_size(); ++i) { for (HashtableEntry** p = the_table()->bucket_addr(i); *p != NULL; ) { HashtableEntry* entry = *p; @@ -112,8 +112,10 @@ } symbols_removed += removed; symbols_counted += total; - if (PrintGCDetails) { - gclog_or_tty->print(" [Symbols=%d size=%dK] ", total, + // Exclude printing for normal PrintGCDetails because people parse + // this output. + if (PrintGCDetails && Verbose && WizardMode) { + gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", total, (memory_total*HeapWordSize)/1024); } } diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/oops/constantPoolOop.cpp --- a/src/share/vm/oops/constantPoolOop.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/oops/constantPoolOop.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -1175,8 +1175,15 @@ case JVM_CONSTANT_UnresolvedClass: { - Symbol* k = from_cp->unresolved_klass_at(from_i); - to_cp->unresolved_klass_at_put(to_i, k); + // Can be resolved after checking tag, so check the slot first. + CPSlot entry = from_cp->slot_at(from_i); + if (entry.is_oop()) { + assert(entry.get_oop()->is_klass(), "must be"); + // Already resolved + to_cp->klass_at_put(to_i, (klassOop)entry.get_oop()); + } else { + to_cp->unresolved_klass_at_put(to_i, entry.get_symbol()); + } } break; case JVM_CONSTANT_UnresolvedClassInError: @@ -1189,8 +1196,14 @@ case JVM_CONSTANT_UnresolvedString: { - Symbol* s = from_cp->unresolved_string_at(from_i); - to_cp->unresolved_string_at_put(to_i, s); + // Can be resolved after checking tag, so check the slot first. + CPSlot entry = from_cp->slot_at(from_i); + if (entry.is_oop()) { + // Already resolved (either string or pseudo-string) + to_cp->string_at_put(to_i, entry.get_oop()); + } else { + to_cp->unresolved_string_at_put(to_i, entry.get_symbol()); + } } break; case JVM_CONSTANT_Utf8: diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/oops/instanceKlass.cpp --- a/src/share/vm/oops/instanceKlass.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/oops/instanceKlass.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -735,7 +735,12 @@ static int call_class_initializer_impl_counter = 0; // for debugging methodOop instanceKlass::class_initializer() { - return find_method(vmSymbols::class_initializer_name(), vmSymbols::void_method_signature()); + methodOop clinit = find_method( + vmSymbols::class_initializer_name(), vmSymbols::void_method_signature()); + if (clinit != NULL && clinit->has_valid_initializer_flags()) { + return clinit; + } + return NULL; } void instanceKlass::call_class_initializer_impl(instanceKlassHandle this_oop, TRAPS) { diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/oops/klassVtable.cpp --- a/src/share/vm/oops/klassVtable.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/oops/klassVtable.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -883,7 +883,7 @@ int ime_num = 0; // Skip first methodOop if it is a class initializer - int i = ((methodOop)methods()->obj_at(0))->name() != vmSymbols::class_initializer_name() ? 0 : 1; + int i = ((methodOop)methods()->obj_at(0))->is_static_initializer() ? 1 : 0; // m, method_name, method_signature, klass reset each loop so they // don't need preserving across check_signature_loaders call @@ -1121,7 +1121,7 @@ assert(index < methods->length(), "should find index for resolve_invoke"); } // Adjust for , which is left out of table if first method - if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->name() == vmSymbols::class_initializer_name()) { + if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->is_static_initializer()) { index--; } return index; @@ -1135,7 +1135,7 @@ int index = itable_index; // Adjust for , which is left out of table if first method - if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->name() == vmSymbols::class_initializer_name()) { + if (methods->length() > 0 && ((methodOop)methods->obj_at(0))->is_static_initializer()) { index++; } diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/oops/methodDataOop.hpp --- a/src/share/vm/oops/methodDataOop.hpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/oops/methodDataOop.hpp Fri Mar 11 21:19:15 2011 -0800 @@ -228,7 +228,7 @@ return byte_offset_of(DataLayout, _header._struct._bci); } static ByteSize cell_offset(int index) { - return byte_offset_of(DataLayout, _cells[index]); + return byte_offset_of(DataLayout, _cells) + in_ByteSize(index * cell_size); } // Return a value which, when or-ed as a byte into _flags, sets the flag. static int flag_number_to_byte_constant(int flag_number) { diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/oops/methodOop.cpp --- a/src/share/vm/oops/methodOop.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/oops/methodOop.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -466,7 +466,20 @@ bool methodOopDesc::is_initializer() const { - return name() == vmSymbols::object_initializer_name() || name() == vmSymbols::class_initializer_name(); + return name() == vmSymbols::object_initializer_name() || is_static_initializer(); +} + +bool methodOopDesc::has_valid_initializer_flags() const { + return (is_static() || + instanceKlass::cast(method_holder())->major_version() < 51); +} + +bool methodOopDesc::is_static_initializer() const { + // For classfiles version 51 or greater, ensure that the clinit method is + // static. Non-static methods with the name "" are not static + // initializers. (older classfiles exempted for backward compatibility) + return name() == vmSymbols::class_initializer_name() && + has_valid_initializer_flags(); } diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/oops/methodOop.hpp --- a/src/share/vm/oops/methodOop.hpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/oops/methodOop.hpp Fri Mar 11 21:19:15 2011 -0800 @@ -518,6 +518,13 @@ // returns true if the method is an initializer ( or ). bool is_initializer() const; + // returns true if the method is static OR if the classfile version < 51 + bool has_valid_initializer_flags() const; + + // returns true if the method name is and the method has + // valid static initializer flags. + bool is_static_initializer() const; + // compiled code support // NOTE: code() is inherently racy as deopt can be clearing code // simultaneously. Use with caution. diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/prims/jvmtiRedefineClasses.cpp --- a/src/share/vm/prims/jvmtiRedefineClasses.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -1084,7 +1084,10 @@ jbyte old_tag = old_cp->tag_at(old_i).value(); switch (old_tag) { case JVM_CONSTANT_Class: + case JVM_CONSTANT_UnresolvedClass: // revert the copy to JVM_CONSTANT_UnresolvedClass + // May be resolving while calling this so do the same for + // JVM_CONSTANT_UnresolvedClass (klass_name_at() deals with transition) (*merge_cp_p)->unresolved_klass_at_put(old_i, old_cp->klass_name_at(old_i)); break; diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/runtime/arguments.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -3111,7 +3111,11 @@ // Turn off biased locking for locking debug mode flags, // which are subtlely different from each other but neither works with // biased locking. - if (!UseFastLocking || UseHeavyMonitors) { + if (UseHeavyMonitors +#ifdef COMPILER1 + || !UseFastLocking +#endif // COMPILER1 + ) { if (!FLAG_IS_DEFAULT(UseBiasedLocking) && UseBiasedLocking) { // flag set to true on command line; warn the user that they // can't enable biased locking here diff -r 83f08886981c -r 799d8ccf63cf src/share/vm/runtime/os.cpp --- a/src/share/vm/runtime/os.cpp Fri Mar 11 07:50:51 2011 -0800 +++ b/src/share/vm/runtime/os.cpp Fri Mar 11 21:19:15 2011 -0800 @@ -633,10 +633,10 @@ *q = (u_char)freeBlockPad; } if (PrintMalloc && tty != NULL) - fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, memblock); + fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, (uintptr_t)memblock); } else if (PrintMalloc && tty != NULL) { // tty->print_cr("os::free %p", memblock); - fprintf(stderr, "os::free " PTR_FORMAT "\n", memblock); + fprintf(stderr, "os::free " PTR_FORMAT "\n", (uintptr_t)memblock); } #endif ::free((char*)memblock - space_before);