Пример #1
0
 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()));
 }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }