mirror of https://gitlab.com/basile.b/dexed.git
#97, refact interpreter with json helpers
This commit is contained in:
parent
00761b740e
commit
c3e55b86ab
118
src/ce_gdb.pas
118
src/ce_gdb.pas
|
@ -7,7 +7,7 @@ interface
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, RegExpr, ComCtrls,
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, RegExpr, ComCtrls,
|
||||||
PropEdits, GraphPropEdits, RTTIGrids, Dialogs, ExtCtrls, Menus, Buttons,
|
PropEdits, GraphPropEdits, RTTIGrids, Dialogs, ExtCtrls, Menus, Buttons,
|
||||||
StdCtrls, process, fpjson, typinfo, Unix, ListViewFilterEdit, SynEdit,
|
StdCtrls, process, xfpjson, typinfo, Unix, ListViewFilterEdit, SynEdit,
|
||||||
ce_common, ce_interfaces, ce_widget, ce_processes, ce_observer, ce_synmemo,
|
ce_common, ce_interfaces, ce_widget, ce_processes, ce_observer, ce_synmemo,
|
||||||
ce_sharedres, ce_stringrange, ce_dsgncontrols, ce_dialogs, ce_dbgitf,
|
ce_sharedres, ce_stringrange, ce_dsgncontrols, ce_dialogs, ce_dbgitf,
|
||||||
ce_ddemangle, ce_writableComponent, EditBtn, strutils;
|
ce_ddemangle, ce_writableComponent, EditBtn, strutils;
|
||||||
|
@ -1761,11 +1761,9 @@ var
|
||||||
fFpuRaw: array[0..9] of Byte absolute fFpuExtended;
|
fFpuRaw: array[0..9] of Byte absolute fFpuExtended;
|
||||||
begin
|
begin
|
||||||
|
|
||||||
val := fJson.Find('reason');
|
if fJson.findAny('reason', val) then
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
begin
|
||||||
reason := val.AsString;
|
reason := val.AsString;
|
||||||
|
|
||||||
r := stopReasons.match(reason);
|
r := stopReasons.match(reason);
|
||||||
if assigned(r) then
|
if assigned(r) then
|
||||||
begin
|
begin
|
||||||
|
@ -1777,11 +1775,7 @@ begin
|
||||||
end;
|
end;
|
||||||
if brkreason = dbWatch then
|
if brkreason = dbWatch then
|
||||||
begin
|
begin
|
||||||
obj := TJSONObject(fJson.Find('wpt'));
|
if fJson.findObject('wpt', obj) and obj.findAny('exp', val) then
|
||||||
if obj.isNotNil and (obj.JSONType = jtObject) then
|
|
||||||
begin
|
|
||||||
val := obj.Find('exp');
|
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
begin
|
||||||
k := lstVariables.FindCaption(0, val.AsString, false, true, false);
|
k := lstVariables.FindCaption(0, val.AsString, false, true, false);
|
||||||
if k.isNotNil then
|
if k.isNotNil then
|
||||||
|
@ -1791,24 +1785,18 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
if fJson.findObject('frame', obj) then
|
||||||
obj := TJSONObject(fJson.Find('frame'));
|
|
||||||
if obj.isNotNil and (obj.JSONType = jtObject) then
|
|
||||||
begin
|
begin
|
||||||
val := obj.Find('addr');
|
if obj.FindAny('addr', val) then
|
||||||
if val.isNotNil then
|
|
||||||
fLastOffset:=val.AsString;
|
fLastOffset:=val.AsString;
|
||||||
val := obj.Find('fullname');
|
if obj.FindANy('fullname', val) then
|
||||||
if val.isNotNil then
|
|
||||||
fLastFilename := val.AsString;
|
fLastFilename := val.AsString;
|
||||||
val := obj.Find('line');
|
if obj.findAny('line', val) then
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
begin
|
||||||
line := val.AsInteger;
|
line := val.AsInteger;
|
||||||
fLastLine := val.AsString;
|
fLastLine := val.AsString;
|
||||||
end;
|
end;
|
||||||
val := obj.Find('func');
|
if obj.findAny('func', val) then
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
begin
|
||||||
if fOptions.autoDisassemble and (val.AsString <> fLastFunction) then
|
if fOptions.autoDisassemble and (val.AsString <> fLastFunction) then
|
||||||
infoAsm(fLastFilename);
|
infoAsm(fLastFilename);
|
||||||
|
@ -1832,29 +1820,22 @@ begin
|
||||||
begin
|
begin
|
||||||
signame := 'unknown signal';
|
signame := 'unknown signal';
|
||||||
sigmean := 'unknown meaning';
|
sigmean := 'unknown meaning';
|
||||||
val := fJson.Find('signal-name');
|
if fJson.findAny('signal-name', val) then
|
||||||
if val.isNotNil then
|
|
||||||
signame := val.AsString;
|
signame := val.AsString;
|
||||||
if (fOptions.ignoredSignals.Count <> 0) and
|
if (fOptions.ignoredSignals.Count <> 0) and
|
||||||
(fOptions.ignoredSignals.IndexOf(signame) <> -1) then
|
(fOptions.ignoredSignals.IndexOf(signame) <> -1) then
|
||||||
exit;
|
exit;
|
||||||
val := fJson.Find('signal-meaning');
|
if fJson.findAny('signal-meaning', val) then
|
||||||
if val.isNotNil then
|
|
||||||
sigmean := val.AsString;
|
sigmean := val.AsString;
|
||||||
obj := TJSONObject(fJson.Find('frame'));
|
if fJson.findObject('frame', obj) then
|
||||||
if obj.isNotNil and (obj.JSONType = jtObject) then
|
|
||||||
begin
|
begin
|
||||||
val := obj.Find('addr');
|
if obj.findAny('addr', val) then
|
||||||
if val.isNotNil then
|
|
||||||
fLastOffset:=val.AsString;
|
fLastOffset:=val.AsString;
|
||||||
val := obj.Find('fullname');
|
if obj.findAny('fullname', val) then
|
||||||
if val.isNotNil then
|
|
||||||
fLastFilename := val.AsString;
|
fLastFilename := val.AsString;
|
||||||
val := obj.Find('line');
|
if obj.findAny('line', val) then
|
||||||
if val.isNotNil then
|
|
||||||
line := val.AsInteger;
|
line := val.AsInteger;
|
||||||
val := obj.Find('func');
|
if obj.findAny('func', val) then
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
begin
|
||||||
if fOptions.autoDisassemble and (val.AsString <> fLastFunction) then
|
if fOptions.autoDisassemble and (val.AsString <> fLastFunction) then
|
||||||
infoAsm(fLastFilename);
|
infoAsm(fLastFilename);
|
||||||
|
@ -1902,31 +1883,22 @@ begin
|
||||||
setState(gsNone);
|
setState(gsNone);
|
||||||
subjDebugStop(fSubj);
|
subjDebugStop(fSubj);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
val := fJson.Find('msg');
|
if fJson.findAny('msg', val) then
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
|
||||||
fMsg.message(val.AsString, nil, amcMisc, amkAuto);
|
fMsg.message(val.AsString, nil, amcMisc, amkAuto);
|
||||||
end;
|
|
||||||
|
|
||||||
val := fJson.Find('register-values');
|
if fJson.findArray('register-values', arr) then
|
||||||
if val.isNotNil and (val.JSONType = jtArray) then
|
|
||||||
begin
|
begin
|
||||||
arr := TJSONArray(val);
|
|
||||||
for i := 0 to arr.Count-1 do
|
for i := 0 to arr.Count-1 do
|
||||||
begin
|
begin
|
||||||
obj := TJSONObject(arr.Objects[i]);
|
obj := TJSONObject(arr.Objects[i]);
|
||||||
if obj.isNil then
|
if obj.isNil then
|
||||||
break
|
break;
|
||||||
else
|
if obj.findAny('number', val) then
|
||||||
begin
|
|
||||||
val := obj.Find('number');
|
|
||||||
if val.isNotNil then
|
|
||||||
number := val.AsInteger;
|
number := val.AsInteger;
|
||||||
val := obj.Find('value');
|
if obj.findAny('value', val) then
|
||||||
if val.isNotNil then case number of
|
case number of
|
||||||
0..integer(high(TCpuRegister)):
|
0..integer(high(TCpuRegister)):
|
||||||
begin
|
begin
|
||||||
fInspState.CPU.setInspectableRegister
|
fInspState.CPU.setInspectableRegister
|
||||||
|
@ -1959,16 +1931,13 @@ begin
|
||||||
end;
|
end;
|
||||||
// TODO-cGDB: get SSE registers
|
// TODO-cGDB: get SSE registers
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
cpuViewer.RefreshPropertyValues;
|
cpuViewer.RefreshPropertyValues;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
val := fJson.Find('stack');
|
if fJson.findArray('stack', arr) then
|
||||||
if val.isNotNil and (val.JSONType = jtArray) then
|
|
||||||
begin
|
begin
|
||||||
fStackItems.clear;
|
fStackItems.clear;
|
||||||
lstCallStack.Clear;
|
lstCallStack.Clear;
|
||||||
arr := TJSONArray(val);
|
|
||||||
for i := 0 to arr.Count-1 do
|
for i := 0 to arr.Count-1 do
|
||||||
begin
|
begin
|
||||||
obj := arr.Objects[i];
|
obj := arr.Objects[i];
|
||||||
|
@ -2027,12 +1996,10 @@ begin
|
||||||
lstVariables.EndUpdate;
|
lstVariables.EndUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
val := fJson.Find('asm_insns');
|
if fJson.findArray('asm_insns', arr) then
|
||||||
if val.isNotNil and (val.JSONType = jtArray) then
|
|
||||||
begin
|
begin
|
||||||
lstAsm.BeginUpdate;
|
lstAsm.BeginUpdate;
|
||||||
lstAsm.Clear;
|
lstAsm.Clear;
|
||||||
arr := TJSONArray(val);
|
|
||||||
for i := 0 to arr.Count-1 do
|
for i := 0 to arr.Count-1 do
|
||||||
begin
|
begin
|
||||||
obj := arr.Objects[i];
|
obj := arr.Objects[i];
|
||||||
|
@ -2059,44 +2026,35 @@ begin
|
||||||
selectAsmInstr;
|
selectAsmInstr;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
val := fJson.Find('threads');
|
if fJson.findArray('threads', arr) then
|
||||||
if val.isNotNil and (val.JSONType = jtArray) then
|
|
||||||
begin
|
begin
|
||||||
arr := TJSONArray(val);
|
|
||||||
lstThreads.BeginUpdate;
|
lstThreads.BeginUpdate;
|
||||||
lstThreads.Clear;
|
lstThreads.Clear;
|
||||||
for i := 0 to arr.Count-1 do
|
for i := 0 to arr.Count-1 do
|
||||||
begin
|
begin
|
||||||
obj := arr.Objects[i];
|
obj := arr.Objects[i];
|
||||||
val := obj.Find('id');
|
if obj.findAny('id', val) then
|
||||||
if val.isNotNil then
|
|
||||||
begin
|
begin
|
||||||
lstThreads.AddItem(val.AsString, nil);
|
lstThreads.AddItem(val.AsString, nil);
|
||||||
k := lstThreads.Items[lstThreads.Items.Count-1];
|
k := lstThreads.Items[lstThreads.Items.Count-1];
|
||||||
val := obj.Find('state');
|
if obj.findAny('state', val) then
|
||||||
if val.isNotNil then
|
|
||||||
k.SubItems.Add(val.AsString);
|
k.SubItems.Add(val.AsString);
|
||||||
val := obj.Find('core');
|
if obj.findAny('core', val) then
|
||||||
if val.isNotNil then
|
|
||||||
k.SubItems.Add(val.AsString);
|
k.SubItems.Add(val.AsString);
|
||||||
val := obj.Find('frame');
|
val := obj.Find('frame');
|
||||||
if val.isNotNil and (val.JSONType = jtObject) then
|
if val.isNotNil and (val.JSONType = jtObject) then
|
||||||
begin
|
begin
|
||||||
obj := TJSONObject(val);
|
obj := TJSONObject(val);
|
||||||
val := obj.Find('func');
|
if obj.findAny('func', val) then
|
||||||
if val.isNotNil then
|
|
||||||
if fOptions.autoDemangle then
|
if fOptions.autoDemangle then
|
||||||
k.SubItems.Add(demangle(val.AsString))
|
k.SubItems.Add(demangle(val.AsString))
|
||||||
else
|
else
|
||||||
k.SubItems.Add(demangle(val.AsString));
|
k.SubItems.Add(demangle(val.AsString));
|
||||||
val := obj.Find('addr');
|
if obj.findAny('addr', val) then
|
||||||
if val.isNotNil then
|
|
||||||
k.SubItems.Add(val.AsString);
|
k.SubItems.Add(val.AsString);
|
||||||
val := obj.Find('fullname');
|
if obj.findAny('fullname', val) then
|
||||||
if val.isNotNil then
|
|
||||||
k.SubItems.Add(val.AsString);
|
k.SubItems.Add(val.AsString);
|
||||||
val := obj.Find('line');
|
if obj.findAny('line', val) then
|
||||||
if val.isNotNil then
|
|
||||||
k.SubItems.Add(val.AsString);
|
k.SubItems.Add(val.AsString);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -2107,8 +2065,7 @@ begin
|
||||||
if fOptions.showGdbOutput or fShowFromCustomCommand then
|
if fOptions.showGdbOutput or fShowFromCustomCommand then
|
||||||
begin
|
begin
|
||||||
fShowFromCustomCommand := false;
|
fShowFromCustomCommand := false;
|
||||||
arr := TJSONArray(fJson.Find('CLI'));
|
if fJson.findArray('CLI', arr) then
|
||||||
if arr.isNotNil then
|
|
||||||
for i := 0 to arr.Count-1 do
|
for i := 0 to arr.Count-1 do
|
||||||
fMsg.message(arr.Strings[i], nil, amcMisc, amkBub);
|
fMsg.message(arr.Strings[i], nil, amcMisc, amkBub);
|
||||||
end;
|
end;
|
||||||
|
@ -2118,7 +2075,6 @@ end;
|
||||||
procedure TCEGdbWidget.gdboutJsonize(sender: TObject);
|
procedure TCEGdbWidget.gdboutJsonize(sender: TObject);
|
||||||
var
|
var
|
||||||
str: string;
|
str: string;
|
||||||
//lst: TStringList;
|
|
||||||
begin
|
begin
|
||||||
if fMsg = nil then
|
if fMsg = nil then
|
||||||
exit;
|
exit;
|
||||||
|
@ -2134,16 +2090,6 @@ begin
|
||||||
|
|
||||||
parseGdbout(fLog.Text, fJson);
|
parseGdbout(fLog.Text, fJson);
|
||||||
interpretJson;
|
interpretJson;
|
||||||
|
|
||||||
//lst := TStringList.Create;
|
|
||||||
//try
|
|
||||||
// str := fJson.FormatJSON(DefaultFormat,2);
|
|
||||||
// lst.Text:= str;
|
|
||||||
// lst.SaveToFile('/home/basile/gdbmessage.json');
|
|
||||||
//finally
|
|
||||||
// lst.Free;
|
|
||||||
//end;
|
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEGdbWidget.readOutput;
|
procedure TCEGdbWidget.readOutput;
|
||||||
|
|
Loading…
Reference in New Issue