示例#1
0
 public void FindDoWhileLoops()
 {
     for (int i = 0; i < this.sizecode; i++)
     {
         if (this.Instructions[i].OpCode == LuaOpCode.OpCodes.HKS_OPCODE_JMP && this.Instructions[i].visited == false)
         {
             if (this.Instructions[i].sBx < 0 && i + this.Instructions[i].sBx >= 0)
             {
                 if (LuaOpCode.isConditionOPCode(this, i - 1))
                 {
                     this.conditions.Add(new LuaCondition(i + this.Instructions[i].sBx, LuaCondition.Type.DoWhile));
                     this.conditions.Add(new LuaCondition(i, LuaCondition.Type.End));
                     this.Instructions[i].visited = true;
                 }
             }
         }
     }
 }
示例#2
0
        public void FindIfStatements()
        {
            int          lines  = -1;
            LuaCondition master = null;

            for (int i = 0; i < this.sizecode; i++)
            {
                if (this.Instructions[i].OpCode == LuaOpCode.OpCodes.HKS_OPCODE_JMP && this.Instructions[i].visited == false)
                {
                    // Make sure the skip goes forward
                    if (this.Instructions[i].sBx >= 0)
                    {
                        if (LuaOpCode.isConditionOPCode(this, i - 1))
                        {
                            // Skip the while loops
                            if (this.Instructions[i + this.Instructions[i].sBx].OpCode == LuaOpCode.OpCodes.HKS_OPCODE_JMP && this.Instructions[i + this.Instructions[i].sBx].sBx < 0)
                            {
                                continue;
                            }
                            // OR statement
                            if (lines == 0)
                            {
                                this.conditions.Add(new LuaCondition(i - 1, LuaCondition.Type.If, LuaCondition.Prefix.or, master));
                                this.Instructions[i].visited = true;
                                lines--;
                                continue;
                            }
                            // and statement
                            if (lines == this.Instructions[i].sBx)
                            {
                                this.conditions.Add(new LuaCondition(i - 1, LuaCondition.Type.If, LuaCondition.Prefix.and, master));
                                this.Instructions[i].visited = true;
                                lines--;
                                continue;
                            }
                            master = new LuaCondition(i - 1, LuaCondition.Type.If, LuaCondition.Prefix.none);
                            this.conditions.Add(master);
                            lines = this.Instructions[i].sBx;
                            this.Instructions[i].visited = true;
                        }
                    }
                }
                lines--;
            }
            List <LuaCondition> newConditions = new List <LuaCondition>();

            foreach (LuaCondition condition in this.conditions)
            {
                if (condition.master == null)
                {
                    LuaCondition lastSon = condition;
                    foreach (LuaCondition conditionSon in this.conditions)
                    {
                        if (conditionSon.master == condition)
                        {
                            if (conditionSon.prefix == LuaCondition.Prefix.or)
                            {
                                if (this.Instructions[lastSon.line].A == 1)
                                {
                                    this.Instructions[lastSon.line].A = 0;
                                }
                                else
                                {
                                    this.Instructions[lastSon.line].A = 1;
                                }
                            }
                            lastSon = conditionSon;
                        }
                    }
                    int skipLines = this.Instructions[lastSon.line + 1].sBx;
                    if (this.Instructions[lastSon.line + 1 + skipLines].OpCode == LuaOpCode.OpCodes.HKS_OPCODE_JMP)
                    {
                        newConditions.Add(new LuaCondition(lastSon.line + 1 + skipLines, LuaCondition.Type.Else));
                        int skipElseLines = this.Instructions[lastSon.line + 1 + skipLines].sBx;
                        newConditions.Add(new LuaCondition(lastSon.line + 1 + skipLines + skipElseLines, LuaCondition.Type.End));
                    }
                    else
                    {
                        newConditions.Add(new LuaCondition(lastSon.line + 1 + skipLines, LuaCondition.Type.End));
                    }
                }
            }
            foreach (LuaCondition condition in newConditions)
            {
                this.conditions.Add(condition);
            }
        }