]> O.S.I.I.S - jp/crow.git/commitdiff
debug new dynEvent handler
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 23 Jan 2017 20:59:14 +0000 (21:59 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 23 Jan 2017 20:59:14 +0000 (21:59 +0100)
src/CompilerServices/CompilerServices.cs
src/IML/BindingMember.cs

index dc2f7a1c70430a69ffe273d7511dff687d2ff0c1..31b29fb256c306dd68a85bd4c7eae367cfaf8f8d 100644 (file)
@@ -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
 
index 1bab5959454219fa84fab6ffc8e16c701736c118..f643d10b12800bdf575899c358ead23ca22c97de 100644 (file)
@@ -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);
                }
        }