Skip to content

Commit ed8888e

Browse files
NH-3964 - cache other reflections which should be cached.
1 parent 79d923b commit ed8888e

File tree

4 files changed

+23
-19
lines changed

4 files changed

+23
-19
lines changed

src/NHibernate/Bytecode/EmitUtil.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,25 +188,25 @@ public static void EmitLoadType(ILGenerator il, System.Type type)
188188
il.Emit(OpCodes.Call, typeof(System.Type).GetMethod("GetTypeFromHandle"));
189189
}
190190

191+
private static readonly MethodInfo GetMethodFromHandle = typeof(MethodBase).GetMethod(
192+
"GetMethodFromHandle", new System.Type[] { typeof(RuntimeMethodHandle) });
193+
191194
public static void EmitLoadMethodInfo(ILGenerator il, MethodInfo methodInfo)
192195
{
193196
il.Emit(OpCodes.Ldtoken, methodInfo);
194-
il.Emit(
195-
OpCodes.Call,
196-
typeof(MethodBase).GetMethod(
197-
"GetMethodFromHandle", new System.Type[] {typeof(RuntimeMethodHandle)}));
197+
il.Emit(OpCodes.Call, GetMethodFromHandle);
198198
il.Emit(OpCodes.Castclass, typeof(MethodInfo));
199199
}
200200

201-
public static void EmitCreateDelegateInstance(ILGenerator il, System.Type delegateType, MethodInfo methodInfo)
202-
{
203-
MethodInfo createDelegate = typeof(Delegate).GetMethod(
201+
private static readonly MethodInfo CreateDelegate = typeof(Delegate).GetMethod(
204202
"CreateDelegate", BindingFlags.Static | BindingFlags.Public | BindingFlags.ExactBinding, null,
205-
new System.Type[] {typeof(System.Type), typeof(MethodInfo)}, null);
203+
new System.Type[] { typeof(System.Type), typeof(MethodInfo) }, null);
206204

205+
public static void EmitCreateDelegateInstance(ILGenerator il, System.Type delegateType, MethodInfo methodInfo)
206+
{
207207
EmitLoadType(il, delegateType);
208208
EmitLoadMethodInfo(il, methodInfo);
209-
il.EmitCall(OpCodes.Call, createDelegate, null);
209+
il.EmitCall(OpCodes.Call, CreateDelegate, null);
210210
il.Emit(OpCodes.Castclass, delegateType);
211211
}
212212
}

src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ private static void EmitCastToReference(ILGenerator il, System.Type type)
118118
}
119119
}
120120

121+
private static readonly MethodInfo GetterCallbackInvoke = typeof (GetterCallback).GetMethod(
122+
"Invoke", new[] { typeof (object), typeof (int) });
123+
121124
/// <summary>
122125
/// Generates a dynamic method on the given type.
123126
/// </summary>
@@ -163,8 +166,7 @@ private GetPropertyValuesInvoker GenerateGetPropertyValuesMethod(IGetter[] gette
163166
else
164167
{
165168
// using the getter itself via a callback
166-
MethodInfo invokeMethod = typeof (GetterCallback).GetMethod("Invoke",
167-
new[] {typeof (object), typeof (int)});
169+
MethodInfo invokeMethod = GetterCallbackInvoke;
168170
il.Emit(OpCodes.Ldarg_1);
169171
il.Emit(OpCodes.Ldarg_0);
170172
il.Emit(OpCodes.Ldc_I4, i);
@@ -182,6 +184,9 @@ private GetPropertyValuesInvoker GenerateGetPropertyValuesMethod(IGetter[] gette
182184
return (GetPropertyValuesInvoker) method.CreateDelegate(typeof (GetPropertyValuesInvoker));
183185
}
184186

187+
private static readonly MethodInfo SetterCallbackInvoke = typeof(SetterCallback).GetMethod(
188+
"Invoke", new[] { typeof(object), typeof(int), typeof(object) });
189+
185190
/// <summary>
186191
/// Generates a dynamic method on the given type.
187192
/// </summary>
@@ -224,8 +229,7 @@ private SetPropertyValuesInvoker GenerateSetPropertyValuesMethod(ISetter[] sette
224229
else
225230
{
226231
// using the setter itself via a callback
227-
MethodInfo invokeMethod = typeof (SetterCallback).GetMethod("Invoke",
228-
new[] {typeof (object), typeof (int), typeof (object)});
232+
MethodInfo invokeMethod = SetterCallbackInvoke;
229233
il.Emit(OpCodes.Ldarg_2);
230234
il.Emit(OpCodes.Ldarg_0);
231235
il.Emit(OpCodes.Ldc_I4, i);

src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ internal class DefaultMethodEmitter : IMethodBodyEmitter
2424
private static readonly MethodInfo getMethodFromHandle = typeof (MethodBase).GetMethod("GetMethodFromHandle", new[] {typeof (RuntimeMethodHandle)});
2525
private static readonly MethodInfo getTypeFromHandle = typeof(System.Type).GetMethod("GetTypeFromHandle");
2626
private static readonly MethodInfo handlerMethod = typeof (IInterceptor).GetMethod("Intercept");
27+
private static readonly MethodInfo getArguments = typeof(InvocationInfo).GetMethod("get_Arguments");
2728

2829
private static readonly ConstructorInfo infoConstructor = typeof (InvocationInfo).GetConstructor(new[]
2930
{
@@ -118,7 +119,6 @@ private static void EmitBaseMethodCall(ILGenerator IL, MethodInfo method)
118119
private static void SaveRefArguments(ILGenerator IL, ParameterInfo[] parameters)
119120
{
120121
// Save the arguments returned from the handler method
121-
MethodInfo getArguments = typeof (InvocationInfo).GetMethod("get_Arguments");
122122
IL.Emit(OpCodes.Ldloc_1);
123123
IL.Emit(OpCodes.Call, getArguments);
124124
IL.Emit(OpCodes.Stloc_0);

src/NHibernate/Proxy/DynamicProxy/ProxyImplementor.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ internal class ProxyImplementor
1818
MethodAttributes.SpecialName | MethodAttributes.NewSlot |
1919
MethodAttributes.Virtual;
2020

21+
private static readonly MethodInfo OriginalSetter = typeof(IProxy).GetMethod("set_Interceptor");
22+
private static readonly MethodInfo OriginalGetter = typeof(IProxy).GetMethod("get_Interceptor");
23+
2124
private FieldBuilder field;
2225

2326
public FieldBuilder InterceptorField
@@ -54,11 +57,8 @@ public void ImplementProxy(TypeBuilder typeBuilder)
5457
IL.Emit(OpCodes.Stfld, field);
5558
IL.Emit(OpCodes.Ret);
5659

57-
MethodInfo originalSetter = typeof (IProxy).GetMethod("set_Interceptor");
58-
MethodInfo originalGetter = typeof (IProxy).GetMethod("get_Interceptor");
59-
60-
typeBuilder.DefineMethodOverride(setterMethod, originalSetter);
61-
typeBuilder.DefineMethodOverride(getterMethod, originalGetter);
60+
typeBuilder.DefineMethodOverride(setterMethod, OriginalSetter);
61+
typeBuilder.DefineMethodOverride(getterMethod, OriginalGetter);
6262
}
6363
}
6464
}

0 commit comments

Comments
 (0)