HexSpan?TryGetSpan(FatMethodBody fatBody, HexPosition position, UInt32Data offsetData, UInt32Data lengthData) { if (!offsetData.Span.Span.Contains(position)) { return(null); } return(TryGetSpan(fatBody, offsetData.ReadValue(), lengthData.ReadValue())); }
HexSpan?TryGetSpan(FatMethodBody fatBody, uint offset, uint length) { var pos = fatBody.Instructions.Data.Span.Span.Start + offset; var end = pos + length; if (end > fatBody.Instructions.Data.Span.Span.End) { return(null); } return(HexSpan.FromBounds(pos, end)); }
HexSpan?GetFieldReferenceSpan(HexBufferFile file, FatMethodBody fatBody, HexPosition position) { var ehTable = fatBody.EHTable; if (ehTable != null) { if (!ehTable.Data.Span.Span.Contains(position)) { return(null); } if (ehTable.Data.IsSmall) { var smallTable = (SmallExceptionHandlerTable)ehTable.Data; if (!smallTable.Clauses.Data.Span.Span.Contains(position)) { return(null); } var clause = (SmallExceptionClause)smallTable.Clauses.Data.GetFieldByPosition(position)?.Data; if (clause == null) { return(null); } HexSpan?span; if ((span = TryGetSpan(fatBody, position, clause.TryOffset.Data, clause.TryLength.Data)) != null) { return(span); } if ((span = TryGetSpan(fatBody, position, clause.HandlerOffset.Data, clause.HandlerLength.Data)) != null) { return(span); } if (clause.ClassTokenOrFilterOffset.Data.Span.Span.Contains(position)) { if (clause.Flags.Data.ReadValue() == 0) { return(TryGetTokenSpan(file, clause.ClassTokenOrFilterOffset.Data.ReadValue())); } else { return(TryGetSpan(fatBody, clause.ClassTokenOrFilterOffset.Data.ReadValue(), 1)); } } } else { var fatTable = (FatExceptionHandlerTable)ehTable.Data; if (!fatTable.Clauses.Data.Span.Span.Contains(position)) { return(null); } var clause = (FatExceptionClause)fatTable.Clauses.Data.GetFieldByPosition(position)?.Data; if (clause == null) { return(null); } HexSpan?span; if ((span = TryGetSpan(fatBody, position, clause.TryOffset.Data, clause.TryLength.Data)) != null) { return(span); } if ((span = TryGetSpan(fatBody, position, clause.HandlerOffset.Data, clause.HandlerLength.Data)) != null) { return(span); } if (clause.ClassTokenOrFilterOffset.Data.Span.Span.Contains(position)) { if (clause.Flags.Data.ReadValue() == 0) { return(TryGetTokenSpan(file, clause.ClassTokenOrFilterOffset.Data.ReadValue())); } else { return(TryGetSpan(fatBody, clause.ClassTokenOrFilterOffset.Data.ReadValue(), 1)); } } } return(null); } return(null); }