示例#1
0
        protected static void AddMember(IntPtr ptr, string name, LuaCSFunction get, LuaCSFunction set, bool instance)
        {
            CheckMethodValid(get);
            CheckMethodValid(set);

            int t = instance ? -2 : -3;

            LuaNativeMethods.lua_createtable(ptr, 2, 0);
            if (get == null)
            {
                LuaNativeMethods.lua_pushnil(ptr);
            }
            else
            {
                PushValue(ptr, get);
            }

            LuaNativeMethods.lua_rawseti(ptr, -2, 1);

            if (set == null)
            {
                LuaNativeMethods.lua_pushnil(ptr);
            }
            else
            {
                PushValue(ptr, set);
            }

            LuaNativeMethods.lua_rawseti(ptr, -2, 2);

            LuaNativeMethods.lua_setfield(ptr, t, name);
        }
示例#2
0
        public static void CompleteTypeMeta(IntPtr ptr, LuaCSFunction con, Type self)
        {
            LuaNativeMethods.lua_pushstring(ptr, ObjectCache.GetAQName(self));
            LuaNativeMethods.lua_setfield(ptr, -3, "__fullname");

            indexFunction.Push(ptr);
            LuaNativeMethods.lua_setfield(ptr, -2, "__index");

            newIndexFunction.Push(ptr);
            LuaNativeMethods.lua_setfield(ptr, -2, "__newindex");

            if (con == null)
            {
                con = NoConstructor;
            }

            PushValue(ptr, con);
            LuaNativeMethods.lua_setfield(ptr, -2, "__call");

            LuaNativeMethods.lua_pushcfunction(ptr, TypeToString);
            LuaNativeMethods.lua_setfield(ptr, -2, "__tostring");

            LuaNativeMethods.lua_pushvalue(ptr, -1);
            LuaNativeMethods.lua_setmetatable(ptr, -3);

            LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, self.FullName);
        }
示例#3
0
 public ObjectCache(IntPtr ptr)
 {
     LuaNativeMethods.lua_newtable(ptr);
     LuaNativeMethods.lua_newtable(ptr);
     LuaNativeMethods.lua_pushstring(ptr, "v");
     LuaNativeMethods.lua_setfield(ptr, -2, "__mode");
     LuaNativeMethods.lua_setmetatable(ptr, -2);
     cacheRef = LuaNativeMethods.luaL_ref(ptr, LuaIndexes.LUARegistryIndex);
 }
示例#4
0
        public static void Register(IntPtr ptr, LuaCSFunction func, string ns)
        {
            CheckMethodValid(func);

            NewTypeTable(ptr, ns);
            PushValue(ptr, func);
            LuaNativeMethods.lua_setfield(ptr, -2, func.Method.Name);
            LuaNativeMethods.lua_pop(ptr, 1);
        }
示例#5
0
        protected static void AddMember(IntPtr ptr, LuaCSFunction func, bool instance)
        {
            CheckMethodValid(func);

            PushValue(ptr, func);
            string name = func.Method.Name;

            LuaNativeMethods.lua_setfield(ptr, instance ? -2 : -3, name);
        }
示例#6
0
        public static void Open(IntPtr ptr)
        {
            List <string> typenames = Lua3rdMeta.Instance.TypesWithAttributes;

            Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies();
            Assembly   assembly  = null;

            foreach (Assembly ass in assemblys)
            {
                if (ass.GetName().Name == "Assembly-CSharp")
                {
                    assembly = ass;
                    break;
                }
            }

            if (assembly != null)
            {
                foreach (string typename in typenames)
                {
                    Type         type    = assembly.GetType(typename);
                    MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
                    foreach (MethodInfo method in methods)
                    {
                        LualibRegAttribute attr = System.Attribute.GetCustomAttribute(method, typeof(LualibRegAttribute)) as LualibRegAttribute;
                        if (attr != null)
                        {
                            LuaCSFunction csfunc = Delegate.CreateDelegate(typeof(LuaCSFunction), method) as LuaCSFunction;
                            DLLRegFuncs.Add(attr.LuaName, csfunc);
                        }
                    }
                }
            }

            if (DLLRegFuncs.Count == 0)
            {
                return;
            }

            LuaNativeMethods.lua_getglobal(ptr, "package");
            LuaNativeMethods.lua_getfield(ptr, -1, "preload");
            foreach (KeyValuePair <string, LuaCSFunction> pair in DLLRegFuncs)
            {
                LuaNativeMethods.lua_pushcfunction(ptr, pair.Value);
                LuaNativeMethods.lua_setfield(ptr, -2, pair.Key);
            }

            LuaNativeMethods.lua_settop(ptr, 0);
        }
示例#7
0
 public static new void Init(IntPtr ptr)
 {
     propertyMethods["Table"]  = ToTable;
     propertyMethods["Length"] = Length;
     LuaNativeMethods.lua_createtable(ptr, 0, 5);
     LuaObject.PushValue(ptr, LuaIndex);
     LuaNativeMethods.lua_setfield(ptr, -2, "__index");
     LuaObject.PushValue(ptr, LuaNewIndex);
     LuaNativeMethods.lua_setfield(ptr, -2, "__newindex");
     LuaNativeMethods.lua_pushcfunction(ptr, LuaObject.LuaGC);
     LuaNativeMethods.lua_setfield(ptr, -2, "__gc");
     LuaNativeMethods.lua_pushcfunction(ptr, ToString);
     LuaNativeMethods.lua_setfield(ptr, -2, "__tostring");
     LuaNativeMethods.lua_pushcfunction(ptr, Len);
     LuaNativeMethods.lua_setfield(ptr, -2, "__len");
     LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, "LuaArray");
 }
