# HG changeset patch # User dcubed # Date 1366404534 25200 # Node ID 17c51f84773a774483937bf10b0964016a02a370 # Parent f78763f49817f57d716677678680718961bb2f7c# Parent 7815eaceaa8c33d2ef5799a8ce0546fdf649cd10 Merge diff -r f78763f49817 -r 17c51f84773a src/share/vm/classfile/classFileParser.cpp --- a/src/share/vm/classfile/classFileParser.cpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/classfile/classFileParser.cpp Fri Apr 19 13:48:54 2013 -0700 @@ -436,14 +436,19 @@ ref_index, CHECK_(nullHandle)); break; case JVM_REF_invokeVirtual: - case JVM_REF_invokeStatic: - case JVM_REF_invokeSpecial: case JVM_REF_newInvokeSpecial: check_property( tag.is_method(), "Invalid constant pool index %u in class file %s (not a method)", ref_index, CHECK_(nullHandle)); break; + case JVM_REF_invokeStatic: + case JVM_REF_invokeSpecial: + check_property( + tag.is_method() || tag.is_interface_method(), + "Invalid constant pool index %u in class file %s (not a method)", + ref_index, CHECK_(nullHandle)); + break; case JVM_REF_invokeInterface: check_property( tag.is_interface_method(), @@ -3837,7 +3842,7 @@ } if (TraceClassLoadingPreorder) { - tty->print("[Loading %s", name->as_klass_external_name()); + tty->print("[Loading %s", (name != NULL) ? name->as_klass_external_name() : "NoName"); if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); tty->print_cr("]"); } diff -r f78763f49817 -r 17c51f84773a src/share/vm/classfile/genericSignatures.cpp --- a/src/share/vm/classfile/genericSignatures.cpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/classfile/genericSignatures.cpp Fri Apr 19 13:48:54 2013 -0700 @@ -268,8 +268,15 @@ Klass* outer = SystemDictionary::find( outer_name, class_loader, protection_domain, CHECK_NULL); if (outer == NULL && !THREAD->is_Compiler_thread()) { - outer = SystemDictionary::resolve_super_or_fail(original_name, - outer_name, class_loader, protection_domain, false, CHECK_NULL); + if (outer_name == ik->super()->name()) { + outer = SystemDictionary::resolve_super_or_fail(original_name, outer_name, + class_loader, protection_domain, + false, CHECK_NULL); + } + else { + outer = SystemDictionary::resolve_or_fail(outer_name, class_loader, + protection_domain, false, CHECK_NULL); + } } InstanceKlass* outer_ik; diff -r f78763f49817 -r 17c51f84773a src/share/vm/interpreter/linkResolver.cpp --- a/src/share/vm/interpreter/linkResolver.cpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/interpreter/linkResolver.cpp Fri Apr 19 13:48:54 2013 -0700 @@ -1014,13 +1014,28 @@ resolved_method->name(), resolved_method->signature())); } - // check if public - if (!sel_method->is_public()) { - ResourceMark rm(THREAD); - THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), - Method::name_and_sig_as_C_string(recv_klass(), - sel_method->name(), - sel_method->signature())); + // check access + if (sel_method->method_holder()->is_interface()) { + // Method holder is an interface. Throw Illegal Access Error if sel_method + // is neither public nor private. + if (!(sel_method->is_public() || sel_method->is_private())) { + ResourceMark rm(THREAD); + THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), + Method::name_and_sig_as_C_string(recv_klass(), + sel_method->name(), + sel_method->signature())); + } + } + else { + // Method holder is a class. Throw Illegal Access Error if sel_method + // is not public. + if (!sel_method->is_public()) { + ResourceMark rm(THREAD); + THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), + Method::name_and_sig_as_C_string(recv_klass(), + sel_method->name(), + sel_method->signature())); + } } // check if abstract if (check_null_and_abstract && sel_method->is_abstract()) { diff -r f78763f49817 -r 17c51f84773a src/share/vm/prims/methodHandles.cpp --- a/src/share/vm/prims/methodHandles.cpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/prims/methodHandles.cpp Fri Apr 19 13:48:54 2013 -0700 @@ -187,6 +187,11 @@ flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); } else if (mods.is_static()) { flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); + // Check if this method is a lambda method that is generated as + // private static method. + if (m->is_private() && m->method_holder()->is_interface()) { + vmindex = klassItable::compute_itable_index(m); + } } else if (receiver_limit != mklass && !receiver_limit->is_subtype_of(mklass)) { return NULL; // bad receiver limit diff -r f78763f49817 -r 17c51f84773a src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/runtime/arguments.cpp Fri Apr 19 13:48:54 2013 -0700 @@ -1901,7 +1901,7 @@ // Divide by bucket size to prevent a large size from causing rollover when // calculating amount of memory needed to be allocated for the String table. - status = status && verify_interval(StringTableSize, defaultStringTableSize, + status = status && verify_interval(StringTableSize, minimumStringTableSize, (max_uintx / StringTable::bucket_size()), "StringTable size"); if (MinHeapFreeRatio > MaxHeapFreeRatio) { diff -r f78763f49817 -r 17c51f84773a src/share/vm/services/memBaseline.hpp --- a/src/share/vm/services/memBaseline.hpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/services/memBaseline.hpp Fri Apr 19 13:48:54 2013 -0700 @@ -133,7 +133,7 @@ // This class aggregates malloc'd records by memory type -class MallocMem : public _ValueObj { +class MallocMem VALUE_OBJ_CLASS_SPEC { private: MEMFLAGS _type; @@ -211,7 +211,7 @@ }; // This class aggregates virtual memory by its memory type -class VMMem : public _ValueObj { +class VMMem VALUE_OBJ_CLASS_SPEC { private: MEMFLAGS _type; @@ -296,7 +296,7 @@ * aggregates memory usage by callsites when detail tracking * is on. */ -class MemBaseline : public _ValueObj { +class MemBaseline VALUE_OBJ_CLASS_SPEC { friend class BaselineReporter; friend class BaselineComparisonReporter; diff -r f78763f49817 -r 17c51f84773a src/share/vm/services/memPtr.hpp --- a/src/share/vm/services/memPtr.hpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/services/memPtr.hpp Fri Apr 19 13:48:54 2013 -0700 @@ -89,7 +89,7 @@ * the memory pointer either points to a malloc'd * memory block, or a mmap'd memory block */ -class MemPointer : public _ValueObj { +class MemPointer VALUE_OBJ_CLASS_SPEC { public: MemPointer(): _addr(0) { } MemPointer(address addr): _addr(addr) { } diff -r f78763f49817 -r 17c51f84773a src/share/vm/services/memSnapshot.hpp --- a/src/share/vm/services/memSnapshot.hpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/services/memSnapshot.hpp Fri Apr 19 13:48:54 2013 -0700 @@ -308,7 +308,7 @@ } }; -class StagingArea : public _ValueObj { +class StagingArea VALUE_OBJ_CLASS_SPEC { private: MemPointerArray* _malloc_data; MemPointerArray* _vm_data; diff -r f78763f49817 -r 17c51f84773a src/share/vm/services/memTrackWorker.hpp --- a/src/share/vm/services/memTrackWorker.hpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/services/memTrackWorker.hpp Fri Apr 19 13:48:54 2013 -0700 @@ -32,7 +32,7 @@ // Maximum MAX_GENERATIONS generation data can be tracked. #define MAX_GENERATIONS 512 -class GenerationData : public _ValueObj { +class GenerationData VALUE_OBJ_CLASS_SPEC { private: int _number_of_classes; MemRecorder* _recorder_list; diff -r f78763f49817 -r 17c51f84773a src/share/vm/utilities/globalDefinitions.hpp --- a/src/share/vm/utilities/globalDefinitions.hpp Fri Apr 19 10:09:11 2013 -0700 +++ b/src/share/vm/utilities/globalDefinitions.hpp Fri Apr 19 13:48:54 2013 -0700 @@ -328,9 +328,10 @@ //---------------------------------------------------------------------------------------------------- -// Minimum StringTableSize value +// Default and minimum StringTableSize values -const int defaultStringTableSize=1009; +const int defaultStringTableSize = NOT_LP64(1009) LP64_ONLY(60013); +const int minimumStringTableSize=1009; //----------------------------------------------------------------------------------------------------