aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortwisti <none@none>2012-10-08 17:04:00 -0700
committertwisti <none@none>2012-10-08 17:04:00 -0700
commitfb8c7bd27990938a885fa0c99e576f9bfda8177c (patch)
tree602f1b2713ce75b9870ad4c3bf60f83d4a397abb /src
parentefa99f2958f833a3a9dc2d04a66ce28f6ecb071d (diff)
8000263: JSR 292: signature types may appear to be unloaded
Reviewed-by: kvn, jrose
Diffstat (limited to 'src')
-rw-r--r--src/cpu/sparc/vm/methodHandles_sparc.cpp25
-rw-r--r--src/cpu/sparc/vm/methodHandles_sparc.hpp2
-rw-r--r--src/cpu/x86/vm/methodHandles_x86.cpp28
-rw-r--r--src/cpu/x86/vm/methodHandles_x86.hpp2
-rw-r--r--src/share/vm/classfile/systemDictionary.cpp19
-rw-r--r--src/share/vm/classfile/systemDictionary.hpp178
-rw-r--r--src/share/vm/classfile/vmSymbols.cpp18
-rw-r--r--src/share/vm/classfile/vmSymbols.hpp3
-rw-r--r--src/share/vm/opto/library_call.cpp8
-rw-r--r--src/share/vm/prims/methodHandles.hpp22
-rw-r--r--src/share/vm/runtime/globals.hpp2
11 files changed, 136 insertions, 171 deletions
diff --git a/src/cpu/sparc/vm/methodHandles_sparc.cpp b/src/cpu/sparc/vm/methodHandles_sparc.cpp
index f8b5f24d5..9245f3b40 100644
--- a/src/cpu/sparc/vm/methodHandles_sparc.cpp
+++ b/src/cpu/sparc/vm/methodHandles_sparc.cpp
@@ -208,8 +208,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
Register O1_scratch = O1;
Register O4_param_size = O4; // size of parameters
- address code_start = __ pc();
-
// here's where control starts out:
__ align(CodeEntryAlignment);
address entry_point = __ pc();
@@ -252,22 +250,9 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
// O4_first_arg_addr is live!
if (TraceMethodHandles) {
- const char* name = vmIntrinsics::name_at(iid);
- if (*name == '_') name += 1;
- const size_t len = strlen(name) + 50;
- char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
- const char* suffix = "";
- if (vmIntrinsics::method_for(iid) == NULL ||
- !vmIntrinsics::method_for(iid)->access_flags().is_public()) {
- if (is_signature_polymorphic_static(iid))
- suffix = "/static";
- else
- suffix = "/private";
- }
- jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
if (O0_mh != noreg)
__ mov(O0_mh, G3_method_handle); // make stub happy
- trace_method_handle(_masm, qname);
+ trace_method_handle_interpreter_entry(_masm, iid);
}
if (iid == vmIntrinsics::_invokeBasic) {
@@ -287,14 +272,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
generate_method_handle_dispatch(_masm, iid, O0_recv, G5_member, not_for_compiler_entry);
}
- if (PrintMethodHandleStubs) {
- address code_end = __ pc();
- tty->print_cr("--------");
- tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
- Disassembler::decode(code_start, code_end);
- tty->cr();
- }
-
return entry_point;
}
diff --git a/src/cpu/sparc/vm/methodHandles_sparc.hpp b/src/cpu/sparc/vm/methodHandles_sparc.hpp
index 75231984d..d58e7d75c 100644
--- a/src/cpu/sparc/vm/methodHandles_sparc.hpp
+++ b/src/cpu/sparc/vm/methodHandles_sparc.hpp
@@ -58,5 +58,3 @@ public:
Register recv, Register method_temp,
Register temp2, Register temp3,
bool for_compiler_entry);
-
- static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
diff --git a/src/cpu/x86/vm/methodHandles_x86.cpp b/src/cpu/x86/vm/methodHandles_x86.cpp
index fd01176d9..88ec6b719 100644
--- a/src/cpu/x86/vm/methodHandles_x86.cpp
+++ b/src/cpu/x86/vm/methodHandles_x86.cpp
@@ -209,8 +209,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled
Register rbx_method = rbx; // eventual target of this invocation
- address code_start = __ pc();
-
// here's where control starts out:
__ align(CodeEntryAlignment);
address entry_point = __ pc();
@@ -251,23 +249,7 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
// rdx_first_arg_addr is live!
- if (TraceMethodHandles) {
- const char* name = vmIntrinsics::name_at(iid);
- if (*name == '_') name += 1;
- const size_t len = strlen(name) + 50;
- char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
- const char* suffix = "";
- if (vmIntrinsics::method_for(iid) == NULL ||
- !vmIntrinsics::method_for(iid)->access_flags().is_public()) {
- if (is_signature_polymorphic_static(iid))
- suffix = "/static";
- else
- suffix = "/private";
- }
- jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
- // note: stub look for mh in rcx
- trace_method_handle(_masm, qname);
- }
+ trace_method_handle_interpreter_entry(_masm, iid);
if (iid == vmIntrinsics::_invokeBasic) {
generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry);
@@ -287,14 +269,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry);
}
- if (PrintMethodHandleStubs) {
- address code_end = __ pc();
- tty->print_cr("--------");
- tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
- Disassembler::decode(code_start, code_end);
- tty->cr();
- }
-
return entry_point;
}
diff --git a/src/cpu/x86/vm/methodHandles_x86.hpp b/src/cpu/x86/vm/methodHandles_x86.hpp
index 62342eefb..bb333781a 100644
--- a/src/cpu/x86/vm/methodHandles_x86.hpp
+++ b/src/cpu/x86/vm/methodHandles_x86.hpp
@@ -55,8 +55,6 @@ public:
Register temp2,
bool for_compiler_entry);
- static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
-
static Register saved_last_sp_register() {
// Should be in sharedRuntime, not here.
return LP64_ONLY(r13) NOT_LP64(rsi);
diff --git a/src/share/vm/classfile/systemDictionary.cpp b/src/share/vm/classfile/systemDictionary.cpp
index 081007c4e..8ccad8e4a 100644
--- a/src/share/vm/classfile/systemDictionary.cpp
+++ b/src/share/vm/classfile/systemDictionary.cpp
@@ -973,9 +973,12 @@ Klass* SystemDictionary::find_well_known_klass(Symbol* class_name) {
if (sid != vmSymbols::NO_SID) {
Klass* k = NULL;
switch (sid) {
- #define WK_KLASS_CASE(name, symbol, ignore_option) \
+ #define WK_KLASS_CASE(name, symbol, option) \
case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
- k = WK_KLASS(name); break;
+ if (option == Pre_Link) { \
+ k = WK_KLASS(name); \
+ } \
+ break;
WK_KLASSES_DO(WK_KLASS_CASE)
#undef WK_KLASS_CASE
}
@@ -1955,6 +1958,16 @@ void SystemDictionary::initialize_wk_klasses_until(WKID limit_id, WKID &start_id
start_id = limit_id;
}
+#ifdef ASSERT
+void SystemDictionary::check_wk_pre_link_klasses() {
+ #define WK_KLASS_CHECK(name, symbol, option) \
+ if (option == Pre_Link) { \
+ assert(name()->is_public(), ""); \
+ }
+ WK_KLASSES_DO(WK_KLASS_CHECK);
+ #undef WK_KLASS_CHECK
+}
+#endif
void SystemDictionary::initialize_preloaded_classes(TRAPS) {
assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
@@ -2010,6 +2023,8 @@ void SystemDictionary::initialize_preloaded_classes(TRAPS) {
initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
+ check_wk_pre_link_klasses();
+
_box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass);
_box_klasses[T_CHAR] = WK_KLASS(Character_klass);
_box_klasses[T_FLOAT] = WK_KLASS(Float_klass);
diff --git a/src/share/vm/classfile/systemDictionary.hpp b/src/share/vm/classfile/systemDictionary.hpp
index 70beeff22..29dd4e0cc 100644
--- a/src/share/vm/classfile/systemDictionary.hpp
+++ b/src/share/vm/classfile/systemDictionary.hpp
@@ -92,93 +92,93 @@ class SymbolPropertyTable;
// The order of these definitions is significant; it is the order in which
// preloading is actually performed by initialize_preloaded_classes.
-#define WK_KLASSES_DO(template) \
- /* well-known classes */ \
- template(Object_klass, java_lang_Object, Pre) \
- template(String_klass, java_lang_String, Pre) \
- template(Class_klass, java_lang_Class, Pre) \
- template(Cloneable_klass, java_lang_Cloneable, Pre) \
- template(ClassLoader_klass, java_lang_ClassLoader, Pre) \
- template(Serializable_klass, java_io_Serializable, Pre) \
- template(System_klass, java_lang_System, Pre) \
- template(Throwable_klass, java_lang_Throwable, Pre) \
- template(Error_klass, java_lang_Error, Pre) \
- template(ThreadDeath_klass, java_lang_ThreadDeath, Pre) \
- template(Exception_klass, java_lang_Exception, Pre) \
- template(RuntimeException_klass, java_lang_RuntimeException, Pre) \
- template(ProtectionDomain_klass, java_security_ProtectionDomain, Pre) \
- template(AccessControlContext_klass, java_security_AccessControlContext, Pre) \
- template(ClassNotFoundException_klass, java_lang_ClassNotFoundException, Pre) \
- template(NoClassDefFoundError_klass, java_lang_NoClassDefFoundError, Pre) \
- template(LinkageError_klass, java_lang_LinkageError, Pre) \
- template(ClassCastException_klass, java_lang_ClassCastException, Pre) \
- template(ArrayStoreException_klass, java_lang_ArrayStoreException, Pre) \
- template(VirtualMachineError_klass, java_lang_VirtualMachineError, Pre) \
- template(OutOfMemoryError_klass, java_lang_OutOfMemoryError, Pre) \
- template(StackOverflowError_klass, java_lang_StackOverflowError, Pre) \
- template(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre) \
- template(Reference_klass, java_lang_ref_Reference, Pre) \
- \
- /* Preload ref klasses and set reference types */ \
- template(SoftReference_klass, java_lang_ref_SoftReference, Pre) \
- template(WeakReference_klass, java_lang_ref_WeakReference, Pre) \
- template(FinalReference_klass, java_lang_ref_FinalReference, Pre) \
- template(PhantomReference_klass, java_lang_ref_PhantomReference, Pre) \
- template(Finalizer_klass, java_lang_ref_Finalizer, Pre) \
- \
- template(Thread_klass, java_lang_Thread, Pre) \
- template(ThreadGroup_klass, java_lang_ThreadGroup, Pre) \
- template(Properties_klass, java_util_Properties, Pre) \
- template(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre) \
- template(reflect_Field_klass, java_lang_reflect_Field, Pre) \
- template(reflect_Method_klass, java_lang_reflect_Method, Pre) \
- template(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre) \
- \
+#define WK_KLASSES_DO(do_klass) \
+ /* well-known classes */ \
+ do_klass(Object_klass, java_lang_Object, Pre_Link ) \
+ do_klass(String_klass, java_lang_String, Pre_Link ) \
+ do_klass(Class_klass, java_lang_Class, Pre_Link ) \
+ do_klass(Cloneable_klass, java_lang_Cloneable, Pre_Link ) \
+ do_klass(ClassLoader_klass, java_lang_ClassLoader, Pre_Link ) \
+ do_klass(Serializable_klass, java_io_Serializable, Pre_Link ) \
+ do_klass(System_klass, java_lang_System, Pre_Link ) \
+ do_klass(Throwable_klass, java_lang_Throwable, Pre_Link ) \
+ do_klass(Error_klass, java_lang_Error, Pre_Link ) \
+ do_klass(ThreadDeath_klass, java_lang_ThreadDeath, Pre_Link ) \
+ do_klass(Exception_klass, java_lang_Exception, Pre_Link ) \
+ do_klass(RuntimeException_klass, java_lang_RuntimeException, Pre_Link ) \
+ do_klass(ProtectionDomain_klass, java_security_ProtectionDomain, Pre_Link ) \
+ do_klass(AccessControlContext_klass, java_security_AccessControlContext, Pre_Link ) \
+ do_klass(ClassNotFoundException_klass, java_lang_ClassNotFoundException, Pre_Link ) \
+ do_klass(NoClassDefFoundError_klass, java_lang_NoClassDefFoundError, Pre_Link ) \
+ do_klass(LinkageError_klass, java_lang_LinkageError, Pre_Link ) \
+ do_klass(ClassCastException_klass, java_lang_ClassCastException, Pre_Link ) \
+ do_klass(ArrayStoreException_klass, java_lang_ArrayStoreException, Pre_Link ) \
+ do_klass(VirtualMachineError_klass, java_lang_VirtualMachineError, Pre_Link ) \
+ do_klass(OutOfMemoryError_klass, java_lang_OutOfMemoryError, Pre_Link ) \
+ do_klass(StackOverflowError_klass, java_lang_StackOverflowError, Pre_Link ) \
+ do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre_Link ) \
+ do_klass(Reference_klass, java_lang_ref_Reference, Pre_Link ) \
+ \
+ /* Preload ref klasses and set reference types */ \
+ do_klass(SoftReference_klass, java_lang_ref_SoftReference, Pre_Link ) \
+ do_klass(WeakReference_klass, java_lang_ref_WeakReference, Pre_Link ) \
+ do_klass(FinalReference_klass, java_lang_ref_FinalReference, Pre ) \
+ do_klass(PhantomReference_klass, java_lang_ref_PhantomReference, Pre_Link ) \
+ do_klass(Finalizer_klass, java_lang_ref_Finalizer, Pre ) \
+ \
+ do_klass(Thread_klass, java_lang_Thread, Pre_Link ) \
+ do_klass(ThreadGroup_klass, java_lang_ThreadGroup, Pre_Link ) \
+ do_klass(Properties_klass, java_util_Properties, Pre_Link ) \
+ do_klass(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre_Link ) \
+ do_klass(reflect_Field_klass, java_lang_reflect_Field, Pre_Link ) \
+ do_klass(reflect_Method_klass, java_lang_reflect_Method, Pre_Link ) \
+ do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre_Link ) \
+ \
/* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \
/* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
- template(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt) \
- template(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \
- template(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
- template(reflect_DelegatingClassLoader_klass, sun_reflect_DelegatingClassLoader, Opt) \
- template(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15) \
- template(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15) \
- \
- /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
- template(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292) \
- template(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292) \
- template(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292) \
- template(LambdaForm_klass, java_lang_invoke_LambdaForm, Opt) \
- template(MethodType_klass, java_lang_invoke_MethodType, Pre_JSR292) \
- template(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre_JSR292) \
- template(CallSite_klass, java_lang_invoke_CallSite, Pre_JSR292) \
- template(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre_JSR292) \
- template(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre_JSR292) \
- template(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre_JSR292) \
- /* Note: MethodHandle must be first, and VolatileCallSite last in group */ \
- \
- template(StringBuffer_klass, java_lang_StringBuffer, Pre) \
- template(StringBuilder_klass, java_lang_StringBuilder, Pre) \
- \
- /* It's NULL in non-1.4 JDKs. */ \
- template(StackTraceElement_klass, java_lang_StackTraceElement, Opt) \
- /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
- /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
- template(nio_Buffer_klass, java_nio_Buffer, Opt) \
- \
- template(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel) \
- \
- template(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt) \
- \
- /* Preload boxing klasses */ \
- template(Boolean_klass, java_lang_Boolean, Pre) \
- template(Character_klass, java_lang_Character, Pre) \
- template(Float_klass, java_lang_Float, Pre) \
- template(Double_klass, java_lang_Double, Pre) \
- template(Byte_klass, java_lang_Byte, Pre) \
- template(Short_klass, java_lang_Short, Pre) \
- template(Integer_klass, java_lang_Integer, Pre) \
- template(Long_klass, java_lang_Long, Pre) \
+ do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \
+ do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \
+ do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
+ do_klass(reflect_DelegatingClassLoader_klass, sun_reflect_DelegatingClassLoader, Opt ) \
+ do_klass(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15 ) \
+ do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15 ) \
+ \
+ /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
+ do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_Link ) \
+ do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre ) \
+ do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre ) \
+ do_klass(LambdaForm_klass, java_lang_invoke_LambdaForm, Opt ) \
+ do_klass(MethodType_klass, java_lang_invoke_MethodType, Pre_Link ) \
+ do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre_Link ) \
+ do_klass(CallSite_klass, java_lang_invoke_CallSite, Pre_Link ) \
+ do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre_Link ) \
+ do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre_Link ) \
+ do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre_Link ) \
+ /* Note: MethodHandle must be first, and VolatileCallSite last in group */ \
+ \
+ do_klass(StringBuffer_klass, java_lang_StringBuffer, Pre_Link ) \
+ do_klass(StringBuilder_klass, java_lang_StringBuilder, Pre_Link ) \
+ \
+ /* It's NULL in non-1.4 JDKs. */ \
+ do_klass(StackTraceElement_klass, java_lang_StackTraceElement, Opt ) \
+ /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
+ /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
+ do_klass(nio_Buffer_klass, java_nio_Buffer, Opt ) \
+ \
+ do_klass(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel ) \
+ \
+ do_klass(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt ) \
+ \
+ /* Preload boxing klasses */ \
+ do_klass(Boolean_klass, java_lang_Boolean, Pre_Link ) \
+ do_klass(Character_klass, java_lang_Character, Pre_Link ) \
+ do_klass(Float_klass, java_lang_Float, Pre_Link ) \
+ do_klass(Double_klass, java_lang_Double, Pre_Link ) \
+ do_klass(Byte_klass, java_lang_Byte, Pre_Link ) \
+ do_klass(Short_klass, java_lang_Short, Pre_Link ) \
+ do_klass(Integer_klass, java_lang_Integer, Pre_Link ) \
+ do_klass(Long_klass, java_lang_Long, Pre_Link ) \
/*end*/
@@ -201,7 +201,7 @@ class SystemDictionary : AllStatic {
enum InitOption {
Pre, // preloaded; error if not present
- Pre_JSR292, // preloaded if EnableInvokeDynamic
+ Pre_Link, // preloaded; error if not present; link as well-known
// Order is significant. Options before this point require resolve_or_fail.
// Options after this point will use resolve_or_null instead.
@@ -392,9 +392,9 @@ public:
return k;
}
- static Klass* check_klass_Pre(Klass* k) { return check_klass(k); }
- static Klass* check_klass_Pre_JSR292(Klass* k) { return EnableInvokeDynamic ? check_klass(k) : k; }
- static Klass* check_klass_Opt(Klass* k) { return k; }
+ static Klass* check_klass_Pre( Klass* k) { return check_klass(k); }
+ static Klass* check_klass_Pre_Link( Klass* k) { return check_klass(k); }
+ static Klass* check_klass_Opt( Klass* k) { return k; }
static Klass* check_klass_Opt_Kernel(Klass* k) { return k; } //== Opt
static Klass* check_klass_Opt_Only_JDK15(Klass* k) {
assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only");
@@ -413,6 +413,8 @@ public:
initialize_wk_klasses_until((WKID) limit, start_id, THREAD);
}
+ static void check_wk_pre_link_klasses() NOT_DEBUG_RETURN;
+
public:
#define WK_KLASS_DECLARE(name, symbol, option) \
static Klass* name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \
diff --git a/src/share/vm/classfile/vmSymbols.cpp b/src/share/vm/classfile/vmSymbols.cpp
index 44de54f5f..318d4178f 100644
--- a/src/share/vm/classfile/vmSymbols.cpp
+++ b/src/share/vm/classfile/vmSymbols.cpp
@@ -324,24 +324,6 @@ vmIntrinsics::ID vmIntrinsics::for_raw_conversion(BasicType src, BasicType dest)
return vmIntrinsics::_none;
}
-Method* vmIntrinsics::method_for(vmIntrinsics::ID id) {
- if (id == _none) return NULL;
- Symbol* cname = vmSymbols::symbol_at(class_for(id));
- Symbol* mname = vmSymbols::symbol_at(name_for(id));
- Symbol* msig = vmSymbols::symbol_at(signature_for(id));
- if (cname == NULL || mname == NULL || msig == NULL) return NULL;
- Klass* k = SystemDictionary::find_well_known_klass(cname);
- if (k == NULL) return NULL;
- Method* m = InstanceKlass::cast(k)->find_method(mname, msig);
- if (m == NULL &&
- cname == vmSymbols::java_lang_invoke_MethodHandle() &&
- msig == vmSymbols::star_name()) {
- // Any signature polymorphic method is represented by a fixed concrete signature:
- m = InstanceKlass::cast(k)->find_method(mname, vmSymbols::object_array_object_signature());
- }
- return m;
-}
-
#define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0"
static const char* vm_intrinsic_name_bodies =
diff --git a/src/share/vm/classfile/vmSymbols.hpp b/src/share/vm/classfile/vmSymbols.hpp
index 10cf48e7b..06fdb35be 100644
--- a/src/share/vm/classfile/vmSymbols.hpp
+++ b/src/share/vm/classfile/vmSymbols.hpp
@@ -1138,9 +1138,6 @@ public:
static const char* short_name_as_C_string(ID id, char* buf, int size);
- // Access to intrinsic methods:
- static Method* method_for(ID id);
-
// Wrapper object methods:
static ID for_boxing(BasicType type);
static ID for_unboxing(BasicType type);
diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp
index 386662e15..4ba7e127e 100644
--- a/src/share/vm/opto/library_call.cpp
+++ b/src/share/vm/opto/library_call.cpp
@@ -2378,13 +2378,15 @@ const TypeOopPtr* LibraryCallKit::sharpen_unsafe_type(Compile::AliasType* alias_
}
}
- if (sharpened_klass != NULL) {
+ // The sharpened class might be unloaded if there is no class loader
+ // contraint in place.
+ if (sharpened_klass != NULL && sharpened_klass->is_loaded()) {
const TypeOopPtr* tjp = TypeOopPtr::make_from_klass(sharpened_klass);
#ifndef PRODUCT
if (PrintIntrinsics || PrintInlining || PrintOptoInlining) {
- tty->print(" from base type: "); adr_type->dump();
- tty->print(" sharpened value: "); tjp->dump();
+ tty->print(" from base type: "); adr_type->dump();
+ tty->print(" sharpened value: "); tjp->dump();
}
#endif
// Sharpen the value type.
diff --git a/src/share/vm/prims/methodHandles.hpp b/src/share/vm/prims/methodHandles.hpp
index 9b77b413f..2e45bac1c 100644
--- a/src/share/vm/prims/methodHandles.hpp
+++ b/src/share/vm/prims/methodHandles.hpp
@@ -196,7 +196,27 @@ public:
# include "methodHandles_ppc.hpp"
#endif
-
+ // Tracing
+ static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
+ static void trace_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid) {
+ if (TraceMethodHandles) {
+ const char* name = vmIntrinsics::name_at(iid);
+ if (*name == '_') name += 1;
+ const size_t len = strlen(name) + 50;
+ char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
+ const char* suffix = "";
+ if (is_signature_polymorphic(iid)) {
+ if (is_signature_polymorphic_static(iid))
+ suffix = "/static";
+ else
+ suffix = "/private";
+ }
+ jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
+ trace_method_handle(_masm, qname);
+ // Note: Don't free the allocated char array because it's used
+ // during runtime.
+ }
+ }
};
diff --git a/src/share/vm/runtime/globals.hpp b/src/share/vm/runtime/globals.hpp
index a0c53aa43..30df54798 100644
--- a/src/share/vm/runtime/globals.hpp
+++ b/src/share/vm/runtime/globals.hpp
@@ -1000,7 +1000,7 @@ class CommandLineFlags {
product(bool, ClassUnloading, true, \
"Do unloading of classes") \
\
- diagnostic(bool, LinkWellKnownClasses, false, \
+ diagnostic(bool, LinkWellKnownClasses, true, \
"Resolve a well known class as soon as its name is seen") \
\
develop(bool, DisableStartThread, false, \