lazarus/components/lazdebuggers/lazdebuggerfpdserver/fpdserverdebuggercommands.inc
2019-01-09 20:50:23 +00:00

320 lines
9.3 KiB
PHP

{ TFPDSendFilenameCommand }
procedure TFPDSendFilenameCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','filename');
AJsonObject.Add('filename',FFileName);
end;
constructor TFPDSendFilenameCommand.create(AFileName: string);
begin
inherited create;
FFileName:=AFileName;
end;
{ TFPDSendRunCommand }
procedure TFPDSendRunCommand.DoOnCommandFailed(ACommandResponse: TJSonObject);
begin
FServerDebugger.DoOnRunFailed;
end;
procedure TFPDSendRunCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','run');
end;
{ TFPDSendStepOutCommand }
procedure TFPDSendStepOutCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','stepout');
end;
{ TFPDSendStepOverInstrCommand }
procedure TFPDSendStepOverInstrCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','stepoverinstr');
end;
{ TFPDSendStepIntoInstrCommand }
procedure TFPDSendStepIntoInstrCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','stepintoinstr');
end;
{ TFPDSendStepCommand }
procedure TFPDSendStepCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','step');
end;
{ TFPDSendStopCommand }
procedure TFPDSendStopCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','stop');
end;
{ TFPDSendNextCommand }
procedure TFPDSendNextCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','next');
end;
{ TFPDSendDoCurrentCommand }
procedure TFPDSendDoCurrentCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','getlocationinfo');
end;
procedure TFPDSendDoCurrentCommand.DoOnCommandSuccesfull(ACommandResponse: TJSonObject);
var
LocRecJSon: TJSONObject;
LocRec: TDBGLocationRec;
begin
LocRecJSon := ACommandResponse.Find('locationRec') as TJSONObject;
if assigned(LocRecJSon) then
begin
LocRec.Address:=Hex2Dec(LocRecJSon.Get('address','0'));
LocRec.FuncName:=LocRecJSon.Get('funcName','');
LocRec.SrcFile:=LocRecJSon.Get('srcFile','');
LocRec.SrcFullName:=LocRecJSon.Get('srcFullName','');
LocRec.SrcLine:=LocRecJSon.Get('srcLine',-1);
FServerDebugger.DoOnDoCurrentSuccessfull(LocRec);
end;
end;
{ TFPDSendAddBreakpointCommand }
procedure TFPDSendAddBreakpointCommand.DoOnCommandFailed(ACommandResponse: TJSonObject);
var
ABreakpoint: TFPBreakpoint;
begin
ABreakpoint := TFPBreakpoints(FServerDebugger.BreakPoints).FindByUID(CommandUID);
if assigned(ABreakpoint) then
begin
ABreakpoint.ServerId:=0;
ABreakpoint.SetInvalid;
ABreakpoint.DoChanged;
end;
end;
procedure TFPDSendAddBreakpointCommand.DoOnCommandSuccesfull(ACommandResponse: TJSonObject);
var
ABreakpoint: TFPBreakpoint;
begin
ABreakpoint := TFPBreakpoints(FServerDebugger.BreakPoints).FindByUID(CommandUID);
if assigned(ABreakpoint) then
begin
ABreakpoint.ServerId :=StrToInt(ACommandResponse.get('BreakpointServerIdr','0'));
ABreakpoint.SetValid;
ABreakpoint.DoChanged;
end;
end;
procedure TFPDSendAddBreakpointCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','addbreakpoint');
if FFileName<>'' then
begin
AJsonObject.Add('filename',FFileName);
AJsonObject.Add('line',FLineNr);
end
else
begin
AJsonObject.Add('location', Dec2Numb(FLocation, 8, 16));
end;
end;
constructor TFPDSendAddBreakpointCommand.create(AFileName: string; ALineNr: integer);
begin
inherited create;
FFileName:=AFileName;
FLineNr:=ALineNr;
end;
constructor TFPDSendAddBreakpointCommand.create(ALocation: TDBGPtr);
begin
inherited create;
FLocation:=ALocation;
end;
{ TFPDSendContinueCommand }
procedure TFPDSendContinueCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','continue');
end;
procedure TFPDSendContinueCommand.DoOnCommandSuccesfull(ACommandResponse: TJSonObject);
begin
inherited DoOnCommandSuccesfull(ACommandResponse);
FServerDebugger.DoOnContinueSuccessfull;
end;
{ TFPDSendCallStackCommand }
procedure TFPDSendCallStackCommand.DoCallStackFreed(Sender: TObject);
begin
FCallStack:=nil;
end;
procedure TFPDSendCallStackCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','stacktrace');
end;
constructor TFPDSendCallStackCommand.create(ACallStack: TCallStackBase; ACallStackSupplier: TCallStackSupplier);
begin
inherited create(True);
ACallStack.AddFreeNotification(@DoCallStackFreed);
FCallStack := ACallStack;
FCallStackSupplier := ACallStackSupplier;
end;
destructor TFPDSendCallStackCommand.Destroy;
begin
if assigned(FCallStack) then
FCallStack.RemoveFreeNotification(@DoCallStackFreed);
inherited Destroy;
end;
procedure TFPDSendCallStackCommand.DoOnCommandSuccesfull(ACommandResponse: TJSonObject);
var
JSonCallStackArr: TJSONArray;
JSonCallStackEntryObj: TJSONObject;
e: TCallStackEntry;
It: TMapIterator;
AnAddress: TDBGPtr;
FunctionName: string;
SourceFile: string;
Line: integer;
begin
inherited DoOnCommandSuccesfull(ACommandResponse);
if assigned(FCallStack) then
begin
JSonCallStackArr := ACommandResponse.Get('callstack', TJSONArray(nil));
if assigned(JSonCallStackArr) and (JSonCallStackArr.Count>0) then
begin
FCallStack.Count:=JSonCallStackArr.Count;
FCallStack.SetCountValidity(ddsValid);
It := TMapIterator.Create(FCallstack.RawEntries);
if not It.Locate(FCallstack.LowestUnknown )
then if not It.EOM
then It.Next;
while (not IT.EOM) and (TCallStackEntry(It.DataPtr^).Index < FCallstack.HighestUnknown) do
begin
e := TCallStackEntry(It.DataPtr^);
if e.Validity = ddsRequested then
begin
JSonCallStackEntryObj := JSonCallStackArr.Items[e.Index] as TJSONObject;
AnAddress:=Hex2Dec(JSonCallStackEntryObj.Get('address','0'));
FunctionName:=JSonCallStackEntryObj.Get('functionname','');
SourceFile:=JSonCallStackEntryObj.Get('sourcefile','');
Line:=JSonCallStackEntryObj.get('line',-1);
e.Init(AnAddress, nil, FunctionName, SourceFile, '', Line, ddsValid);
end;
It.Next;
end;
It.Free;
FCallStack.SetCountValidity(ddsValid);
TFPCallStackSupplier(FCallStackSupplier).DoUpdate;
end
else
begin
FCallStack.SetCountValidity(ddsInvalid);
FCallStack.SetHasAtLeastCountInfo(ddsInvalid);
end;
end;
end;
{ TFPDSendDisassembleCommand }
procedure TFPDSendDisassembleCommand.ComposeJSon(AJsonObject: TJSONObject);
begin
inherited ComposeJSon(AJsonObject);
AJsonObject.Add('command','disassemble');
if FStartAddr>0 then
AJsonObject.Add('address', Dec2Numb(FStartAddr, 8, 16));
if FLinesAfter>0 then
AJsonObject.Add('linesafter', FLinesAfter);
if FLinesBefore>0 then
AJsonObject.Add('linesbefore', FLinesBefore);
end;
constructor TFPDSendDisassembleCommand.create(ADisassembler: TDBGDisassembler; AStartAddr: TDBGPtr; ALinesBefore, ALinesAfter: integer);
begin
inherited create(true);
FDisassembler := ADisassembler;
FLinesBefore:=ALinesBefore;
FLinesAfter:=ALinesAfter;
FStartAddr:=AStartAddr;
end;
procedure TFPDSendDisassembleCommand.DoOnCommandSuccesfull(ACommandResponse: TJSonObject);
var
JSonCallStackArr: TJSONArray;
JSonCallStackEntryObj: TJSONObject;
ARange: TDBGDisassemblerEntryRange;
AnEntry: TDisassemblerEntry;
i: Integer;
begin
if assigned(FDisassembler) then
begin
JSonCallStackArr := ACommandResponse.Get('disassembly', TJSONArray(nil));
if assigned(JSonCallStackArr) and (JSonCallStackArr.Count>0) then
begin
ARange := TDBGDisassemblerEntryRange.Create;
ARange.RangeStartAddr:=Hex2Dec(ACommandResponse.Get('startaddress', Dec2Numb(FStartAddr, 8, 16)));
for i := 0 to JSonCallStackArr.Count-1 do
begin
JSonCallStackEntryObj := JSonCallStackArr.Items[i] as TJSONObject;
AnEntry.Addr:=Hex2Dec(JSonCallStackEntryObj.Get('address', '0'));
AnEntry.Dump:=JSonCallStackEntryObj.Get('dump', '');
AnEntry.Statement:=JSonCallStackEntryObj.Get('statement', '');
AnEntry.SrcFileName:=JSonCallStackEntryObj.Get('srcfilename', '');
AnEntry.SrcFileLine:=JSonCallStackEntryObj.Get('srcfileline', 0);
AnEntry.SrcStatementIndex:=JSonCallStackEntryObj.Get('srcstatementindex', 0);
AnEntry.SrcStatementCount:=JSonCallStackEntryObj.Get('srcstatementcount', 0);
AnEntry.FuncName:=JSonCallStackEntryObj.Get('functionname', '');
AnEntry.Offset:=JSonCallStackEntryObj.Get('offset', 0);
ARange.Append(@AnEntry);
end;
ARange.RangeEndAddr:=Hex2Dec(ACommandResponse.Get('endaddress', Dec2Numb(AnEntry.Addr, 8, 16)));
ARange.LastEntryEndAddr:=Hex2Dec(ACommandResponse.Get('lastentryendaddress', '0'));
TFPDBGDisassembler(FDisassembler).AddRange(ARange);
end
end;
end;
procedure TFPDSendCallStackCommand.DoOnCommandFailed(ACommandResponse: TJSonObject);
begin
FCallStack.SetCountValidity(ddsInvalid);
end;