/* * Creates the metatable for delegates */ private void createFunctionMetatable(LuaCore.lua_State luaState) { LuaLib.luaL_newmetatable(luaState, "luaNet_function"); LuaLib.lua_pushstring(luaState, "__gc"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.gcFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__call"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.execDelegateFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_settop(luaState, -2); }
/* * Pushes a new object into the Lua stack with the provided * metatable */ private void pushNewObject(LuaCore.lua_State luaState, object o, int index, string metatable) { if (metatable == "luaNet_metatable") { // Gets or creates the metatable for the object's type LuaLib.luaL_getmetatable(luaState, o.GetType().AssemblyQualifiedName); if (LuaLib.lua_isnil(luaState, -1)) { LuaLib.lua_settop(luaState, -2); LuaLib.luaL_newmetatable(luaState, o.GetType().AssemblyQualifiedName); LuaLib.lua_pushstring(luaState, "cache"); LuaLib.lua_newtable(luaState); LuaLib.lua_rawset(luaState, -3); LuaLib.lua_pushlightuserdata(luaState, LuaLib.luanet_gettag()); LuaLib.lua_pushnumber(luaState, 1); LuaLib.lua_rawset(luaState, -3); LuaLib.lua_pushstring(luaState, "__index"); LuaLib.lua_pushstring(luaState, "luaNet_indexfunction"); LuaLib.lua_rawget(luaState, (int)LuaIndexes.Registry); LuaLib.lua_rawset(luaState, -3); LuaLib.lua_pushstring(luaState, "__gc"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.gcFunction); LuaLib.lua_rawset(luaState, -3); LuaLib.lua_pushstring(luaState, "__tostring"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.toStringFunction); LuaLib.lua_rawset(luaState, -3); LuaLib.lua_pushstring(luaState, "__newindex"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.newindexFunction); LuaLib.lua_rawset(luaState, -3); } } else { LuaLib.luaL_getmetatable(luaState, metatable); } // Stores the object index in the Lua list and pushes the // index into the Lua stack LuaLib.luaL_getmetatable(luaState, "luaNet_objects"); LuaLib.luanet_newudata(luaState, index); LuaLib.lua_pushvalue(luaState, -3); LuaLib.lua_remove(luaState, -4); LuaLib.lua_setmetatable(luaState, -2); LuaLib.lua_pushvalue(luaState, -1); LuaLib.lua_rawseti(luaState, -3, index); LuaLib.lua_remove(luaState, -2); }
/* * Registers the global functions used by LuaInterface */ private void setGlobalFunctions(LuaCore.lua_State luaState) { LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.indexFunction); LuaLib.lua_setglobal(luaState, "get_object_member"); LuaLib.lua_pushstdcallcfunction(luaState, importTypeFunction); LuaLib.lua_setglobal(luaState, "import_type"); LuaLib.lua_pushstdcallcfunction(luaState, loadAssemblyFunction); LuaLib.lua_setglobal(luaState, "load_assembly"); LuaLib.lua_pushstdcallcfunction(luaState, registerTableFunction); LuaLib.lua_setglobal(luaState, "make_object"); LuaLib.lua_pushstdcallcfunction(luaState, unregisterTableFunction); LuaLib.lua_setglobal(luaState, "free_object"); LuaLib.lua_pushstdcallcfunction(luaState, getMethodSigFunction); LuaLib.lua_setglobal(luaState, "get_method_bysig"); LuaLib.lua_pushstdcallcfunction(luaState, getConstructorSigFunction); LuaLib.lua_setglobal(luaState, "get_constructor_bysig"); }
/* * Creates the metatable for superclasses (the base * field of registered tables) */ private void createBaseClassMetatable(LuaCore.lua_State luaState) { LuaLib.luaL_newmetatable(luaState, "luaNet_searchbase"); LuaLib.lua_pushstring(luaState, "__gc"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.gcFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__tostring"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.toStringFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__index"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.baseIndexFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__newindex"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.newindexFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_settop(luaState, -2); }
/* * Creates the metatable for type references */ private void createClassMetatable(LuaCore.lua_State luaState) { LuaLib.luaL_newmetatable(luaState, "luaNet_class"); LuaLib.lua_pushstring(luaState, "__gc"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.gcFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__tostring"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.toStringFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__index"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.classIndexFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__newindex"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.classNewindexFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_pushstring(luaState, "__call"); LuaLib.lua_pushstdcallcfunction(luaState, metaFunctions.callConstructorFunction); LuaLib.lua_settable(luaState, -3); LuaLib.lua_settop(luaState, -2); }