예제 #1
0
        private void HandleNot(TLuaState state)
        {
            //slot operation: slot[A] = !slot[D]
            if (state.slots[state.regs.regD].GetType() == typeof(CBool))
            {
                state.slots[state.regs.regA] = !(CBool)state.slots[state.regs.regD]; //bug here currently
            }
            else
            {
                throw new Exception("NOT declared on non-boolean operand.");
            }

            //source
            StringBuilder line = new StringBuilder();
            var           dst  = state.CheckGetVarName(state.regs.regA);
            var           src  = state.CheckGetVarName(state.regs.regD);

            state.CheckLocal(dst, ref line);
            line.Append(dst.Item2 + " = not " + src.Item2);
            line.AppendLine(" --NOT");
            state.decompLines.Add(line.ToString());

            //debugging
            //FileManager.WriteDebug(line.ToString());
        }
예제 #2
0
        private string HandleVV(TLuaState state, Tuple <bool, string> dst, string op)
        {
            var opC = state.CheckGetVarName(state.regs.regC);
            var opB = state.CheckGetVarName(state.regs.regB);

            return(opC.Item2 + op + opB.Item2);
        }
예제 #3
0
        //TODO: Handle if it is accessing a global OR a slot value.
        //Handle non-inline length operations.
        private void HandleLength(TLuaState state)
        {
            StringBuilder line = new StringBuilder();

            //Length operator # is indicated by registers A and D being the same as the previous line's constant's A register.
            //If these conditions are met, we inline a length operator and the constant.

            var pReg = state.prevII.registers;
            var dst  = state.CheckGetVarName(state.regs.regA);                                                       //should be the same destiation as the last line...

            if (pReg.regA == state.curII.registers.regA && state.curII.registers.regA == state.curII.registers.regD) //inline check
            {
                state.decompLines.RemoveAt(state.decompLines.Count - 1);                                             //remove last entry.

                line.Append("local " + dst.Item2 + " = " + "#" + state.slots[state.regs.regD].GetValue());           //might want to ensure that we are really working with a new variable declaration for length later...and we assume global constants table here too.

                //debugging
                //FileManager.WriteDebug(line.ToString());
            }
            else
            {
                state.CheckLocal(dst, ref line);
                line.Append(dst.Item2 + " = " + "#" + state.slots[state.regs.regD].GetValue());
            }
            line.AppendLine(" --LEN");
            state.decompLines.Add(line.ToString());
        }
예제 #4
0
        //Copy D into A operation.
        private void HandleMov(TLuaState state)
        {
            //slot operation:  slot[A] = slot[D]
            state.slots[state.regs.regA] = state.slots[state.regs.regD];

            //source
            StringBuilder line = new StringBuilder();
            var           dst  = state.CheckGetVarName(state.regs.regA);
            var           src  = state.CheckGetVarName(state.regs.regD);

            state.CheckLocal(dst, ref line);
            line.Append(dst.Item2 + " = " + src.Item2);
            line.AppendLine(" --MOV");
            state.decompLines.Add(line.ToString());

            //debugging
            //FileManager.WriteDebug(line.ToString());
        }
예제 #5
0
        public override void WriteLua(TLuaState state)
        {
            StringBuilder line = new StringBuilder();
            var           dst  = state.CheckGetVarName(state.regs.regA);
            var           b    = state.CheckGetVarName(state.regs.regB);

            state.CheckLocal(dst, ref line);
            line.Append(dst.Item2 + " = " + b.Item2 + " .. ");

            //concatenate variables in slots B->C INCLUSIVE -- Lua string concat operator is ".."
            for (int i = state.regs.regB + 1; i <= state.regs.regC; i++)
            {
                var nextCat = state.CheckGetVarName(i); //I guess we assume all the slots for the concat operation are loaded?
                line.Append(nextCat.Item2);
                if (i + 1 <= state.regs.regC)
                {
                    line.Append(" .. ");
                }
            }
            line.Append(" --CAT");
            state.decompLines.Add(line.ToString() + "\n");
        }
