RFR 8174954: Parameter target type can yield successful access after a module read edge or a package export has occurred after failed resolution
harold seigel
harold.seigel at oracle.com
Fri Jun 9 13:45:41 UTC 2017
Hi Lois,
Thanks for your comments. I'll look into this and let you know what I
find.
Harold
On 6/8/2017 1:21 PM, Lois Foltan wrote:
> Hi Harold,
>
> I like your fix but I think there may be an issue, would like to know
> your opinion. If I add another identical but distinct invokedynamic
> call in p5/c5.java, something like
>
> 29 public class c5 {
> static final String printDescription = "In c5's method5 with param = ";
> 30 public void method5(p2.c2 param,Module c2Module) { System.out.println(printDescription + param);
> methodAddReadEdge(c2Module); System.out.println(PrintDescription + param); }
> 31
> 32 public void methodAddReadEdge(Module m) {
> 33 // Add a read edge from p5/c5's module (first_mod) to second_mod
> 34 c5.class.getModule().addReads(m);
> 35 }
> 36 }
> 37
> c5's method5 should end up with 2 invokedynamic bytecodes pointing at
> the same constant pool index
>
> 4: invokedynamic #3, 0 // InvokeDynamic
> #0:makeConcatWithConstants:(Lp2/c2;)Ljava/lang/String;
> 9: invokevirtual #4 // Method
> java/io/PrintStream.println:(Ljava/lang/String;)V
> 12: aload_0
> 13: aload_2
> 14: invokevirtual #5 // Method
> methodAddReadEdge:(Ljava/lang/Module;)V
> 17: getstatic #2 // Field
> java/lang/System.out:Ljava/io/PrintStream;
> 20: aload_1
> 21: invokedynamic #3, 0 // InvokeDynamic
> #0:makeConcatWithConstants:(Lp2/c2;)Ljava/lang/String;
>
>
> The invokedynamic at #4 should fail due to an IAE and continue to
> fail, but the invokedynamic at #21 should succeed. With your fix the
> invokedynamic at #21 fails with the cached exception. I suspect what
> is happening is that the exception is stored at the original
> invokedynamic's CP index and not the rewritten invokedynamic's cpCache
> index. Can you take a look at this and confirm? I could be wrong,
> but if I am I think this is worth adding to the test.
>
> Thanks,
> Lois
>
> On 6/8/2017 9:33 AM, harold seigel wrote:
>> Hi,
>>
>> Please review this JDK-10 fix for JDK-8174954. For invokedynamic,
>> the JVM currently does not conform to the following module related
>> upcoming JVM Spec change to 5.4.3 Resolution:
>>
>> This means that a class in one module that attempts to access, via
>> resolution of a symbolic reference in its run-time constant pool, an
>> unexported public type in a different module will always receive the
>> same error indicating an inaccessible type (§5.4.4), even if the
>> Java SE Platform API is used to dynamically export the public type's
>> package at some time after the class's first attempt.
>>
>> This RFR fixes this issue by caching the LinkageError exception from
>> the initial resolution failure. Subsequent resolution attempts will
>> then just throw the cached exception instead of actually re-doing the
>> resolution, and so will get the same failure even if the module graph
>> has been changed.
>>
>> Note that this fix also fixes JDK-8174942
>> <https://bugs.openjdk.java.net/browse/JDK-8174942>.
>>
>> Open Webrev: http://cr.openjdk.java.net/~hseigel/bug_8174954/webrev/
>>
>> JBS Bug: https://bugs.openjdk.java.net/browse/JDK-8174954
>>
>> The fix was tested with JCK Lang, VM, and API/java_lang tests, the
>> JTreg hotspot, java/io, java/lang, java/util and other tests, the
>> co-located NSK tests, RBT tests, and with JPRT. The new tests (based
>> on Lois's test cases) were run with and without -Xcomp.
>>
>> Thanks, Harold
>>
>
More information about the hotspot-runtime-dev
mailing list