コード例 #1
0
        bool CheckDupTargets(ILEntry expr)
        {
            bool ret = false;

            if (expr != null && expr.Targets != null)
            {
                foreach (var target in expr.Targets)
                {
                    if (target != null)
                    {
                        if (CallInstruction(target.Instr.OpCode.Code) || target.Instr.OpCode.Code == Code.Ret)
                        {
                            return(true);
                        }
                    }
                }
            }

            return(ret);
        }
コード例 #2
0
        bool CheckDupSources(ILEntry expr, List <ILEntry> path)
        {
            bool ret  = false;
            bool flag = path.Contains(expr) || path.Count() > 10;

            if (!flag)
            {
                path.Add(expr);
            }

            if (!flag && expr != null && expr.Sources != null)
            {
                foreach (var source in expr.Sources)
                {
                    if (source != null)
                    {
                        if (source.Instr.OpCode.Code == Code.Dup)
                        {
                            ret = CheckDupTargets(source);
                        }
                        else
                        {
                            ret = CheckDupSources(source, path);
                        }

                        if (ret == true)
                        {
                            break;
                        }
                    }
                }
            }

            if (!flag)
            {
                path.RemoveRange(path.Count - 1, 1);
            }

            return(ret);
        }