From: Jean-Philippe Bruyère Date: Sun, 14 Mar 2021 01:05:18 +0000 (+0100) Subject: use console for binding debug output X-Git-Tag: v0.9.5-beta~62 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=41c27de43fee49b33ad1194c3f99ef929e66e800;p=jp%2Fcrow.git use console for binding debug output --- diff --git a/Crow/Templates/Button.template b/Crow/Templates/Button.template index c46da8c6..ca1119a5 100644 --- a/Crow/Templates/Button.template +++ b/Crow/Templates/Button.template @@ -1,5 +1,5 @@ - (evtType & DiscardEvents) == 0 && (evtType & IncludeEvents) != 0; + => (evtType & DiscardEvents) == 0 && (evtType & IncludeEvents) == IncludeEvents; static object logMutex = new object (); diff --git a/Crow/src/IML/CompilerServices.cs b/Crow/src/IML/CompilerServices.cs index d8033b28..1bf378a9 100644 --- a/Crow/src/IML/CompilerServices.cs +++ b/Crow/src/IML/CompilerServices.cs @@ -270,7 +270,7 @@ namespace Crow.IML static MemberInfo getMemberInfoWithReflexion(object instance, string member){ Type t = instance.GetType(); #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"getMemberInfoWithReflexion ({instance},{member}); type:{t}"); + Console.WriteLine ($"getMemberInfoWithReflexion ({instance},{member}); type:{t}"); #endif MemberInfo mi = t.GetMember (member)?.FirstOrDefault(); if (mi == null) @@ -279,7 +279,7 @@ namespace Crow.IML } static MethodInfo getMethodInfoWithReflexion(object instance, string method){ #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"getMethodInfoWithReflexion ({instance},{method}); type:{instance.GetType ()}"); + Console.WriteLine ($"getMethodInfoWithReflexion ({instance},{method}); type:{instance.GetType ()}"); #endif return instance.GetType ().GetMethod (method, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); } @@ -291,7 +291,7 @@ namespace Crow.IML /// Destination member static void setValueWithReflexion(object dest, object value, string destMember){ #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"setValueWithReflexion (dest:{dest},value:{value},member:{destMember});"); + Console.WriteLine ($"setValueWithReflexion (dest:{dest},value:{value},member:{destMember});"); #endif Type destType = null; Type origType = null; @@ -300,7 +300,7 @@ namespace Crow.IML MemberInfo miDest = getMemberInfoWithReflexion (dest, destMember); if (miDest == null) { - Debug.WriteLine ("Reverse template binding error: " + destMember + " not found in " + dest); + Console.WriteLine ("Reverse template binding error: " + destMember + " not found in " + dest); return; } @@ -323,7 +323,7 @@ namespace Crow.IML } } } catch (Exception ex) { - Debug.WriteLine (ex.ToString ()); + Console.WriteLine (ex.ToString ()); return; } @@ -338,7 +338,7 @@ namespace Crow.IML /// static object getValueWithReflexion(object instance, MemberInfo mi){ #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"getValueWithReflexion ({instance},{mi});"); + Console.WriteLine ($"getValueWithReflexion ({instance},{mi});"); #endif object tmp = null; Type dstType = null; @@ -368,7 +368,7 @@ namespace Crow.IML if (dstType.IsValueType) return Activator.CreateInstance (dstType); } catch (Exception ex) { - Debug.WriteLine (ex.ToString ()); + Console.WriteLine (ex.ToString ()); return ""; } @@ -380,7 +380,7 @@ namespace Crow.IML if (knownExtMethods.ContainsKey (key)) return knownExtMethods [key]; - //System.Diagnostics.Debug.WriteLine ($"*** search extension method: {t};{methodName} => key={key}"); + //System.Diagnostics.Console.WriteLine ($"*** search extension method: {t};{methodName} => key={key}"); MethodInfo mi = null; if (!TryGetExtensionMethods (Assembly.GetEntryAssembly (), t, methodName, out mi)) { @@ -755,7 +755,7 @@ namespace Crow.IML FieldInfo fiEvt = getEventHandlerField (t, eventName); if (fiEvt == null) { #if DEBUG_BINDING - Debug.WriteLine ("RemoveHandlerByName: Event '" + eventName + "' not found in " + instance); + Console.WriteLine ("RemoveHandlerByName: Event '" + eventName + "' not found in " + instance); #endif return; } @@ -766,7 +766,7 @@ namespace Crow.IML if (d.Method.Name == delegateName) { eiEvt.RemoveEventHandler (instance, d); #if DEBUG_BINDING - Debug.WriteLine ("\tremoveEventHandlerByName: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName); + Console.WriteLine ("\tremoveEventHandlerByName: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName); #endif } } @@ -785,7 +785,7 @@ namespace Crow.IML if (d.Target == target) { eiEvt.RemoveEventHandler (instance, d); #if DEBUG_BINDING - Debug.WriteLine ("\tremoveEventHandlerByTarget: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName); + Console.WriteLine ("\tremoveEventHandlerByTarget: {0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName); #endif } } @@ -798,7 +798,7 @@ namespace Crow.IML Type t = instance.GetType (); MethodInfo mi = t.GetMethod (method, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (mi == null) { - Debug.WriteLine ("Handler Method '{0}' not found in '{1}'", method, t); + Console.WriteLine ("Handler Method '{0}' not found in '{1}'", method, t); return null; } return Delegate.CreateDelegate (eventType, instance, mi); @@ -879,7 +879,7 @@ namespace Crow.IML //get value from member of object internal static object getDataTypeAndFetch (object data, string fetchMethod){ Type dataType = data.GetType(); - //System.Diagnostics.Debug.WriteLine ($"get data type and fetch {data}.{fetchMethod}"); + //Console.WriteLine ($"get data type and fetch {data}.{fetchMethod}"); MethodInfo miGetDatas = dataType.GetMethod (fetchMethod, new Type[] {}); if (miGetDatas == null) miGetDatas = CompilerServices.SearchExtMethod (dataType, fetchMethod); @@ -902,7 +902,7 @@ namespace Crow.IML //TODO:memberinfo found here must be cached internal static object getValue (Type dataType, object data, string member) { - //System.Diagnostics.Debug.WriteLine ($"get value: {dataType} ; {data} ; {member}"); + //Console.WriteLine ($"get value: {dataType} ; {data} ; {member}"); MethodInfo miGetDatas = dataType.GetMethod (member, new Type [] { }); if (miGetDatas != null) diff --git a/Crow/src/IML/Instantiator.cs b/Crow/src/IML/Instantiator.cs index a7ca4f2f..34f904b7 100644 --- a/Crow/src/IML/Instantiator.cs +++ b/Crow/src/IML/Instantiator.cs @@ -588,7 +588,7 @@ namespace Crow.IML { BindingDefinition bindingDef = sourceNA.GetBindingDef (sourceMember, expression); #if DEBUG_BINDING - Debug.WriteLine("Property Binding: " + bindingDef.ToString()); + Console.WriteLine("Property Binding: " + bindingDef.ToString()); #endif if (bindingDef.IsDataSourceBinding) {//bind on data source @@ -629,6 +629,10 @@ namespace Crow.IML { il.Emit (OpCodes.Ldstr, eventName);//2nd arg event name il.Emit (OpCodes.Ldstr, delegateName);//3d arg: delegate name il.Emit (OpCodes.Call, CompilerServices.miRemEvtHdlByName); +#if DEBUG_BINDING + il.EmitWriteLine ($"remove old ds handler: evtname:{eventName} delname:{delegateName} dsside:{DSSide}"); +#endif + il.MarkLabel(cancel); } #endregion @@ -648,7 +652,7 @@ namespace Crow.IML { static Delegate compileDynEventHandler (EventInfo sourceEvent, string expression, NodeAddress currentNode = null) { #if DEBUG_BINDING - Debug.WriteLine ("\tCompile Event {0}: {1}", sourceEvent.Name, expression); + Console.WriteLine ("\tCompile Event {0}: {1}", sourceEvent.Name, expression); #endif Type lopType = null; @@ -770,7 +774,7 @@ namespace Crow.IML { BindingDefinition bindingDef = currentNode.GetBindingDef (sourceEvent.Name, expression); #if DEBUG_BINDING - Debug.WriteLine("Event Binding: " + bindingDef.ToString()); + Console.WriteLine("Event Binding: " + bindingDef.ToString()); #endif if (bindingDef.IsTemplateBinding | bindingDef.IsDataSourceBinding) { @@ -861,7 +865,8 @@ namespace Crow.IML { Type origineNodeType = origine.NodeType; //value changed dyn method - DynamicMethod dm = new DynamicMethod ("dyn_valueChanged" + NewId, + string delname = "dyn_valueChanged" + NewId; + DynamicMethod dm = new DynamicMethod (delname, typeof (void), CompilerServices.argsValueChange, true); ILGenerator il = dm.GetILGenerator (64); @@ -869,6 +874,10 @@ namespace Crow.IML { il.DeclareLocal (typeof(object)); +#if DEBUG_BINDING + il.EmitWriteLine ($"DYN Called => {delname}"); +#endif + il.Emit (OpCodes.Nop); int i = 0; @@ -953,7 +962,7 @@ namespace Crow.IML { ctx.emitCachedDelegateHandlerAddition (dmIdx, CompilerServices.eiValueChange, origine); #if DEBUG_BINDING - Debug.WriteLine("\tCrow property binding: " + dm.Name); + Console.WriteLine("\tCrow property binding: " + dm.Name); #endif } @@ -1025,7 +1034,7 @@ namespace Crow.IML { foreach (MemberAddress ma in bindingCase.Value) { if (ma.Address.Count == 0){ - Debug.WriteLine("\t\tBUG: reverse template binding in normal template binding"); + Console.WriteLine("\t\tBUG: reverse template binding in normal template binding"); continue;//template binding } //first we try to get memberInfo of new parent, if it doesn't exist, it's a propery less binding @@ -1112,7 +1121,7 @@ namespace Crow.IML { void emitDataSourceBindings (IMLContext ctx, BindingDefinition bindingDef, Type dsType) { #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"emitDataSourceBindings with data type knows: {bindingDef}"); + Console.WriteLine ($"emitDataSourceBindings with data type knows: {bindingDef} dstype: {dsType}"); #endif DynamicMethod dm = null; ILGenerator il = null; @@ -1133,6 +1142,10 @@ namespace Crow.IML { il.DeclareLocal (typeof (object)); +#if DEBUG_BINDING + il.EmitWriteLine ($"DYN Called => {delName}"); +#endif + //load value changed member name onto the stack il.Emit (OpCodes.Ldarg_2);//TODO:check _2??? not _1?? il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName); @@ -1174,7 +1187,8 @@ namespace Crow.IML { //the actual value of the origin member of the datasource and then will bind the value changed //dyn methode. //dm is bound to the instanciator instance to have access to cached dyn meth and delegates - dm = new DynamicMethod ("dyn_dschanged" + NewId, + string dschangeddelname = "dyn_dschanged" + NewId; + dm = new DynamicMethod (dschangeddelname, typeof (void), CompilerServices.argsBoundDSChange, true); @@ -1186,7 +1200,9 @@ namespace Crow.IML { Label cancel = il.DefineLabel (); Label newDSIsNull = il.DefineLabel (); Label cancelInit = il.DefineLabel (); - +#if DEBUG_BINDING + il.EmitWriteLine ($"DYN Called => {dschangeddelname}"); +#endif il.Emit (OpCodes.Ldarg_2);//load datasource change arg il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS); @@ -1206,6 +1222,9 @@ namespace Crow.IML { //il.Emit (OpCodes.Call, CompilerServices.miGetMDToken); //il.Emit (OpCodes.Ldc_I4, dsType.MetadataToken); il.Emit (OpCodes.Brfalse, newDSIsNull); +#if DEBUG_BINDING + il.EmitWriteLine ($"\tNew ds is of expected type: {dsType}"); +#endif } #region fetch initial Value @@ -1219,6 +1238,9 @@ namespace Crow.IML { if (mbType != piSource.PropertyType) CompilerServices.emitConvert (il, mbType, piSource.PropertyType); il.Emit (OpCodes.Callvirt, piSource.GetSetMethod ()); +#if DEBUG_BINDING + il.EmitWriteLine ($"{dschangeddelname}: fetch initial value for binding: {bindingDef}"); +#endif } } #endregion @@ -1249,6 +1271,9 @@ namespace Crow.IML { } il.MarkLabel (newDSIsNull); +#if DEBUG_BINDING + il.EmitWriteLine ($"\tNew ds is NULL, expected type = {dsType}"); +#endif il.Emit (OpCodes.Ret); //store dschange delegate in instatiator instance for access while instancing graphic object @@ -1263,8 +1288,8 @@ namespace Crow.IML { ctx.emitCachedDelegateHandlerAddition (delDSIndex, CompilerServices.eiDSChange); #if DEBUG_BINDING - Debug.WriteLine("\tDataSource ValueChanged: " + delName); - Debug.WriteLine("\tDataSource Changed: " + dm.Name); + Console.WriteLine("\tDataSource ValueChanged: " + delName); + Console.WriteLine("\tDataSource Changed: " + dm.Name); #endif } @@ -1290,7 +1315,7 @@ namespace Crow.IML { public Delegate emitDataSourceBindings (PropertyInfo piSource, BindingDefinition bindingDef){ #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"emitDataSourceBindings: {bindingDef}"); + Console.WriteLine ($"emitDataSourceBindings: {bindingDef}"); #endif DynamicMethod dm = null; ILGenerator il = null; @@ -1310,6 +1335,10 @@ namespace Crow.IML { il.DeclareLocal (typeof(object)); +#if DEBUG_BINDING + il.EmitWriteLine ($"DYN Called => {delName}"); +#endif + //load value changed member name onto the stack il.Emit (OpCodes.Ldarg_2); il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName); @@ -1351,7 +1380,8 @@ namespace Crow.IML { //the actual value of the origin member of the datasource and then will bind the value changed //dyn methode. //dm is bound to the instanciator instance to have access to cached dyn meth and delegates - dm = new DynamicMethod ("dyn_dschanged" + NewId, + string dschanged_delName = "dyn_dschanged" + NewId; + dm = new DynamicMethod (dschanged_delName, typeof (void), CompilerServices.argsBoundDSChange, true); @@ -1366,6 +1396,9 @@ namespace Crow.IML { System.Reflection.Emit.Label cancelInit = il.DefineLabel (); il.Emit (OpCodes.Nop); +#if DEBUG_BINDING + il.EmitWriteLine ($"dyn method call: {dschanged_delName}"); +#endif il.Emit (OpCodes.Ldarg_2);//load datasource change arg il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS); @@ -1445,8 +1478,8 @@ namespace Crow.IML { il.Emit (OpCodes.Ret); #if DEBUG_BINDING - Debug.WriteLine("\tDataSource ValueChanged: " + delName); - Debug.WriteLine("\tDataSource Changed: " + dm.Name); + Console.WriteLine("\tDataSource ValueChanged: " + delName); + Console.WriteLine("\tDataSource Changed: " + dm.Name); #endif return dm.CreateDelegate (CompilerServices.ehTypeDSChange, this); @@ -1481,7 +1514,7 @@ namespace Crow.IML { foreach (string m in destMember.Split('.')) { MemberInfo miDest = curType.GetMember (m).FirstOrDefault (); if (miDest == null) { - Debug.WriteLine ($"Member '{destMember}' not found in new DataSource '{dest}' of '{orig}'"); + Console.WriteLine ($"Member '{destMember}' not found in new DataSource '{dest}' of '{orig}'"); return; } miDests.Add (miDest); @@ -1489,7 +1522,7 @@ namespace Crow.IML { } #if DEBUG_BINDING - Debug.WriteLine ("DS Reverse binding: Member '{0}' found in new DS '{1}' of '{2}'", destMember, dest, orig); + Console.WriteLine ("DS Reverse binding: Member '{0}' found in new DS '{1}' of '{2}'", destMember, dest, orig); #endif #region ValueChanged emit @@ -1501,6 +1534,9 @@ namespace Crow.IML { Stack locals = new Stack (); System.Reflection.Emit.Label endMethod = il.DefineLabel (); +#if DEBUG_BINDING + il.EmitWriteLine ($"DYN Called => {delName}"); +#endif //load value changed member name onto the stack il.Emit (OpCodes.Ldarg_2); diff --git a/Crow/src/IML/MemberAddress.cs b/Crow/src/IML/MemberAddress.cs index 6797e8ea..3acc8e46 100644 --- a/Crow/src/IML/MemberAddress.cs +++ b/Crow/src/IML/MemberAddress.cs @@ -90,7 +90,7 @@ namespace Crow.IML bool tryFindMember () { #if DEBUG_BINDING_FUNC_CALLS - System.Diagnostics.Debug.WriteLine ($"tryFindMember ({Address},{member})"); + Console.WriteLine ($"tryFindMember ({Address},{member})"); #endif if (member != null) throw new Exception ("member already found"); diff --git a/Crow/src/Interface.cs b/Crow/src/Interface.cs index 5dbac92f..66b9b594 100644 --- a/Crow/src/Interface.cs +++ b/Crow/src/Interface.cs @@ -452,7 +452,7 @@ namespace Crow /// /// default templates dic by metadata token /// - public Dictionary DefaultTemplates; + public Dictionary DefaultTemplates; /// /// Item templates stored with their index /// @@ -564,7 +564,7 @@ namespace Crow Styling = new Dictionary (initCapacity); DefaultValuesLoader = new Dictionary (initCapacity); Instantiators = new Dictionary (initCapacity); - DefaultTemplates = new Dictionary (initCapacity); + DefaultTemplates = new Dictionary (initCapacity); ItemTemplates = new Dictionary (initCapacity); } void loadThemeFiles () { @@ -588,9 +588,9 @@ namespace Crow path = Path.Combine (Theme, "DefaultTemplates"); foreach (string iml in Directory.GetFiles (path, "*.*", SearchOption.AllDirectories)) { string resId = $"#{iml.Substring (path.Length + 1).Replace (Path.DirectorySeparatorChar, '.')}"; - int mdTok = Instantiator.tryGetGOType (resId.Substring (6, resId.Length - 15)).MetadataToken; + //int mdTok = Instantiator.tryGetGOType (resId.Substring (6, resId.Length - 15)).MetadataToken; using (Stream s = new FileStream (iml, FileMode.Open, FileAccess.Read)) - DefaultTemplates[mdTok] = new IML.Instantiator (this, s, resId); + DefaultTemplates[resId] = new IML.Instantiator (this, s, resId); } } path = Path.Combine (Theme, "IML"); @@ -1454,6 +1454,11 @@ namespace Crow _activeWidget.onMouseUp (_activeWidget, new MouseButtonEventArgs (MousePosition.X, MousePosition.Y, button, InputAction.Release)); + if (_activeWidget == null) { + Debug.WriteLine ("[BUG]Mystery reset of _activeWidget"); + return true; + } + if (doubleClickTriggered) _activeWidget.onMouseDoubleClick (_activeWidget, new MouseButtonEventArgs (MousePosition.X, MousePosition.Y, button, InputAction.Press)); else diff --git a/Crow/src/ObservableList.cs b/Crow/src/ObservableList.cs index 0087ea5e..e87226cd 100644 --- a/Crow/src/ObservableList.cs +++ b/Crow/src/ObservableList.cs @@ -76,6 +76,11 @@ namespace Crow SelectedIndex++; ListAdd.Raise (this, new ListChangedEventArg (selectedIndex, SelectedItem)); } + public void Replace (T oldValue, T newValue) { + int idx = IndexOf (oldValue); + base[idx] = newValue; + ListEdit.Raise (this, new ListChangedEventArg (idx, newValue)); + } public void RaiseEdit () { if (selectedIndex < 0) return; diff --git a/Crow/src/Text/SpanCharReader.cs b/Crow/src/Text/SpanCharReader.cs new file mode 100644 index 00000000..b8f42565 --- /dev/null +++ b/Crow/src/Text/SpanCharReader.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Crow.src.Text +{ + public ref struct SpanCharReader + { + int curPos; + ReadOnlySpan buffer; + + public SpanCharReader (string text) { + buffer = text.AsSpan (); + curPos = 0; + } + + public int CurrentPosition => curPos; + + public void Seek (int position) => curPos = position; + + public Char Peak () => buffer[curPos]; + public Char Read () => buffer[curPos++]; + public ReadOnlySpan Get (int fromPosition) => buffer.Slice (fromPosition, curPos - fromPosition); + public bool EndOfSpan => curPos >= buffer.Length; + } +} diff --git a/Crow/src/Widgets/TemplatedControl.cs b/Crow/src/Widgets/TemplatedControl.cs index 9f60e0a8..5110d941 100644 --- a/Crow/src/Widgets/TemplatedControl.cs +++ b/Crow/src/Widgets/TemplatedControl.cs @@ -115,16 +115,15 @@ namespace Crow this.ClearTemplateBinding(); if (template == null) { - int mdTok = this.GetType ().MetadataToken; - - if (!IFace.DefaultTemplates.ContainsKey (mdTok)) { - string defTmpId = this.GetType ().FullName + ".template"; + string defTmpId = this.GetType ().FullName + ".template"; + if (!IFace.DefaultTemplates.ContainsKey (defTmpId)) { + Stream s = IFace.GetStreamFromPath ("#" + defTmpId); if (s == null) throw new Exception (string.Format ("No default template found for '{0}'", this.GetType ().FullName)); - IFace.DefaultTemplates [mdTok] = new IML.Instantiator (IFace, s, defTmpId); + IFace.DefaultTemplates [defTmpId] = new IML.Instantiator (IFace, s, defTmpId); } - this.SetChild (IFace.DefaultTemplates[mdTok].CreateInstance()); + this.SetChild (IFace.DefaultTemplates[defTmpId].CreateInstance()); }else this.SetChild (template); } diff --git a/Crow/src/Widgets/Widget.cs b/Crow/src/Widgets/Widget.cs index 8e44759c..eb963926 100644 --- a/Crow/src/Widgets/Widget.cs +++ b/Crow/src/Widgets/Widget.cs @@ -982,12 +982,10 @@ namespace Crow rootDataLevel = true; DbgLogger.StartEvent(DbgEvtType.GOLockUpdate, this); - lock (IFace.UpdateMutex) { OnDataSourceChanged (this, dse); NotifyValueChangedAuto (DataSource); } - DbgLogger.EndEvent (DbgEvtType.GOLockUpdate); } get { @@ -1025,7 +1023,7 @@ namespace Crow #endif #if DEBUG_BINDING - Debug.WriteLine("New DataSource for => {0} \n\t{1}=>{2}", this.ToString(),e.OldDataSource,e.NewDataSource); + Console.WriteLine("New DataSource for => {0} \n\t{1}=>{2}", this.ToString(),e.OldDataSource,e.NewDataSource); #endif } ///