annotate Source/Aspects/Builders/ClearCacheAspectBuilder.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using BLToolkit.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.TypeBuilder.Builders;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 namespace BLToolkit.Aspects.Builders
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 public class ClearCacheAspectBuilder : AbstractTypeBuilderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public ClearCacheAspectBuilder(Type declaringType, string methodName, Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 _declaringType = declaringType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 _methodName = methodName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 _parameterTypes = parameterTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 private readonly Type _declaringType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 private readonly string _methodName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 private readonly Type[] _parameterTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public override int GetPriority(BuildContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 return TypeBuilderConsts.Priority.ClearCacheAspect;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 if (context == null) throw new ArgumentNullException("context");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 return context.IsFinallyStep && context.IsMethodOrProperty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 #region Build
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 private static int _methodCounter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 public override void Build(BuildContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 Context = context;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 if (string.IsNullOrEmpty(_methodName))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 FieldBuilder type = Context.CreatePrivateStaticField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 "_type$ClearCacheAspect$" + ++_methodCounter, typeof(Type));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 Label checkType = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 .ldsfld (type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 .brtrue_s (checkType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 .LoadType (_declaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 .call (typeof(ClearCacheAspect), "GetType", typeof(object), typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 .stsfld (type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 .MarkLabel (checkType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 .ldsfld (type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 .call (typeof(CacheAspect), "ClearCache", typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 FieldBuilder methodInfo = Context.CreatePrivateStaticField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 "_methodInfo$ClearCacheAspect$" + ++_methodCounter, typeof(MethodInfo));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 EmitHelper emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 Label checkMethodInfo = emit.DefineLabel();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 .ldsfld (methodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 .brtrue_s (checkMethodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 .LoadType (_declaringType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 .ldstrEx (_methodName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 if (_parameterTypes == null || _parameterTypes.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 emit.ldnull.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 LocalBuilder field = emit.DeclareLocal(typeof(Type[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 .ldc_i4_ (_parameterTypes.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 .newarr (typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 .stloc (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 for (int i = 0; i < _parameterTypes.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 .ldloc (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 .ldc_i4 (i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 .LoadType (_parameterTypes[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 emit.ldloc(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 .call (typeof(ClearCacheAspect), "GetMethodInfo", typeof(object), typeof(Type), typeof(string), typeof(Type[]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 .stsfld (methodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 .MarkLabel (checkMethodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 .ldsfld (methodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 .call (typeof(CacheAspect), "ClearCache", typeof(MethodInfo))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 }