langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java
changeset 1468 19d266637353
parent 1260 a772ba9ba43d
child 2220 dfae517d8078
equal deleted inserted replaced
1467:290837884931 1468:19d266637353
  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;