lua_pushlightuserdata() private method

private lua_pushlightuserdata ( IntPtr luaState, IntPtr udata ) : void
luaState System.IntPtr
udata System.IntPtr
return void
示例#1
0
        public LuaState()
        {
            // Create State
            L = LuaDLL.luaL_newstate();

            // Create LuaInterface library
            LuaDLL.luaL_openlibs(L);
            LuaDLL.lua_pushstring(L, "LUAINTERFACE LOADED");
            LuaDLL.lua_pushboolean(L, true);
            LuaDLL.lua_settable(L, (int)LuaIndexes.LUA_REGISTRYINDEX);
            LuaDLL.lua_newtable(L);
            LuaDLL.lua_setglobal(L, "luanet");
            LuaDLL.lua_pushvalue(L, (int)LuaIndexes.LUA_GLOBALSINDEX);
            LuaDLL.lua_getglobal(L, "luanet");
            LuaDLL.lua_pushstring(L, "getmetatable");
            LuaDLL.lua_getglobal(L, "getmetatable");
            LuaDLL.lua_settable(L, -3);

            // Set luanet as global for object translator
            LuaDLL.lua_replace(L, (int)LuaIndexes.LUA_GLOBALSINDEX);
            translator = new ObjectTranslator(this, L);
            LuaDLL.lua_replace(L, (int)LuaIndexes.LUA_GLOBALSINDEX);

            GCHandle handle  = GCHandle.Alloc(translator, GCHandleType.Pinned);
            IntPtr   thisptr = GCHandle.ToIntPtr(handle);

            LuaDLL.lua_pushlightuserdata(L, thisptr);
            LuaDLL.lua_setglobal(L, "_translator");

            tracebackFunction = new LuaCSFunction(LuaStatic.traceback);

            // We need to keep this in a managed reference so the delegate doesn't get garbage collected
            panicCallback = new LuaCSFunction(LuaStatic.panic);
            LuaDLL.lua_atpanic(L, panicCallback);

            printFunction = new LuaCSFunction(LuaStatic.print);
            LuaDLL.lua_pushstdcallcfunction(L, printFunction);
            LuaDLL.lua_setfield(L, LuaIndexes.LUA_GLOBALSINDEX, "print");

            loadfileFunction = new LuaCSFunction(LuaStatic.loadfile);
            LuaDLL.lua_pushstdcallcfunction(L, loadfileFunction);
            LuaDLL.lua_setfield(L, LuaIndexes.LUA_GLOBALSINDEX, "loadfile");

            dofileFunction = new LuaCSFunction(LuaStatic.dofile);
            LuaDLL.lua_pushstdcallcfunction(L, dofileFunction);
            LuaDLL.lua_setfield(L, LuaIndexes.LUA_GLOBALSINDEX, "dofile");

            // Insert our loader FIRST
            loaderFunction = new LuaCSFunction(LuaStatic.loader);
            LuaDLL.lua_pushstdcallcfunction(L, loaderFunction);
            int loaderFunc = LuaDLL.lua_gettop(L);

            LuaDLL.lua_getfield(L, LuaIndexes.LUA_GLOBALSINDEX, "package");
            LuaDLL.lua_getfield(L, -1, "loaders");
            int loaderTable = LuaDLL.lua_gettop(L);

            // Shift table elements right
            for (int e = LuaDLL.luaL_getn(L, loaderTable) + 1; e > 1; e--)
            {
                LuaDLL.lua_rawgeti(L, loaderTable, e - 1);
                LuaDLL.lua_rawseti(L, loaderTable, e);
            }
            LuaDLL.lua_pushvalue(L, loaderFunc);
            LuaDLL.lua_rawseti(L, loaderTable, 1);
            LuaDLL.lua_settop(L, 0);

            DoString(LuaStatic.init_luanet);
        }
示例#2
0
 public void LuaPushLightUserData(IntPtr udata)
 {
     LuaDLL.lua_pushlightuserdata(L, udata);
 }
示例#3
0
        //L:  [namespace Table]
        public bool AddObject(IntPtr L, System.Object obj, string metatable /* nullable */)
        {
            IntPtr userdata = IntPtr.Zero;

            if (luaObjs.TryGetValue(obj, out userdata))
            {
                LuaDLL.lua_rawgeti(L, LuaDLL.LUA_REGISTRYINDEX, weakRefForUserData); //namespace,reftable
                LuaDLL.lua_pushlightuserdata(L, userdata);                           //namespace,reftable,userdataKey
                LuaDLL.lua_rawget(L, -2);                                            //namespace,reftable,userdata
                LuaDLL.lua_remove(L, -2);                                            //namespace,userdata
                if (LuaDLL.lua_isuserdata(L, -1))
                {
                    return(true);
                }
                else
                {
                    LuaDLL.lua_pop(L, 1);                     //namespace
                }
            }

            userdata = LuaDLL.lua_newuserdata(L, 1);             //namespace,obj

            if (metatable == null)
            {
                Type type = obj.GetType();
                while (type != null)
                {
                    LuaDLL.wlua_getfield(L, -2, type.Name);                    //namespace,obj,typet
                    if (LuaDLL.lua_isnil(L, -1))
                    {
                        LuaDLL.lua_pop(L, 1);                         //namespace,obj
                        type = type.BaseType;
                        continue;
                    }
                    if (LuaDLL.lua_istable(L, -1))
                    {
                        metatable = type.Name;
                        break;
                    }
                    else
                    {
                        LuaDLL.lua_pop(L, 2);                         //namespace
                        throw new LuaException(L, "metatable must be a table:" + type.Name);
                    }
                }
            }
            else
            {
                LuaDLL.wlua_getfield(L, -2, metatable);                //namespace,obj,typet
                if (LuaDLL.lua_isnil(L, -1))
                {
                    LuaDLL.lua_pop(L, 2);                     //namespace
                    throw new LuaException(L, "failed to find metatable:" + metatable);
                }
            }

            //namespace,obj,typet
            LuaDLL.lua_setmetatable(L, -2);             //namespace,obj
            objs[userdata.ToInt64()] = obj;
            luaObjs[obj]             = userdata;

            LuaDLL.lua_rawgeti(L, LuaDLL.LUA_REGISTRYINDEX, weakRefForUserData); //namespace,obj,reftable
            LuaDLL.lua_pushlightuserdata(L, userdata);                           //namespace,obj,reftable,userdatakey
            LuaDLL.lua_pushvalue(L, -3);                                         //namespace,obj,reftable,userdatakey,obj
            LuaDLL.lua_rawset(L, -3);                                            //namespace,obj,reftable
            LuaDLL.lua_pop(L, 1);                                                //namespace,obj

            return(true);
        }