From 24b333a5e96aeb1fb3ec6f0f304ac9d514551184 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Thu, 13 Jun 2019 20:01:10 +0800 Subject: [PATCH] add api lua_sharestring --- 3rd/lua/lapi.c | 12 ++++++++++++ 3rd/lua/lua.h | 1 + lualib-src/lua-sharetable.c | 12 ++---------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/3rd/lua/lapi.c b/3rd/lua/lapi.c index 0422cbc3..e2415d62 100644 --- a/3rd/lua/lapi.c +++ b/3rd/lua/lapi.c @@ -1049,6 +1049,18 @@ LUA_API void lua_sharefunction (lua_State *L, int index) { luaF_shareproto(f->p); } +LUA_API void lua_sharestring (lua_State *L, int index) { + const char *str = lua_tostring(L, index); + if (str == NULL) + luaG_runerror(L, "need a string to share"); + + TString *ts = (TString *)(str - sizeof(UTString)); + if(ts->tt == LUA_TLNGSTR) + makeshared(ts); + else + luaS_fix(G(L), ts); +} + LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { int status; TValue *o; diff --git a/3rd/lua/lua.h b/3rd/lua/lua.h index 675bc0ff..0595e75e 100644 --- a/3rd/lua/lua.h +++ b/3rd/lua/lua.h @@ -235,6 +235,7 @@ LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); LUA_API int (lua_pushthread) (lua_State *L); LUA_API void (lua_clonefunction) (lua_State *L, const void * fp); LUA_API void (lua_sharefunction) (lua_State *L, int index); +LUA_API void (lua_sharestring) (lua_State *L, int index); /* ** get functions (Lua -> stack) diff --git a/lualib-src/lua-sharetable.c b/lualib-src/lua-sharetable.c index fbb56132..0dbb5256 100644 --- a/lualib-src/lua-sharetable.c +++ b/lualib-src/lua-sharetable.c @@ -6,8 +6,6 @@ #include "lstring.h" #include "lobject.h" -#include "ltable.h" -#include "lstate.h" #include "lapi.h" #include "lgc.h" @@ -44,15 +42,9 @@ mark_shared(lua_State *L) { if (!lua_iscfunction(L, idx) || lua_getupvalue(L, idx, 1) != NULL) luaL_error(L, "Invalid function"); break; - case LUA_TSTRING: { - const char *str = lua_tostring(L, idx); - TString *ts = (TString *)(str - sizeof(UTString)); - if(ts->tt == LUA_TLNGSTR) - makeshared(ts); - else - luaS_fix(G(L), ts); + case LUA_TSTRING: + lua_sharestring(L, idx); break; - } default: luaL_error(L, "Invalid type [%s]", lua_typename(L, t)); break;