--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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("]");
}
--- a/hotspot/src/share/vm/classfile/genericSignatures.cpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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;
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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()) {
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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
--- a/hotspot/src/share/vm/runtime/arguments.cpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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) {
--- a/hotspot/src/share/vm/services/memBaseline.hpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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;
--- a/hotspot/src/share/vm/services/memPtr.hpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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) { }
--- a/hotspot/src/share/vm/services/memSnapshot.hpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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;
--- a/hotspot/src/share/vm/services/memTrackWorker.hpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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;
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp Fri Apr 19 10:09:11 2013 -0700
+++ b/hotspot/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;
//----------------------------------------------------------------------------------------------------