コード例 #1
0
ファイル: If.cs プロジェクト: hnjm/Decompiler
        public override bool Matches(MatcherData data)
        {
            Instruction next   = data.Code.Peek();
            Instruction target = next.GetBranchTarget();

            return(target != null && target.Offset > next.Offset);
        }
コード例 #2
0
 public bool TryGetMatcherData(string referenceName, int matcherIndex, out MatcherData matcherData)
 {
     matcherData = _statMatchersList
                   .Where(r => r.ReferenceNames.Contains(referenceName))
                   .SelectMany(r => r.Data)
                   .ElementAtOrDefault(matcherIndex);
     return(matcherData != null);
 }
コード例 #3
0
 public override void Build(CodeWriter writer, MatcherData data)
 {
     data.Code.Dequeue();
     if (data.Stack.Any())
     {
         writer.WriteLine($"return {data.Stack.Pop()};");
     }
     //else writer.WriteLine("return;");
 }
コード例 #4
0
ファイル: ArgsMatcher.cs プロジェクト: hnjm/Decompiler
        public override bool Matches(MatcherData data)
        {
            Instruction instruction = data.Code.Peek();

            return(instruction.OpCode == OpCodes.Ldarg_0 ||
                   instruction.OpCode == OpCodes.Ldarg_1 ||
                   instruction.OpCode == OpCodes.Ldarg_2 ||
                   instruction.OpCode == OpCodes.Ldarg_3 ||
                   instruction.OpCode == OpCodes.Ldarg_S);
        }
コード例 #5
0
        public string ExpandsCorrectly(string inputRegex)
        {
            var inputData    = new MatcherData(inputRegex, new ModifierBuilder());
            var statMatchers = MockStatMatchers(true, inputData);
            var sut          = CreateSut(statMatchers);

            var data = sut.First();

            return(data.Regex);
        }
コード例 #6
0
ファイル: SimpleMatcher.cs プロジェクト: hnjm/Decompiler
        public override bool Matches(MatcherData data)
        {
            Instruction next = data.Code.Peek();

            return(next.OpCode == OpCodes.Dup ||
                   next.OpCode == OpCodes.Pop ||
                   next.OpCode == OpCodes.Ldstr ||
                   next.OpCode == OpCodes.Starg ||
                   next.OpCode == OpCodes.Starg_S);
        }
コード例 #7
0
ファイル: DoWhile.cs プロジェクト: hnjm/Decompiler
        public override bool Matches(MatcherData data)
        {
            Instruction next = data.Code.Peek();

            if (data.Code.Any(i => i.Operand == next))
            {
                return(true);                                       // Found a branch pointing to this instruction
            }
            return(false);
        }
コード例 #8
0
        public override bool Matches(MatcherData data)
        {
            Instruction next = data.Code.Peek();

            return(next.OpCode == OpCodes.Add ||
                   next.OpCode == OpCodes.Sub ||
                   next.OpCode == OpCodes.Mul ||
                   next.OpCode == OpCodes.Div ||
                   next.OpCode == OpCodes.Cgt ||
                   next.OpCode == OpCodes.Ceq ||
                   next.OpCode == OpCodes.Clt);
        }
コード例 #9
0
ファイル: IntMatcher.cs プロジェクト: hnjm/Decompiler
        public override bool Matches(MatcherData data)
        {
            Instruction next = data.Code.Peek();

            return(next.OpCode == OpCodes.Ldc_I4_0 ||
                   next.OpCode == OpCodes.Ldc_I4_1 ||
                   next.OpCode == OpCodes.Ldc_I4_2 ||
                   next.OpCode == OpCodes.Ldc_I4_3 ||
                   next.OpCode == OpCodes.Ldc_I4_4 ||
                   next.OpCode == OpCodes.Ldc_I4_5 ||
                   next.OpCode == OpCodes.Ldc_I4_6 ||
                   next.OpCode == OpCodes.Ldc_I4_7 ||
                   next.OpCode == OpCodes.Ldc_I4_8 ||
                   next.OpCode == OpCodes.Ldc_I4_S);
        }
コード例 #10
0
ファイル: IntMatcher.cs プロジェクト: hnjm/Decompiler
        public override void Build(CodeWriter writer, MatcherData data)
        {
            Instruction instruction = data.Code.Dequeue();
            int         val;

            if (instruction.OpCode == OpCodes.Ldc_I4_0)
            {
                val = 0;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_1)
            {
                val = 1;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_2)
            {
                val = 2;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_3)
            {
                val = 3;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_4)
            {
                val = 4;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_5)
            {
                val = 5;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_6)
            {
                val = 6;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_7)
            {
                val = 7;
            }
            else if (instruction.OpCode == OpCodes.Ldc_I4_8)
            {
                val = 8;
            }
            else
            {
                val = Convert.ToInt32(instruction.Operand);
            }
            data.Stack.Push(val.ToString());
        }
