From: <fab...@us...> - 2008-11-26 12:38:56
|
Revision: 3931 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3931&view=rev Author: fabiomaulo Date: 2008-11-26 12:38:52 +0000 (Wed, 26 Nov 2008) Log Message: ----------- Fix NH-1589 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs Modified: trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs 2008-11-26 04:19:41 UTC (rev 3930) +++ trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs 2008-11-26 12:38:52 UTC (rev 3931) @@ -52,7 +52,7 @@ /// Generates a dynamic method which creates a new instance of <paramref name="type" /> /// when invoked. /// </summary> - private static CreateInstanceInvoker CreateCreateInstanceMethod(System.Type type) + protected virtual CreateInstanceInvoker CreateCreateInstanceMethod(System.Type type) { if (type.IsInterface || type.IsAbstract) { @@ -110,7 +110,7 @@ /// </summary> private GetPropertyValuesInvoker GenerateGetPropertyValuesMethod(IGetter[] getters) { - System.Type[] methodArguments = new System.Type[] {typeof (object), typeof (GetterCallback)}; + System.Type[] methodArguments = new[] {typeof (object), typeof (GetterCallback)}; DynamicMethod method = CreateDynamicMethod(typeof (object[]), methodArguments); ILGenerator il = method.GetILGenerator(); @@ -151,7 +151,7 @@ { // using the getter itself via a callback MethodInfo invokeMethod = typeof (GetterCallback).GetMethod("Invoke", - new System.Type[] {typeof (object), typeof (int)}); + new[] {typeof (object), typeof (int)}); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4, i); @@ -175,7 +175,7 @@ /// <returns></returns> private SetPropertyValuesInvoker GenerateSetPropertyValuesMethod(IGetter[] getters, ISetter[] setters) { - System.Type[] methodArguments = new System.Type[] {typeof (object), typeof (object[]), typeof (SetterCallback)}; + System.Type[] methodArguments = new[] {typeof (object), typeof (object[]), typeof (SetterCallback)}; DynamicMethod method = CreateDynamicMethod(null, methodArguments); ILGenerator il = method.GetILGenerator(); @@ -213,8 +213,7 @@ { // using the setter itself via a callback MethodInfo invokeMethod = typeof (SetterCallback).GetMethod("Invoke", - new System.Type[] - {typeof (object), typeof (int), typeof (object)}); + new[] {typeof (object), typeof (int), typeof (object)}); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4, i); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-26 13:34:03
|
Revision: 3932 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3932&view=rev Author: fabiomaulo Date: 2008-11-26 13:34:00 +0000 (Wed, 26 Nov 2008) Log Message: ----------- Minor refactoring Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs Modified: trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs 2008-11-26 12:38:52 UTC (rev 3931) +++ trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs 2008-11-26 13:34:00 UTC (rev 3932) @@ -24,9 +24,9 @@ get { return this; } } - public object CreateInstance() + public virtual object CreateInstance() { - return createInstanceMethod(); + return createInstanceMethod != null ? createInstanceMethod() : null; } /// <summary> @@ -59,7 +59,7 @@ return null; } - DynamicMethod method = new DynamicMethod(string.Empty, typeof (object), null, type, true); + var method = new DynamicMethod(string.Empty, typeof (object), null, type, true); ILGenerator il = method.GetILGenerator(); @@ -70,20 +70,31 @@ il.Emit(OpCodes.Initobj, type); il.Emit(OpCodes.Ldloc, tmpLocal); il.Emit(OpCodes.Box, type); + il.Emit(OpCodes.Ret); + + return (CreateInstanceInvoker)method.CreateDelegate(typeof(CreateInstanceInvoker)); } else { ConstructorInfo constructor = ReflectHelper.GetDefaultConstructor(type); - if (constructor == null) + if (constructor != null) { - throw new InstantiationException("Object class " + type + " must declare a default (no-argument) constructor", type); + il.Emit(OpCodes.Newobj, constructor); + il.Emit(OpCodes.Ret); + + return (CreateInstanceInvoker) method.CreateDelegate(typeof (CreateInstanceInvoker)); } - il.Emit(OpCodes.Newobj, constructor); + else + { + ThrowExceptionForNoDefaultCtor(type); + } } + return null; + } - il.Emit(OpCodes.Ret); - - return (CreateInstanceInvoker) method.CreateDelegate(typeof (CreateInstanceInvoker)); + protected virtual void ThrowExceptionForNoDefaultCtor(System.Type type) + { + throw new InstantiationException("Object class " + type + " must declare a default (no-argument) constructor", type); } protected DynamicMethod CreateDynamicMethod(System.Type returnType, System.Type[] argumentTypes) @@ -110,7 +121,7 @@ /// </summary> private GetPropertyValuesInvoker GenerateGetPropertyValuesMethod(IGetter[] getters) { - System.Type[] methodArguments = new[] {typeof (object), typeof (GetterCallback)}; + var methodArguments = new[] {typeof (object), typeof (GetterCallback)}; DynamicMethod method = CreateDynamicMethod(typeof (object[]), methodArguments); ILGenerator il = method.GetILGenerator(); @@ -139,7 +150,7 @@ il.Emit(OpCodes.Ldc_I4, i); // get the value... - IOptimizableGetter optimizableGetter = getter as IOptimizableGetter; + var optimizableGetter = getter as IOptimizableGetter; if (optimizableGetter != null) { // using the getter's emitted IL code @@ -175,7 +186,7 @@ /// <returns></returns> private SetPropertyValuesInvoker GenerateSetPropertyValuesMethod(IGetter[] getters, ISetter[] setters) { - System.Type[] methodArguments = new[] {typeof (object), typeof (object[]), typeof (SetterCallback)}; + var methodArguments = new[] {typeof (object), typeof (object[]), typeof (SetterCallback)}; DynamicMethod method = CreateDynamicMethod(null, methodArguments); ILGenerator il = method.GetILGenerator(); @@ -192,7 +203,7 @@ ISetter setter = setters[i]; System.Type valueType = getters[i].ReturnType; - IOptimizableSetter optimizableSetter = setter as IOptimizableSetter; + var optimizableSetter = setter as IOptimizableSetter; if (optimizableSetter != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-26 13:50:34
|
Revision: 3933 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3933&view=rev Author: fabiomaulo Date: 2008-11-26 13:50:31 +0000 (Wed, 26 Nov 2008) Log Message: ----------- Minor Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs Modified: trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs 2008-11-26 13:34:00 UTC (rev 3932) +++ trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/ReflectionOptimizer.cs 2008-11-26 13:50:31 UTC (rev 3933) @@ -11,7 +11,7 @@ { private readonly IAccessOptimizer accessOptimizer; private readonly CreateInstanceInvoker createInstanceMethod; - private readonly System.Type mappedType; + protected readonly System.Type mappedType; private readonly System.Type typeOfThis; public IAccessOptimizer AccessOptimizer This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |