]> O.S.I.I.S - jp/crow.git/commitdiff
debug reverse ds binding old dataSource handler removal, add find parse method in...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Tue, 15 Oct 2019 16:32:47 +0000 (18:32 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Tue, 15 Oct 2019 16:32:47 +0000 (18:32 +0200)
Crow/src/CompilerServices/CompilerServices.cs
Crow/src/Instantiator.cs

index 7e368a086b2150af329c4d2d57e8d6d583a5972e..6637185c9adefe54bdef7024a9a1b9d6fe3f4b2a 100644 (file)
@@ -577,9 +577,18 @@ namespace Crow.IML
                                if (destType.IsAssignableFrom (origType))
                                        il.Emit (OpCodes.Castclass, destType);
                                else {
+                                       if (origType == typeof (string)) {
+                                               //search dest type for parse method
+                                               MethodInfo miParse = destType.GetMethod
+                                                                                               ("Parse", BindingFlags.Static | BindingFlags.Public,
+                                                                                                       Type.DefaultBinder, new Type [] { typeof (string) }, null);
+                                               if (miParse == null)
+                                                       throw new Exception ("no Parse method found for: " + destType.FullName);
+                                               il.Emit (OpCodes.Call, miParse);
+                                       }
                                        //implicit conversion can't be defined from or to object base class,
                                        //so we will check if object underlying type is one of the implicit converter of destType
-                                       if (origType == typeof (object)) {//test all implicit converter to destType on obj
+                                       else if (origType == typeof (object)) {//test all implicit converter to destType on obj
                                                System.Reflection.Emit.Label emitTestNextImpOp;
                                                System.Reflection.Emit.Label emitImpOpFound = il.DefineLabel ();
                                                foreach (MethodInfo mi in destType.GetMethods (BindingFlags.Public | BindingFlags.Static)) {
index 1b37a7aec6aeb1f940758c555e6790d5cd3c2e51..bf9ad37bc209bd349788b5852e2375d2265d3772 100644 (file)
@@ -489,7 +489,7 @@ namespace Crow.IML {
                                                        throw new Exception ("Member '" + reader.Name + "' not found in " + ctx.CurrentNodeType.Name);
 
                                                if (mi.MemberType == MemberTypes.Event) {
-                                                       foreach (string exp in CompilerServices.splitOnSemiColumnOutsideAccolades(reader.Value)) {
+                                                       foreach (string exp in reader.Value.Split (';')) {
                                                                string trimed = exp.Trim();
                                                                if (trimed.StartsWith ("{", StringComparison.Ordinal))
                                                                        compileAndStoreDynHandler (ctx, mi as EventInfo, trimed.Substring (1, trimed.Length - 2));
@@ -1074,7 +1074,7 @@ namespace Crow.IML {
 
                        if (!string.IsNullOrEmpty (bindingDef.TargetMember)) {
                                if (bindingDef.TwoWay) //remove handler
-                                       emitRemoveOldDataSourceHandler (il, "ValueChanged", delName, false);
+                                       emitRemoveOldDataSourceHandler (il, "ValueChanged", delName + "_reverse", false);
                                //test if new ds is null
                                il.Emit (OpCodes.Ldloc_2);
                                il.Emit (OpCodes.Brfalse, newDSIsNull);//new ds is null
@@ -1117,6 +1117,7 @@ namespace Crow.IML {
                                il.MarkLabel (cancel);
 
                                if (bindingDef.TwoWay) {
+                                       il.Emit (OpCodes.Ldstr, delName + "_reverse");//load delName used for removing on ds changed
                                        il.Emit (OpCodes.Ldarg_1);//arg1: dataSourceChange source, the origine of the binding
                                        il.Emit (OpCodes.Ldstr, bindingDef.SourceMember);//arg2: orig member
                                        il.Emit (OpCodes.Ldloc_2);//arg3: new datasource
@@ -1233,7 +1234,7 @@ namespace Crow.IML {
 
                        if (!string.IsNullOrEmpty(bindingDef.TargetMember)){
                                if (bindingDef.TwoWay)//remove handler
-                                       emitRemoveOldDataSourceHandler(il, "ValueChanged", delName, false);
+                                       emitRemoveOldDataSourceHandler(il, "ValueChanged", delName + "_reverse", false);
 
                                il.Emit (OpCodes.Ldloc_2);
                                il.Emit (OpCodes.Brfalse, newDSIsNull);//new ds is null
@@ -1289,6 +1290,7 @@ namespace Crow.IML {
                                il.MarkLabel (cancel);
 
                                if (bindingDef.TwoWay){
+                                       il.Emit (OpCodes.Ldstr, delName + "_reverse");//load delName used for removing on ds changed
                                        il.Emit (OpCodes.Ldarg_1);//arg1: dataSourceChange source, the origine of the binding
                                        il.Emit (OpCodes.Ldstr, bindingDef.SourceMember);//arg2: orig member
                                        il.Emit (OpCodes.Ldloc_2);//arg3: new datasource
@@ -1320,7 +1322,8 @@ namespace Crow.IML {
                                il.Emit (OpCodes.Stfld, mi as FieldInfo);
                        else if (mi.MemberType == MemberTypes.Property) {
                                MethodInfo mt = (mi as PropertyInfo).GetSetMethod ();
-                               il.Emit (mt.IsVirtual?OpCodes.Callvirt:OpCodes.Call, mt);
+                               //il.Emit (mt.IsVirtual?OpCodes.Callvirt:OpCodes.Call, mt);
+                               il.Emit (OpCodes.Callvirt, mt);
                        } else
                                throw new NotImplementedException ();
                }
@@ -1328,11 +1331,12 @@ namespace Crow.IML {
                /// Two way binding for datasource, graphicObj=>dataSource link, datasource value has priority
                /// and will be set as init for source property (in emitDataSourceBindings func)
                /// </summary>
+               /// <param name="delName">delegate name</param>
                /// <param name="orig">Graphic object instance, source of binding</param>
                /// <param name="origMember">Origin member name</param>
                /// <param name="dest">datasource instance, target of the binding</param>
                /// <param name="destMember">Destination member name</param>
-               static void dataSourceReverseBinding(IValueChange orig, string origMember, object dest, string destMember){
+               static void dataSourceReverseBinding(string delName, IValueChange orig, string origMember, object dest, string destMember){
                        Type tOrig = orig.GetType ();
                        Type tDest = dest.GetType ();
                        PropertyInfo piOrig = tOrig.GetProperty (origMember);
@@ -1353,7 +1357,7 @@ namespace Crow.IML {
 #endif
 
 #region ValueChanged emit
-                       DynamicMethod dm = new DynamicMethod ("dyn_valueChanged" + NewId,
+                       DynamicMethod dm = new DynamicMethod (delName,
                                typeof (void), CompilerServices.argsBoundValueChange, true);
                        ILGenerator il = dm.GetILGenerator (64);