1 //
2 // ExpressionDecoderAdapter.cs
3 //
4 // Authors:
5 //	Alexander Chebaturkin (chebaturkin@gmail.com)
6 //
7 // Copyright (C) 2012 Alexander Chebaturkin
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 
29 using System;
30 using Mono.CodeContracts.Static.AST;
31 using Mono.CodeContracts.Static.AST.Visitors;
32 using Mono.CodeContracts.Static.Analysis.HeapAnalysis;
33 using Mono.CodeContracts.Static.ControlFlow;
34 
35 namespace Mono.CodeContracts.Static.Analysis.ExpressionAnalysis {
36 	struct ExpressionDecoderAdapter<SymbolicValue, Data, Result, Visitor>
37 		: IExpressionILVisitor<APC, SymbolicValue, SymbolicValue, Data, Result>
38 		where SymbolicValue : IEquatable<SymbolicValue>
39 		where Visitor : ISymbolicExpressionVisitor<LabeledSymbol<APC, SymbolicValue>, LabeledSymbol<APC, SymbolicValue>, SymbolicValue, Data, Result> {
40 
41 		private readonly Visitor visitor;
42 
ExpressionDecoderAdapterMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter43 		public ExpressionDecoderAdapter (Visitor visitor)
44 		{
45 			this.visitor = visitor;
46 		}
47 
48 		#region Implementation of IExpressionILVisitor<APC,Type,SymbolicValue,SymbolicValue,Data,Result>
BinaryMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter49 		public Result Binary (APC pc, BinaryOperator op, SymbolicValue dest, SymbolicValue operand1, SymbolicValue operand2, Data data)
50 		{
51 			return this.visitor.Binary (Unrefine (pc, dest), op, dest, Unrefine (pc, operand1), Unrefine (pc, operand2), data);
52 		}
53 
IsinstMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter54 		public Result Isinst (APC pc, TypeNode type, SymbolicValue dest, SymbolicValue obj, Data data)
55 		{
56 			return this.visitor.Isinst (Unrefine (pc, dest), type, dest, Unrefine (pc, obj), data);
57 		}
58 
LoadNullMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter59 		public Result LoadNull (APC pc, SymbolicValue dest, Data polarity)
60 		{
61 			return this.visitor.LoadNull (Unrefine (pc, dest), dest, polarity);
62 		}
63 
LoadConstMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter64 		public Result LoadConst (APC pc, TypeNode type, object constant, SymbolicValue dest, Data data)
65 		{
66 			return this.visitor.LoadConst (Unrefine (pc, dest), type, constant, dest, data);
67 		}
68 
SizeofMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter69 		public Result Sizeof (APC pc, TypeNode type, SymbolicValue dest, Data data)
70 		{
71 			return this.visitor.Sizeof (Unrefine (pc, dest), type, dest, data);
72 		}
73 
UnaryMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter74 		public Result Unary (APC pc, UnaryOperator op, bool unsigned, SymbolicValue dest, SymbolicValue source, Data data)
75 		{
76 			return this.visitor.Unary (Unrefine (pc, dest), op, unsigned, dest, Unrefine (pc, source), data);
77 		}
78 
UnrefineMono.CodeContracts.Static.Analysis.ExpressionAnalysis.ExpressionDecoderAdapter79 		private LabeledSymbol<APC, SymbolicValue> Unrefine (APC pc, SymbolicValue dest)
80 		{
81 			return new LabeledSymbol<APC, SymbolicValue> (pc, dest);
82 		}
83 		#endregion
84 	}
85 }
86