aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib_package.c3
-rw-r--r--src/lj_api.c28
-rw-r--r--src/lua.h1
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
162LUA_API void lua_replace(lua_State *L, int idx) 162static 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
184LUA_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
191LUA_API void lua_copy(lua_State *L, int fromidx, int toidx)
192{
193 copy_slot(L, index2adr(L, fromidx), toidx);
194}
195
186LUA_API void lua_pushvalue(lua_State *L, int idx) 196LUA_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));
diff --git a/src/lua.h b/src/lua.h
index f067483a..0c653f56 100644
--- a/src/lua.h
+++ b/src/lua.h
@@ -349,6 +349,7 @@ LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);
349LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt, 349LUA_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);
351LUA_API const lua_Number *lua_version (lua_State *L); 351LUA_API const lua_Number *lua_version (lua_State *L);
352LUA_API void lua_copy (lua_State *L, int fromidx, int toidx);
352 353
353 354
354struct lua_Debug { 355struct lua_Debug {