5 // Alexander Chebaturkin (chebaturkin@gmail.com)
7 // Copyright (C) 2011 Alexander Chebaturkin
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
29 using System.Collections.Generic;
30 using Mono.CodeContracts.Static.ControlFlow;
31 using Mono.CodeContracts.Static.DataStructures;
33 namespace Mono.CodeContracts.Static.AST.Visitors
36 /// Abstract base implementation of ILVisitor
38 /// <remarks> Each (non-overriden) operation returns DefaultVisit(pc, data) </remarks>
39 abstract class ILVisitorBase<Label, Source, Dest, Data, Result>
40 : IILVisitor<Label, Source, Dest, Data, Result>
42 public abstract Result DefaultVisit(Label pc, Data data);
44 #region Implementation of IExpressionILVisitor<Label,Type,Source,Dest,Data,Result>
45 public virtual Result Binary(Label pc, BinaryOperator bop, Dest dest, Source operand1, Source operand2, Data data)
47 return DefaultVisit (pc, data);
50 public virtual Result Isinst(Label pc, TypeNode type, Dest dest, Source obj, Data data)
52 return DefaultVisit (pc, data);
55 public virtual Result LoadNull(Label pc, Dest dest, Data polarity)
57 return DefaultVisit (pc, polarity);
60 public virtual Result LoadConst(Label pc, TypeNode type, object constant, Dest dest, Data data)
62 return DefaultVisit (pc, data);
65 public virtual Result Sizeof(Label pc, TypeNode type, Dest dest, Data data)
67 return DefaultVisit (pc, data);
70 public virtual Result Unary(Label pc, UnaryOperator uop, bool unsigned, Dest dest, Source source, Data data)
72 return DefaultVisit (pc, data);
76 #region Implementation of IILVisitor<Label,Local,Parameter,Method,Field,Type,Source,Dest,Data,Result>
77 public virtual Result Arglist(Label pc, Dest dest, Data data)
79 return DefaultVisit (pc, data);
82 public virtual Result Branch(Label pc, Label target, bool leavesExceptionBlock, Data data)
84 return DefaultVisit (pc, data);
87 public virtual Result BranchCond(Label pc, Label target, BranchOperator bop, Source value1, Source value2, Data data)
89 return DefaultVisit (pc, data);
92 public virtual Result BranchTrue(Label pc, Label target, Source cond, Data data)
94 return DefaultVisit (pc, data);
97 public virtual Result BranchFalse(Label pc, Label target, Source cond, Data data)
99 return DefaultVisit (pc, data);
102 public virtual Result Break(Label pc, Data data)
104 return DefaultVisit (pc, data);
107 public virtual Result Call<TypeList, ArgList>(Label pc, Method method, bool virt, TypeList extraVarargs, Dest dest, ArgList args, Data data)
108 where TypeList : IIndexable<TypeNode> where ArgList : IIndexable<Source>
110 return DefaultVisit (pc, data);
113 public virtual Result Calli<TypeList, ArgList>(Label pc, TypeNode returnType, TypeList argTypes, bool instance, Dest dest, Source functionPointer, ArgList args, Data data)
114 where TypeList : IIndexable<TypeNode> where ArgList : IIndexable<Source>
116 return DefaultVisit (pc, data);
119 public virtual Result CheckFinite(Label pc, Dest dest, Source source, Data data)
121 return DefaultVisit (pc, data);
124 public virtual Result CopyBlock(Label pc, Source destAddress, Source srcAddress, Source len, Data data)
126 return DefaultVisit (pc, data);
129 public virtual Result EndFilter(Label pc, Source decision, Data data)
131 return DefaultVisit (pc, data);
134 public virtual Result EndFinally(Label pc, Data data)
136 return DefaultVisit (pc, data);
139 public virtual Result Jmp(Label pc, Method method, Data data)
141 return DefaultVisit (pc, data);
144 public virtual Result LoadArg(Label pc, Parameter param, bool isOld, Dest dest, Data data)
146 return DefaultVisit (pc, data);
149 public virtual Result LoadArgAddress(Label pc, Parameter param, bool isOld, Dest dest, Data data)
151 return DefaultVisit (pc, data);
154 public virtual Result LoadLocal(Label pc, Local local, Dest dest, Data data)
156 return DefaultVisit (pc, data);
159 public virtual Result LoadLocalAddress(Label pc, Local local, Dest dest, Data data)
161 return DefaultVisit (pc, data);
164 public virtual Result Nop(Label pc, Data data)
166 return DefaultVisit (pc, data);
169 public virtual Result Pop(Label pc, Source source, Data data)
171 return DefaultVisit (pc, data);
174 public virtual Result Return(Label pc, Source source, Data data)
176 return DefaultVisit (pc, data);
179 public virtual Result StoreArg(Label pc, Parameter param, Source source, Data data)
181 return DefaultVisit (pc, data);
184 public virtual Result StoreLocal(Label pc, Local local, Source source, Data data)
186 return DefaultVisit (pc, data);
189 public virtual Result Switch(Label pc, TypeNode type, IEnumerable<Pair<object, Label>> cases, Source value, Data data)
191 return DefaultVisit (pc, data);
194 public virtual Result Box(Label pc, TypeNode type, Dest dest, Source source, Data data)
196 return DefaultVisit (pc, data);
199 public virtual Result ConstrainedCallvirt<TypeList, ArgList>(Label pc, Method method, TypeNode constraint, TypeList extraVarargs, Dest dest, ArgList args, Data data)
200 where TypeList : IIndexable<TypeNode>
201 where ArgList : IIndexable<Source>
203 return DefaultVisit (pc, data);
206 public virtual Result CastClass(Label pc, TypeNode type, Dest dest, Source obj, Data data)
208 return DefaultVisit (pc, data);
211 public virtual Result CopyObj(Label pc, TypeNode type, Source destPtr, Source sourcePtr, Data data)
213 return DefaultVisit (pc, data);
216 public virtual Result Initobj(Label pc, TypeNode type, Source ptr, Data data)
218 return DefaultVisit (pc, data);
221 public virtual Result LoadElement(Label pc, TypeNode type, Dest dest, Source array, Source index, Data data)
223 return DefaultVisit (pc, data);
226 public virtual Result LoadField(Label pc, Field field, Dest dest, Source obj, Data data)
228 return DefaultVisit (pc, data);
231 public virtual Result LoadFieldAddress(Label pc, Field field, Dest dest, Source obj, Data data)
233 return DefaultVisit (pc, data);
236 public virtual Result LoadLength(Label pc, Dest dest, Source array, Data data)
238 return DefaultVisit (pc, data);
241 public virtual Result LoadStaticField(Label pc, Field field, Dest dest, Data data)
243 return DefaultVisit (pc, data);
246 public virtual Result LoadStaticFieldAddress(Label pc, Field field, Dest dest, Data data)
248 return DefaultVisit (pc, data);
251 public virtual Result LoadTypeToken(Label pc, TypeNode type, Dest dest, Data data)
253 return DefaultVisit (pc, data);
256 public virtual Result LoadFieldToken(Label pc, Field field, Dest dest, Data data)
258 return DefaultVisit (pc, data);
261 public virtual Result LoadMethodToken(Label pc, Method method, Dest dest, Data data)
263 return DefaultVisit (pc, data);
266 public virtual Result NewArray<ArgList>(Label pc, TypeNode type, Dest dest, ArgList lengths, Data data)
267 where ArgList : IIndexable<Source>
269 return DefaultVisit (pc, data);
272 public virtual Result NewObj<ArgList>(Label pc, Method ctor, Dest dest, ArgList args, Data data)
273 where ArgList : IIndexable<Source>
275 return DefaultVisit (pc, data);
278 public virtual Result MkRefAny(Label pc, TypeNode type, Dest dest, Source obj, Data data)
280 return DefaultVisit (pc, data);
283 public virtual Result RefAnyType(Label pc, Dest dest, Source source, Data data)
285 return DefaultVisit (pc, data);
288 public virtual Result RefAnyVal(Label pc, TypeNode type, Dest dest, Source source, Data data)
290 return DefaultVisit (pc, data);
293 public virtual Result Rethrow(Label pc, Data data)
295 return DefaultVisit (pc, data);
298 public virtual Result StoreElement(Label pc, TypeNode type, Source array, Source index, Source value, Data data)
300 return DefaultVisit (pc, data);
303 public virtual Result StoreField(Label pc, Field field, Source obj, Source value, Data data)
305 return DefaultVisit (pc, data);
308 public virtual Result StoreStaticField(Label pc, Field field, Source value, Data data)
310 return DefaultVisit (pc, data);
313 public virtual Result Throw(Label pc, Source exception, Data data)
315 return DefaultVisit (pc, data);
318 public virtual Result Unbox(Label pc, TypeNode type, Dest dest, Source obj, Data data)
320 return DefaultVisit (pc, data);
323 public virtual Result UnboxAny(Label pc, TypeNode type, Dest dest, Source obj, Data data)
325 return DefaultVisit (pc, data);
329 #region Implementation of ISyntheticILVisitor<Label,Method,Field,Type,Source,Dest,Data,Result>
330 public virtual Result Entry(Label pc, Method method, Data data)
332 return DefaultVisit (pc, data);
335 public virtual Result Assume(Label pc, EdgeTag tag, Source condition, Data data)
337 return DefaultVisit (pc, data);
340 public virtual Result Assert(Label pc, EdgeTag tag, Source condition, Data data)
342 return DefaultVisit (pc, data);
345 public virtual Result BeginOld(Label pc, Label matchingEnd, Data data)
347 return DefaultVisit (pc, data);
350 public virtual Result EndOld(Label pc, Label matchingBegin, TypeNode type, Dest dest, Source source, Data data)
352 return DefaultVisit (pc, data);
355 public virtual Result LoadStack(Label pc, int offset, Dest dest, Source source, bool isOld, Data data)
357 return DefaultVisit (pc, data);
360 public virtual Result LoadStackAddress(Label pc, int offset, Dest dest, Source source, TypeNode type, bool isOld, Data data)
362 return DefaultVisit (pc, data);
365 public virtual Result LoadResult(Label pc, TypeNode type, Dest dest, Source source, Data data)
367 return DefaultVisit (pc, data);