langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java
changeset 40306 1a0fcaf3f2ed
parent 40236 48d9e26a8fa4
child 42407 f3702cff2933
equal deleted inserted replaced
40305:4262ef5fc5f0 40306:1a0fcaf3f2ed
  3182             result = tree;
  3182             result = tree;
  3183         }
  3183         }
  3184     }
  3184     }
  3185 
  3185 
  3186     public void visitAssignop(final JCAssignOp tree) {
  3186     public void visitAssignop(final JCAssignOp tree) {
  3187         JCTree lhsAccess = access(TreeInfo.skipParens(tree.lhs));
       
  3188         final boolean boxingReq = !tree.lhs.type.isPrimitive() &&
  3187         final boolean boxingReq = !tree.lhs.type.isPrimitive() &&
  3189             tree.operator.type.getReturnType().isPrimitive();
  3188             tree.operator.type.getReturnType().isPrimitive();
  3190 
  3189 
  3191         if (boxingReq || lhsAccess.hasTag(APPLY)) {
  3190         AssignopDependencyScanner depScanner = new AssignopDependencyScanner(tree);
       
  3191         depScanner.scan(tree.rhs);
       
  3192 
       
  3193         if (boxingReq || depScanner.dependencyFound) {
  3192             // boxing required; need to rewrite as x = (unbox typeof x)(x op y);
  3194             // boxing required; need to rewrite as x = (unbox typeof x)(x op y);
  3193             // or if x == (typeof x)z then z = (unbox typeof x)((typeof x)z op y)
  3195             // or if x == (typeof x)z then z = (unbox typeof x)((typeof x)z op y)
  3194             // (but without recomputing x)
  3196             // (but without recomputing x)
  3195             JCTree newTree = abstractLval(tree.lhs, new TreeBuilder() {
  3197             JCTree newTree = abstractLval(tree.lhs, new TreeBuilder() {
  3196                     public JCExpression build(final JCExpression lhs) {
  3198                     public JCExpression build(final JCExpression lhs) {
  3233               : tree.rhs;
  3235               : tree.rhs;
  3234             app.args = List.of(rhs).prependList(app.args);
  3236             app.args = List.of(rhs).prependList(app.args);
  3235             result = app;
  3237             result = app;
  3236         } else {
  3238         } else {
  3237             result = tree;
  3239             result = tree;
       
  3240         }
       
  3241     }
       
  3242 
       
  3243     class AssignopDependencyScanner extends TreeScanner {
       
  3244 
       
  3245         Symbol sym;
       
  3246         boolean dependencyFound = false;
       
  3247 
       
  3248         AssignopDependencyScanner(JCAssignOp tree) {
       
  3249             this.sym = TreeInfo.symbol(tree.lhs);
       
  3250         }
       
  3251 
       
  3252         @Override
       
  3253         public void scan(JCTree tree) {
       
  3254             if (tree != null && sym != null) {
       
  3255                 tree.accept(this);
       
  3256             }
       
  3257         }
       
  3258 
       
  3259         @Override
       
  3260         public void visitAssignop(JCAssignOp tree) {
       
  3261             if (TreeInfo.symbol(tree.lhs) == sym) {
       
  3262                 dependencyFound = true;
       
  3263                 return;
       
  3264             }
       
  3265             super.visitAssignop(tree);
       
  3266         }
       
  3267 
       
  3268         @Override
       
  3269         public void visitUnary(JCUnary tree) {
       
  3270             if (TreeInfo.symbol(tree.arg) == sym) {
       
  3271                 dependencyFound = true;
       
  3272                 return;
       
  3273             }
       
  3274             super.visitUnary(tree);
  3238         }
  3275         }
  3239     }
  3276     }
  3240 
  3277 
  3241     /** Lower a tree of the form e++ or e-- where e is an object type */
  3278     /** Lower a tree of the form e++ or e-- where e is an object type */
  3242     JCExpression lowerBoxedPostop(final JCUnary tree) {
  3279     JCExpression lowerBoxedPostop(final JCUnary tree) {