From 9e68cf0071e98f48ac975fb885306dc887fe0c72 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 1 Oct 2023 12:15:08 +0200 Subject: [PATCH] fix in linux debugger --- .../DebugVariablesListWindowForm.cs | 4 +- .../IB/Debugger/Debugger.cs | 10 ++- .../IB/Debugger/LocalVars.cs | 16 ----- .../MonoDebugging/Client/ObjectValue.cs | 67 ++++++++++++++----- 4 files changed, 59 insertions(+), 38 deletions(-) diff --git a/VisualPascalABCNETLinux/DockContent/DebugVariablesListWindowForm.cs b/VisualPascalABCNETLinux/DockContent/DebugVariablesListWindowForm.cs index d7ae7b51d..57b093f37 100644 --- a/VisualPascalABCNETLinux/DockContent/DebugVariablesListWindowForm.cs +++ b/VisualPascalABCNETLinux/DockContent/DebugVariablesListWindowForm.cs @@ -204,8 +204,8 @@ namespace VisualPascalABC ValueItem vi = new ValueItem(rv.monoValue, this.watchList.Rows[i].Cells[0].Value as string, WorkbenchServiceFactory.DebuggerManager.evaluator.declaringType); (this.watchList.Rows[i] as AdvancedDataGridView.TreeGridNode)._grid = this.watchList; (this.watchList.Rows[i] as AdvancedDataGridView.TreeGridNode).Content = vi; - this.watchList.Rows[i].Cells[1].Value = WorkbenchServiceFactory.DebuggerManager.MakeValueView(rv.obj_val);//rv.obj_val.AsString; - this.watchList.Rows[i].Cells[2].Value = DebugUtils.WrapTypeName(rv.obj_val.Type); + this.watchList.Rows[i].Cells[1].Value = rv.monoValue.Value;//rv.obj_val.AsString; + this.watchList.Rows[i].Cells[2].Value = rv.monoValue.TypeName; this.watchList.InvalidateCell(0, i); } catch (System.Exception e) diff --git a/VisualPascalABCNETLinux/IB/Debugger/Debugger.cs b/VisualPascalABCNETLinux/IB/Debugger/Debugger.cs index 50773e1bd..69d061ba4 100644 --- a/VisualPascalABCNETLinux/IB/Debugger/Debugger.cs +++ b/VisualPascalABCNETLinux/IB/Debugger/Debugger.cs @@ -554,7 +554,7 @@ namespace VisualPascalABC private delegate void EndDebuggerSessionDelegate(); - public void EndDebuggerSession() + private void EndDebuggerSessionSafe() { if (Mono.Debugger.Soft.VirtualMachineManager.currentProcess == null) return; @@ -606,8 +606,12 @@ namespace VisualPascalABC private void Process_Exited(object sender, EventArgs e) { - VisualPABCSingleton.MainForm.Invoke(new EndDebuggerSessionDelegate(EndDebuggerSession)); - + EndDebuggerSession(); + } + + public void EndDebuggerSession() + { + VisualPABCSingleton.MainForm.Invoke(new EndDebuggerSessionDelegate(EndDebuggerSessionSafe)); } private void MonoDebuggerSession_TargetThreadStopped(object sender, Mono.Debugging.Client.TargetEventArgs e) diff --git a/VisualPascalABCNETLinux/IB/Debugger/LocalVars.cs b/VisualPascalABCNETLinux/IB/Debugger/LocalVars.cs index 3187bd71d..49016662e 100644 --- a/VisualPascalABCNETLinux/IB/Debugger/LocalVars.cs +++ b/VisualPascalABCNETLinux/IB/Debugger/LocalVars.cs @@ -585,11 +585,6 @@ namespace VisualPascalABC if (monoValue.Name.IndexOf(':') != -1) return monoValue.Name.Substring(0, monoValue.Name.IndexOf(':')); return monoValue.Name; - if (!string.IsNullOrEmpty(name)) - return name; - if (!((val is NamedValue) ? (val as NamedValue).Name : name).Contains("$rv")) - return (val is NamedValue) ? ((val as NamedValue).Name.IndexOf(':') != -1 ? (val as NamedValue).Name.Substring(0, (val as NamedValue).Name.IndexOf(':')) : (val as NamedValue).Name) : name; - return "Result"; } catch { @@ -745,17 +740,6 @@ namespace VisualPascalABC get { return false; - try - { - if (!failed) - return val.IsInteger && !ShowValuesInHexadecimal || val.IsPrimitive; - else - return false; - } - catch - { - return false; - } } } diff --git a/VisualPascalABCNETLinux/MonoDebugging/Client/ObjectValue.cs b/VisualPascalABCNETLinux/MonoDebugging/Client/ObjectValue.cs index 4bacedeeb..1b5b188e6 100644 --- a/VisualPascalABCNETLinux/MonoDebugging/Client/ObjectValue.cs +++ b/VisualPascalABCNETLinux/MonoDebugging/Client/ObjectValue.cs @@ -33,6 +33,7 @@ using System.Linq; using Mono.Debugging.Backend; using Mono.Debugging.Evaluation; +using System.Text; namespace Mono.Debugging.Client { @@ -67,29 +68,61 @@ namespace Mono.Debugging.Client [NonSerialized] public StackFrame parentFrame; + static Dictionary pascalTypes; + static ObjectValue() + { + pascalTypes = new Dictionary(); + pascalTypes.Add("int", "integer"); + pascalTypes.Add("double", "real"); + pascalTypes.Add("float", "single"); + pascalTypes.Add("uint", "longword"); + pascalTypes.Add("long", "int64"); + pascalTypes.Add("short", "smallint"); + pascalTypes.Add("ushort", "word"); + pascalTypes.Add("sbyte", "shortint"); + pascalTypes.Add("bool", "boolean"); + } static ObjectValue Create(IObjectValueSource source, ObjectPath path, string typeName) { var val = new ObjectValue(); val.typeName = typeName; - int ptr_ind = val.typeName.IndexOf('*'); - string ptr = ""; - if (ptr_ind != -1) - ptr = val.typeName.Substring(ptr_ind).Replace('*', '^'); - switch (val.typeName.Replace("*","")) - { - case "int": val.typeName = "integer"; break; - case "double": val.typeName = "real"; break; - case "float": val.typeName = "single"; break; - case "uint": val.typeName = "longword"; break; - case "long": val.typeName = "int64"; break; - case "ulong": val.typeName = "uint64"; break; - case "short": val.typeName = "smallint"; break; - case "ushort": val.typeName = "word"; break; - case "sbyte": val.typeName = "shortint"; break; - case "bool": val.typeName = "boolean"; break; + StringBuilder sb = new StringBuilder(); + StringBuilder buf = new StringBuilder(); + int i = 0; + while (i < val.typeName.Length) + { + char c = val.typeName[i]; + if (char.IsLetterOrDigit(c)) + buf.Append(c); + else if (c != ']') + { + string type = buf.ToString(); + string pascalType = ""; + if (c == '*') + sb.Append("^"); + else if (c == '[') + sb.Append("array of "); + if (pascalTypes.TryGetValue(type, out pascalType)) + sb.Append(pascalType); + else + sb.Append(type); + if (c != '*' && c != ']' && c != '[') + sb.Append(c); + buf.Clear(); + } + i++; + } + if (buf.Length > 0) + { + string type = buf.ToString(); + string pascalType = ""; + if (pascalTypes.TryGetValue(type, out pascalType)) + sb.Append(pascalType); + else + sb.Append(type); } - val.typeName = ptr+val.typeName.Replace("*", ""); + val.typeName = sb.ToString(); val.source = source; val.path = path; return val;