equal
deleted
inserted
replaced
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) { |