1 24 25 package org.aspectj.compiler.base.ast; 26 27 import org.aspectj.compiler.base.AssignmentCheckerPass; 28 import org.aspectj.compiler.base.*; 29 import org.aspectj.compiler.crosscuts.AccessFixer; 30 31 import java.util.*; 32 33 import org.aspectj.compiler.base.bcg.CodeBuilder; 34 35 39 public class NumericAssignExpr extends AssignExpr { 40 41 public Type discoverType() { 42 Type ty1 = lhs.getType(); 43 Type ty2 = rhs.getType(); 44 if (! ((ty1 instanceof NumericType) 45 && (ty2 instanceof NumericType))) { 46 showOperatorTypeError(op, ty1, ty2); 47 } 48 return ty1; 49 } 50 51 protected void cgValue(CodeBuilder cb) { 54 cgValueEffect(cb, true); 55 } 56 protected void cgEffect(CodeBuilder cb) { 57 cgValueEffect(cb, false); 58 } 59 private void cgValueEffect(CodeBuilder cb, boolean needsValue) { 60 AssignableExpr lhs = getLhs(); 61 Expr rhs = getRhs(); 62 Type lhsTy = lhs.getType(); 63 Type rhsTy = rhs.getType(); 64 String op = getOp(); 65 Type ty = getTypeManager().binaryNumericPromotion(lhsTy, rhsTy); 66 lhs.cgLvalue(cb); 67 lhs.cgDupLvalue(cb); 68 lhs.cgLtoRvalue(cb); 69 lhsTy.emitCast(cb, ty); 70 rhs.cgValue(cb, ty); 71 ty.emitNumericOp(cb, op); 72 ty.emitCast(cb, lhsTy); 73 if (needsValue) lhs.cgDupRvalue(cb); 74 lhs.cgAssignment(cb); 75 } 76 77 79 public NumericAssignExpr(SourceLocation location, AssignableExpr _lhs, String _op, Expr _rhs) { 80 super(location, _lhs, _op, _rhs); 81 82 } 83 protected NumericAssignExpr(SourceLocation source) { 84 super(source); 85 } 86 87 public ASTObject copyWalk(CopyWalker walker) { 88 NumericAssignExpr ret = new NumericAssignExpr(getSourceLocation()); 89 ret.preCopy(walker, this); 90 if (lhs != null) ret.setLhs( (AssignableExpr)walker.process(lhs) ); 91 ret.op = op; 92 if (rhs != null) ret.setRhs( (Expr)walker.process(rhs) ); 93 return ret; 94 } 95 96 97 public String getDefaultDisplayName() { 98 return "NumericAssignExpr(op: "+op+")"; 99 } 100 101 } 103 | Popular Tags |