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 BitwiseAssignExpr extends AssignExpr { 40 41 public Type discoverType() { 42 Type ty1 = lhs.getType(); 43 Type ty2 = rhs.getType(); 44 if (! (((ty1 instanceof IntegralType) 45 && (ty2 instanceof IntegralType)) 46 || ((ty1 instanceof BooleanType) 47 && (ty2 instanceof BooleanType)))) { 48 showOperatorTypeError(op, ty1, ty2); 49 } 50 return ty1; 51 } 52 53 56 public void walkFlow(FlowCheckerPass w) { 60 super.walkFlow(w); 61 if (getType().isBoolean()) { 62 w.setVars(w.getVars().getTrue().join(w.getVars().getFalse())); 63 } 64 } 65 66 protected void cgValue(CodeBuilder cb) { 69 cgValueEffect(cb, true); 70 } 71 protected void cgEffect(CodeBuilder cb) { 72 cgValueEffect(cb, false); 73 } 74 private void cgValueEffect(CodeBuilder cb, boolean needsValue) { 75 AssignableExpr lhs = getLhs(); 76 Expr rhs = getRhs(); 77 Type lhsTy = lhs.getType(); 78 Type rhsTy = rhs.getType(); 79 String op = getOp(); 80 Type ty = (lhsTy instanceof BooleanType) 81 ? lhsTy 82 : getTypeManager().binaryNumericPromotion(lhsTy, rhsTy); 83 lhs.cgLvalue(cb); 84 lhs.cgDupLvalue(cb); 85 lhs.cgLtoRvalue(cb); 86 lhsTy.emitCast(cb, ty); 87 rhs.cgValue(cb, ty); 88 ty.emitBitwiseOp(cb, op); 89 ty.emitCast(cb, lhsTy); 90 if (needsValue) lhs.cgDupRvalue(cb); 91 lhs.cgAssignment(cb); 92 } 93 94 96 public BitwiseAssignExpr(SourceLocation location, AssignableExpr _lhs, String _op, Expr _rhs) { 97 super(location, _lhs, _op, _rhs); 98 99 } 100 protected BitwiseAssignExpr(SourceLocation source) { 101 super(source); 102 } 103 104 public ASTObject copyWalk(CopyWalker walker) { 105 BitwiseAssignExpr ret = new BitwiseAssignExpr(getSourceLocation()); 106 ret.preCopy(walker, this); 107 if (lhs != null) ret.setLhs( (AssignableExpr)walker.process(lhs) ); 108 ret.op = op; 109 if (rhs != null) ret.setRhs( (Expr)walker.process(rhs) ); 110 return ret; 111 } 112 113 114 public String getDefaultDisplayName() { 115 return "BitwiseAssignExpr(op: "+op+")"; 116 } 117 118 } 120 | Popular Tags |