/** * */ package soottocfg.cfg.statement; import java.util.HashSet; import java.util.Map; import java.util.Set; import soottocfg.cfg.SourceLocation; import soottocfg.cfg.expression.Expression; import soottocfg.cfg.expression.IdentifierExpression; import soottocfg.cfg.expression.literal.BooleanLiteral; import soottocfg.cfg.expression.literal.IntegerLiteral; import soottocfg.cfg.type.BoolType; import soottocfg.cfg.variable.Variable; import soottocfg.soot.util.SootTranslationHelpers; /** * @author schaef * */ public class AssignStatement extends Statement { private static final long serialVersionUID = 6725099779878843508L; private Expression left, right; public Expression getLeft() { return left; } public Expression getRight() { return right; } /** * @param createdFrom */ public AssignStatement(SourceLocation loc, Expression lhs, Expression rhs) { super(loc); if (lhs.getType().getClass() != rhs.getType().getClass() && !SootTranslationHelpers.v().getMemoryModel().isNullReference(rhs)) { // TODO: this should be somewhere in the translation. if (lhs.getType() == BoolType.instance() && rhs instanceof IntegerLiteral) { if (((IntegerLiteral) rhs).getValue() == 0L) { rhs = BooleanLiteral.falseLiteral(); } else if (((IntegerLiteral) rhs).getValue() == 1L) { rhs = BooleanLiteral.trueLiteral(); } else { throw new RuntimeException("Assignment statement not implemented for bool/int mix."); } } } this.left = lhs; this.right = rhs; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(this.left); sb.append(" := "); sb.append(this.right); return sb.toString(); } @Override public Set<IdentifierExpression> getUseIdentifierExpressions() { Set<IdentifierExpression> used = new HashSet<IdentifierExpression>(); used.addAll(right.getUseIdentifierExpressions()); return used; } @Override public Set<IdentifierExpression> getDefIdentifierExpressions() { Set<IdentifierExpression> res = new HashSet<IdentifierExpression>(); if (left instanceof IdentifierExpression) { res.add((IdentifierExpression)left); } else { throw new RuntimeException("Did not consider the case where lhs is not an IdentifierExpression."); } return res; } @Override public Statement deepCopy() { return new AssignStatement(getSourceLocation(), left.deepCopy(), right.deepCopy()); } @Override public AssignStatement substitute(Map<Variable, Variable> subs) { return new AssignStatement(getSourceLocation(), left.substitute(subs), right.substitute(subs)); } @Override public AssignStatement substituteVarWithExpression(Map<Variable, Expression> subs) { return new AssignStatement(getSourceLocation(), left.deepCopy(), right.substituteVarWithExpression(subs)); } }