/* * Creates the metatable for delegates */ private void CreateFunctionMetatable(LuaState luaState) { LuaLib.LuaLNewMetatable(luaState, "luaNet_function"); LuaLib.LuaPushString(luaState, "__gc"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.GcFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__call"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ExecuteDelegateFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaSetTop(luaState, -2); }
/* * Pushes a new object into the Lua stack with the provided * metatable */ private void PushNewObject(LuaState luaState, object o, int index, string metatable) { if (metatable == "luaNet_metatable") { string assemblyQualifiedName = CacheReflection.GetAssemblyQualifiedName(o.GetType()); // Gets or creates the metatable for the object's type LuaLib.LuaLGetMetatable(luaState, assemblyQualifiedName); if (LuaLib.LuaIsNil(luaState, -1)) { LuaLib.LuaSetTop(luaState, -2); LuaLib.LuaLNewMetatable(luaState, assemblyQualifiedName); LuaLib.LuaPushString(luaState, "cache"); LuaLib.LuaNewTable(luaState); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushLightUserData(luaState, LuaLib.LuaNetGetTag()); LuaLib.LuaPushNumber(luaState, 1); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__index"); LuaLib.LuaPushString(luaState, "luaNet_indexfunction"); LuaLib.LuaRawGet(luaState, (int)LuaIndexes.Registry); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__gc"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.GcFunction); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__tostring"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ToStringFunction); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__newindex"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.NewIndexFunction); LuaLib.LuaRawSet(luaState, -3); // Bind C# operator with Lua metamethods (__add, __sub, __mul) RegisterOperatorsFunctions(luaState, o.GetType()); RegisterCallMethodForDelegate(luaState, o); } } else { LuaLib.LuaLGetMetatable(luaState, metatable); } // Stores the object index in the Lua list and pushes the // index into the Lua stack LuaLib.LuaLGetMetatable(luaState, "luaNet_objects"); LuaLib.LuaNetNewUData(luaState, index); LuaLib.LuaPushValue(luaState, -3); LuaLib.LuaRemove(luaState, -4); LuaLib.LuaSetMetatable(luaState, -2); LuaLib.LuaPushValue(luaState, -1); LuaLib.LuaRawSetI(luaState, -3, index); LuaLib.LuaRemove(luaState, -2); }
/* * Pushes a new object into the Lua stack with the provided * metatable */ private void PushNewObject(LuaState luaState, object o, int index, string metatable) { if (metatable == "luaNet_metatable") { // Gets or creates the metatable for the object's type LuaLib.LuaLGetMetatable(luaState, o.GetType().AssemblyQualifiedName); if (LuaLib.LuaIsNil(luaState, -1)) { LuaLib.LuaSetTop(luaState, -2); LuaLib.LuaLNewMetatable(luaState, o.GetType().AssemblyQualifiedName); LuaLib.LuaPushString(luaState, "cache"); LuaLib.LuaNewTable(luaState); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushLightUserData(luaState, LuaLib.LuaNetGetTag()); LuaLib.LuaPushNumber(luaState, 1); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__index"); LuaLib.LuaPushString(luaState, "luaNet_indexfunction"); LuaLib.LuaRawGet(luaState, (int)LuaIndexes.Registry); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__gc"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.gcFunction); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__tostring"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.toStringFunction); LuaLib.LuaRawSet(luaState, -3); LuaLib.LuaPushString(luaState, "__newindex"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.newindexFunction); LuaLib.LuaRawSet(luaState, -3); } } else { LuaLib.LuaLGetMetatable(luaState, metatable); } // Stores the object index in the Lua list and pushes the // index into the Lua stack LuaLib.LuaLGetMetatable(luaState, "luaNet_objects"); LuaLib.LuaNetNewUData(luaState, index); LuaLib.LuaPushValue(luaState, -3); LuaLib.LuaRemove(luaState, -4); LuaLib.LuaSetMetatable(luaState, -2); LuaLib.LuaPushValue(luaState, -1); LuaLib.LuaRawSetI(luaState, -3, index); LuaLib.LuaRemove(luaState, -2); }
/* * Creates the metatable for superclasses (the base * field of registered tables) */ private void CreateBaseClassMetatable(LuaState luaState) { LuaLib.LuaLNewMetatable(luaState, "luaNet_searchbase"); LuaLib.LuaPushString(luaState, "__gc"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.GcFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__tostring"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ToStringFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__index"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.BaseIndexFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__newindex"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.NewIndexFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaSetTop(luaState, -2); }
/* * Creates the metatable for type references */ private void CreateClassMetatable(LuaState luaState) { LuaLib.LuaLNewMetatable(luaState, "luaNet_class"); LuaLib.LuaPushString(luaState, "__gc"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.GcFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__tostring"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ToStringFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__index"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ClassIndexFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__newindex"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.ClassNewindexFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaPushString(luaState, "__call"); LuaLib.LuaPushStdCallCFunction(luaState, metaFunctions.CallConstructorFunction); LuaLib.LuaSetTable(luaState, -3); LuaLib.LuaSetTop(luaState, -2); }