From: <fab...@us...> - 2011-04-07 17:20:01
|
Revision: 5629 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5629&view=rev Author: fabiomaulo Date: 2011-04-07 17:19:55 +0000 (Thu, 07 Apr 2011) Log Message: ----------- Fix NH-2622 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultArgumentHandler.cs trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs trunk/nhibernate/src/NHibernate.Test/DynamicProxyTests/ProxiedMembers/Fixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/OpCodesMap.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-06 21:06:29 UTC (rev 5628) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2011-04-07 17:19:55 UTC (rev 5629) @@ -499,6 +499,7 @@ <Compile Include="Proxy\DynamicProxy\IProxy.cs" /> <Compile Include="Proxy\DynamicProxy\IProxyCache.cs" /> <Compile Include="Proxy\DynamicProxy\IProxyMethodBuilder.cs" /> + <Compile Include="Proxy\DynamicProxy\OpCodesMap.cs" /> <Compile Include="Proxy\DynamicProxy\ProxyCache.cs" /> <Compile Include="Proxy\DynamicProxy\ProxyCacheEntry.cs" /> <Compile Include="Proxy\DynamicProxy\ProxyDummy.cs" /> Modified: trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultArgumentHandler.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultArgumentHandler.cs 2011-04-06 21:06:29 UTC (rev 5628) +++ trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultArgumentHandler.cs 2011-04-07 17:19:55 UTC (rev 5629) @@ -6,7 +6,6 @@ #endregion -using System; using System.Reflection; using System.Reflection.Emit; @@ -37,7 +36,7 @@ int argumentPosition = 1; foreach (ParameterInfo param in parameters) { - System.Type parameterType = param.ParameterType; + System.Type parameterType = param.ParameterType.IsByRef ? param.ParameterType.GetElementType() : param.ParameterType; // args[N] = argumentN (pseudocode) IL.Emit(OpCodes.Ldloc_S, 0); IL.Emit(OpCodes.Ldc_I4, index); @@ -54,9 +53,17 @@ IL.Emit(OpCodes.Ldarg, argumentPosition); - bool isGeneric = parameterType.IsGenericParameter; + if (param.ParameterType.IsByRef) + { + OpCode ldindInstruction; + if(!OpCodesMap.TryGetLdindOpCode(param.ParameterType.GetElementType(), out ldindInstruction)) + { + ldindInstruction = OpCodes.Ldind_Ref; + } + IL.Emit(ldindInstruction); + } - if (parameterType.IsValueType || isGeneric) + if (parameterType.IsValueType || param.ParameterType.IsByRef || parameterType.IsGenericParameter) { IL.Emit(OpCodes.Box, parameterType); } Modified: trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs 2011-04-06 21:06:29 UTC (rev 5628) +++ trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/DefaultMethodEmitter.cs 2011-04-07 17:19:55 UTC (rev 5629) @@ -30,7 +30,6 @@ private static readonly ConstructorInfo notImplementedConstructor = typeof(NotImplementedException).GetConstructor(new System.Type[0]); - private static readonly Dictionary<string, OpCode> stindMap = new Dictionary<string, OpCode>(); private readonly IArgumentHandler _argumentHandler; static DefaultMethodEmitter() @@ -43,23 +42,6 @@ }; infoConstructor = typeof (InvocationInfo).GetConstructor(constructorTypes); - - - stindMap["Bool&"] = OpCodes.Stind_I1; - stindMap["Int8&"] = OpCodes.Stind_I1; - stindMap["Uint8&"] = OpCodes.Stind_I1; - - stindMap["Int16&"] = OpCodes.Stind_I2; - stindMap["Uint16&"] = OpCodes.Stind_I2; - - stindMap["Uint32&"] = OpCodes.Stind_I4; - stindMap["Int32&"] = OpCodes.Stind_I4; - - stindMap["IntPtr"] = OpCodes.Stind_I4; - stindMap["Uint64&"] = OpCodes.Stind_I8; - stindMap["Int64&"] = OpCodes.Stind_I8; - stindMap["Float32&"] = OpCodes.Stind_R4; - stindMap["Float64&"] = OpCodes.Stind_R8; } public DefaultMethodEmitter() : this(new DefaultArgumentHandler()) {} @@ -124,8 +106,8 @@ IL.Emit(OpCodes.Ldloc_1); IL.Emit(OpCodes.Callvirt, handlerMethod); - SaveRefArguments(IL, parameters); PackageReturnType(method, IL); + SaveRefArguments(IL, parameters); IL.Emit(OpCodes.Ret); } @@ -158,8 +140,7 @@ IL.Emit(OpCodes.Ldc_I4, param.Position); IL.Emit(OpCodes.Ldelem_Ref); - typeName = typeName.Replace("&", ""); - System.Type unboxedType = System.Type.GetType(typeName); + System.Type unboxedType = param.ParameterType.GetElementType(); IL.Emit(OpCodes.Unbox_Any, unboxedType); @@ -170,23 +151,16 @@ private static OpCode GetStindInstruction(System.Type parameterType) { - if (parameterType.IsClass && !parameterType.Name.EndsWith("&")) + if (parameterType.IsByRef) { - return OpCodes.Stind_Ref; + OpCode stindOpCode; + if(OpCodesMap.TryGetStindOpCode(parameterType.GetElementType(), out stindOpCode)) + { + return stindOpCode; + } } - - string typeName = parameterType.Name; - - if (!stindMap.ContainsKey(typeName) && parameterType.IsByRef) - { - return OpCodes.Stind_Ref; - } - - Debug.Assert(stindMap.ContainsKey(typeName)); - OpCode result = stindMap[typeName]; - - return result; + return OpCodes.Stind_Ref; } private void PushStackTrace(ILGenerator IL) Added: trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/OpCodesMap.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/OpCodesMap.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Proxy/DynamicProxy/OpCodesMap.cs 2011-04-07 17:19:55 UTC (rev 5629) @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Reflection.Emit; + +namespace NHibernate.Proxy.DynamicProxy +{ + public static class OpCodesMap + { + private static readonly Dictionary<System.Type, OpCode> LdindMap = new Dictionary<System.Type, OpCode> + { + {typeof (Boolean), OpCodes.Ldind_I1}, + {typeof (SByte), OpCodes.Ldind_I1}, + {typeof (Byte), OpCodes.Ldind_U1}, + {typeof (Char), OpCodes.Ldind_I2}, + {typeof (Int16), OpCodes.Ldind_I2}, + {typeof (Int32), OpCodes.Ldind_I4}, + {typeof (Int64), OpCodes.Ldind_I8}, + {typeof (UInt16), OpCodes.Ldind_U2}, + {typeof (UInt32), OpCodes.Ldind_U4}, + {typeof (UInt64), OpCodes.Ldind_I8}, + {typeof (Single), OpCodes.Ldind_R4}, + {typeof (Double), OpCodes.Ldind_R8}, + }; + private static readonly Dictionary<System.Type, OpCode> StindMap = new Dictionary<System.Type, OpCode> + { + {typeof (Boolean), OpCodes.Stind_I1}, + {typeof (SByte), OpCodes.Stind_I1}, + {typeof (Byte), OpCodes.Stind_I1}, + {typeof (Char), OpCodes.Stind_I2}, + {typeof (Int16), OpCodes.Stind_I2}, + {typeof (Int32), OpCodes.Stind_I4}, + {typeof (Int64), OpCodes.Stind_I8}, + {typeof (UInt16), OpCodes.Stind_I2}, + {typeof (UInt32), OpCodes.Stind_I4}, + {typeof (UInt64), OpCodes.Stind_I8}, + {typeof (Single), OpCodes.Stind_R4}, + {typeof (Double), OpCodes.Stind_R8}, + }; + + public static bool TryGetLdindOpCode(System.Type valueType, out OpCode opCode) + { + return LdindMap.TryGetValue(valueType, out opCode); + } + + public static bool TryGetStindOpCode(System.Type valueType, out OpCode opCode) + { + return StindMap.TryGetValue(valueType, out opCode); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/DynamicProxyTests/ProxiedMembers/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DynamicProxyTests/ProxiedMembers/Fixture.cs 2011-04-06 21:06:29 UTC (rev 5628) +++ trunk/nhibernate/src/NHibernate.Test/DynamicProxyTests/ProxiedMembers/Fixture.cs 2011-04-07 17:19:55 UTC (rev 5629) @@ -20,7 +20,6 @@ public class Fixture { [Test] - [Ignore] public void Proxy() { var factory = new ProxyFactory(); @@ -28,11 +27,11 @@ int x; c.Method1(out x); - x.Should().Be(3); + Assert.AreEqual(3, x); x = 4; c.Method2(ref x); - x.Should().Be(5); + Assert.AreEqual(5, x); } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |