src/share/classes/com/sun/tools/javac/comp/Lower.java

changeset 133
c0372d1097c0
parent 113
eff38cc97183
child 237
9711a6c2db7e
equal deleted inserted replaced
132:a54ef8459576 133:c0372d1097c0
1882 } 1882 }
1883 }); 1883 });
1884 } 1884 }
1885 }); 1885 });
1886 } 1886 }
1887 case JCTree.TYPECAST: {
1888 return abstractLval(((JCTypeCast)lval).expr, builder);
1889 }
1887 } 1890 }
1888 throw new AssertionError(lval); 1891 throw new AssertionError(lval);
1889 } 1892 }
1890 1893
1891 // evaluate and discard the first expression, then evaluate the second. 1894 // evaluate and discard the first expression, then evaluate the second.
2711 if (!tree.lhs.type.isPrimitive() && 2714 if (!tree.lhs.type.isPrimitive() &&
2712 tree.operator.type.getReturnType().isPrimitive()) { 2715 tree.operator.type.getReturnType().isPrimitive()) {
2713 // boxing required; need to rewrite as x = (unbox typeof x)(x op y); 2716 // boxing required; need to rewrite as x = (unbox typeof x)(x op y);
2714 // or if x == (typeof x)z then z = (unbox typeof x)((typeof x)z op y) 2717 // or if x == (typeof x)z then z = (unbox typeof x)((typeof x)z op y)
2715 // (but without recomputing x) 2718 // (but without recomputing x)
2716 JCTree arg = (tree.lhs.getTag() == JCTree.TYPECAST) 2719 JCTree newTree = abstractLval(tree.lhs, new TreeBuilder() {
2717 ? ((JCTypeCast)tree.lhs).expr
2718 : tree.lhs;
2719 JCTree newTree = abstractLval(arg, new TreeBuilder() {
2720 public JCTree build(final JCTree lhs) { 2720 public JCTree build(final JCTree lhs) {
2721 int newTag = tree.getTag() - JCTree.ASGOffset; 2721 int newTag = tree.getTag() - JCTree.ASGOffset;
2722 // Erasure (TransTypes) can change the type of 2722 // Erasure (TransTypes) can change the type of
2723 // tree.lhs. However, we can still get the 2723 // tree.lhs. However, we can still get the
2724 // unerased type of tree.lhs as it is stored 2724 // unerased type of tree.lhs as it is stored
2766 JCTree lowerBoxedPostop(final JCUnary tree) { 2766 JCTree lowerBoxedPostop(final JCUnary tree) {
2767 // translate to tmp1=lval(e); tmp2=tmp1; tmp1 OP 1; tmp2 2767 // translate to tmp1=lval(e); tmp2=tmp1; tmp1 OP 1; tmp2
2768 // or 2768 // or
2769 // translate to tmp1=lval(e); tmp2=tmp1; (typeof tree)tmp1 OP 1; tmp2 2769 // translate to tmp1=lval(e); tmp2=tmp1; (typeof tree)tmp1 OP 1; tmp2
2770 // where OP is += or -= 2770 // where OP is += or -=
2771 final boolean cast = tree.arg.getTag() == JCTree.TYPECAST; 2771 final boolean cast = TreeInfo.skipParens(tree.arg).getTag() == JCTree.TYPECAST;
2772 final JCExpression arg = cast ? ((JCTypeCast)tree.arg).expr : tree.arg; 2772 return abstractLval(tree.arg, new TreeBuilder() {
2773 return abstractLval(arg, new TreeBuilder() {
2774 public JCTree build(final JCTree tmp1) { 2773 public JCTree build(final JCTree tmp1) {
2775 return abstractRval(tmp1, tree.arg.type, new TreeBuilder() { 2774 return abstractRval(tmp1, tree.arg.type, new TreeBuilder() {
2776 public JCTree build(final JCTree tmp2) { 2775 public JCTree build(final JCTree tmp2) {
2777 int opcode = (tree.getTag() == JCTree.POSTINC) 2776 int opcode = (tree.getTag() == JCTree.POSTINC)
2778 ? JCTree.PLUS_ASG : JCTree.MINUS_ASG; 2777 ? JCTree.PLUS_ASG : JCTree.MINUS_ASG;

mercurial