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); }
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); }
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()); } }
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); }
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); }
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); }
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); } }
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); }
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); }
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); }
// 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); } }
// 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); } }