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); }
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 }
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 }
public static void SetGlobal(this IntPtr l, LuaString key) { SetField(l, lua.LUA_GLOBALSINDEX, key); }
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 }
public static void PushString(this IntPtr l, LuaString str) { str.PushString(l); }