From a84e509116b46aa1a98e80460e6a82e2056b9475 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Mon, 23 Jan 2017 21:59:14 +0100 Subject: [PATCH] debug new dynEvent handler --- src/CompilerServices/CompilerServices.cs | 31 +++++++++++++++--------- src/IML/BindingMember.cs | 22 +++++++++++------ 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/CompilerServices/CompilerServices.cs b/src/CompilerServices/CompilerServices.cs index dc2f7a1c..31b29fb2 100644 --- a/src/CompilerServices/CompilerServices.cs +++ b/src/CompilerServices/CompilerServices.cs @@ -270,13 +270,17 @@ namespace Crow destType =(miDest as FieldInfo).FieldType; if (value != null) { - origType = value.GetType (); - if (destType.IsAssignableFrom (origType)) - convertedVal = Convert.ChangeType (value, destType); - else if (origType.IsPrimitive & destType.IsPrimitive) - convertedVal = GetConvertMethod (destType).Invoke (null, new Object[] { value }); - else - convertedVal = getImplicitOp (origType, destType).Invoke (value, null); + if (destType == TObject)//TODO: check that test of destType is not causing problems + convertedVal = value; + else { + origType = value.GetType (); + if (destType.IsAssignableFrom (origType)) + convertedVal = Convert.ChangeType (value, destType); + else if (origType.IsPrimitive & destType.IsPrimitive) + convertedVal = GetConvertMethod (destType).Invoke (null, new Object[] { value }); + else + convertedVal = getImplicitOp (origType, destType).Invoke (value, null); + } } if (miDest.MemberType == MemberTypes.Property) @@ -663,7 +667,10 @@ namespace Crow #region RIGHT OPERANDES if (rop.IsStringConstant){ il.Emit (OpCodes.Ldstr, rop.Tokens[0]); - lop.emitSetProperty (il, cancelFinalSet); + lop.emitSetProperty (il); + }else if (rop.IsSingleName && rop.Tokens[0] == "this"){ + il.Emit (OpCodes.Ldarg_0); //load sender ref onto the stack, the current node + lop.emitSetProperty (il); }else if (rop.LevelsUp ==0 && !string.IsNullOrEmpty(rop.Tokens[0])) {//parsable constant depending on lop type //if left operand is member of current node, it's easy to fetch type, else we should use reflexion in msil if (lopPI == null){//accept GraphicObj members, but it's restricive @@ -685,9 +692,11 @@ namespace Crow //emit left operand assignment il.Emit (OpCodes.Callvirt, lopPI.GetSetMethod()); } else {//tree parsing and propert gets - rop.emitGetTarget (il, cancel); - rop.emitGetProperty (il, cancel); - lop.emitSetProperty (il, cancelFinalSet); + il.Emit (OpCodes.Ldarg_0); //load sender ref onto the stack, the current node + + rop.emitGetTarget (il, cancelFinalSet); + rop.emitGetProperty (il, cancelFinalSet); + lop.emitSetProperty (il); } #endregion diff --git a/src/IML/BindingMember.cs b/src/IML/BindingMember.cs index 1bab5959..f643d10b 100644 --- a/src/IML/BindingMember.cs +++ b/src/IML/BindingMember.cs @@ -89,6 +89,7 @@ namespace Crow } else { while (splitedExp [ptr] == "..") ptr++; + LevelsUp = ptr; } } if (ptr != splitedExp.Length - 1) @@ -109,7 +110,7 @@ namespace Crow il.Emit (OpCodes.Dup); il.Emit (OpCodes.Brfalse, nextLogicParent); } else if (LevelsUp > 0) {//go upward in logical tree - il.Emit (OpCodes.Ldind_I4, LevelsUp);//push arg 2 of goUpLevels + il.Emit (OpCodes.Ldc_I4, LevelsUp);//push arg 2 of goUpLevels il.Emit (OpCodes.Callvirt, CompilerServices.miGoUpLevels); //test if null il.Emit (OpCodes.Dup); @@ -124,27 +125,34 @@ namespace Crow } for (int i = 1; i < Tokens.Length -1; i++) { + System.Reflection.Emit.Label miOK = il.DefineLabel (); + il.Emit (OpCodes.Dup);//duplicate instance il.Emit (OpCodes.Ldstr, Tokens [i]);//load member name il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx); il.Emit (OpCodes.Dup); - il.Emit (OpCodes.Brfalse, cancel); + il.Emit (OpCodes.Brtrue, miOK); + il.Emit (OpCodes.Pop);//pop dup instance + il.Emit (OpCodes.Br, cancel); + il.MarkLabel (miOK); il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx); il.Emit (OpCodes.Dup); il.Emit (OpCodes.Brfalse, cancel); } } public void emitGetProperty(ILGenerator il, System.Reflection.Emit.Label cancel) { + System.Reflection.Emit.Label miOK = il.DefineLabel (); + il.Emit (OpCodes.Dup);//duplicate instance il.Emit (OpCodes.Ldstr, Tokens [Tokens.Length -1]);//load member name il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx); il.Emit (OpCodes.Dup); - il.Emit (OpCodes.Brfalse, cancel); + il.Emit (OpCodes.Brtrue, miOK); + il.Emit (OpCodes.Pop);//pop dup instance + il.Emit (OpCodes.Br, cancel); + il.MarkLabel (miOK); il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx); } - public void emitSetProperty(ILGenerator il, System.Reflection.Emit.Label cancel) { + public void emitSetProperty(ILGenerator il) { il.Emit (OpCodes.Ldstr, Tokens [Tokens.Length -1]);//load member name - il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx); - il.Emit (OpCodes.Dup); - il.Emit (OpCodes.Brfalse, cancel); il.Emit (OpCodes.Call, CompilerServices.miSetValWithRefx); } } -- 2.47.3