2 using Mono.CodeContracts.Static.AST;
3 using Mono.CodeContracts.Static.AST.Visitors;
4 using Mono.CodeContracts.Static.Analysis.HeapAnalysis;
5 using Mono.CodeContracts.Static.ControlFlow;
7 namespace Mono.CodeContracts.Static.Analysis.ExpressionAnalysis {
8 struct ExpressionDecoderAdapter<SymbolicValue, Data, Result, Visitor>
9 : IExpressionILVisitor<APC, SymbolicValue, SymbolicValue, Data, Result>
10 where SymbolicValue : IEquatable<SymbolicValue>
11 where Visitor : ISymbolicExpressionVisitor<LabeledSymbol<APC, SymbolicValue>, LabeledSymbol<APC, SymbolicValue>, SymbolicValue, Data, Result> {
13 private readonly Visitor visitor;
15 public ExpressionDecoderAdapter (Visitor visitor)
17 this.visitor = visitor;
20 #region Implementation of IExpressionILVisitor<APC,Type,SymbolicValue,SymbolicValue,Data,Result>
21 public Result Binary (APC pc, BinaryOperator op, SymbolicValue dest, SymbolicValue operand1, SymbolicValue operand2, Data data)
23 return this.visitor.Binary (Unrefine (pc, dest), op, dest, Unrefine (pc, operand1), Unrefine (pc, operand2), data);
26 public Result Isinst (APC pc, TypeNode type, SymbolicValue dest, SymbolicValue obj, Data data)
28 return this.visitor.Isinst (Unrefine (pc, dest), type, dest, Unrefine (pc, obj), data);
31 public Result LoadNull (APC pc, SymbolicValue dest, Data polarity)
33 return this.visitor.LoadNull (Unrefine (pc, dest), dest, polarity);
36 public Result LoadConst (APC pc, TypeNode type, object constant, SymbolicValue dest, Data data)
38 return this.visitor.LoadConst (Unrefine (pc, dest), type, constant, dest, data);
41 public Result Sizeof (APC pc, TypeNode type, SymbolicValue dest, Data data)
43 return this.visitor.Sizeof (Unrefine (pc, dest), type, dest, data);
46 public Result Unary (APC pc, UnaryOperator op, bool unsigned, SymbolicValue dest, SymbolicValue source, Data data)
48 return this.visitor.Unary (Unrefine (pc, dest), op, unsigned, dest, Unrefine (pc, source), data);
51 private LabeledSymbol<APC, SymbolicValue> Unrefine (APC pc, SymbolicValue dest)
53 return new LabeledSymbol<APC, SymbolicValue> (pc, dest);