public object[] CallLuaFunc(string name, params object[] args)
    {
        if (!ReferenceEquals(_Self, null))
        {
            var l = _Self._L;
            using (var lr = new LuaStateRecover(l))
            {
                if (args != null)
                {
                    for (int i = 0; i < args.Length; ++i)
                    {
                        l.PushLua(args[i]);
                    }
                }

                int oldtop = lr.Top;
                var code   = CallLuaFuncInternal(l, _Self.Refid, name, oldtop);
                int newtop = l.gettop();
                if (code == 0 && newtop >= oldtop)
                {
                    var cnt = newtop - oldtop;
                    var rv  = ObjectPool.GetReturnValueFromPool(cnt);
                    for (int i = 0; i < cnt; ++i)
                    {
                        rv[i] = l.GetLua(i + oldtop + 1);
                    }
                    return(rv);
                }
            }
        }
        return(null);
    }
 public static int ClrFuncDict(IntPtr l)
 {
     if (l.istable(1))
     {
         IDictionary dict = null;
         using (var lr = new LuaStateRecover(l))
         {
             var ktype = l.GetLua <Type>(2);
             var vtype = l.GetLua <Type>(3);
             if (ktype == null)
             {
                 ktype = typeof(object);
             }
             if (vtype == null)
             {
                 vtype = typeof(object);
             }
             dict = Activator.CreateInstance(typeof(Dictionary <,>).MakeGenericType(ktype, vtype)) as IDictionary;
             //dict = typeof(Dictionary<,>).MakeGenericType(ktype, vtype).GetConstructor(new Type[0]).Invoke(null) as IDictionary;
             l.pushnil();
             while (l.next(1))
             {
                 object key = l.GetLua(-2);
                 object val = l.GetLua(-1);
                 dict.Add(key.ConvertType(ktype), val.ConvertType(vtype));
                 l.pop(1);
             }
             //l.pop(1);
         }
         l.PushLuaObject(dict);
         return(1);
     }
     return(0);
 }
 public static int ClrFuncDict(IntPtr l)
 {
     if (l.istable(1))
     {
         IDictionary dict = null;
         using (var lr = new LuaStateRecover(l))
         {
             LuaOnStackTable tab   = new LuaOnStackTable(l, 1);
             var             ktype = l.GetLua(2).ConvertType(typeof(Type)) as Type;
             var             vtype = l.GetLua(3).ConvertType(typeof(Type)) as Type;
             if (ktype == null)
             {
                 ktype = typeof(object);
             }
             if (vtype == null)
             {
                 vtype = typeof(object);
             }
             dict = typeof(Dictionary <,>).MakeGenericType(ktype, vtype).GetConstructor(new Type[0]).Invoke(null) as IDictionary;
             l.PushLua(tab);
             l.pushnil();
             while (l.next(-2))
             {
                 object key = l.GetLua(-2);
                 object val = l.GetLua(-1);
                 dict.Add(key.UnwrapDynamic().ConvertType(ktype), val.UnwrapDynamic().ConvertType(vtype));
                 l.pop(1);
             }
             //l.pop(1);
         }
         l.PushLua(dict);
         return(1);
     }
     return(0);
 }
 public bool CallLuaFunc <R, P0, P1, P2, P3, P4, P5>(string name, out R r, P0 p0, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
 {
     if (!ReferenceEquals(_Self, null))
     {
         var l = _Self._L;
         using (var lr = new LuaStateRecover(l))
         {
             l.PushLua(p0);
             l.PushLua(p1);
             l.PushLua(p2);
             l.PushLua(p3);
             l.PushLua(p4);
             l.PushLua(p5);
             var code = CallLuaFuncInternal(l, _Self.Refid, name, lr.Top);
             if (code == 0 && l.gettop() > lr.Top)
             {
                 R rv;
                 l.GetLua <R>(lr.Top + 1, out rv);
                 r = rv;
                 return(true);
             }
         }
     }
     r = default(R);
     return(false);
 }
Exemple #5
0
 public object[] CallLuaFunc(string name, params object[] args)
 {
     if (!ReferenceEquals(_Self, null))
     {
         var l = _Self._L;
         using (var lr = new LuaStateRecover(l))
         {
             l.getref(_Self.Refid);
             l.GetField(-1, name);
             var func = l.GetLuaOnStack(-1).WrapDynamic();
             if (!ReferenceEquals(func, null))
             {
                 if (args != null)
                 {
                     object[] rargs = ObjectPool.GetParamsFromPool(args.Length + 1);
                     rargs[0] = _Self;
                     for (int i = 0; i < args.Length; ++i)
                     {
                         rargs[i + 1] = args[i];
                     }
                     var rv = func.Call(rargs);
                     ObjectPool.ReturnParamsToPool(rargs);
                     return(rv);
                 }
                 else
                 {
                     return(func.Call(_Self));
                 }
             }
         }
     }
     return(null);
 }
            private static void ResetRaw()
            {
                var l = GlobalLua.L.L;

                using (var lr = new LuaStateRecover(l))
                {
                    l.newtable();
                    l.SetField(lua.LUA_REGISTRYINDEX, "___levt");
                }
            }
 public void CallLuaFunc(string name)
 {
     if (!ReferenceEquals(_Self, null))
     {
         var l = _Self._L;
         using (var lr = new LuaStateRecover(l))
         {
             var code = CallLuaFuncInternal(l, _Self.Refid, name, lr.Top);
         }
     }
 }
Exemple #8
0
 public static int ClrFuncPrintError(IntPtr l)
 {
     using (var lr = new LuaStateRecover(l))
     {
         var obj = l.GetLua(1).UnwrapDynamic();
         if (GLog.IsLogErrorEnabled)
         {
             GLog.LogError(obj);
         }
     }
     return(0);
 }
 public void CallLuaFunc <P0, P1>(string name, P0 p0, P1 p1)
 {
     if (!ReferenceEquals(_Self, null))
     {
         var l = _Self._L;
         using (var lr = new LuaStateRecover(l))
         {
             l.PushLua(p0);
             l.PushLua(p1);
             var code = CallLuaFuncInternal(l, _Self.Refid, name, lr.Top);
         }
     }
 }
 public static void ExpandExFieldsToSelf(IntPtr l, CapsUnityLuaBehav behav, int index)
 {
     using (var lr = new LuaStateRecover(l))
     {
         l.pushvalue(index); // behav
         if (behav.ExFields != null)
         {
             foreach (var kvp in behav.ExFields)
             {
                 l.SetHierarchical(-1, kvp.Key, kvp.Value);
             }
         }
     }
 }
            private static void UnregHandlerRaw(string cate, int refid)
            {
                var l = GlobalLua.L.L;

                using (var lr = new LuaStateRecover(l))
                {
                    l.GetField(lua.LUA_REGISTRYINDEX, "___levt");
                    if (l.istable(-1))
                    {
                        if (refid <= 0)
                        {
                            l.pushnil();
                            l.SetField(-2, cate);
                        }
                        else
                        {
                            l.GetField(-1, cate);
                            if (l.istable(-1))
                            {
                                int cnt = 0;
                                l.pushnil();
                                while (l.next(-2))
                                {
                                    if (l.IsNumber(-2))
                                    {
                                        var key = (int)l.tonumber(-2);
                                        if (key > cnt)
                                        {
                                            cnt = key;
                                        }
                                    }
                                    l.pop(1);
                                }

                                l.pushnumber(refid);
                                l.pushnil();
                                l.settable(-3);
                                for (int i = refid; i <= cnt; ++i)
                                {
                                    l.pushnumber(i);
                                    l.pushnumber(i + 1);
                                    l.gettable(-3);
                                    l.settable(-3);
                                }
                            }
                        }
                    }
                }
            }
 public static int ClrFuncArray(IntPtr l)
 {
     if (l.istable(1))
     {
         Array arr = null;
         using (var lr = new LuaStateRecover(l))
         {
             var len   = l.getn(1);
             var otype = l.GetLua <Type>(2);
             if (otype == null)
             {
                 otype = typeof(object);
             }
             arr = Array.CreateInstance(otype, len);
             for (int i = 0; i < len; ++i)
             {
                 l.pushnumber(i + 1);
                 l.gettable(1);
                 arr.SetValue(l.GetLua(-1).ConvertType(otype), i);
                 l.pop(1);
             }
         }
         l.PushLuaObject(arr);
         return(1);
     }
     else if (l.IsString(1))
     {
         var bytes = l.tolstring(1);
         l.PushLuaObject(bytes);
         return(1);
     }
     else if (l.IsNumber(1))
     {
         int len = (int)l.tonumber(1);
         if (len < 0)
         {
             len = 0;
         }
         Type otype = l.GetLua <Type>(2);
         if (otype == null)
         {
             otype = typeof(object);
         }
         Array arr = Array.CreateInstance(otype, len);
         l.PushLuaObject(arr);
         return(1);
     }
     return(0);
 }
        public static int RegLuaEventHandler(IntPtr l)
        {
            if (l != IntPtr.Zero)
            {
                int order = 0;
                if (l.gettop() >= 3)
                {
                    order = l.GetLua <int>(3);
                }
                var cate = l.GetLua <string>(1);
                if (cate != null)
                {
                    var refid = CrossEvent.RegHandler(cate, (CrossEvent.ICEventHandler)null);
                    if (order != 0)
                    {
                        CrossEvent.SetHandlerOrder(cate, refid, order);
                    }
                    using (var lr = new LuaStateRecover(l))
                    {
                        l.GetField(lua.LUA_REGISTRYINDEX, "___levt");
                        if (!l.istable(-1))
                        {
                            l.pop(1);
                            l.newtable();
                            l.pushvalue(-1);
                            l.SetField(lua.LUA_REGISTRYINDEX, "___levt");
                        }

                        l.pushvalue(1); // levt cate
                        l.gettable(-2); // levt cate list
                        if (!l.istable(-1))
                        {
                            l.pop(1);        // levt cate
                            l.newtable();    // levt cate list
                            l.pushvalue(1);  // levt cate list cate
                            l.pushvalue(-2); // levt cate list cate list
                            l.settable(-4);  // levt cate list
                        }
                        l.pushnumber(refid); // levt cate list refid
                        l.pushvalue(2);      // levt cate list refid handler
                        l.settable(-3);      //  levt cate list
                    }
                    l.pushnumber(refid);
                    return(1);
                }
            }
            return(0);
        }
 public static int ClrFuncArray(IntPtr l)
 {
     if (l.istable(1))
     {
         Array arr = null;
         using (var lr = new LuaStateRecover(l))
         {
             LuaOnStackTable tab   = new LuaOnStackTable(l, 1);
             var             len   = ((LuaOnStackTable.LuaTableFieldsProvider)tab.FieldsProvider).ArrLength;
             var             otype = l.GetLua(2).ConvertType(typeof(Type));
             if (otype == null)
             {
                 otype = typeof(object);
             }
             arr = Array.CreateInstance((Type)otype, len);
             for (int i = 0; i < len; ++i)
             {
                 arr.SetValue(tab[i + 1].UnwrapDynamic().ConvertType((Type)otype), i);
             }
         }
         l.PushUserDataOfType(arr, arr.GetType());
         return(1);
     }
     else if (l.IsString(1))
     {
         var bytes = l.tolstring(1);
         l.PushUserDataOfType(bytes, typeof(byte[]));
         return(1);
     }
     else if (l.IsNumber(1))
     {
         int len = (int)l.tonumber(1);
         if (len < 0)
         {
             len = 0;
         }
         var otype = l.GetLua(2).ConvertType(typeof(Type));
         if (otype == null)
         {
             otype = typeof(object);
         }
         Array arr = Array.CreateInstance((Type)otype, len);
         l.PushUserDataOfType(arr, arr.GetType());
         return(1);
     }
     return(0);
 }
 public static void ExpandExFields(IntPtr l, CapsUnityLuaBehav behav, int index)
 {
     using (var lr = new LuaStateRecover(l))
     {
         l.pushvalue(index);      // behav
         l.newtable();            // behav ex
         l.pushvalue(-1);         // behav ex ex
         l.SetField(-3, "___ex"); // behav ex
         if (behav.ExFields != null)
         {
             foreach (var kvp in behav.ExFields)
             {
                 l.SetHierarchical(-1, kvp.Key, kvp.Value);
             }
         }
     }
 }
 public bool CallLuaFunc <R>(string name, out R r)
 {
     if (!ReferenceEquals(_Self, null))
     {
         var l = _Self._L;
         using (var lr = new LuaStateRecover(l))
         {
             var code = CallLuaFuncInternal(l, _Self.Refid, name, lr.Top);
             if (code == 0 && l.gettop() > lr.Top)
             {
                 R rv;
                 l.GetLua <R>(lr.Top + 1, out rv);
                 r = rv;
                 return(true);
             }
         }
     }
     r = default(R);
     return(false);
 }
Exemple #17
0
        public static int ClrFuncReset(IntPtr l)
        {
            // old package.path
            if (_OldPath == null)
            {
                _OldPath = "";
                using (var lr = new LuaStateRecover(l))
                {
                    // package.path
                    l.GetGlobal("package"); // package
                    if (l.istable(-1))
                    {
                        l.GetField(-1, "path"); // package path
                        if (l.isstring(-1))
                        {
                            _OldPath = l.tostring(-1);
                        }
                        l.pop(1);                  // package
                        l.GetField(-1, "loaders"); // package loaders
                        if (l.istable(-1))
                        {
                            _LoaderIndex = l.getn(-1) + 1;
                        }
                    }
                }
            }
            else
            {
                if (MainThreadId == CurrentThreadId)
                {
                    Capstones.UnityFramework.ResManager.UnloadAllRes();
                    Capstones.UnityFramework.ResManager.ReloadDistributeFlags();
                }
            }

            // package.path
            l.GetGlobal("package"); // package
            if (l.istable(-1))
            {
                var packagepath = GetLuaPackagePath();
                foreach (var flag in Capstones.UnityFramework.ResManager.GetDistributeFlags())
                {
                    packagepath = GetLuaDistributePath(flag) + packagepath;
                }
                packagepath += _OldPath;
                l.PushString(packagepath); // package path
#if UNITY_ANDROID && !UNITY_EDITOR
                if (UnityFramework.ResManager.LoadAssetsFromApk)
                {
                    l.GetField(-2, "loaders"); // package path loaders
                    if (l.istable(-1))
                    {
                        l.pushnumber(_LoaderIndex);       // package path loaders n
                        l.pushcfunction(ClrDelApkLoader); // package path loaders n func
                        l.settable(-3);                   // package path loaders
                    }
                    l.pop(1);                             // package path
                }
#endif
                l.SetField(-2, "path"); // package
            }
            l.pop(1);

            // res version
            l.pushnil();
            l.SetGlobal("___resver");

            return(0);
        }
            public void HandleEvent(string cate, int refid)
            {
                var tid = ThreadLocalObj.GetThreadId();

                if (tid == ThreadSafeValues.UnityThreadID)
                {
                    var pars = CrossEvent.CurrentContext._P[CrossEvent.TOKEN_ARGS];
                    var rvs  = CrossEvent.CurrentContext._P[CrossEvent.TOKEN_RETS];
                    var l    = GlobalLua.L.L;
                    using (var lr = new LuaStateRecover(l))
                    {
                        object[] args = new object[pars.Count + 1];
                        for (int i = 0; i < pars.Count; ++i)
                        {
                            args[i + 1] = pars[i].Value;
                        }
                        args[0] = cate;

                        l.GetField(lua.LUA_REGISTRYINDEX, "___levt");
                        if (l.istable(-1))
                        {
                            l.PushString(cate);
                            l.gettable(-2);
                            if (l.istable(-1))
                            {
                                l.pushnumber(refid);
                                l.gettable(-2);
                                if (l.isfunction(-1))
                                {
                                    var luarvs = ((BaseDynamic)(new LuaOnStackFunc(l, -1))).Call(args);
                                    for (int j = rvs.Count; j < luarvs.Length; ++j)
                                    {
                                        rvs.Add(new CrossEvent.EventParam());
                                    }
                                    for (int j = 0; j < luarvs.Length; ++j)
                                    {
                                        var param = rvs[j];
                                        param.Value = luarvs[j];
                                        rvs[j]      = param;
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    var pars = CrossEvent.CurrentContext._P[CrossEvent.TOKEN_ARGS];
                    UnityThreadDispatcher.RunInUnityThread(() =>
                    {
                        var l = GlobalLua.L.L;
                        using (var lr = new LuaStateRecover(l))
                        {
                            object[] args = new object[pars.Count + 1];
                            for (int i = 0; i < pars.Count; ++i)
                            {
                                args[i + 1] = pars[i].Value;
                            }
                            args[0] = cate;

                            l.GetField(lua.LUA_REGISTRYINDEX, "___levt");
                            if (l.istable(-1))
                            {
                                l.PushString(cate);
                                l.gettable(-2);
                                if (l.istable(-1))
                                {
                                    l.pushnumber(refid);
                                    l.gettable(-2);
                                    if (l.isfunction(-1))
                                    {
                                        ((BaseDynamic)(new LuaOnStackFunc(l, -1))).Call(args);
                                    }
                                }
                            }
                        }
                    });
                }
            }
    public static BaseLua BindBehav(IntPtr l, CapsUnityLuaBehav behav, int index)
    {
        ExpandExFields(l, behav, index);
        using (var lr = new LuaStateRecover(l))
        {
            if (string.IsNullOrEmpty(behav.InitLuaPath))
            {
                l.pushvalue(index);
                var refid = l.refer();
                return(new BaseLua(l, refid));
            }

            int  oldtop      = lr.Top;
            bool luaFileDone = false;
            l.pushcfunction(LuaHub.LuaFuncOnError);
            l.GetGlobal("require");
            l.PushString(behav.InitLuaPath);
            if (l.pcall(1, 1, -3) == 0)
            {
                if (l.gettop() > oldtop + 1 && l.istable(oldtop + 2))
                {
                    luaFileDone = true;
                }
                else
                {
                    DynamicHelper.LogError("Failed to init script by require " + behav.InitLuaPath + ". (Not a table.) Now Init it by file.");
                }
            }
            else
            {
                DynamicHelper.LogError(l.GetLua(-1));
                DynamicHelper.LogInfo("Failed to init script by require " + behav.InitLuaPath + ". Now Init it by file.");
            }
            if (!luaFileDone)
            {
                DynamicHelper.LogInfo("Init it by file. - Disabled");
                //string path = behav.InitLuaPath;
                //if (path.EndsWith(".lua"))
                //{
                //    path = path.Substring(0, path.Length - 4);
                //}
                //path = path.Replace('.', '/');
                //path = path.Replace('\\', '/');
                //if (!path.StartsWith("spt/"))
                //{
                //    path = "spt/" + path;
                //}
                //path += ".lua";
                //path = ResManager.UpdatePath + "/" + path;

                //l.settop(oldtop);
                //if (l.dofile(path) == 0)
                //{
                //    if (l.gettop() > oldtop && l.istable(oldtop + 1))
                //    {
                //        luaFileDone = true;
                //    }
                //    else
                //    {
                //        DynamicHelper.LogInfo("Failed to load script " + path + ". (Not a table.)");
                //    }
                //}
                //else
                //{
                //    DynamicHelper.LogInfo(l.GetLua(-1).UnwrapDynamic());
                //    DynamicHelper.LogInfo("Failed to load script " + path);
                //}
            }
            if (luaFileDone)
            {
                l.GetField(oldtop + 2, "___bind_ex_to_self");
                if (!l.isnoneornil(-1))
                {
                    bool bindex;
                    l.GetLua(-1, out bindex);
                    if (bindex)
                    {
                        ExpandExFieldsToSelf(l, behav, oldtop);
                    }
                }
                l.pop(1);

                l.GetField(oldtop + 2, "attach");
                if (l.isfunction(-1))
                {
                    l.pushvalue(oldtop);
                    if (l.pcall(1, 0, oldtop + 1) == 0)
                    {
                    }
                    else
                    {
                        DynamicHelper.LogError(l.GetLua(-1));
                    }
                    l.pushvalue(oldtop);
                    var refid = l.refer();
                    return(new BaseLua(l, refid));
                }
            }
        }
        {
            l.pushvalue(index);
            var refid = l.refer();
            return(new BaseLua(l, refid));
        }
    }