mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-24 19:20:08 +02:00
FPDebug: starting plus minus operator
git-svn-id: trunk@44238 -
This commit is contained in:
parent
96af3a4213
commit
1cedbd7c7f
@ -331,6 +331,7 @@ type
|
||||
// Unary + -
|
||||
protected
|
||||
procedure Init; override;
|
||||
function DoGetResultValue: TDbgSymbolValue; override;
|
||||
end;
|
||||
|
||||
{ TFpPascalExpressionPartOperatorPlusMinus }
|
||||
@ -339,6 +340,7 @@ type
|
||||
// Binary + -
|
||||
protected
|
||||
procedure Init; override;
|
||||
function DoGetResultValue: TDbgSymbolValue; override;
|
||||
end;
|
||||
|
||||
{ TFpPascalExpressionPartOperatorMulDiv }
|
||||
@ -1176,14 +1178,6 @@ begin
|
||||
{$IFDEF WITH_REFCOUNT_DEBUG}Result.DbgRenameReference(nil, 'DoGetResultValue'){$ENDIF};
|
||||
end;
|
||||
|
||||
{ TFpPascalExpressionPartOperatorUnaryPlusMinus }
|
||||
|
||||
procedure TFpPascalExpressionPartOperatorUnaryPlusMinus.Init;
|
||||
begin
|
||||
FPrecedence := PRECEDENCE_UNARY_SIGN;
|
||||
inherited Init;
|
||||
end;
|
||||
|
||||
{ TFpPascalExpression }
|
||||
|
||||
procedure TFpPascalExpression.Parse;
|
||||
@ -2029,6 +2023,48 @@ begin
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
{ TFpPascalExpressionPartOperatorUnaryPlusMinus }
|
||||
|
||||
procedure TFpPascalExpressionPartOperatorUnaryPlusMinus.Init;
|
||||
begin
|
||||
FPrecedence := PRECEDENCE_UNARY_SIGN;
|
||||
inherited Init;
|
||||
end;
|
||||
|
||||
function TFpPascalExpressionPartOperatorUnaryPlusMinus.DoGetResultValue: TDbgSymbolValue;
|
||||
var
|
||||
tmp1: TDbgSymbolValue;
|
||||
IsAdd: Boolean;
|
||||
begin
|
||||
Result := nil;
|
||||
if Count <> 1 then exit;
|
||||
assert((GetText = '+') or (GetText = '-'), 'TFpPascalExpressionPartOperatorUnaryPlusMinus.DoGetResultValue: (GetText = +) or (GetText = -)');
|
||||
|
||||
tmp1 := Items[0].ResultValue;
|
||||
IsAdd := GetText = '+';
|
||||
if (tmp1 = nil) then exit;
|
||||
|
||||
{$PUSH}{$R-}{$Q-}
|
||||
if IsAdd then begin
|
||||
case tmp1.Kind of
|
||||
skPointer: ;
|
||||
skInteger: Result := tmp1;
|
||||
skCardinal: Result := tmp1;
|
||||
end;
|
||||
end
|
||||
else begin
|
||||
case tmp1.Kind of
|
||||
skPointer: ;
|
||||
skInteger: Result := TDbgSymbolValueConstNumber.Create(-tmp1.AsInteger, True);
|
||||
skCardinal: Result := TDbgSymbolValueConstNumber.Create(-tmp1.AsCardinal, True);
|
||||
end;
|
||||
end;
|
||||
{$POP}
|
||||
|
||||
if Result <> nil then
|
||||
Result.AddReference{$IFDEF WITH_REFCOUNT_DEBUG}(nil, 'DoGetResultValue'){$ENDIF};
|
||||
end;
|
||||
|
||||
{ TFpPascalExpressionPartOperatorPlusMinus }
|
||||
|
||||
procedure TFpPascalExpressionPartOperatorPlusMinus.Init;
|
||||
@ -2037,6 +2073,57 @@ begin
|
||||
inherited Init;
|
||||
end;
|
||||
|
||||
function TFpPascalExpressionPartOperatorPlusMinus.DoGetResultValue: TDbgSymbolValue;
|
||||
var
|
||||
tmp1, tmp2: TDbgSymbolValue;
|
||||
IsAdd: Boolean;
|
||||
begin
|
||||
Result := nil;
|
||||
if Count <> 2 then exit;
|
||||
assert((GetText = '+') or (GetText = '-'), 'TFpPascalExpressionPartOperatorUnaryPlusMinus.DoGetResultValue: (GetText = +) or (GetText = -)');
|
||||
|
||||
tmp1 := Items[0].ResultValue;
|
||||
tmp2 := Items[1].ResultValue;
|
||||
IsAdd := GetText = '+';
|
||||
if (tmp1 = nil) or (tmp2 = nil) then exit;
|
||||
|
||||
{$PUSH}{$R-}{$Q-}
|
||||
if IsAdd then begin
|
||||
case tmp1.Kind of
|
||||
skPointer: ;
|
||||
skInteger: case tmp2.Kind of
|
||||
skPointer: ;
|
||||
skInteger: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsInteger + tmp2.AsInteger, True);
|
||||
skCardinal: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsInteger + tmp2.AsCardinal, True);
|
||||
end;
|
||||
skCardinal: case tmp2.Kind of
|
||||
skPointer: ;
|
||||
skInteger: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsCardinal + tmp2.AsInteger, True);
|
||||
skCardinal: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsCardinal + tmp2.AsCardinal, False);
|
||||
end;
|
||||
end;
|
||||
end
|
||||
else begin
|
||||
case tmp1.Kind of
|
||||
skPointer: ;
|
||||
skInteger: case tmp2.Kind of
|
||||
skPointer: ;
|
||||
skInteger: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsInteger - tmp2.AsInteger, True);
|
||||
skCardinal: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsInteger - tmp2.AsCardinal, True);
|
||||
end;
|
||||
skCardinal: case tmp2.Kind of
|
||||
skPointer: ;
|
||||
skInteger: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsCardinal - tmp2.AsInteger, True);
|
||||
skCardinal: Result := TDbgSymbolValueConstNumber.Create(tmp1.AsCardinal - tmp2.AsCardinal, True);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$POP}
|
||||
|
||||
if Result <> nil then
|
||||
Result.AddReference{$IFDEF WITH_REFCOUNT_DEBUG}(nil, 'DoGetResultValue'){$ENDIF};
|
||||
end;
|
||||
|
||||
{ TFpPascalExpressionPartOperatorMulDiv }
|
||||
|
||||
procedure TFpPascalExpressionPartOperatorMulDiv.Init;
|
||||
|
Loading…
Reference in New Issue
Block a user