RFR JDK-8183548: Comma-expressions shouldn't use any temporary variable
B. Blaser
bsrbnd at gmail.com
Wed Sep 12 19:28:06 UTC 2018
Hi,
Please review the following straightforward fix for [1] to avoid using
any temporary variable in comma expressions.
It makes use of the recently (as part of [2]) enhanced 'LetExpr' to
allow more than one statement.
Any feedback is welcome (langtools:tier1 is OK),
Bernard
[1] https://bugs.openjdk.java.net/browse/JDK-8183548
[2] http://mail.openjdk.java.net/pipermail/compiler-dev/2018-July/012197.html
diff -r 3aafd7015d87
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
Wed Sep 12 14:24:17 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
Wed Sep 12 20:31:32 2018 +0200
@@ -2057,7 +2057,9 @@
// evaluate and discard the first expression, then evaluate the second.
JCExpression makeComma(final JCExpression expr1, final
JCExpression expr2) {
- return abstractRval(expr1, discarded -> expr2);
+ JCExpression res = make.LetExpr(List.of(make.Exec(expr1)), expr2);
+ res.type = expr2.type;
+ return res;
}
/**************************************************************************
diff -r 3aafd7015d87 test/langtools/tools/javac/desugar/BoxingAndSuper.java
--- a/test/langtools/tools/javac/desugar/BoxingAndSuper.java Wed
Sep 12 14:24:17 2018 +0200
+++ b/test/langtools/tools/javac/desugar/BoxingAndSuper.java Wed
Sep 12 20:31:32 2018 +0200
@@ -100,7 +100,7 @@
"p.Test.dump()java.lang.Integer\n" +
"{\n" +
" return (let /*synthetic*/ final Integer $le0 =
(Integer)super.i " +
- "in (let /*synthetic*/ final Integer $le1
= super.i = Integer.valueOf((int)(super.i.intValue() + 1)) " +
+ "in (let super.i =
Integer.valueOf((int)(super.i.intValue() + 1)); " +
"in $le0));\n" +
"}\n");
//qualified super, same package:
@@ -121,7 +121,7 @@
"p.Test.Inner.dump()java.lang.Integer\n" +
"{\n" +
" return (let /*synthetic*/ final Integer $le0 =
(Integer)Test.access$001(this$0) " +
- "in (let /*synthetic*/ final Integer $le1
= Test.access$103(this$0,
Integer.valueOf((int)(Test.access$201(this$0).intValue() + 1))) " +
+ "in (let Test.access$103(this$0,
Integer.valueOf((int)(Test.access$201(this$0).intValue() + 1))); " +
"in $le0));\n" +
"}\n" +
"p.Test.access$001(p.Test)java.lang.Integer\n" +
@@ -152,7 +152,7 @@
"p1.Test.dump()java.lang.Integer\n" +
"{\n" +
" return (let /*synthetic*/ final Integer $le0 =
(Integer)super.i " +
- "in (let /*synthetic*/ final Integer $le1
= super.i = Integer.valueOf((int)(super.i.intValue() + 1)) " +
+ "in (let super.i =
Integer.valueOf((int)(super.i.intValue() + 1)); " +
"in $le0));\n" +
"}\n");
//qualified super, different packages:
@@ -173,7 +173,7 @@
"p1.Test.Inner.dump()java.lang.Integer\n" +
"{\n" +
" return (let /*synthetic*/ final Integer $le0 =
(Integer)Test.access$001(this$0) " +
- "in (let /*synthetic*/ final Integer $le1
= Test.access$103(this$0,
Integer.valueOf((int)(Test.access$201(this$0).intValue() + 1))) " +
+ "in (let Test.access$103(this$0,
Integer.valueOf((int)(Test.access$201(this$0).intValue() + 1))); " +
"in $le0));\n" +
"}\n" +
"p1.Test.access$001(p1.Test)java.lang.Integer\n" +
@@ -201,8 +201,8 @@
String expected =
"Test.dump()void\n" +
"{\n" +
- " (let /*synthetic*/ final Integer $le0 = i in
(let /*synthetic*/ final Integer $le1 = i =
Integer.valueOf((int)(i.intValue() + 1)) in $le0));\n" +
- " (let /*synthetic*/ final Integer $le2 =
(Integer)this.i in (let /*synthetic*/ final Integer $le3 = this.i =
Integer.valueOf((int)(this.i.intValue() + 1)) in $le2));\n" +
+ " (let /*synthetic*/ final Integer $le0 = i in
(let i = Integer.valueOf((int)(i.intValue() + 1)); in $le0));\n" +
+ " (let /*synthetic*/ final Integer $le1 =
(Integer)this.i in (let this.i =
Integer.valueOf((int)(this.i.intValue() + 1)); in $le1));\n" +
"}\n";
runTest(code, expected);
//qualified this:
@@ -219,8 +219,8 @@
"Test.Inner1.Inner2.dump()java.lang.Integer\n" +
"{\n" +
" return (let /*synthetic*/ final Integer $le0 =
(Integer)this$1.this$0.i" +
- " in (let /*synthetic*/ final Integer $le1
= this$1.this$0.i = " +
-
"Integer.valueOf((int)(this$1.this$0.i.intValue() + 1)) " +
+ " in (let this$1.this$0.i = " +
+
"Integer.valueOf((int)(this$1.this$0.i.intValue() + 1)); " +
"in $le0));\n" +
"}\n"
);
@@ -329,7 +329,8 @@
LetExpr le = (LetExpr) tree;
for (JCStatement var : le.defs) {
- letExprRemap.put(((JCVariableDecl)
var).name.toString(), "$le" + i++);
+ if (var.hasTag(Tag.VARDEF))
+ letExprRemap.put(((JCVariableDecl)
var).name.toString(), "$le" + i++);
}
}
return super.visitOther(node, p);
More information about the compiler-dev
mailing list