/*
* Context.java - This file is part of the Jakstab project.
* Copyright 2007-2015 Johannes Kinder <jk@jakstab.org>
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, see <http://www.gnu.org/licenses/>.
*/
package org.jakstab.rtl;
import java.util.*;
import org.jakstab.rtl.expressions.*;
/**
* A context used for evaluating expressions.
*
* @author Johannes Kinder
*/
public class Context {
private Map<Writable, RTLExpression> substitutions;
private Map<Writable, RTLExpression> assignments;
public Context() {
this.substitutions = new HashMap<Writable, RTLExpression>();
this.assignments = new LinkedHashMap<Writable, RTLExpression>();
}
/**
* Copy constructor.
*
* @param proto
*/
public Context(Context proto) {
this();
substitutions.putAll(proto.substitutions);
assignments.putAll(proto.assignments);
}
/**
* Substitutes a variable or memory location with another expression in this context.
*
* @param w the variable or memory location to substitute
* @param expr the substitute
*/
public void substitute(Writable w, RTLExpression expr) {
assert (!(w instanceof RTLBitRange));
this.substitutions.put(w, expr);
}
/**
* Assigns a variable or memory location with a value in this context.
*/
public void addAssignment(Writable w, RTLExpression expr) {
assert (!(w instanceof RTLBitRange));
this.assignments.put(w, expr);
}
public boolean removeAssignment(Writable var) {
return this.assignments.remove(var) != null ? true : false;
}
public boolean removeAssignment(SetOfVariables var) {
return this.assignments.keySet().removeAll(var);
}
/**
* Returns the substitute for a specific variable or memory location
* in this context. If there is no substitute, returns the parameter.
*
* @param w the variable or memory location to be queried
* @return the substitute of w in this context
*/
public RTLExpression getSubstitution(Writable w) {
RTLExpression result = substitutions.get(w);
if (result != null)
return result;
else
return w;
}
/**
* Returns the value assigned to a variable or memory location
* in this context.
*
* @param w the variable or memory location
* @return the assigned value for w, or null if there is no value assigned
*/
public RTLExpression getAssignment(Writable w) {
RTLExpression result = assignments.get(w);
if (result != null)
return result;
else
return w;
}
public Map<Writable, RTLExpression> getAssignments() {
return assignments;
}
}