/** * */ 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.variable.ClassVariable; import soottocfg.cfg.variable.Variable; /** * @author schaef * */ public class NewStatement extends Statement { private static final long serialVersionUID = 6725099779878843508L; private final IdentifierExpression left; private final ClassVariable classVariable; Variable counterVar = null; public Expression getLeft() { return left; } public ClassVariable getClassVariable() { return this.classVariable; } /** * @param createdFrom */ public NewStatement(SourceLocation loc, IdentifierExpression lhs, ClassVariable classVar) { super(loc); this.left = lhs; this.classVariable = classVar; } public NewStatement(SourceLocation loc, IdentifierExpression lhs, ClassVariable classVar, Variable cvar) { super(loc); this.left = lhs; this.classVariable = classVar; this.counterVar = cvar; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(this.left); sb.append(" := new "); sb.append(this.classVariable); 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>(); res.add(left); return res; } /* * TODO: the counter var is just a hacky way to keep track * of the current heap counter. Later, we could use different * heap counters to keep track of how many objects of a particular * type can be allocated and how many objects are allocated in a * certain scope. */ public void setCounterVar(Variable v) { this.counterVar = v; } public Variable getCounterVar() { return this.counterVar; } @Override public NewStatement deepCopy() { return new NewStatement(getSourceLocation(), left.deepCopy(), this.classVariable, this.counterVar); } @Override public NewStatement substitute(Map<Variable, Variable> subs) { ClassVariable cv = this.classVariable; if (subs.containsKey(cv)) { cv = (ClassVariable)subs.get(cv); } return new NewStatement(getSourceLocation(), left.substitute(subs), cv, this.counterVar); } @Override public NewStatement substituteVarWithExpression(Map<Variable, Expression> subs) { return this.deepCopy(); } }