Esempio n. 1
0
 public virtual TreeViewNodeFilterResult GetFilterResultLocals(MethodDef method)
 {
     return(filter.GetFilterResultLocals(method));
 }
Esempio n. 2
0
        void SearchBody(DnSpyFile ownerModule, TypeDef type, MethodDef method, out bool loadedBody)
        {
            loadedBody = false;
            CilBody body;

            var res = filter.GetFilterResultLocals(method);

            if (res.FilterResult != FilterResult.Hidden)
            {
                body = method.Body;
                if (body == null)
                {
                    return;                     // Return immediately. All code here depends on a non-null body
                }
                loadedBody = true;

                foreach (var local in body.Variables)
                {
                    res = filter.GetFilterResult(method, local);
                    if (res.FilterResult == FilterResult.Hidden)
                    {
                        continue;
                    }
                    if (res.IsMatch && IsMatch(local.Name, local))
                    {
                        onMatch(new SearchResult {
                            Language          = language,
                            Object            = method,
                            NameObject        = method,
                            TypeImageInfo     = MethodTreeNode.GetImageInfo(method, BackgroundType.Search),
                            LocationObject    = type,
                            LocationImageInfo = TypeTreeNode.GetImageInfo(type, BackgroundType.Search),
                            DnSpyFile         = ownerModule,
                        });
                        return;
                    }
                }
            }

            res = filter.GetFilterResultBody(method);
            if (res.FilterResult == FilterResult.Hidden)
            {
                return;
            }
            if (!res.IsMatch)
            {
                return;
            }

            body = method.Body;
            if (body == null)
            {
                return;                 // Return immediately. All code here depends on a non-null body
            }
            loadedBody = true;
            foreach (var instr in body.Instructions)
            {
                object operand;
                // Only check numbers and strings. Don't pass in any type of operand to IsMatch()
                switch (instr.OpCode.Code)
                {
                case Code.Ldc_I4_M1: operand = -1; break;

                case Code.Ldc_I4_0: operand = 0; break;

                case Code.Ldc_I4_1: operand = 1; break;

                case Code.Ldc_I4_2: operand = 2; break;

                case Code.Ldc_I4_3: operand = 3; break;

                case Code.Ldc_I4_4: operand = 4; break;

                case Code.Ldc_I4_5: operand = 5; break;

                case Code.Ldc_I4_6: operand = 6; break;

                case Code.Ldc_I4_7: operand = 7; break;

                case Code.Ldc_I4_8: operand = 8; break;

                case Code.Ldc_I4:
                case Code.Ldc_I4_S:
                case Code.Ldc_R4:
                case Code.Ldc_R8:
                case Code.Ldstr: operand = instr.Operand; break;

                default: operand = null; break;
                }
                if (operand != null && IsMatch(null, operand))
                {
                    onMatch(new SearchResult {
                        Language          = language,
                        Object            = method,
                        NameObject        = method,
                        TypeImageInfo     = MethodTreeNode.GetImageInfo(method, BackgroundType.Search),
                        LocationObject    = type,
                        LocationImageInfo = TypeTreeNode.GetImageInfo(type, BackgroundType.Search),
                        DnSpyFile         = ownerModule,
                    });
                    break;
                }
            }
        }