RFR: 8145148: InterfaceMethod CP entry pointing to a class should cause ICCE

Yumin Qi yumin.qi at oracle.com
Mon Dec 21 18:52:03 UTC 2015


Please review:

bug: https://bugs.openjdk.java.net/browse/JDK-8145148
webrev:http://cr.openjdk.java.net/~minqi/8145148/webrev-01/

This is REDO for bug 8087223, which was backed out due to failed on 
8143317 and 8143320.
The defmeth encoutered new failures after the fix, which now has correct 
constant tags. The test bugs will be addressed in 8143320, which based 
on vm/runtime/defmeth and 8143317, which in jdk/test.

One difference from the attached for this webrev is that in MethodHandle 
resolution, I relax the check for one specific case: Using MethodHandle 
to invoke static default interface method. In this case, we must use 
invokestatic (JVM_REF_invokeStatic), which in defmeth it will generate 
method tag for interface which violates JVMS-5.4.3.3 (it should create 
interface method tag!).  ASM currently has no API to generate 
invokeinterface for a interface static default method through 
MethodHandle invocation.

Tests: JPRT, runtime quick test list (the fixed version for 8143320).
Note the fix still fails 8143320 and 8143317 which are not fixed at the 
momment.


Thanks
Yumin


Original post:
----------------------------------------------------------------------------------------------------------------------------------------------------- 

Please review:

bug: https://bugs.openjdk.java.net/browse/JDK-8087223
webrev: http://cr.openjdk.java.net/~minqi/8087223/webrev-02/

According to JVMS-8:

JVMS-5.4.3.3 Method Resolution:
  " If C is an interface, method resolution throws an 
IncompatibleClassChangeError."
JVMS-5.4.3.4 Interface Method Resolution:
  "If C is not an interface, interface method resolution throws an 
IncompatibleClassChangeError"

When invoke a method with resolved to an interface method, or invoke a 
interface method with resolved to an instance method,  ICCE should be 
thrown. The case usually happens when using tools like asmtools or 
jdk.internal.org.objectweb.asm to generate java bytecode.

The fix is carrying the constantTag for the method at call and check if 
tag is consistent with the method called. Doing this by adding a member 
of constantTag, _tag,  to LinkInfo, and check tag in resolve functions 
to see if tag matched with the correct method.

The fix solved the problem when call is from interpreter and compiler, 
bug for MethodHandle invoke, which should be addressed in another bug,  
since the MethodHandle does not come with a byte stream and getting the 
constant pool index at the invoke is not possible.  It will be addressed 
in another bug.

Tests: test case (added, minor modified from bug), JPRT, rutime quick 
test list(in progress).
manually tested:  1) -Xint
                                2) -Xcomp
                                3) -Xcomp -XX:-TieredCompiltion
                                4) -Xcomp -XX:+TieredCompilation

Thanks to Coleen for helping fixed constant pool index and cleaned 
LinkInfo.
----------------------------------------------------------------------------------------------------------------------------------

Second revision attached.




Thanks
Yumin
-------------- next part --------------
An embedded message was scrubbed...
From: Vladimir Ivanov <vladimir.x.ivanov at oracle.com>
Subject: Re: RFR: 8087223: InterfaceMethod CP entry pointing to a class should cause ICCE
Date: Wed, 18 Nov 2015 00:13:01 +0300
Size: 2278
URL: <http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20151221/1bda9098/AttachedMessage.mht>


More information about the hotspot-runtime-dev mailing list