diff --git a/components/fpdebug/fpdbgdwarfdataclasses.pas b/components/fpdebug/fpdbgdwarfdataclasses.pas index 212cd8a857..f8e3b48ec6 100644 --- a/components/fpdebug/fpdbgdwarfdataclasses.pas +++ b/components/fpdebug/fpdbgdwarfdataclasses.pas @@ -2122,6 +2122,13 @@ var SetError(fpErrLocationParserNoAddressOnStack); end; + function AssertAddressOrRegOnStack: Boolean; inline; + begin + Result := (FStack.PeekKind in [mlfTargetMem, mlfSelfMem, mlfConstantDeref, mlfTargetRegister]); + if not Result then + SetError(fpErrLocationParserNoAddressOnStack); + end; + function AssertMinCount(ACnt: Integer): Boolean; inline; begin Result := FStack.Count >= ACnt; @@ -2198,7 +2205,7 @@ begin FStack.Push(FCU.ReadTargetAddressFromDwarfSection(CurData, True)); // always mlfTargetMem; end; DW_OP_deref: begin - if not AssertAddressOnStack then exit; + if not AssertAddressOrRegOnStack then exit; EntryP := FStack.PeekForDeref; if not ReadAddressFromMemory(EntryP^, AddrSize, NewLoc) then exit; EntryP^ := NewLoc; // mlfTargetMem; @@ -2213,7 +2220,7 @@ begin EntryP^ := NewLoc; // mlfTargetMem; end; DW_OP_deref_size: begin - if not AssertAddressOnStack then exit; + if not AssertAddressOrRegOnStack then exit; EntryP := FStack.PeekForDeref; if not ReadAddressFromMemory(EntryP^, ReadUnsignedFromExpression(CurData, 1), NewLoc) then exit; EntryP^ := NewLoc; // mlfTargetMem;