public static void DoCall(this ILuaState self, int nResult, params object[] Args) { var b = self.GetTop(); self.PushCSharpFunction(LuaStatic.traceback); self.Insert(b); int nArg = 0; if (Args != null) { nArg = Args.Length; for (int i = 0; i < Args.Length; ++i) { self.PushAnyObject(Args[i]); } } if (self.PCall(nArg, nResult, b) == LuaThreadStatus.LUA_OK) { self.Remove(b); } else { ThrowExceptionFromError(self, b - 1); } }
private static IEnumerator LuaCoroutine(ILuaState lua, LuaFunction luaRef, object yieldRet) { lua.GetGlobal("coroutine", "status"); var coro_status = lua.L_Ref(LuaIndexes.LUA_REGISTRYINDEX); lua.GetGlobal("coroutine", "resume"); var corou_resume = lua.L_Ref(LuaIndexes.LUA_REGISTRYINDEX); for (bool coroRet = true; ;) { yield return(yieldRet); var oldTop = lua.GetTop(); // 检查协程状态 lua.GetRef(coro_status); luaRef.push(lua); lua.Call(1, 1); var coStat = lua.ToString(-1); lua.Pop(1); if (coStat == "dead") { break; } // 再启动协程 lua.GetRef(corou_resume); luaRef.push(lua); var status = lua.PCall(1, 2, 0); if (status != LuaThreadStatus.LUA_OK) { LogMgr.E(lua.ToString(-1)); lua.SetTop(oldTop); break; } coroRet = lua.ToBoolean(-2); yieldRet = lua.ToAnyObject(-1); // 弹出返回值 lua.Pop(2); if (!coroRet) { LogMgr.E("{0}", yieldRet); break; } } lua.L_Unref(LuaIndexes.LUA_REGISTRYINDEX, coro_status); lua.L_Unref(LuaIndexes.LUA_REGISTRYINDEX, corou_resume); luaRef.Dispose(); }
public static int DoBuffer(this ILuaState self, byte[] nbytes, string name) { int oldTop = self.GetTop(); self.PushCSharpFunction(LuaEnv.Get(self).ls.tracebackFunction); var b = oldTop + 1; if (self.L_LoadBuffer(nbytes, name) == LuaThreadStatus.LUA_OK && self.PCall(0, -1, b) == LuaThreadStatus.LUA_OK) { self.Remove(b); return(self.GetTop() - oldTop); } ThrowExceptionFromError(self, oldTop); return(0); }
private static int StartCoroutine(ILuaState lua) { var oldTop = lua.GetTop(); // 参数列表 (mono, func, [args, ...]) var mono = lua.ToComponent(1, typeof(LuaComponent)) as MonoBehaviour; if (mono == null) { mono = ZFrame.UIManager.Instance; } if (mono.isActiveAndEnabled) { // 创建lua协程 lua.GetGlobal("coroutine", "create"); lua.PushValue(2); var status = lua.PCall(1, 1, 0); if (status == LuaThreadStatus.LUA_OK) { // 保存协程引用(这个其实不是函数,应该是LUA_TTHREAD类型) var r = lua.L_Ref(LuaIndexes.LUA_REGISTRYINDEX); var luaRef = new LuaFunction(r, lua); var top = lua.GetTop(); // 协程启动方法入栈 lua.GetGlobal("coroutine", "resume"); // 协程入栈 luaRef.push(lua); // 启动参数入栈 for (int i = 3; i < top + 1; ++i) { lua.PushValue(i); } // 总参数数量=协程+启动参数数量,即:1 + (top - 2) status = lua.PCall(top - 1, 2, 0); if (status == LuaThreadStatus.LUA_OK) { var coroRet = lua.ToBoolean(-2); var yieldRet = lua.ToAnyObject(-1); // 弹出返回值 lua.Pop(2); if (coroRet) { var coro = mono.StartCoroutine(LuaCoroutine(lua, luaRef, yieldRet)); lua.PushLightUserData(coro); return(1); } else { LogMgr.E("{0}", yieldRet); } } else { LogMgr.E("coroutine.resume FAIL!"); } } else { LogMgr.E("coroutine.create FAIL!"); } lua.SetTop(oldTop); } else { LogMgr.W("MonoBehaviour<{0}> not exist OR not isActiveAndEnabled", mono); } return(0); }
public static int Open(IntPtr L) { L.glua_settop(0); // Remove weird constants L.PushGFunction(GLua.EmptyGFunc); L.PushGFunction(GLua.EmptyGFunc); L.PushGFunction(GLua.EmptyGFunc); L.PushGFunction(GLua.EmptyGFunc); L.PushGFunction(GLua.EmptyGFunc); Kernel32.AllocConsole(); Console.Title = "Garry's Mod"; GLuaDynamic _GD = new GLuaDynamic(L); dynamic _G = _GD; _GD.Dbg(); L.CreateType(typeof(Cart)); _GD.Dbg(); GLua.Utils.DoString(L, "TESTVAR = 256; function TESTFUNC(...) Cart.Console(...) print(...) end"); _GD.Dbg(); _G.TESTFUNC("Hello from DLR! ", 42); _G.TESTFUNC(_G.TESTVAR); L.SetGlobalTableGFunc("_G", "SpewMsg", GLua.EmptyGFunc); bool InHook = false; GLua.Utils.HookOutput(new GSpewOutputFunc((int T, string Str, int R, int G, int B, int A) => { if (InHook) return; InHook = true; L.Locked(() => { L.PushSpecial(SPECIAL.GLOB); L.glua_getfield(-1, "SpewMsg"); L.glua_pushinteger(R); L.glua_pushinteger(G); L.glua_pushinteger(B); L.glua_pushinteger(A); L.glua_pushstring(Str); if (L.PCall(5, 0, 0) != 0) GLua.Utils.print(L, L.CheckString(-1)); }); InHook = false; })); L.Locked(() => { if (L.gluaL_loadstring("function TEST_DUMP() print(\"Hello universe!\") end") != 0) Console.WriteLine(L.CheckString(-1)); if (L.glua_pcall(0, 0, 0) != 0) Console.WriteLine(L.CheckString(-1)); }); /*L.GetTableVal("_G", "TEST_DUMP"); L.glua_dump((LPtr, Dump, Size, UData) => { // TODO: Fix, what is this shit. string Str = Marshal.PtrToStringAnsi(Dump, (int)Size); Console.WriteLine("{0} >> \"{1}\"", Size, Str); return 0; });*/ GLua.Utils.print(L, string.Format("Test with ManagedWrapper v{0} loaded", ManagedWrapper.VERSION), false); return 0; }