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; |