示例#8
0
        protected static void AddMember(IntPtr ptr, LuaCSFunction func)
        {
            CheckMethodValid(func);

            PushValue(ptr, func);
            string name = func.Method.Name;

            if (name.EndsWith("_s"))
            {
                name = name.Substring(0, name.Length - 2);
                LuaNativeMethods.lua_setfield(ptr, -3, name);
            }
            else
            {
                LuaNativeMethods.lua_setfield(ptr, -2, name);
            }
        }
示例#9
0
        private static void CompleteInstanceMeta(IntPtr ptr, Type self)
        {
            LuaNativeMethods.lua_pushstring(ptr, "__typename");
            LuaNativeMethods.lua_pushstring(ptr, self.Name);
            LuaNativeMethods.lua_rawset(ptr, -3);

            // for instance
            indexFunction.Push(ptr);
            LuaNativeMethods.lua_setfield(ptr, -2, "__index");

            newIndexFunction.Push(ptr);
            LuaNativeMethods.lua_setfield(ptr, -2, "__newindex");

            PushValue(ptr, luaAdd);
            LuaNativeMethods.lua_setfield(ptr, -2, "__add");
            PushValue(ptr, luaSub);
            LuaNativeMethods.lua_setfield(ptr, -2, "__sub");
            PushValue(ptr, luaMul);
            LuaNativeMethods.lua_setfield(ptr, -2, "__mul");
            PushValue(ptr, luaDiv);
            LuaNativeMethods.lua_setfield(ptr, -2, "__div");
            PushValue(ptr, luaUnm);
            LuaNativeMethods.lua_setfield(ptr, -2, "__unm");
            PushValue(ptr, luaEq);
            LuaNativeMethods.lua_setfield(ptr, -2, "__eq");
            PushValue(ptr, luaLe);
            LuaNativeMethods.lua_setfield(ptr, -2, "__le");
            PushValue(ptr, luaLt);
            LuaNativeMethods.lua_setfield(ptr, -2, "__lt");
            PushValue(ptr, luaToString);
            LuaNativeMethods.lua_setfield(ptr, -2, "__tostring");

            LuaNativeMethods.lua_pushcfunction(ptr, LuaGC);
            LuaNativeMethods.lua_setfield(ptr, -2, "__gc");

            if (self.IsValueType && IsImplByLua(self))
            {
                LuaNativeMethods.lua_pushvalue(ptr, -1);
                LuaNativeMethods.lua_setglobal(ptr, self.FullName + ".Instance");
            }

            LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, ObjectCache.GetAQName(self));
        }
示例#10
0
        public static void Register(IntPtr ptr)
        {
            LuaObject.GetTypeTable(ptr, "Slua");
            LuaObject.AddMember(ptr, CreateAction, false);
            LuaObject.AddMember(ptr, CreateClass, false);
            LuaObject.AddMember(ptr, GetClass, false);
            LuaObject.AddMember(ptr, Iterator, false);
            LuaObject.AddMember(ptr, ToString, false);
            LuaObject.AddMember(ptr, As, false);
            LuaObject.AddMember(ptr, IsNull, false);
            LuaObject.AddMember(ptr, MakeArray, false);
            LuaObject.AddMember(ptr, ToBytes, false);
            LuaObject.AddMember(ptr, "out", GetOut, null, false);
            LuaObject.AddMember(ptr, "version", GetVersion, null, false);

            LuaFunction function = LuaState.Get(ptr).DoString(ClassFunction) as LuaFunction;

            function.Push(ptr);
            LuaNativeMethods.lua_setfield(ptr, -3, "Class");
            LuaObject.CreateTypeMetatable(ptr, null, typeof(Helper));
        }
示例#11
0
 protected static void AddMember(IntPtr ptr, int v, string name)
 {
     LuaNativeMethods.lua_pushinteger(ptr, v);
     LuaNativeMethods.lua_setfield(ptr, -2, name);
 }
示例#12
0
        public static void Init(IntPtr ptr)
        {
            string newindexfun = @"

local getmetatable=getmetatable
local rawget=rawget
local error=error
local type=type
local function newindex(ud,k,v)
    local t=getmetatable(ud)
    repeat
        local h=rawget(t,k)
        if h then
            if h[2] then
                h[2](ud,v)
                return
            else
                error('property '..k..' is read only')
            end
        end
        t=rawget(t,'__parent')
    until t==nil
    error('can not find '..k)
end

return newindex
";

            string   indexfun = @"
local type=type
local error=error
local rawget=rawget
local getmetatable=getmetatable
local function index(ud,k)
    local t=getmetatable(ud)
    repeat
        local fun=rawget(t,k)
        local tp=type(fun)
        if tp=='function' then
            return fun
        elseif tp=='table' then
            local f=fun[1]
            if f then
                return f(ud)
            else
                error('property '..k..' isthis.Write only')
            end
        end
        t = rawget(t,'__parent')
    until t==nil
    error('Can not find '..k)
end

return index
";
            LuaState state    = LuaState.Get(ptr);

            newIndexFunction = (LuaFunction)state.DoString(newindexfun);
            indexFunction    = (LuaFunction)state.DoString(indexfun);

            // object method
            LuaNativeMethods.lua_createtable(ptr, 0, 4);
            AddMember(ptr, ToString);
            AddMember(ptr, GetHashCode);
            AddMember(ptr, Equals);
            AddMember(ptr, GetType);
            LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, "__luabaseobject");

            LuaArray.Init(ptr);
            LuaVarObject.Init(ptr);

            LuaNativeMethods.lua_newtable(ptr);
            LuaNativeMethods.lua_setglobal(ptr, DelgateTable);
        }