summaryrefslogtreecommitdiff
path: root/Source/Core/Duplicator.cs
diff options
context:
space:
mode:
authorGravatar wuestholz <unknown>2014-10-17 11:37:39 +0200
committerGravatar wuestholz <unknown>2014-10-17 11:37:39 +0200
commit3845d4e0bcf52113a60d0a360cf25e9e4a33e2d5 (patch)
treed7a7548785c5e7bfa99bb9c600611d154120aa60 /Source/Core/Duplicator.cs
parente2e2e2c05612d10a227c4aec53cf7b80f7dc38ea (diff)
Worked on the verification result caching.
Diffstat (limited to 'Source/Core/Duplicator.cs')
-rw-r--r--Source/Core/Duplicator.cs17
1 files changed, 14 insertions, 3 deletions
diff --git a/Source/Core/Duplicator.cs b/Source/Core/Duplicator.cs
index 565b2f06..d9a35174 100644
--- a/Source/Core/Duplicator.cs
+++ b/Source/Core/Duplicator.cs
@@ -479,29 +479,40 @@ namespace Microsoft.Boogie {
public delegate Expr/*?*/ Substitution(Variable/*!*/ v);
public static class Substituter {
- public static Substitution SubstitutionFromHashtable(Dictionary<Variable, Expr> map) {
+ public static Substitution SubstitutionFromHashtable(Dictionary<Variable, Expr> map, bool fallBackOnName = false)
+ {
Contract.Requires(map != null);
Contract.Ensures(Contract.Result<Substitution>() != null);
// TODO: With Whidbey, could use anonymous functions.
- return new Substitution(new CreateSubstitutionClosure(map).Method);
+ return new Substitution(new CreateSubstitutionClosure(map, fallBackOnName).Method);
}
private sealed class CreateSubstitutionClosure {
Dictionary<Variable /*!*/, Expr /*!*/>/*!*/ map;
+ Dictionary<string /*!*/, Expr /*!*/>/*!*/ nameMap;
[ContractInvariantMethod]
void ObjectInvariant() {
Contract.Invariant(map != null);
}
- public CreateSubstitutionClosure(Dictionary<Variable, Expr> map)
+ public CreateSubstitutionClosure(Dictionary<Variable, Expr> map, bool fallBackOnName = false)
: base() {
Contract.Requires(map != null);
this.map = map;
+ if (fallBackOnName)
+ {
+ this.nameMap = map.ToDictionary(kv => kv.Key.Name, kv => kv.Value);
+ }
}
public Expr/*?*/ Method(Variable v) {
Contract.Requires(v != null);
if(map.ContainsKey(v)) {
return map[v];
}
+ Expr e;
+ if (nameMap != null && nameMap.TryGetValue(v.Name, out e))
+ {
+ return e;
+ }
return null;
}
}