Example #1
0
            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);
            }
Example #2
0
        public static void ResumeGC()
        {
            var env = LuaProfiler.mainL;

            if (env != IntPtr.Zero)
            {
                LuaDLL.lua_gc(env, LuaGCOptions.LUA_GCRESTART, 0);
            }
        }
Example #3
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);
        }
Example #4
0
        public static void RunGC()
        {
            var env = LuaProfiler.mainL;

            if (env != IntPtr.Zero)
            {
                LuaDLL.lua_gc(env, LuaGCOptions.LUA_GCCOLLECT, 0);
            }
        }
Example #5
0
        public static void StopGC()
        {
            var env = LuaProfiler.mainL;

            if (env != IntPtr.Zero)
            {
                LuaDLL.lua_gc(env, LuaGCOptions.LUA_GCSTOP, 0);
            }
        }
Example #6
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;
            }
Example #7
0
        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);
        }
Example #8
0
		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

		}
Example #9
0
        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);
        }
Example #10
0
        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)));
        }
Example #13
0
        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));
        }
Example #14
0
        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
        }
Example #15
0
        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);
            }
Example #17
0
        /// <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;
		}
Example #18
0
        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);
        }
Example #19
0
        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;
		}
Example #21
0
        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;
		}
Example #24
0
 static public int ok(IntPtr l, int retCount)
 {
     LuaDLL.lua_pushboolean(l, true);
     LuaDLL.lua_insert(l, -(retCount + 1));
     return(retCount + 1);
 }
Example #25
0
 protected static void addMember(IntPtr l, int v, string name)
 {
     LuaDLL.lua_pushinteger(l, v);
     LuaDLL.lua_setfield(l, -2, name);
 }
Example #26
0
        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);
        }
Example #27
0
 public static bool isLuaClass(IntPtr l, int p)
 {
     return(LuaDLL.luaS_subclassof(l, p, null) == 1);
 }
Example #28
0
 static bool isLuaValueType(IntPtr l, int p)
 {
     return(LuaDLL.luaS_checkluatype(l, p, null) == 1);
 }
Example #29
0
        public static bool matchType(IntPtr l, int p, Type t1)
        {
            LuaTypes t = LuaDLL.lua_type(l, p);

            return(matchType(l, p, t, t1));
        }
Example #30
0
 static public int ok(IntPtr l)
 {
     LuaDLL.lua_pushboolean(l, true);
     return(1);
 }