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