static int PrintWarning(LuaState luaState) { // For each argument we'll 'tostring' it int n = LuaLib.LuaGetTop(luaState); var sb = new StringBuilder("Lua:"); LuaLib.LuaGetGlobal(luaState, "tostring"); for( int i = 1; i <= n; i++ ) { LuaLib.LuaPushValue(luaState, -1); /* function to be called */ LuaLib.LuaPushValue(luaState, i); /* value to print */ LuaLib.LuaPCall(luaState, 1, 1, 0); var s = LuaLib.LuaToString(luaState, -1); sb.Append(s); if(i > 1) { sb.Append("\t"); } LuaLib.LuaPop(luaState, 1); /* pop result */ } UnityEngine.Debug.LogWarning(sb.ToString()); return 0; }
public static object[] CallLunaFunction(this Lua lua, string fileName, string function, params object[] args) { var luaState = lua.LuaState; var translator = lua.Translator; var oldTop = LuaLib.LuaGetTop(luaState); LuaLib.LuaGetGlobal(luaState, "CallImportFuncion"); translator.Push(luaState, fileName); translator.Push(luaState, function); for (var i = 0; i < args.Length; i++) { translator.Push(luaState, args[i]); } var error = LuaLib.LuaPCall(luaState, 2 + args.Length, -1, 0); if (error != 0) { var curTop = LuaLib.LuaGetTop(luaState); if (curTop > oldTop) { object err = translator.GetObject(luaState, -1); UnityEngine.Debug.LogError(err); } LuaLib.LuaSetTop(luaState, oldTop); return null; } var ret = translator.PopValues(luaState, oldTop); return ret; }
/* * Creates a new table as a global variable or as a field * inside an existing table */ public void NewTable(string fullPath) { string [] path = FullPathToArray(fullPath); int oldTop = LuaLib.LuaGetTop(luaState); if (path.Length == 1) { LuaLib.LuaNewTable(luaState); LuaLib.LuaSetGlobal(luaState, fullPath); } else { LuaLib.LuaGetGlobal(luaState, path [0]); for (int i = 1; i < path.Length - 1; i++) { LuaLib.LuaPushString(luaState, path [i]); LuaLib.LuaGetTable(luaState, -2); } LuaLib.LuaPushString(luaState, path [path.Length - 1]); LuaLib.LuaNewTable(luaState); LuaLib.LuaSetTable(luaState, -3); } LuaLib.LuaSetTop(luaState, oldTop); }
/* * Indexer for global variables from the LuaInterpreter * Supports navigation of tables by using . operator */ public object this [string fullPath] { get { object returnValue = null; int oldTop = LuaLib.LuaGetTop(luaState); string[] path = fullPath.Split(new char[] { '.' }); LuaLib.LuaGetGlobal(luaState, path [0]); returnValue = translator.GetObject(luaState, -1); LuaBase dispose = null; if (path.Length > 1) { dispose = returnValue as LuaBase; string[] remainingPath = new string[path.Length - 1]; Array.Copy(path, 1, remainingPath, 0, path.Length - 1); returnValue = GetObject(remainingPath); if (dispose != null) { dispose.Dispose(); } } LuaLib.LuaSetTop(luaState, oldTop); return(returnValue); } set { int oldTop = LuaLib.LuaGetTop(luaState); string[] path = fullPath.Split(new char[] { '.' }); if (path.Length == 1) { translator.Push(luaState, value); LuaLib.LuaSetGlobal(luaState, fullPath); } else { LuaLib.LuaGetGlobal(luaState, path [0]); string[] remainingPath = new string[path.Length - 1]; Array.Copy(path, 1, remainingPath, 0, path.Length - 1); SetObject(remainingPath, value); } LuaLib.LuaSetTop(luaState, oldTop); // Globals auto-complete if (value == null) { // Remove now obsolete entries globals.Remove(fullPath); } else { // Add new entries if (!globals.Contains(fullPath)) { RegisterGlobal(fullPath, value.GetType(), 0); } } } }
/// <summary> /// <para>Return a debug.traceback() call result (a multi-line string, containing a full stack trace, including C calls.</para> /// <para>Note: it won't return anything unless the interpreter is in the middle of execution - that is, it only makes sense to call it from a method called from Lua, or during a coroutine yield.</para> /// </summary> public string GetDebugTraceback() { int oldTop = LuaLib.LuaGetTop(luaState); LuaLib.LuaGetGlobal(luaState, "debug"); // stack: debug LuaLib.LuaGetField(luaState, -1, "traceback"); // stack: debug,traceback LuaLib.LuaRemove(luaState, -2); // stack: traceback LuaLib.LuaPCall(luaState, 0, -1, 0); return(translator.PopValues(luaState, oldTop)[0] as string); }
/// <summary> /// Push a debug.traceback reference onto the stack, for a pcall function to use as error handler. (Remember to increment any top-of-stack markers!) /// </summary> private int PushDebugTraceback(LuaState luaState, int argcount) { LuaLib.LuaGetGlobal(luaState, "debug"); LuaLib.LuaGetField(luaState, -1, "traceback"); LuaLib.LuaRemove(luaState, -2); int errindex = -argcount - 2; LuaLib.LuaInsert(luaState, errindex); return(errindex); }
public static void SetReadFile(Lua lua) { if (ReadFileFunction == null) ReadFileFunction = new LuaNativeFunction(ReadFile); LuaLib.LuaGetGlobal(lua.LuaState, "io"); LuaLib.LuaPushString(lua.LuaState, "readfile"); LuaLib.LuaPushStdCallCFunction(lua.LuaState, ReadFileFunction); LuaLib.LuaSetTable(lua.LuaState, -3); LuaLib.LuaPop(lua.LuaState, 1); }
public static void CheckStack(this Lua lua) { var luaState = lua.LuaState; var top = LuaLib.LuaGetTop(luaState); if (top == 0) return; LuaLib.LuaPushString(luaState, "Script stack leak!"); LuaLib.LuaInsert(luaState, 1); LuaLib.LuaPushNumber(luaState, top); LuaLib.LuaInsert(luaState, 1); LuaLib.LuaGetGlobal(luaState, "print"); LuaLib.LuaInsert(luaState, 1); LuaLib.LuaPCall(luaState, top + 2, 0, 0); LuaLib.LuaSetTop(luaState, 0); }
void Init() { LuaLib.LuaPushString(luaState, "LUAINTERFACE LOADED"); LuaLib.LuaPushBoolean(luaState, true); LuaLib.LuaSetTable(luaState, (int)LuaIndexes.Registry); if (_StatePassed == false) { LuaLib.LuaNewTable(luaState); LuaLib.LuaSetGlobal(luaState, "luanet"); } LuaLib.LuaNetPushGlobalTable(luaState); LuaLib.LuaGetGlobal(luaState, "luanet"); LuaLib.LuaPushString(luaState, "getmetatable"); LuaLib.LuaGetGlobal(luaState, "getmetatable"); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaNetPopGlobalTable(luaState); translator = new ObjectTranslator(this, luaState); ObjectTranslatorPool.Instance.Add(luaState, translator); LuaLib.LuaNetPopGlobalTable(luaState); }