///*******************************************************************************
//* Copyright (c) 2009 Luaj.org. All rights reserved.
//*
//* Permission is hereby granted, free of charge, to any person obtaining a copy
//* of this software and associated documentation files (the "Software"), to deal
//* in the Software without restriction, including without limitation the rights
//* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//* copies of the Software, and to permit persons to whom the Software is
//* furnished to do so, subject to the following conditions:
//*
//* The above copyright notice and this permission notice shall be included in
//* all copies or substantial portions of the Software.
//*
//* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//* THE SOFTWARE.
//******************************************************************************/
//package org.luaj.vm2;
//TODO 与3.0不一样
//import java.io.ByteArrayOutputStream;
//import java.io.PrintStream;
//
///**
// * Debug helper class to pretty-print lua bytecodes.
// * @see Prototype
// * @see LuaClosure
// */
//public class Print extends Lua {
//
// /** opcode names */
// private static final String STRING_FOR_NULL = "null";
// public static PrintStream ps = System.out;
//
// /** String names for each lua opcode value. */
// public static final String[] OPNAMES = {
// "MOVE",
// "LOADK",
// "LOADKX",
// "LOADBOOL",
// "LOADNIL",
// "GETUPVAL",
// "GETTABUP",
// "GETTABLE",
// "SETTABUP",
// "SETUPVAL",
// "SETTABLE",
// "NEWTABLE",
// "SELF",
// "ADD",
// "SUB",
// "MUL",
// "DIV",
// "MOD",
// "POW",
// "UNM",
// "NOT",
// "LEN",
// "CONCAT",
// "JMP",
// "EQ",
// "LT",
// "LE",
// "TEST",
// "TESTSET",
// "CALL",
// "TAILCALL",
// "RETURN",
// "FORLOOP",
// "FORPREP",
// "TFORCALL",
// "TFORLOOP",
// "SETLIST",
// "CLOSURE",
// "VARARG",
// "EXTRAARG",
// null,
// };
//
//
// static void printString(PrintStream ps, final LuaString s) {
//
// ps.print('"');
// for (int i = 0, n = s.m_length; i < n; i++) {
// int c = s.m_bytes[s.m_offset+i];
// if ( c >= ' ' && c <= '~' && c != '\"' && c != '\\' )
// ps.print((char) c);
// else {
// switch (c) {
// case '"':
// ps.print("\\\"");
// break;
// case '\\':
// ps.print("\\\\");
// break;
// case 0x0007: /* bell */
// ps.print("\\a");
// break;
// case '\b': /* backspace */
// ps.print("\\b");
// break;
// case '\f': /* form feed */
// ps.print("\\f");
// break;
// case '\t': /* tab */
// ps.print("\\t");
// break;
// case '\r': /* carriage return */
// ps.print("\\r");
// break;
// case '\n': /* newline */
// ps.print("\\n");
// break;
// case 0x000B: /* vertical tab */
// ps.print("\\v");
// break;
// default:
// ps.print('\\');
// ps.print(Integer.toString(1000 + 0xff&c).substring(1));
// break;
// }
// }
// }
// ps.print('"');
// }
//
// static void printValue( PrintStream ps, LuaValue v ) {
// switch ( v.type() ) {
// case LuaValue.TSTRING: printString( ps, (LuaString) v ); break;
// default: ps.print( v.tojstring() );
//
// }
// }
//
// static void printConstant(PrintStream ps, Prototype f, int i) {
// printValue( ps, f.k[i] );
// }
//
// static void printUpvalue(PrintStream ps, Upvaldesc u) {
// ps.print( u.idx + " " );
// printValue( ps, u.name );
// }
//
// /**
// * Print the code in a prototype
// * @param f the {@link Prototype}
// */
// public static void printCode(Prototype f) {
// int[] code = f.code;
// int pc, n = code.length;
// for (pc = 0; pc < n; pc++) {
// printOpCode(f, pc);
// ps.println();
// }
// }
//
// /**
// * Print an opcode in a prototype
// * @param f the {@link Prototype}
// * @param pc the program counter to look up and print
// */
// public static void printOpCode(Prototype f, int pc) {
// printOpCode(ps,f,pc);
// }
//
// /**
// * Print an opcode in a prototype
// * @param ps the {@link PrintStream} to print to
// * @param f the {@link Prototype}
// * @param pc the program counter to look up and print
// */
// public static void printOpCode(PrintStream ps, Prototype f, int pc) {
// int[] code = f.code;
// int i = code[pc];
// int o = GET_OPCODE(i);
// int a = GETARG_A(i);
// int b = GETARG_B(i);
// int c = GETARG_C(i);
// int bx = GETARG_Bx(i);
// int sbx = GETARG_sBx(i);
// int line = getline(f, pc);
// ps.print(" " + (pc + 1) + " ");
// if (line > 0)
// ps.print("[" + line + "] ");
// else
// ps.print("[-] ");
// ps.print(OPNAMES[o] + " ");
// switch (getOpMode(o)) {
// case iABC:
// ps.print( a );
// if (getBMode(o) != OpArgN)
// ps.print(" "+(ISK(b) ? (-1 - INDEXK(b)) : b));
// if (getCMode(o) != OpArgN)
// ps.print(" "+(ISK(c) ? (-1 - INDEXK(c)) : c));
// break;
// case iABx:
// if (getBMode(o) == OpArgK) {
// ps.print(a + " " + (-1 - bx));
// } else {
// ps.print(a + " " + (bx));
// }
// break;
// case iAsBx:
// if (o == OP_JMP)
// ps.print( sbx );
// else
// ps.print(a + " " + sbx);
// break;
// }
// switch (o) {
// case OP_LOADK:
// ps.print(" ; ");
// printConstant(ps, f, bx);
// break;
// case OP_GETUPVAL:
// case OP_SETUPVAL:
// ps.print(" ; ");
// printUpvalue(ps, f.upvalues[b]);
// break;
// case OP_GETTABUP:
// ps.print(" ; ");
// printUpvalue(ps, f.upvalues[b]);
// ps.print(" ");
// if (ISK(c))
// printConstant(ps, f, INDEXK(c));
// else
// ps.print("-");
// break;
// case OP_SETTABUP:
// ps.print(" ; ");
// printUpvalue(ps, f.upvalues[a]);
// ps.print(" ");
// if (ISK(b))
// printConstant(ps, f, INDEXK(b));
// else
// ps.print("-");
// ps.print(" ");
// if (ISK(c))
// printConstant(ps, f, INDEXK(c));
// else
// ps.print("-");
// break;
// case OP_GETTABLE:
// case OP_SELF:
// if (ISK(c)) {
// ps.print(" ; ");
// printConstant(ps, f, INDEXK(c));
// }
// break;
// case OP_SETTABLE:
// case OP_ADD:
// case OP_SUB:
// case OP_MUL:
// case OP_DIV:
// case OP_POW:
// case OP_EQ:
// case OP_LT:
// case OP_LE:
// if (ISK(b) || ISK(c)) {
// ps.print(" ; ");
// if (ISK(b))
// printConstant(ps, f, INDEXK(b));
// else
// ps.print("-");
// ps.print(" ");
// if (ISK(c))
// printConstant(ps, f, INDEXK(c));
// else
// ps.print("-");
// }
// break;
// case OP_JMP:
// case OP_FORLOOP:
// case OP_FORPREP:
// ps.print(" ; to " + (sbx + pc + 2));
// break;
// case OP_CLOSURE:
// ps.print(" ; " + f.p[bx].getClass().getName());
// break;
// case OP_SETLIST:
// if (c == 0)
// ps.print(" ; " + ((int) code[++pc]));
// else
// ps.print(" ; " + ((int) c));
// break;
// case OP_VARARG:
// ps.print( " ; is_vararg="+ f.is_vararg );
// break;
// default:
// break;
// }
// }
//
// private static int getline(Prototype f, int pc) {
// return pc>0 && f.lineinfo!=null && pc<f.lineinfo.length? f.lineinfo[pc]: -1;
// }
//
// static void printHeader(Prototype f) {
// String s = String.valueOf(f.source);
// if (s.startsWith("@") || s.startsWith("="))
// s = s.substring(1);
// else if ("\033Lua".equals(s))
// s = "(bstring)";
// else
// s = "(string)";
// String a = (f.linedefined == 0) ? "main" : "function";
// ps.print("\n%" + a + " <" + s + ":" + f.linedefined + ","
// + f.lastlinedefined + "> (" + f.code.length + " instructions, "
// + f.code.length * 4 + " bytes at " + id(f) + ")\n");
// ps.print(f.numparams + " param, " + f.maxstacksize + " slot, "
// + f.upvalues.length + " upvalue, ");
// ps.print(f.locvars.length + " local, " + f.k.length
// + " constant, " + f.p.length + " function\n");
// }
//
// static void printConstants(Prototype f) {
// int i, n = f.k.length;
// ps.print("constants (" + n + ") for " + id(f) + ":\n");
// for (i = 0; i < n; i++) {
// ps.print(" " + (i + 1) + " ");
// printValue( ps, f.k[i] );
// ps.print( "\n");
// }
// }
//
// static void printLocals(Prototype f) {
// int i, n = f.locvars.length;
// ps.print("locals (" + n + ") for " + id(f) + ":\n");
// for (i = 0; i < n; i++) {
// ps.println(" "+i+" "+f.locvars[i].varname+" "+(f.locvars[i].startpc+1)+" "+(f.locvars[i].endpc+1));
// }
// }
//
// static void printUpValues(Prototype f) {
// int i, n = f.upvalues.length;
// ps.print("upvalues (" + n + ") for " + id(f) + ":\n");
// for (i = 0; i < n; i++) {
// ps.print(" " + i + " " + f.upvalues[i] + "\n");
// }
// }
//
// /** Pretty-prints contents of a Prototype.
// *
// * @param prototype Prototype to print.
// */
// public static void print(Prototype prototype) {
// printFunction(prototype, true);
// }
//
// /** Pretty-prints contents of a Prototype in short or long form.
// *
// * @param prototype Prototype to print.
// * @param full true to print all fields, false to print short form.
// */
// public static void printFunction(Prototype prototype, boolean full) {
// int i, n = prototype.p.length;
// printHeader(prototype);
// printCode(prototype);
// if (full) {
// printConstants(prototype);
// printLocals(prototype);
// printUpValues(prototype);
// }
// for (i = 0; i < n; i++)
// printFunction(prototype.p[i], full);
// }
//
// private static void format( String s, int maxcols ) {
// int n = s.length();
// if ( n > maxcols )
// ps.print( s.substring(0,maxcols) );
// else {
// ps.print( s );
// for ( int i=maxcols-n; --i>=0; )
// ps.print( ' ' );
// }
// }
//
// private static String id(Prototype f) {
// return "Proto";
// }
// private void _assert(boolean b) {
// if ( !b )
// throw new NullPointerException("_assert failed");
// }
//
// /**
// * Print the state of a {@link LuaClosure} that is being executed
// * @param cl the {@link LuaClosure}
// * @param pc the program counter
// * @param stack the stack of {@link LuaValue}
// * @param top the top of the stack
// * @param varargs any {@link Varargs} value that may apply
// */
// public static void printState(LuaClosure cl, int pc, LuaValue[] stack, int top, Varargs varargs) {
// // print opcode into buffer
// PrintStream previous = ps;
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// ps = new PrintStream( baos );
// printOpCode( cl.p, pc );
// ps.flush();
// ps.close();
// ps = previous;
// format( baos.toString(), 50 );
//
// // print stack
// ps.print('[');
// for ( int i=0; i<stack.length; i++ ) {
// LuaValue v = stack[i];
// if ( v == null )
// ps.print(STRING_FOR_NULL);
// else switch ( v.type() ) {
// case LuaValue.TSTRING:
// LuaString s = v.checkstring();
// ps.print( s.length() < 48?
// s.tojstring():
// s.substring(0, 32).tojstring()+"...+"+(s.length()-32)+"b");
// break;
// case LuaValue.TFUNCTION:
// ps.print( v.tojstring() );
// break;
// case LuaValue.TUSERDATA:
// Object o = v.touserdata();
// if ( o != null ) {
// String n = o.getClass().getName();
// n = n.substring(n.lastIndexOf('.')+1);
// ps.print( n+": "+Integer.toHexString(o.hashCode()) );
// } else {
// ps.print( v.toString() );
// }
// break;
// default:
// ps.print(v.tojstring());
// }
// if ( i+1 == top )
// ps.print(']');
// ps.print( " | " );
// }
// ps.print(varargs);
// ps.println();
// }
//
//
//
//}