예제 #6
0
        private void HandleUnaryMinus(TLuaState state)
        {
            //slot operation: slot[A] = -slot[D] //TODO: Error checking
            if (state.slots[state.regs.regD].GetType() == typeof(CInt))
            {
                state.slots[state.regs.regA] = -(CInt)state.slots[state.regs.regD];
            }

            else if (state.slots[state.regs.regD].GetType() == typeof(CShort))
            {
                state.slots[state.regs.regA] = -(CShort)state.slots[state.regs.regD];
            }

            else if (state.slots[state.regs.regD].GetType() == typeof(CLuaNumber))
            {
                //state.slots[state.regs.regA] = -(CLuaNumber)state.slots[state.regs.regD];
                throw new NotImplementedException("UNM declared on a lua number. Currently unimplemented.");
            }
            else
            {
                throw new Exception("UNM declared on non-numeric data.");
            }

            //source
            StringBuilder line = new StringBuilder();
            var           dst  = state.CheckGetVarName(state.regs.regA);
            var           src  = state.CheckGetVarName(state.regs.regD);

            state.CheckLocal(dst, ref line);
            line.Append(dst.Item2 + " = -" + src.Item2);
            line.AppendLine(" --UNM");
            state.decompLines.Add(line.ToString());

            //debugging
            //FileManager.WriteDebug(line.ToString());
        }
예제 #7
0
        /// <summary>
        /// Sets register A to one of the following from register D: nil, true, false.
        /// Note: A single nil value is set with KPRI. KNIL is only used when multiple values need to be set to nil.
        /// Potential register D values:
        ///     nil = 0
        ///     false = 1
        ///     true = 2
        /// </summary>
        /// <param name="state"></param>
        private void HandleKPri(TLuaState state)
        {
            //slot operation: slot[A] = regD->(CBool, CNil)
            if (state.regs.regD == 0)
            {
                state.slots[state.regs.regA] = new CNil();
            }
            else
            {
                state.slots[state.regs.regA] = state.regs.regD == 1 ? new CBool(false) : new CBool(true);
            }

            //source
            StringBuilder line = new StringBuilder();

            var    dst = state.CheckGetVarName(state.regs.regA);
            string valueText;

            if (state.regs.regD == 0)
            {
                valueText = "nil";
            }
            else
            {
                valueText = state.regs.regD == 1 ? "false" : "true";
            }

            state.CheckLocal(dst, ref line);

            line.Append(dst.Item2 + " = " + valueText);
            line.AppendLine(" --KPRI");
            state.decompLines.Add(line.ToString());

            //debugging
            //FileManager.WriteDebug(line.ToString());
        }
예제 #8
0
 private string HandleNV(TLuaState state, Tuple <bool, string> dst, string op)
 {
     return(state.num_G[state.regs.regC].GetValue() + op + state.CheckGetVarName(state.regs.regB).Item2);
 }
예제 #9
0
        public override void WriteLua(TLuaState state)
        {
            DelOperandOrder OperandOrder = null;

            switch (state.curII.iROp)
            {
            case IRMap.MathNV:
                OperandOrder = HandleNV;
                break;

            case IRMap.MathVN:
                OperandOrder = HandleVN;
                break;

            case IRMap.MathVV:
                OperandOrder = HandleVV;
                break;
            }
            StringBuilder line = new StringBuilder();
            var           dst  = state.CheckGetVarName(state.regs.regA);

            state.CheckLocal(dst, ref line);

            line.Append(dst.Item2 + " = ");

            //operator...might want to redesign this into the IRmap or something?
            string op = "!@#$%"; //junk value to begin with in case of error.

            switch (state.curII.originalOp)
            {
            case OpCodes.ADDNV:
            case OpCodes.ADDVN:
            case OpCodes.ADDVV:
                op = " + ";
                break;

            case OpCodes.SUBNV:
            case OpCodes.SUBVN:
            case OpCodes.SUBVV:
                op = " - ";
                break;

            case OpCodes.MULNV:
            case OpCodes.MULVN:
            case OpCodes.MULVV:
                op = " * ";
                break;

            case OpCodes.DIVNV:
            case OpCodes.DIVVN:
            case OpCodes.DIVVV:
                op = " / ";
                break;

            case OpCodes.MODNV:
            case OpCodes.MODVN:
            case OpCodes.MODVV:
                op = " % ";
                break;

            case OpCodes.POW:
                op = " ^ ";
                break;
            }

            line.Append(OperandOrder(state, dst, op));
            line.AppendLine(" --ARITHMETIC");
            state.decompLines.Add(line.ToString());
        }