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); }
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); } } }
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); }
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)); } }