FPDebug: starting plus minus operator

git-svn-id: trunk@44238 -
This commit is contained in:
martin 2014-02-25 15:02:04 +00:00
parent 96af3a4213
commit 1cedbd7c7f

View File

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