MH inlining fails for a package-private and protected calls
Paul Sandoz
paul.sandoz at oracle.com
Tue Oct 28 09:25:40 UTC 2014
On Oct 27, 2014, at 6:23 PM, Paul Sandoz <Paul.Sandoz at oracle.com> wrote:
> AFAICT an access control check fails for the lambda form to access the protected method when attempting to inline the method handle.
>
FWIW below is a hacky patch that makes the inlining work, the intent being just to highlight the access control area.
I don't quite know what the proper fix should be.
The Compile::optimize_inlining method attempts to find the mono morphic target, which in turn needs to resolve the method in the context of the calling class via LinkResolver::resolve_virtual_call_or_null, and that fails. If the method is private then Compile::optimize_inlining skips such checks because the method can be statically bound.
Paul.
diff -r b1c2dd843f24 src/share/vm/interpreter/linkResolver.cpp
--- a/src/share/vm/interpreter/linkResolver.cpp Fri Oct 24 12:32:53 2014 +0400
+++ b/src/share/vm/interpreter/linkResolver.cpp Tue Oct 28 10:12:48 2014 +0100
@@ -472,6 +472,33 @@
}
// assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
+ {
+ InstanceKlass* inst = InstanceKlass::cast(ref_klass());
+ if (inst->is_anonymous()) {
+ Klass* host_klass = inst->host_klass();
+ if (host_klass == SystemDictionary::LambdaForm_klass()) {
+
+#ifndef PRODUCT
+ if (PrintOpto && (Verbose || WizardMode)) {
+ tty->print_cr("Host class of reference class is LambdaForm");
+ tty->print_cr("LinkResolver::check_method_accessability access to method %s.%s%s from class %s, with resolved class %s\n",
+ sel_klass->external_name(),
+ sel_method->name()->as_C_string(),
+ sel_method->signature()->as_C_string(),
+ ref_klass->external_name(),
+ resolved_klass->external_name()
+ );
+ }
+#endif
+
+ jint new_flags = flags.as_int();
+ new_flags = new_flags & (~JVM_ACC_PROTECTED);
+ new_flags = new_flags | JVM_ACC_PUBLIC;
+ flags.set_flags(new_flags);
+ }
+ }
+ }
+
if (!Reflection::verify_field_access(ref_klass(),
resolved_klass(),
sel_klass(),
diff -r b1c2dd843f24 src/share/vm/opto/callGenerator.cpp
--- a/src/share/vm/opto/callGenerator.cpp Fri Oct 24 12:32:53 2014 +0400
+++ b/src/share/vm/opto/callGenerator.cpp Tue Oct 28 10:12:48 2014 +0100
@@ -822,6 +822,19 @@
case vmIntrinsics::_linkToSpecial:
case vmIntrinsics::_linkToInterface:
{
+
+#ifndef PRODUCT
+ if (PrintOpto && (Verbose || WizardMode)) {
+ tty->print_cr("CallGenerator::for_method_handle_inline");
+ tty->print(" Caller: ");
+ caller->print_name();
+ tty->cr();
+ tty->print(" Callee: ");
+ callee->print_name();
+ tty->cr();
+ }
+#endif
+
// Get MemberName argument:
Node* member_name = kit.argument(callee->arg_size() - 1);
if (member_name->Opcode() == Op_ConP) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 841 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20141028/0e6b13c7/signature.asc>
More information about the hotspot-compiler-dev
mailing list