Ejemplo n.º 1
0
        internal static void forPrep(Instruction i, ref LuaVM vm)
        {
            var(a, sBx) = i.AsBx();
            a          += 1;

            vm.PushValue(a);
            vm.PushValue(a + 2);
            vm.Arith(Consts.LUA_OPSUB);
            vm.Replace(a);
            vm.AddPC(sBx);
        }
Ejemplo n.º 2
0
        internal static void forPrep(Instruction i, ref LuaVM vm)
        {
            var asBx = i.AsBx();
            var a    = asBx.Item1 + 1;
            var sBx  = asBx.Item2;

            vm.PushValue(a);
            vm.PushValue(a + 2);
            vm.Arith(Consts.LUA_OPSUB);
            vm.Replace(a);
            vm.AddPC(sBx);
        }
Ejemplo n.º 3
0
        internal static void setList(Instruction i, ref LuaVM vm)
        {
            var abc = i.ABC();
            var a   = abc.Item1 + 1;
            var b   = abc.Item2;
            var c   = abc.Item3;

            if (c > 0)
            {
                c = c - 1;
            }
            else
            {
                c = new Instruction(vm.Fetch()).Ax();
            }

            var bIsZero = b == 0;

            if (bIsZero)
            {
                b = (int)vm.ToInteger(-1) - a - 1;
                vm.Pop(1);
            }

            vm.CheckStack(1);
            var idx = (long)(c * LFIELDS_PER_FLUSH);

            for (var j = 1; j <= b; j++)
            {
                idx++;
                vm.PushValue(a + j);
                vm.SetI(a, idx);
            }

            if (bIsZero)
            {
                for (var j = vm.RegisterCount() + 1; j <= vm.GetTop(); j++)
                {
                    idx++;
                    vm.PushValue(j);
                    vm.SetI(a, idx);
                }

                // clear stack
                vm.SetTop(vm.RegisterCount());
            }
        }
Ejemplo n.º 4
0
        private static void _unaryArith(Instruction i, LuaVM vm, ArithOp op)
        {
            var(a, b, _) = i.ABC();
            a           += 1;
            b           += 1;

            vm.PushValue(b);
            vm.Arith(op);
            vm.Replace(a);
        }
Ejemplo n.º 5
0
        private static void _unaryArith(Instruction i, LuaVM vm, ArithOp op)
        {
            var ab_ = i.ABC();
            var a   = ab_.Item1 + 1;
            var b   = ab_.Item2 + 1;

            vm.PushValue(b);
            vm.Arith(op);
            vm.Replace(a);
        }
Ejemplo n.º 6
0
        static void fixStack(int a, LuaVM vm)
        {
            int x = (int)vm.ToInteger(-1);

            vm.Pop(1);

            vm.CheckStack(x - a);
            for (int i = a; i < x; i++)
            {
                vm.PushValue(i);
            }
            vm.Rotate(vm.RegisterCount() + 1, x - a);
        }
Ejemplo n.º 7
0
        internal static void ForLoop(Instruction i, ref LuaVM vm)
        {
            var(a, sBx) = i.AsBx();
            a          += 1;

            // R(A)+=R(A+2);
            vm.PushValue(a + 2);
            vm.PushValue(a);
            vm.Arith(Constant.LUA_OPADD);
            vm.Replace(a);

            var isPositiveStep = vm.ToNumber(a + 2) >= 0;

            if (
                (isPositiveStep && vm.Compare(a, a + 1, Constant.LUA_OPLE)) ||
                (!isPositiveStep && vm.Compare(a + 1, a, Constant.LUA_OPLE)))
            {
                // pc+=sBx; R(A+3)=R(A)
                vm.AddPC(sBx);
                vm.Copy(a, a + 3);
            }
        }
Ejemplo n.º 8
0
        static int pushFuncAndArgs(int a, int b, ref LuaVM vm)
        {
            if (b >= 1)
            {
                vm.CheckStack(b);
                for (int i = a; i < a + b; i++)
                {
                    vm.PushValue(i);
                }

                return(b - 1);
            }

            fixStack(a, vm);
            return(vm.GetTop() - vm.RegisterCount() - 1);
        }
Ejemplo n.º 9
0
        internal static void concat(Instruction i, ref LuaVM vm)
        {
            var abc = i.ABC();
            var a   = abc.Item1 + 1;
            var b   = abc.Item2 + 1;
            var c   = abc.Item3 + 1;

            var n = c - b + 1;

            vm.CheckStack(n);
            for (var l = b; l <= c; l++)
            {
                vm.PushValue(l);
            }

            vm.Concat(n);
            vm.Replace(a);
        }
Ejemplo n.º 10
0
        internal static void Concat(Instruction i, ref LuaVM vm)
        {
            var(a, b, c) = i.ABC();
            a           += 1;
            b           += 1;
            c           += 1;

            var n = c - b + 1;

            vm.CheckStack(n);
            for (var l = b; l <= c; l++)
            {
                vm.PushValue(l);
            }

            vm.Concat(n);
            vm.Replace(a);
        }
Ejemplo n.º 11
0
        // return R(A), ... ,R(A+B-2)
        internal static void _return(Instruction i, ref LuaVM vm)
        {
            var(a, b, _) = i.ABC();
            a           += 1;

            if (b == 1)
            {
                // no return values
            }
            else if (b > 1)
            {
                // b-1 return values
                vm.CheckStack(b - 1);
                for (var j = a; j <= a + b - 2; j++)
                {
                    vm.PushValue(j);
                }
            }
            else
            {
                FixStack(a, vm);
            }
        }
Ejemplo n.º 12
0
        // return R(A), ... ,R(A+B-2)
        internal static void _return(Instruction i, ref LuaVM vm)
        {
            var ab_ = i.ABC();
            var a   = ab_.Item1 + 1;
            var b   = ab_.Item2;

            if (b == 1)
            {
                // no return values
            }
            else if (b > 1)
            {
                // b-1 return values
                vm.CheckStack(b - 1);
                for (var j = a; j <= a + b - 2; j++)
                {
                    vm.PushValue(j);
                }
            }
            else
            {
                fixStack(a, vm);
            }
        }