|
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.
|