Ejemplo n.º 1
0
            public bool TryGetCacheInfo(int id, out LuaCachedStringInfo info)
            {
                var found = CacheRevMap.TryGetValue(id, out info);

                if (found)
                {
                    info.AddVisitCount();
                }
                return(found);
            }
Ejemplo n.º 2
0
            public void RemoveFromCache(LuaCachedStringInfo info)
            {
                if (info.Node != null)
                {
                    RemoveListNode(info.Node);
                    info.Node = null;
                }
                CacheMap.Remove(info.Str);
                CacheRevMap.Remove(info.Id);

                var id = info.Id;
                var l  = L;

                UnregString(l, id);
            }
Ejemplo n.º 3
0
            public LuaCachedStringInfo PutIntoCache(string str)
            {
                if (str == null)
                {
                    return(null);
                }
                LuaCachedStringInfo rv;

                if (TryGetCacheInfo(str, out rv))
                {
                    return(rv);
                }
                if (str.Length > CachedStringMaxLen)
                {
                    return(null);
                }
                rv       = new LuaCachedStringInfo();
                rv.Str   = str;
                rv.Cache = this;
                rv.Id    = ++LastId;

                if (string.IsInterned(str) != null)
                {
                    rv.IsInterned = true;
                }
                else
                {
                    if (CacheList.Count >= CacheMaxCount)
                    {
                        var last = CacheList.Last.Value;
                        RemoveFromCache(last);
                    }
                    rv.Node = CacheList.AddLast(rv);
                }
                CacheMap[str]      = rv;
                CacheRevMap[rv.Id] = rv;
                rv.AddVisitCount();

                var id = rv.Id;
                var l  = L;

                RegString(l, id, str);

                return(rv);
            }
Ejemplo n.º 4
0
            public void RemoveFromCache(LuaCachedStringInfo info)
            {
                if (info.Node != null)
                {
                    RemoveListNode(info.Node);
                    info.Node = null;
                }
                CacheMap.Remove(info.Str);
                CacheRevMap.Remove(info.Id);

                var id = info.Id;
                var l  = L;

                using (var lr = new LuaStateRecover(l))
                {
                    l.pushbuffer(LuaStringCache.LuaRefEntry); // rkey
                    l.gettable(lua.LUA_REGISTRYINDEX);        // reg
                    if (l.istable(-1))
                    {
                        l.pushnumber(1); // reg 1
                        l.gettable(-2);  // reg map
                        l.pushnumber(2); // reg map 2
                        l.gettable(-3);  // reg map revmap
                        if (l.istable(-2))
                        {
                            l.pushnumber(id); // reg map revmap id
                            l.pushvalue(-1);  // reg map revmap id id
                            l.gettable(-4);   // reg map revmap id str
                            l.pushvalue(-2);  // reg map revmap id str id
                            l.pushnil();      // reg map revmap id str id nil
                            l.settable(-6);   // reg map revmap id str
                            if (l.isstring(-1) && l.istable(-3))
                            {
                                l.pushnil();    // reg map revmap id str nil
                                l.settable(-4); // reg map revmap id
                            }
                        }
                    }
                }
            }
Ejemplo n.º 5
0
            public LuaCachedStringInfo PutIntoCache(string str)
            {
                if (str == null)
                {
                    return(null);
                }
                LuaCachedStringInfo rv;

                if (TryGetCacheInfo(str, out rv))
                {
                    return(rv);
                }
                if (str.Length > CachedStringMaxLen)
                {
                    return(null);
                }
                rv       = new LuaCachedStringInfo();
                rv.Str   = str;
                rv.Cache = this;
                rv.Id    = ++LastId;

                if (string.IsInterned(str) != null)
                {
                    rv.IsInterned = true;
                }
                else
                {
                    if (CacheList.Count >= CacheMaxCount)
                    {
                        var last = CacheList.Last.Value;
                        RemoveFromCache(last);
                    }
                    rv.Node = CacheList.AddLast(rv);
                }
                CacheMap[str]      = rv;
                CacheRevMap[rv.Id] = rv;
                rv.AddVisitCount();

                var id = rv.Id;
                var l  = L;

                using (var lr = new LuaStateRecover(l))
                {
                    l.pushbuffer(LuaStringCache.LuaRefEntry); // rkey
                    l.gettable(lua.LUA_REGISTRYINDEX);        // reg
                    if (l.istable(-1))
                    {
                        l.pushnumber(1); // reg 1
                        l.gettable(-2);  // reg map
                        if (!l.istable(-1))
                        {
                            l.pop(1);        // reg
                            l.newtable();    // reg map
                            l.pushnumber(1); // reg map 1
                            l.pushvalue(-2); // reg map 1 map
                            l.settable(-4);  // reg map
                        }
                        l.pushnumber(2);     // reg map 2
                        l.gettable(-3);      // reg map revmap
                        if (!l.istable(-1))
                        {
                            l.pop(1);        // reg map
                            l.newtable();    // reg map revmap
                            l.pushnumber(2); // reg map revmap 2
                            l.pushvalue(-2); // reg map revmap 2 revmap
                            l.settable(-5);  // reg map revmap
                        }

                        l.pushnumber(id);  // reg map revmap id
                        l.pushstring(str); // reg map revmap id str
                        l.pushvalue(-1);   // reg map revmap id str str
                        l.pushvalue(-3);   // reg map revmap id str str id
                        l.settable(-5);    // reg map revmap id str
                        l.settable(-4);    // reg map revmap
                    }
                }

                return(rv);
            }