diff options
author | Mike Pall <mike> | 2017-04-07 12:24:26 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2017-04-07 12:24:26 +0200 |
commit | ef23b70eb64f67c6e6606098baad3cb0ba98d1c3 (patch) | |
tree | 0499f2cd8215e92f260d33d52e333e04d45598ff /src | |
parent | c67a0982920b94f081a5e2a4e65efc6851e78500 (diff) | |
download | luajit-ef23b70eb64f67c6e6606098baad3cb0ba98d1c3.tar.gz luajit-ef23b70eb64f67c6e6606098baad3cb0ba98d1c3.tar.bz2 luajit-ef23b70eb64f67c6e6606098baad3cb0ba98d1c3.zip |
From Lua 5.2: Add lua_copy().
Contributed by François Perrad.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib_package.c | 3 | ||||
-rw-r--r-- | src/lj_api.c | 28 | ||||
-rw-r--r-- | src/lua.h | 1 |
3 files changed, 21 insertions, 11 deletions
diff --git a/src/lib_package.c b/src/lib_package.c index 552db305..40bafed5 100644 --- a/src/lib_package.c +++ b/src/lib_package.c | |||
@@ -572,8 +572,7 @@ LUALIB_API int luaopen_package(lua_State *L) | |||
572 | lj_lib_pushcf(L, lj_cf_package_unloadlib, 1); | 572 | lj_lib_pushcf(L, lj_cf_package_unloadlib, 1); |
573 | lua_setfield(L, -2, "__gc"); | 573 | lua_setfield(L, -2, "__gc"); |
574 | luaL_register(L, LUA_LOADLIBNAME, package_lib); | 574 | luaL_register(L, LUA_LOADLIBNAME, package_lib); |
575 | lua_pushvalue(L, -1); | 575 | lua_copy(L, -1, LUA_ENVIRONINDEX); |
576 | lua_replace(L, LUA_ENVIRONINDEX); | ||
577 | lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0); | 576 | lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0); |
578 | for (i = 0; package_loaders[i] != NULL; i++) { | 577 | for (i = 0; package_loaders[i] != NULL; i++) { |
579 | lj_lib_pushcf(L, package_loaders[i], 1); | 578 | lj_lib_pushcf(L, package_loaders[i], 1); |
diff --git a/src/lj_api.c b/src/lj_api.c index f0f41766..3c1a07bc 100644 --- a/src/lj_api.c +++ b/src/lj_api.c | |||
@@ -159,30 +159,40 @@ LUA_API void lua_insert(lua_State *L, int idx) | |||
159 | copyTV(L, p, L->top); | 159 | copyTV(L, p, L->top); |
160 | } | 160 | } |
161 | 161 | ||
162 | LUA_API void lua_replace(lua_State *L, int idx) | 162 | static void copy_slot(lua_State *L, TValue *f, int idx) |
163 | { | 163 | { |
164 | api_checknelems(L, 1); | ||
165 | if (idx == LUA_GLOBALSINDEX) { | 164 | if (idx == LUA_GLOBALSINDEX) { |
166 | api_check(L, tvistab(L->top-1)); | 165 | api_check(L, tvistab(f)); |
167 | /* NOBARRIER: A thread (i.e. L) is never black. */ | 166 | /* NOBARRIER: A thread (i.e. L) is never black. */ |
168 | setgcref(L->env, obj2gco(tabV(L->top-1))); | 167 | setgcref(L->env, obj2gco(tabV(f))); |
169 | } else if (idx == LUA_ENVIRONINDEX) { | 168 | } else if (idx == LUA_ENVIRONINDEX) { |
170 | GCfunc *fn = curr_func(L); | 169 | GCfunc *fn = curr_func(L); |
171 | if (fn->c.gct != ~LJ_TFUNC) | 170 | if (fn->c.gct != ~LJ_TFUNC) |
172 | lj_err_msg(L, LJ_ERR_NOENV); | 171 | lj_err_msg(L, LJ_ERR_NOENV); |
173 | api_check(L, tvistab(L->top-1)); | 172 | api_check(L, tvistab(f)); |
174 | setgcref(fn->c.env, obj2gco(tabV(L->top-1))); | 173 | setgcref(fn->c.env, obj2gco(tabV(f))); |
175 | lj_gc_barrier(L, fn, L->top-1); | 174 | lj_gc_barrier(L, fn, f); |
176 | } else { | 175 | } else { |
177 | TValue *o = index2adr(L, idx); | 176 | TValue *o = index2adr(L, idx); |
178 | api_checkvalidindex(L, o); | 177 | api_checkvalidindex(L, o); |
179 | copyTV(L, o, L->top-1); | 178 | copyTV(L, o, f); |
180 | if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */ | 179 | if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */ |
181 | lj_gc_barrier(L, curr_func(L), L->top-1); | 180 | lj_gc_barrier(L, curr_func(L), f); |
182 | } | 181 | } |
182 | } | ||
183 | |||
184 | LUA_API void lua_replace(lua_State *L, int idx) | ||
185 | { | ||
186 | api_checknelems(L, 1); | ||
187 | copy_slot(L, L->top - 1, idx); | ||
183 | L->top--; | 188 | L->top--; |
184 | } | 189 | } |
185 | 190 | ||
191 | LUA_API void lua_copy(lua_State *L, int fromidx, int toidx) | ||
192 | { | ||
193 | copy_slot(L, index2adr(L, fromidx), toidx); | ||
194 | } | ||
195 | |||
186 | LUA_API void lua_pushvalue(lua_State *L, int idx) | 196 | LUA_API void lua_pushvalue(lua_State *L, int idx) |
187 | { | 197 | { |
188 | copyTV(L, L->top, index2adr(L, idx)); | 198 | copyTV(L, L->top, index2adr(L, idx)); |
@@ -349,6 +349,7 @@ LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2); | |||
349 | LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt, | 349 | LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt, |
350 | const char *chunkname, const char *mode); | 350 | const char *chunkname, const char *mode); |
351 | LUA_API const lua_Number *lua_version (lua_State *L); | 351 | LUA_API const lua_Number *lua_version (lua_State *L); |
352 | LUA_API void lua_copy (lua_State *L, int fromidx, int toidx); | ||
352 | 353 | ||
353 | 354 | ||
354 | struct lua_Debug { | 355 | struct lua_Debug { |