コード例 #11
0
        public string ExpandsReferencesRecursively(string inputRegex)
        {
            var inputData         = new MatcherData(inputRegex, new ModifierBuilder());
            var statMatchers      = MockStatMatchers(true, inputData);
            var referencedRegexes = Mock.Of <IReferencedRegexes>(r =>
                                                                 r.GetRegexes("Matchers1") == new[] { "0+", "[1-9]" } &&
                                                                 r.GetRegexes("Matchers2") == new[] { "a" } &&
                                                                 r.GetRegexes("Matchers3") == new[] { "({Matchers2})", "c", "d ({Matchers1}) ({Matchers2})" } &&
                                                                 r.GetRegexes("Matchers4") == new[] { "({Matchers2})" } &&
                                                                 r.GetRegexes("Matchers5") == new[] { "({Matchers1})", "({Matchers2})", "({Matchers3})", "({Matchers4})" } &&
                                                                 r.GetRegexes("Matchers6") == new[] { "({Matchers2}) ({Matchers2}) ({Matchers2}) ({Matchers2})" });
            var sut = CreateSut(statMatchers, referencedRegexes);

            var data = sut.First();

            return(data.Regex);
        }
コード例 #12
0
ファイル: SimpleMatcher.cs プロジェクト: hnjm/Decompiler
        public override void Build(CodeWriter writer, MatcherData data)
        {
            Instruction next = data.Code.Dequeue();

            if (next.OpCode == OpCodes.Dup)
            {
                data.Stack.Push(data.Stack.Peek());
            }
            else if (next.OpCode == OpCodes.Pop)
            {
                writer.WriteLine($"{data.Stack.Pop()};");
            }
            else if (next.OpCode == OpCodes.Ldstr)
            {
                data.Stack.Push($"\"{data.Code.Dequeue().Operand as string}\"");
            }
            else if (next.OpCode == OpCodes.Starg || next.OpCode == OpCodes.Starg_S)
            {
                writer.WriteLine($"{(next.Operand as ParameterDefinition).Name} = {data.Stack.Pop()};");
            }
        }
コード例 #13
0
        private ActionResult FindNextPage(bool isResult = false)
        {
            MatcherData matcherData = SesionMatcherData;

            if (matcherData.Men == null)
            {
                return(RedirectToAction("Men"));
            }
            else if (matcherData.Women == null)
            {
                return(RedirectToAction("Women"));
            }
            else if (isResult)
            {
                matcherData.Matched = MatcherPeople.MatchCouple(matcherData.Men, matcherData.Women);
                return(View(matcherData));
            }
            else
            {
                return(RedirectToAction("Result"));
            }
        }
コード例 #14
0
        private void MatchSucceedUIData(List <Matcher> matchers)
        {
            DataManager clientData = DataManager.GetInstance();

            allMatchers = matchers;
            clientData.SetMatchers(allMatchers);

            long      id         = clientData.GetPlayerAccountId();
            MatchSide myselfSide = matchers.Find(p => p.playerId == id).side;

            bool myselfReady = matchers.Find(p => p.playerId == id).ready;

            view.intoGameButton.interactable = !myselfReady;

            List <MatcherData> friendData = new List <UI.FightMatchController.MatcherData>();
            List <MatcherData> enemyData  = new List <UI.FightMatchController.MatcherData>();

            List <Matcher> friends = matchers.FindAll(p => p.side == myselfSide);
            List <Matcher> enemys  = matchers.FindAll(p => p.side != myselfSide);

            long myId = DataManager.GetInstance().GetPlayerId();

            foreach (Matcher friend in friends)
            {
                MatcherData data = new MatcherData(friend.name, friend.portrait, friend.ready, friend.playerId == myId, friend.playerId);
                friendData.Add(data);
            }

            foreach (Matcher enemy in enemys)
            {
                MatcherData data = new MatcherData(enemy.name, enemy.portrait, enemy.ready, false, enemy.playerId);
                enemyData.Add(data);
            }

            view.friendDatas = friendData;
            view.enemyDatas  = enemyData;

            view.InitSucceedItem();
        }
