#97, refact interpreter with json helpers

This commit is contained in:
Basile Burg 2016-11-29 00:52:41 +01:00
parent 00761b740e
commit c3e55b86ab
No known key found for this signature in database
GPG Key ID: 1868039F415CB8CF
1 changed files with 66 additions and 120 deletions

View File

@ -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;