[lworld] RFR: 8244982: [lworld] Javac does not compile test/jdk/valhalla/valuetypes/StreamTest.java anymore
Srikanth Adayapalam
sadayapalam at openjdk.java.net
Fri May 15 05:14:36 UTC 2020
Jim, could you please review this fix ? Here is some background:
ATM, we infer (by design) Arrays.stream(X[]) to be a Stream<X.ref> (and not as
Stream<X\> as the latter is malformed as of now) and so the method reference X::data
ends up with a receiver type of X.ref instead of X.
Until such time JLS 15.13.1 (Compile-Time Declaration of a Method Reference) is
amended to account for inline widening/narrowing conversions, this is ilegal
code (as there is no subtyping relationship between X.ref and X) and to make it
work the test has to be changed to use X.ref::data instead of X::data
With this change, the test code would compile, but in order to be able to run it
we need a further tweak in LambdaToMethod. Since in the present code generation
scheme, X$ref.class files are completely empty, lambda meta factory would go looking
for a method data() in X$ref during bootstrap and this would result in a
NoSuchMethodError. To workaround that, we use a tried and tested trick in javac
land where we fold the method reference into a lambda and in the lambda body apply
suitable inline conversions.
So the method reference X.ref::data gets transformed into an equivalent lambda
(Object rec$)->((X.ref)rec$).data()
in com.sun.tools.javac.comp.LambdaToMethod.MemberReferenceToLambda#lambda
This also has the "wrong" receiver, but we already have code in
com.sun.tools.javac.jvm.TransValues#visitSelect to sharpen the receiver and
make it ((X)(X.ref)rec$).data()
Finally, there also a change in TransValues that is not essential to this fix,
but is related. We were inadvertantly changing a local variable (only) without
really changing the AST (as we should). This is corrected now.
(If you are wondering how despite this things were working, that is because
com.sun.tools.javac.jvm.Gen#binaryQualifier was covering for us. It is not
incorrect to let com.sun.tools.javac.jvm.Gen#binaryQualifier handle it, but
is a waste of resource in that it creates an additional clone, while we
already have a clone handy)
-------------
Commit messages:
- 8244982: Javac does not compile test/jdk/valhalla/valuetypes/StreamTest.java anymore
Changes: https://git.openjdk.java.net/valhalla/pull/48/files
Webrev: https://webrevs.openjdk.java.net/valhalla/48/webrev.00
Issue: https://bugs.openjdk.java.net/browse/JDK-8244982
Stats: 85 lines in 4 files changed: 82 ins; 0 del; 3 mod
Patch: https://git.openjdk.java.net/valhalla/pull/48.diff
Fetch: git fetch https://git.openjdk.java.net/valhalla pull/48/head:pull/48
PR: https://git.openjdk.java.net/valhalla/pull/48
More information about the valhalla-dev
mailing list