public override string ToString()
{
string text = Opcode.ToString();
switch (Opcode) {
case LuaOpcode.Call:
text = (A - 1 == A + C - 2) ? "" : string.Format("{0} = ", GetArgumentRegisterRange(A, A + C - 2));
return text + string.Format("{0}({1})", GetArgumentRegister(A), GetArgumentRegisterRange(A + 1, A + B - 1));
case LuaOpcode.Closure:
LuaFunction closure = Function.Closures[Bx];
text = string.Format("{0} = closure({1}", GetArgumentRegister(A), closure.SourceOrIndex);
if (closure.UpValueCount != 0)
text += string.Format(", {0}", GetArgumentRegisterRange(A, A + closure.UpValueCount - 1));
return text + ")";
case LuaOpcode.GetGlobal:
return string.Format("{0} = {1}", GetArgumentRegister(A), GetArgumentGlobal(Bx));
case LuaOpcode.LoadBoolean: // R(A) = (bool)B; if(C) PC++
return string.Format("{0} = {1}{2}", GetArgumentRegister(A), GetArgumentBoolean(B), (C != 0) ? "; PC++" : "");
case LuaOpcode.LoadConstant: // R(A) = Constant(Bx)
return string.Format("{0} = {1}", GetArgumentRegister(A), GetArgumentLiteral(Bx));
case LuaOpcode.Move: // R(A) = R(B)
return string.Format("{0} = {1}", GetArgumentRegister(A), GetArgumentRegister(B));
case LuaOpcode.Return: // return R(A to A+B-2); if (B == 0) then return up to 'top'
if (A - 1 == A + B - 2)
return "return";
return string.Format("return {0}", B == 0 ? GetArgumentRegister(A) + " to top" : GetArgumentRegisterRange(A, A + B - 2));
case LuaOpcode.Self: return string.Format("{0} = {1}; {2} = {3}.{4}", GetArgumentRegister(A + 1), GetArgumentRegister(B), GetArgumentRegister(A), GetArgumentRegister(B), GetArgumentRegisterConstant
(C));
case LuaOpcode.SetGlobal: // Global[Constant[Bx]] = R(A)
return string.Format("{0} = {1}", GetArgumentGlobal(Bx), GetArgumentRegister(A));
default:
foreach (LuaOpcodeArgument argument in Arguments)
text += " " + GetArgument(argument);
break;
}
return text;
}