RFR 8203488: Remove error generation from TransTypes

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon May 21 20:09:11 UTC 2018



On 21/05/18 18:51, Remi Forax wrote:
>
>
> ------------------------------------------------------------------------
>
>     *De: *"Maurizio Cimadamore" <maurizio.cimadamore at oracle.com>
>     *À: *"compiler-dev" <compiler-dev at openjdk.java.net>
>     *Envoyé: *Lundi 21 Mai 2018 19:30:01
>     *Objet: *RFR 8203488: Remove error generation from TransTypes
>
>     Hi,
>     as written in the bug report, TransTypes generates two kind of
>     user-facing errors:
>
>     1) bridge clash
>
>     2) arity mismatch due to sig poly invocation with -target 6
>
>     We can simply get rid of (1) as we now have Attr checking that
>     override/hide do not clash. We can also get rid of (2), by
>     reworking the fix that introduced it (JDK-8013179
>     <https://bugs.openjdk.java.net/browse/JDK-8013179>). The issue
>     there was that, when compiling code that contained a call to
>     MethodHandle.invoke, with target -6, the compiler was left in a
>     limbo between polysig methods (which have sharp signatures) and
>     the underlying Java vararg signature (which is not sharp at all).
>     Since the target method was a 'varargs' but the call itself was
>     not a varargs call, javac complained about an arity mismatch.
>
>     The solution to this problem is to either use polysig
>     type-checking or regular type-checking depending on whether the
>     support is enabled in the backend. If a polysig call is treated as
>     a true polysig call, we emit a symbol with a sharp descriptor, set
>     the resolution phase to BASIC (no varargs, no boxing) and we just
>     treat it as a regular call from there on. This simplified a number
>     of places (e.g. Attr.checkId and LambdaToMethod) where we needed
>     to special case polysig methods.
>
>     If backend support for polysig method is disabled (-target 6),
>     then we treat a polysig method as a varargs method; meaning that
>     we leave resolution phase as VARARGS, and then javac will do
>     regular vararg conversion (e.g. box arguments into an array and
>     pass that to the method). This of course doesn't make much sense
>     for polysig methods such as MethodHandle.invoke, but the user gets
>     what he's asking for by compiling code that has polysig call using
>     a target that doesn't know what polysig methods even are.
>
>
> With my JSR 292 hat, Polymorphic signature calls should have not been 
> allowed in 6 (-source 6), calling it as a varargs is never was you 
> want, this feature should only be enabled for 7+
> I'm not a big fan of generating a code that will not work at runtime, 
> i think it's better to explain to the user that he/she should use 
> --release 7.
> So instead of trying to revert to a basic call, i think it's better to 
> just emit an error early in Attr.
That's an option too, either error or warning.


>
>     Of course, same code would fail to compile if using --release 6
>     (as MethodHandle API was not there in 6).
>
>
> BTW, the VarHandle API also add more calls tagged with 
> @PolymorphicSignature and the semantics of a polymorphic siganture 
> calls was sightly changed, i wonder how the compiler behave when you 
> calls one of these methods with -source 7 or 8 ?
Good point; seems like whatever we do for MH in -target 6, we should do 
for VH in target < 9.

Maurizio
>
>     Webrev:
>
>     http://cr.openjdk.java.net/~mcimadamore/8203488/
>
>     Maurizio
>
>
> Rémi
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20180521/b17802d0/attachment.html>


More information about the compiler-dev mailing list