コード例 #15
0
        public override void Build(CodeWriter writer, MatcherData data)
        {
            string b  = data.Stack.Pop();
            string a  = data.Stack.Pop();
            string op = "";

            Instruction instruction = data.Code.Dequeue();

            if (instruction.OpCode == OpCodes.Add)
            {
                op = "+";
            }
            else if (instruction.OpCode == OpCodes.Sub)
            {
                op = "-";
            }
            else if (instruction.OpCode == OpCodes.Mul)
            {
                op = "*";
            }
            else if (instruction.OpCode == OpCodes.Div)
            {
                op = "/";
            }
            else if (instruction.OpCode == OpCodes.Cgt)
            {
                op = ">";
            }
            else if (instruction.OpCode == OpCodes.Ceq)
            {
                op = "==";
            }
            else if (instruction.OpCode == OpCodes.Clt)
            {
                op = "<";
            }

            data.Stack.Push($"({a} {op} {b})");
        }
コード例 #16
0
ファイル: ArgsMatcher.cs プロジェクト: hnjm/Decompiler
        public override void Build(CodeWriter writer, MatcherData data)
        {
            int         arg;
            Instruction i = data.Code.Dequeue();

            if (i.OpCode == OpCodes.Ldarg_0)
            {
                arg = 0;
            }
            else if (i.OpCode == OpCodes.Ldarg_1)
            {
                arg = 1;
            }
            else if (i.OpCode == OpCodes.Ldarg_2)
            {
                arg = 2;
            }
            else if (i.OpCode == OpCodes.Ldarg_3)
            {
                arg = 3;
            }
            else
            {
                arg = (int)i.Operand;
            }

            if (data.Method.HasThis)
            {
                arg--;
            }
            if (arg == -1)
            {
                data.Stack.Push("this");
            }
            else
            {
                data.Stack.Push(data.Method.Parameters[arg].Name);
            }
        }
コード例 #17
0
        public override void Build(CodeWriter writer, MatcherData data)
        {
            Instruction     call      = data.Code.Dequeue();
            MethodReference reference = call.Operand as MethodReference;

            // Get passed parameters
            string[] args = new string[reference.Parameters.Count];
            for (int i = 0; i < reference.Parameters.Count; i++)
            {
                args[i] = data.Stack.Pop();
            }

            // TODO: Come up with a better naming scheme
            string built = $"{data.Namer.GetName(reference.DeclaringType)}.{reference.Name}({string.Join(", ", args)})";

            if (reference.ReturnType.FullName == "System.Void")
            {
                writer.WriteLine($"{built};");
            }
            else
            {
                data.Stack.Push(built);
            }
        }
コード例 #18
0
ファイル: Matcher.cs プロジェクト: hnjm/Decompiler
 public abstract bool Matches(MatcherData data);
コード例 #19
0
ファイル: DoWhile.cs プロジェクト: hnjm/Decompiler
        public override void Build(CodeWriter writer, MatcherData data)
        {
            Instruction next   = data.Code.Peek();
            Instruction branch = data.Code.LastOrDefault(i => i.Operand == next);

            if (branch != null)
            {
                List <Instruction> loopCode = new List <Instruction>();
                while (data.Code.Peek() != branch)
                {
                    loopCode.Add(data.Code.Dequeue());
                }
                CodeBuilder builder = new CodeBuilder(data.Method, data.Namer, loopCode);
                builder.Data.Stack = data.Stack;
                writer.WriteLine("do");
                writer.WriteLine("{");
                writer.AddIndent();
                builder.Build(writer);
                writer.RemoveIndent();
                writer.WriteLine("}");

                data.Code.Dequeue();
                if (branch.OpCode == OpCodes.Brtrue || branch.OpCode == OpCodes.Brtrue_S)
                {
                    writer.WriteLine($"while ({data.Stack.Pop()});");
                }
                else if (branch.OpCode == OpCodes.Brfalse || branch.OpCode == OpCodes.Brfalse_S)
                {
                    writer.WriteLine($"while (!{data.Stack.Pop()});");
                }
                else
                {
                    string b = data.Stack.Pop();
                    string a = data.Stack.Pop();
                    if (branch.OpCode == OpCodes.Beq || branch.OpCode == OpCodes.Beq_S)
                    {
                        writer.WriteLine($"while ({a} == {b});");
                    }
                    else if (branch.OpCode == OpCodes.Bne_Un || branch.OpCode == OpCodes.Bne_Un_S)
                    {
                        writer.WriteLine($"while ({a} != {b});");
                    }
                    else if (branch.OpCode == OpCodes.Blt || branch.OpCode == OpCodes.Blt_S || branch.OpCode == OpCodes.Blt_Un || branch.OpCode == OpCodes.Blt_Un_S)
                    {
                        writer.WriteLine($"while ({a} < {b});");
                    }
                    else if (branch.OpCode == OpCodes.Ble || branch.OpCode == OpCodes.Ble_S || branch.OpCode == OpCodes.Ble_Un || branch.OpCode == OpCodes.Ble_Un_S)
                    {
                        writer.WriteLine($"while ({a} <= {b});");
                    }
                    else if (branch.OpCode == OpCodes.Bgt || branch.OpCode == OpCodes.Bgt_S || branch.OpCode == OpCodes.Bgt_Un || branch.OpCode == OpCodes.Bgt_Un_S)
                    {
                        writer.WriteLine($"while ({a} > {b});");
                    }
                    else if (branch.OpCode == OpCodes.Bge || branch.OpCode == OpCodes.Bge_S || branch.OpCode == OpCodes.Bge_Un || branch.OpCode == OpCodes.Bge_Un_S)
                    {
                        writer.WriteLine($"while ({a} >= {b});");
                    }
                }
            }
        }
