public static string lua_tostring(IntPtr L, int index) { int strlen; IntPtr str = LuaDLL.luaS_tolstring32(L, index, out strlen); // fix il2cpp 64 bit string s = null; if (TryGetLuaString(str, out s)) { return(s); } if (strlen > 0 && str != IntPtr.Zero) { s = Marshal.PtrToStringAnsi(str); // fallback method if (s == null) { byte[] b = new byte[strlen]; Marshal.Copy(str, b, 0, strlen); s = System.Text.Encoding.Default.GetString(b); } } if (s != null) { RefString(str, index, s, L); } return((s == null) ? string.Empty : s); }
public static void ResumeGC() { var env = LuaProfiler.mainL; if (env != IntPtr.Zero) { LuaDLL.lua_gc(env, LuaGCOptions.LUA_GCRESTART, 0); } }
public static long GetLuaMemory(IntPtr luaState) { long result = 0; result = LuaDLL.lua_gc(luaState, LuaGCOptions.LUA_GCCOUNT, 0); result = result * 1024 + LuaDLL.lua_gc(luaState, LuaGCOptions.LUA_GCCOUNTB, 0); return(result); }
public static void RunGC() { var env = LuaProfiler.mainL; if (env != IntPtr.Zero) { LuaDLL.lua_gc(env, LuaGCOptions.LUA_GCCOLLECT, 0); } }
public static void StopGC() { var env = LuaProfiler.mainL; if (env != IntPtr.Zero) { LuaDLL.lua_gc(env, LuaGCOptions.LUA_GCSTOP, 0); } }
public static void RefString(IntPtr strPoint, int index, string s, IntPtr L) { int oldTop = LuaDLL.lua_gettop(L); LuaDLL.lua_pushvalue(L, index); //把字符串ref了之后就不GC了 LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaDLL.lua_settop(L, oldTop); stringDict[(long)strPoint] = s; }
public static bool matchType(IntPtr l, int total, int from, ParameterInfo[] pars) { if (total - from + 1 != pars.Length) { return(false); } for (int n = 0; n < pars.Length; n++) { int p = n + from; LuaTypes t = LuaDLL.lua_type(l, p); if (!matchType(l, p, t, pars[n].ParameterType)) { return(false); } } return(true); }
internal void push(IntPtr l, object o, bool checkReflect) { int index = allocID (l, o); if (index < 0) return; bool gco = isGcObject(o); #if SLUA_CHECK_REFLECTION int isReflect = LuaDLL.luaS_pushobject(l, index, getAQName(o), gco, udCacheRef); if (isReflect != 0 && checkReflect) { Logger.LogWarning(string.Format("{0} not exported, using reflection instead", o.ToString())); } #else LuaDLL.luaS_pushobject(l, index, getAQName(o), gco, udCacheRef); #endif }
static internal int checkDelegate(IntPtr l, int p, out UnityEngine.EventSystems.ExecuteEvents.EventFunction <UnityEngine.EventSystems.IEndDragHandler> ua) { int op = extractFunction(l, p); if (LuaDLL.lua_isnil(l, p)) { ua = null; return(op); } else if (LuaDLL.lua_isuserdata(l, p) == 1) { ua = (UnityEngine.EventSystems.ExecuteEvents.EventFunction <UnityEngine.EventSystems.IEndDragHandler>)checkObj(l, p); return(op); } if (LuaDLL.lua_isnil(l, -1)) { ua = null; return(op); } LuaDelegate ld; checkType(l, -1, out ld); LuaDLL.lua_pop(l, 1); if (ld.d != null) { ua = (UnityEngine.EventSystems.ExecuteEvents.EventFunction <UnityEngine.EventSystems.IEndDragHandler>)ld.d; return(op); } l = LuaState.get(l).L; ua = (UnityEngine.EventSystems.IEndDragHandler a1, UnityEngine.EventSystems.BaseEventData a2) => { int error = pushTry(l); pushValue(l, a1); pushValue(l, a2); ld.pcall(2, error); LuaDLL.lua_settop(l, error - 1); }; ld.d = ua; return(op); }
private static void completeInstanceMeta(IntPtr l, Type self) { LuaDLL.lua_pushstring(l, "__typename"); LuaDLL.lua_pushstring(l, self.Name); LuaDLL.lua_rawset(l, -3); // for instance index_func.push(l); LuaDLL.lua_setfield(l, -2, "__index"); newindex_func.push(l); LuaDLL.lua_setfield(l, -2, "__newindex"); pushValue(l, lua_add); LuaDLL.lua_setfield(l, -2, "__add"); pushValue(l, lua_sub); LuaDLL.lua_setfield(l, -2, "__sub"); pushValue(l, lua_mul); LuaDLL.lua_setfield(l, -2, "__mul"); pushValue(l, lua_div); LuaDLL.lua_setfield(l, -2, "__div"); pushValue(l, lua_unm); LuaDLL.lua_setfield(l, -2, "__unm"); pushValue(l, lua_eq); LuaDLL.lua_setfield(l, -2, "__eq"); pushValue(l, lua_le); LuaDLL.lua_setfield(l, -2, "__le"); pushValue(l, lua_lt); LuaDLL.lua_setfield(l, -2, "__lt"); pushValue(l, lua_tostring); LuaDLL.lua_setfield(l, -2, "__tostring"); LuaDLL.lua_pushcfunction(l, lua_gc); LuaDLL.lua_setfield(l, -2, "__gc"); if (self.IsValueType && isImplByLua(self)) { LuaDLL.lua_pushvalue(l, -1); LuaDLL.lua_setglobal(l, self.FullName + ".Instance"); } LuaDLL.lua_setfield(l, LuaIndexes.LUA_REGISTRYINDEX, ObjectCache.getAQName(self)); }
static bool checkType(IntPtr l,int p,out UnityEngine.Events.UnityAction<UnityEngine.Vector2> ua) { LuaDLL.luaL_checktype(l, p, LuaTypes.LUA_TFUNCTION); LuaDelegate ld; checkType(l, p, out ld); if (ld.d != null) { ua = (UnityEngine.Events.UnityAction<UnityEngine.Vector2>)ld.d; return true; } l = LuaState.get(l).L; ua = (UnityEngine.Vector2 v0) => { int error = pushTry(l); pushValue(l,v0); ld.pcall(1, error); LuaDLL.lua_settop(l,error - 1); }; ld.d = ua; return true; }
static new public void init(IntPtr l) { LuaDLL.lua_createtable(l, 0, 5); LuaDLL.lua_pushstring(l, "LuaVarObject"); LuaDLL.lua_setfield(l, -2, "__fullname"); LuaDLL.lua_pushstring(l, "LuaVarObject"); LuaDLL.lua_setfield(l, -2, "__typename"); pushValue(l, luaIndex); LuaDLL.lua_setfield(l, -2, "__index"); pushValue(l, luaNewIndex); LuaDLL.lua_setfield(l, -2, "__newindex"); LuaDLL.lua_pushcfunction(l, lua_gc); LuaDLL.lua_setfield(l, -2, "__gc"); LuaDLL.lua_setfield(l, LuaIndexes.LUA_REGISTRYINDEX, "LuaVarObject"); LuaDLL.lua_createtable(l, 0, 1); pushValue(l, methodWrapper); LuaDLL.lua_setfield(l, -2, "__call"); LuaDLL.lua_setfield(l, LuaIndexes.LUA_REGISTRYINDEX, ObjectCache.getAQName(typeof(LuaCSFunction))); }
public static int pushTry(IntPtr l) { if (!LuaState.get(l).isMainThread()) { Logger.LogError("Can't call lua function in bg thread"); return(0); } if (errorRef == 0) { LuaDLL.lua_pushcfunction(l, LuaState.errorFunc); LuaDLL.lua_pushvalue(l, -1); errorRef = LuaDLL.luaL_ref(l, LuaIndexes.LUA_REGISTRYINDEX); } else { LuaDLL.lua_getref(l, errorRef); } return(LuaDLL.lua_gettop(l)); }
public static void createTypeMetatable(IntPtr l, LuaCSFunction con, Type self, Type parent) { checkMethodValid(con); // set parent bool parentSet = false; LuaDLL.lua_pushstring(l, "__parent"); while (parent != null && parent != typeof(object) && parent != typeof(ValueType)) { LuaDLL.luaL_getmetatable(l, ObjectCache.getAQName(parent)); // if parentType is not exported to lua if (LuaDLL.lua_isnil(l, -1)) { LuaDLL.lua_pop(l, 1); parent = parent.BaseType; } else { LuaDLL.lua_rawset(l, -3); LuaDLL.lua_pushstring(l, "__parent"); LuaDLL.luaL_getmetatable(l, parent.FullName); LuaDLL.lua_rawset(l, -4); parentSet = true; break; } } if (!parentSet) { LuaDLL.luaL_getmetatable(l, "__luabaseobject"); LuaDLL.lua_rawset(l, -3); } completeInstanceMeta(l, self); completeTypeMeta(l, con, self); LuaDLL.lua_pop(l, 1); // pop type Table }
public static void newTypeTable(IntPtr l, string name) { string[] subt = name.Split('.'); LuaDLL.lua_pushglobaltable(l); foreach (string t in subt) { LuaDLL.lua_pushstring(l, t); LuaDLL.lua_rawget(l, -2); if (LuaDLL.lua_isnil(l, -1)) { LuaDLL.lua_pop(l, 1); LuaDLL.lua_createtable(l, 0, 0); LuaDLL.lua_pushstring(l, t); LuaDLL.lua_pushvalue(l, -2); LuaDLL.lua_rawset(l, -4); } LuaDLL.lua_remove(l, -2); } }
internal bool matchType(IntPtr l, int from, ParameterInfo[] pis, bool isstatic) { int top = LuaDLL.lua_gettop(l); from = isstatic ? from : from + 1; if (top - from + 1 != pis.Length) { return(false); } for (int n = 0; n < pis.Length; n++) { int p = n + from; LuaTypes t = LuaDLL.lua_type(l, p); if (!matchType(l, p, t, pis[n].ParameterType)) { return(false); } } return(true); }
/// <summary> /// push o to cache list /// </summary> /// <param name="l"></param> /// <param name="o"></param> /// <returns></returns> internal int allocID(IntPtr l,object o) { int index = -1; if (o == null) { LuaDLL.lua_pushnil(l); return index; } bool gco = isGcObject(o); bool found = gco && objMap.TryGetValue(o, out index); if (found) { //already found, do not need to add again if (LuaDLL.luaS_getcacheud(l, index, udCacheRef) == 1) return -1; } index = add(o); return index; }
static internal int checkDelegate(IntPtr l, int p, out UnityEngine.Events.UnityAction <System.Single, System.Single, System.Boolean> ua) { int op = extractFunction(l, p); if (LuaDLL.lua_isnil(l, p)) { ua = null; return(op); } else if (LuaDLL.lua_isuserdata(l, p) == 1) { ua = (UnityEngine.Events.UnityAction <System.Single, System.Single, System.Boolean>)checkObj(l, p); return(op); } LuaDelegate ld; checkType(l, -1, out ld); if (ld.d != null) { ua = (UnityEngine.Events.UnityAction <System.Single, System.Single, System.Boolean>)ld.d; return(op); } LuaDLL.lua_pop(l, 1); l = LuaState.get(l).L; ua = (float a1, float a2, bool a3) => { int error = pushTry(l); pushValue(l, a1); pushValue(l, a2); pushValue(l, a3); ld.pcall(3, error); LuaDLL.lua_settop(l, error - 1); }; ld.d = ua; return(op); }
public static int extractFunction(IntPtr l, int p) { int op = 0; LuaTypes t = LuaDLL.lua_type(l, p); switch (t) { case LuaTypes.LUA_TNIL: case LuaTypes.LUA_TUSERDATA: op = 0; break; case LuaTypes.LUA_TTABLE: LuaDLL.lua_rawgeti(l, p, 1); LuaDLL.lua_pushstring(l, "+="); if (LuaDLL.lua_rawequal(l, -1, -2) == 1) { op = 1; } else { op = 2; } LuaDLL.lua_pop(l, 2); LuaDLL.lua_rawgeti(l, p, 2); break; case LuaTypes.LUA_TFUNCTION: LuaDLL.lua_pushvalue(l, p); break; default: throw new Exception("expect valid Delegate"); } return(op); }
static internal int checkDelegate(IntPtr l,int p,out FairyGUI.UIPackage.LoadResource ua) { int op = extractFunction(l,p); if(LuaDLL.lua_isnil(l,p)) { ua=null; return op; } else if (LuaDLL.lua_isuserdata(l, p)==1) { ua = (FairyGUI.UIPackage.LoadResource)checkObj(l, p); return op; } LuaDelegate ld; checkType(l, -1, out ld); if(ld.d!=null) { ua = (FairyGUI.UIPackage.LoadResource)ld.d; return op; } LuaDLL.lua_pop(l,1); l = LuaState.get(l).L; ua = (string a1,string a2,System.Type a3) => { int error = pushTry(l); pushValue(l,a1); pushValue(l,a2); pushValue(l,a3); ld.pcall(3, error); UnityEngine.Object ret; checkType(l,error+1,out ret); LuaDLL.lua_settop(l, error-1); return ret; }; ld.d=ua; return op; }
static internal int checkDelegate(IntPtr l, int p, out UnityEngine.Windows.Speech.DictationRecognizer.DictationErrorHandler ua) { int op = extractFunction(l, p); if (LuaDLL.lua_isnil(l, p)) { ua = null; return(op); } else if (LuaDLL.lua_isuserdata(l, p) == 1) { ua = (UnityEngine.Windows.Speech.DictationRecognizer.DictationErrorHandler)checkObj(l, p); return(op); } LuaDelegate ld; checkType(l, -1, out ld); if (ld.d != null) { ua = (UnityEngine.Windows.Speech.DictationRecognizer.DictationErrorHandler)ld.d; return(op); } LuaDLL.lua_pop(l, 1); l = LuaState.get(l).L; ua = (string a1, int a2) => { int error = pushTry(l); pushValue(l, a1); pushValue(l, a2); ld.pcall(2, error); LuaDLL.lua_settop(l, error - 1); }; ld.d = ua; return(op); }
static internal int checkDelegate(IntPtr l, int p, out XGOIntKeyPool.XPoolObjDestroy ua) { int op = extractFunction(l, p); if (LuaDLL.lua_isnil(l, p)) { ua = null; return(op); } else if (LuaDLL.lua_isuserdata(l, p) == 1) { ua = (XGOIntKeyPool.XPoolObjDestroy)checkObj(l, p); return(op); } LuaDelegate ld; checkType(l, -1, out ld); LuaDLL.lua_pop(l, 1); if (ld.d != null) { ua = (XGOIntKeyPool.XPoolObjDestroy)ld.d; return(op); } l = LuaState.get(l).L; ua = (UnityEngine.GameObject a1, int a2) => { int error = pushTry(l); pushValue(l, a1); pushValue(l, a2); ld.pcall(2, error); LuaDLL.lua_settop(l, error - 1); }; ld.d = ua; return(op); }
static internal int checkDelegate(IntPtr l,int p,out UnityEngine.Canvas.WillRenderCanvases ua) { int op = extractFunction(l,p); if(LuaDLL.lua_isnil(l,-1)) { ua=null; return op; } int r = LuaDLL.luaS_checkcallback(l, -1); if(r<0) LuaDLL.luaL_error(l,"expect function"); if(getCacheDelegate<UnityEngine.Canvas.WillRenderCanvases>(r,out ua)) return op; LuaDLL.lua_pop(l,1); ua = () => { int error = pushTry(l); LuaDLL.lua_getref(l, r); if (LuaDLL.lua_pcall(l, 0, -1, error) != 0) { LuaDLL.lua_pop(l, 1); } LuaDLL.lua_pop(l, 1); }; cacheDelegate(r,ua); return op; }
static public int ok(IntPtr l, int retCount) { LuaDLL.lua_pushboolean(l, true); LuaDLL.lua_insert(l, -(retCount + 1)); return(retCount + 1); }
protected static void addMember(IntPtr l, int v, string name) { LuaDLL.lua_pushinteger(l, v); LuaDLL.lua_setfield(l, -2, name); }
public static bool matchType(IntPtr l, int p, LuaTypes lt, Type t) { if (t == typeof(object)) { return(true); } else if (t == typeof(Type) && isTypeTable(l, p)) { return(true); } else if (t == typeof(char[]) || t == typeof(byte[])) { return(lt == LuaTypes.LUA_TSTRING); } switch (lt) { case LuaTypes.LUA_TNIL: return(!t.IsValueType && !t.IsPrimitive); case LuaTypes.LUA_TNUMBER: #if LUA_5_3 if (LuaDLL.lua_isinteger(l, p) > 0) { return((t.IsPrimitive && t != typeof(float) && t != typeof(double)) || t.IsEnum); } else { return(t == typeof(float) || t == typeof(double)); } #else return(t.IsPrimitive || t.IsEnum); #endif case LuaTypes.LUA_TUSERDATA: object o = checkObj(l, p); Type ot = o.GetType(); return(ot == t || ot.IsSubclassOf(t) || t.IsAssignableFrom(ot)); case LuaTypes.LUA_TSTRING: return(t == typeof(string)); case LuaTypes.LUA_TBOOLEAN: return(t == typeof(bool)); case LuaTypes.LUA_TTABLE: { if (t == typeof(LuaTable) || t.IsArray) { return(true); } else if (t.IsValueType) { return(true); //luaTypeCheck(l, p, t.Name); } else if (LuaDLL.luaS_subclassof(l, p, t.Name) == 1) { return(true); } else { return(false); } } case LuaTypes.LUA_TFUNCTION: return(t == typeof(LuaFunction) || t.BaseType == typeof(MulticastDelegate)); case LuaTypes.LUA_TTHREAD: return(t == typeof(LuaThread)); } return(false); }
public static bool isLuaClass(IntPtr l, int p) { return(LuaDLL.luaS_subclassof(l, p, null) == 1); }
static bool isLuaValueType(IntPtr l, int p) { return(LuaDLL.luaS_checkluatype(l, p, null) == 1); }
public static bool matchType(IntPtr l, int p, Type t1) { LuaTypes t = LuaDLL.lua_type(l, p); return(matchType(l, p, t, t1)); }
static public int ok(IntPtr l) { LuaDLL.lua_pushboolean(l, true); return(1); }