Esempio n. 1
0
        public static void GetField(this IntPtr l, int index, LuaString key)
        {
            var top = l.gettop();

            if (index < 0 && -index <= top)
            {
                index = top + 1 + index;
            }

            key.PushString(l);
            l.gettable(index);
        }
Esempio n. 2
0
        public static void PushString(this IntPtr l, string str)
        {
#if DEBUG_LUA_PERFORMANCE
            PushOrGetStringTimingWatch.Restart();
            try
            {
#endif
            l.pushstring(str);
            return;            // test result shows it is faster to NOT use the cache.

#pragma warning disable CS0162 // 检测到无法访问的代码
            LuaString predefined = LuaString.GetString(str);
            if (predefined != null)
            {
                predefined.PushString(l);
                return;
            }

            var cache = LuaStateAttachmentManager.GetOrCreateAttachmentManager(l).StrCache;
            cache.L = l;

            var info = cache.PutIntoCache(str);
            if (info == null)
            {
                l.pushstring(str); // str
            }
            else
            {
                if (!PushString(l, info.Id))
                {
                    // this should not happen
                    l.pop(3);          // X
                    l.pushstring(str); // str
                }
            }
#pragma warning restore CS0162 // 检测到无法访问的代码
#if DEBUG_LUA_PERFORMANCE
        }

        finally
        {
            PushOrGetStringTimingWatch.Stop();
            long delta = PushOrGetStringTimingWatch.ElapsedTicks;
            var  cnt   = System.Threading.Interlocked.Increment(ref PushOrGetStringCallCount);
            var  time  = System.Threading.Interlocked.Add(ref PushOrGetStringCallTotalTime, delta);
            UnityEngine.Debug.Log(((double)time) / (double)System.Diagnostics.Stopwatch.Frequency * 1000.0 / cnt);
        }
#endif
        }
Esempio n. 3
0
        public static void PushBinaryOp(this IntPtr l, LuaString op)
        {
            l.checkstack(5);
            l.PushString(op);                                 // str
            l.pushlightuserdata(LuaConst.LRKEY_OBJ_META_BIN); // str #bin
            l.gettable(lua.LUA_REGISTRYINDEX);                // str reg
            if (!l.istable(-1))
            {
                l.pop(1);                                         // str
                l.newtable();                                     // str reg
                l.pushlightuserdata(LuaConst.LRKEY_OBJ_META_BIN); // str reg #bin
                l.pushvalue(-2);                                  // str reg #bin reg
                l.settable(lua.LUA_REGISTRYINDEX);                // str reg
            }
            l.pushvalue(-2);                                      // str reg str
            l.rawget(-2);                                         // str reg func
            if (l.isfunction(-1))
            {
                l.insert(-3); // func str reg
                l.pop(2);     // func
                return;
            }
            l.pop(1);        // str reg
            l.pushvalue(-2); // str reg str
#if !DISABLE_LUA_HUB_C
            if (LuaHub.LuaHubC.Ready)
            {
                LuaHub.LuaHubC.capslua_pushCommonBinaryOp(l, 1);
            }
            else
#endif
            {
                l.pushcclosure(LuaFuncBinary, 1);
            }
            // str reg func
            l.pushvalue(-3); // str reg func str
            l.pushvalue(-2); // str reg func str func
            l.rawset(-4);    // str reg func
            l.insert(-3);    // func str reg
            l.pop(2);        // func
        }
Esempio n. 4
0
 public static void SetGlobal(this IntPtr l, LuaString key)
 {
     SetField(l, lua.LUA_GLOBALSINDEX, key);
 }
Esempio n. 5
0
        public static string GetString(this IntPtr l, int index)
        {
#if DEBUG_LUA_PERFORMANCE
            PushOrGetStringTimingWatch.Restart();
            try
            {
#endif
            return(l.tostring(index)); // test result shows it is faster to NOT use the cache.

#pragma warning disable CS0162         // 检测到无法访问的代码
            int id = GetStringRegId(l, index);
            if (id != 0)
            {
                if (id < 0)
                {
                    LuaString predefined = LuaString.GetString(id);
                    if (predefined != null)
                    {
                        return(predefined.Str);
                    }
                    else
                    {
                        // this should not happen.
                        return(l.tostring(index));
                    }
                }
                else
                {
                    LuaStringCache cache = LuaStateAttachmentManager.GetOrCreateAttachmentManager(l).StrCache;
                    cache.L = l;
                    LuaStringCache.LuaCachedStringInfo info;
                    if (cache.TryGetCacheInfo(id, out info))
                    {
                        return(info.Str);
                    }
                    else
                    {
                        // this should not happen.
                        var str = l.tostring(index);
                        cache.PutIntoCache(str);
                        return(str);
                    }
                }
            }
            else
            {
                // Not cached.
                var str = l.tostring(index);
                if (str != null && str.Length >= LuaStringCache.CachedStringMinLen && str.Length <= LuaStringCache.CachedStringMaxLen)
                {
                    var cache = LuaStateAttachmentManager.GetOrCreateAttachmentManager(l).StrCache;
                    cache.L = l;
                    cache.PutIntoCache(str);
                }
                return(str);
            }
#pragma warning restore CS0162 // 检测到无法访问的代码
#if DEBUG_LUA_PERFORMANCE
        }

        finally
        {
            PushOrGetStringTimingWatch.Stop();
            long delta = PushOrGetStringTimingWatch.ElapsedTicks;
            var  cnt   = System.Threading.Interlocked.Increment(ref PushOrGetStringCallCount);
            var  time  = System.Threading.Interlocked.Add(ref PushOrGetStringCallTotalTime, delta);
            UnityEngine.Debug.Log(((double)time) / (double)System.Diagnostics.Stopwatch.Frequency * 1000.0 / cnt);
        }
#endif
        }
Esempio n. 6
0
 public static void PushString(this IntPtr l, LuaString str)
 {
     str.PushString(l);
 }