Пример #1
0
 /*
  * 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);
 }
Пример #2
0
        /*
         * 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);
        }
Пример #3
0
        /*
         * 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);
        }
Пример #4
0
 /*
  * 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);
 }
Пример #5
0
 /*
  * 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);
 }