lua_pushthread() private method

private lua_pushthread ( IntPtr L ) : int
L System.IntPtr
return int
示例#1
0
        public static int traceback(IntPtr L)
        {
            int    arg;
            IntPtr L1;

            if (LuaDLL.lua_isthread(L, 1))
            {
                arg = 1;
                L1  = LuaDLL.lua_tothread(L, 1);
            }
            else
            {
                arg = 0;
                L1  = L;
            }

            string msg = LuaDLL.lua_tostring(L, arg + 1);

            if (string.IsNullOrEmpty(msg))
            {
                LuaDLL.lua_pushvalue(L, arg + 1);
            }
            else
            {
                int level = (int)LuaDLL.luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0);
                LuaDLL.lua_getref(L, 3);
                LuaDLL.lua_pushthread(L1);
                LuaDLL.lua_pushvalue(L, arg + 1);
                LuaDLL.lua_pushnumber(L, level + 1);
                LuaDLL.lua_call(L, 3, 1);
            }

            return(1);
        }
示例#2
0
        public int Resume(params object[] args)
        {
            objs = null;
            int top = 0;

            luaState.Push(this);
            IntPtr L = luaState.LuaToThread(-1);

            luaState.LuaPop(1);
            int nArgs = 0;

            if (args != null)
            {
                nArgs = args.Length;

                for (int i = 0; i < args.Length; i++)
                {
                    ToLua.Push(L, args[i]);
                }
            }

            int ret = LuaDLL.lua_resume(L, nArgs);

            if (ret > (int)LuaThreadStatus.LUA_YIELD)
            {
                string error = null;
                top = LuaDLL.lua_gettop(L);
                LuaDLL.tolua_pushtraceback(L);
                LuaDLL.lua_pushthread(L);
                LuaDLL.lua_pushvalue(L, -3);

                if (LuaDLL.lua_pcall(L, 2, -1, 0) != 0)
                {
                    LuaDLL.lua_settop(L, top);
                }

                error = LuaDLL.lua_tostring(L, -1);
                LuaDLL.lua_settop(L, 0);
                throw new LuaException(error);
            }

            top = LuaDLL.lua_gettop(L);

            if (top > 0)
            {
                objs = new object[top];

                for (int i = 0; i < top; i++)
                {
                    objs[i] = ToLua.ToVarObject(L, i + 1);
                }
            }

            if (ret == 0)
            {
                Dispose();
            }

            return(ret);
        }
示例#3
0
        public int Resume(params object[] args)
        {
            this.objs = null;
            this.luaState.Push(this);
            IntPtr intPtr = this.luaState.LuaToThread(-1);

            this.luaState.LuaPop(1);
            int narg = 0;

            if (args != null)
            {
                narg = args.Length;
                for (int i = 0; i < args.Length; i++)
                {
                    ToLua.Push(intPtr, args[i]);
                }
            }
            int num = LuaDLL.lua_resume(intPtr, narg);
            int num2;

            if (num > 1)
            {
                num2 = LuaDLL.lua_gettop(intPtr);
                LuaDLL.tolua_pushtraceback(intPtr);
                LuaDLL.lua_pushthread(intPtr);
                LuaDLL.lua_pushvalue(intPtr, -3);
                if (LuaDLL.lua_pcall(intPtr, 2, -1, 0) != 0)
                {
                    LuaDLL.lua_settop(intPtr, num2);
                }
                string msg = LuaDLL.lua_tostring(intPtr, -1);
                LuaDLL.lua_settop(intPtr, 0);
                throw new LuaException(msg, null, 1);
            }
            num2 = LuaDLL.lua_gettop(intPtr);
            if (num2 > 0)
            {
                this.objs = new object[num2];
                for (int j = 0; j < num2; j++)
                {
                    this.objs[j] = ToLua.ToVarObject(intPtr, j + 1);
                }
            }
            if (num == 0)
            {
                this.Dispose();
            }
            return(num);
        }
示例#4
0
文件: ToLua.cs 项目: zhangf911/tolua
        public static string TracebackError(IntPtr L)
        {
            int top = LuaDLL.lua_gettop(L);

            LuaDLL.tolua_pushtraceback(L);
            LuaDLL.lua_pushthread(L);
            LuaDLL.lua_pushvalue(L, -3);

            if (LuaDLL.lua_pcall(L, 2, -1, 0) != 0)
            {
                LuaDLL.lua_settop(L, top);
            }

            return(LuaDLL.lua_tostring(L, -1));
        }
示例#5
0
        protected int Resume(IntPtr L, int nArgs)
        {
            int ret = LuaDLL.lua_resume(L, nArgs);

            if (ret > (int)LuaThreadStatus.LUA_YIELD)
            {
                string error = null;
                int    top   = LuaDLL.lua_gettop(L);
                LuaDLL.tolua_pushtraceback(L);
                LuaDLL.lua_pushthread(L);
                LuaDLL.lua_pushvalue(L, top);

                if (LuaDLL.lua_pcall(L, 2, -1, 0) != 0)
                {
                    LuaDLL.lua_settop(L, top);
                }

                error = LuaDLL.lua_tostring(L, -1);
                luaState.LuaSetTop(0);
                throw new LuaException(error);
            }

            return(ret);
        }
示例#6
0
 public int LuaPushThread()
 {
     return(LuaDLL.lua_pushthread(L));
 }