コード例 #20
0
 public override void Build(CodeWriter writer, MatcherData data)
 {
     data.Stack.Push($"!{data.Stack.Pop()}");
     data.Code.Dequeue();
 }
コード例 #21
0
 public override bool Matches(MatcherData data)
 {
     return(data.Code.Peek().OpCode == OpCodes.Ret);
 }
コード例 #22
0
 private static string GetRemaining(MatcherData matcherData, string stat, Match match)
 {
     return(stat.Substring(0, match.Index)
            + match.Result(matcherData.MatchSubstitution)
            + stat.Substring(match.Index + match.Length));
 }
コード例 #23
0
ファイル: If.cs プロジェクト: hnjm/Decompiler
        public override void Build(CodeWriter writer, MatcherData data)
        {
            Instruction branch = data.Code.Dequeue();
            Instruction target = branch.GetBranchTarget();

            if (target != null)
            {
                // Check if else
                //if ()

                if (branch.OpCode == OpCodes.Brtrue || branch.OpCode == OpCodes.Brtrue_S)
                {
                    writer.WriteLine($"if (!{data.Stack.Pop()})");
                }
                else if (branch.OpCode == OpCodes.Brfalse || branch.OpCode == OpCodes.Brfalse_S)
                {
                    writer.WriteLine($"if ({data.Stack.Pop()})");
                }
                else
                {
                    string b = data.Stack.Pop();
                    string a = data.Stack.Pop();
                    if (branch.OpCode == OpCodes.Beq || branch.OpCode == OpCodes.Beq_S)
                    {
                        writer.WriteLine($"if ({a} != {b})");
                    }
                    else if (branch.OpCode == OpCodes.Bne_Un || branch.OpCode == OpCodes.Bne_Un_S)
                    {
                        writer.WriteLine($"if ({a} == {b})");
                    }
                    else if (branch.OpCode == OpCodes.Blt || branch.OpCode == OpCodes.Blt_S || branch.OpCode == OpCodes.Blt_Un || branch.OpCode == OpCodes.Blt_Un_S)
                    {
                        writer.WriteLine($"if ({a} >= {b})");
                    }
                    else if (branch.OpCode == OpCodes.Ble || branch.OpCode == OpCodes.Ble_S || branch.OpCode == OpCodes.Ble_Un || branch.OpCode == OpCodes.Ble_Un_S)
                    {
                        writer.WriteLine($"if ({a} > {b})");
                    }
                    else if (branch.OpCode == OpCodes.Bgt || branch.OpCode == OpCodes.Bgt_S || branch.OpCode == OpCodes.Bgt_Un || branch.OpCode == OpCodes.Bgt_Un_S)
                    {
                        writer.WriteLine($"if ({a} <= {b})");
                    }
                    else if (branch.OpCode == OpCodes.Bge || branch.OpCode == OpCodes.Bge_S || branch.OpCode == OpCodes.Bge_Un || branch.OpCode == OpCodes.Bge_Un_S)
                    {
                        writer.WriteLine($"if ({a} < {b})");
                    }
                }

                writer.WriteLine("{");
                writer.AddIndent();

                List <Instruction> loopCode = new List <Instruction>();
                while (data.Code.Peek() != target)
                {
                    loopCode.Add(data.Code.Dequeue());
                }
                CodeBuilder builder = new CodeBuilder(data.Method, data.Namer, loopCode);
                builder.Data.Stack = data.Stack;
                builder.Build(writer);
                writer.RemoveIndent();
                writer.WriteLine("}");
            }
        }
コード例 #24
0
        public ActionResult Result()
        {
            MatcherData matcherData = SesionMatcherData;

            return(FindNextPage(true));
        }
コード例 #25
0
ファイル: Matcher.cs プロジェクト: hnjm/Decompiler
 public abstract void Build(CodeWriter writer, MatcherData data);