aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-11-25 15:17:44 +0100
committerMike Pall <mike>2013-11-25 15:17:44 +0100
commitc378f7dbb882068d1ae06edc8e7049fb1907db2d (patch)
tree2a99541a907ac84a3be740ef67dfadb640832dce
parenta8c3862d63ad60acf07252304bbfd74bce35371c (diff)
downloadluajit-c378f7dbb882068d1ae06edc8e7049fb1907db2d.tar.gz
luajit-c378f7dbb882068d1ae06edc8e7049fb1907db2d.tar.bz2
luajit-c378f7dbb882068d1ae06edc8e7049fb1907db2d.zip
Abstract out post-registration handling of pre-registered modules.
-rw-r--r--src/lib_table.c7
-rw-r--r--src/lj_lib.c21
-rw-r--r--src/lj_lib.h15
3 files changed, 25 insertions, 18 deletions
diff --git a/src/lib_table.c b/src/lib_table.c
index 85ca660e..91c022bb 100644
--- a/src/lib_table.c
+++ b/src/lib_table.c
@@ -275,12 +275,7 @@ LJLIB_NOREG LJLIB_CF(table_new) LJLIB_REC(.)
275 275
276static int luaopen_table_new(lua_State *L) 276static int luaopen_table_new(lua_State *L)
277{ 277{
278 GCfunc *fn = lj_lib_pushcc(L, lj_cf_table_new, FF_table_new, 0); 278 return lj_lib_postreg(L, lj_cf_table_new, FF_table_new, "new");
279 GCtab *t = tabref(curr_func(L)->c.env); /* Reference to "table". */
280 setfuncV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "new")), fn);
281 lj_gc_anybarriert(L, t);
282 setfuncV(L, L->top++, fn);
283 return 1;
284} 279}
285 280
286/* ------------------------------------------------------------------------ */ 281/* ------------------------------------------------------------------------ */
diff --git a/src/lj_lib.c b/src/lj_lib.c
index df66ed51..aea96120 100644
--- a/src/lj_lib.c
+++ b/src/lj_lib.c
@@ -148,6 +148,17 @@ void lj_lib_register(lua_State *L, const char *libname,
148 } 148 }
149} 149}
150 150
151/* Push internal function on the stack. */
152GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n)
153{
154 GCfunc *fn;
155 lua_pushcclosure(L, f, n);
156 fn = funcV(L->top-1);
157 fn->c.ffid = (uint8_t)id;
158 setmref(fn->c.pc, &G(L)->bc_cfunc_int);
159 return fn;
160}
161
151void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f, GCtab *env) 162void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f, GCtab *env)
152{ 163{
153 luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4); 164 luaL_findtable(L, LUA_REGISTRYINDEX, "_PRELOAD", 4);
@@ -158,6 +169,16 @@ void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f, GCtab *env)
158 L->top--; 169 L->top--;
159} 170}
160 171
172int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id, const char *name)
173{
174 GCfunc *fn = lj_lib_pushcf(L, cf, id);
175 GCtab *t = tabref(curr_func(L)->c.env); /* Reference to parent table. */
176 setfuncV(L, lj_tab_setstr(L, t, lj_str_newz(L, name)), fn);
177 lj_gc_anybarriert(L, t);
178 setfuncV(L, L->top++, fn);
179 return 1;
180}
181
161/* -- Type checks --------------------------------------------------------- */ 182/* -- Type checks --------------------------------------------------------- */
162 183
163TValue *lj_lib_checkany(lua_State *L, int narg) 184TValue *lj_lib_checkany(lua_State *L, int narg)
diff --git a/src/lj_lib.h b/src/lj_lib.h
index f9377bad..c77c5229 100644
--- a/src/lj_lib.h
+++ b/src/lj_lib.h
@@ -59,18 +59,7 @@ LJ_FUNC int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst);
59#define lj_lib_checkfpu(L) UNUSED(L) 59#define lj_lib_checkfpu(L) UNUSED(L)
60#endif 60#endif
61 61
62/* Push internal function on the stack. */ 62LJ_FUNC GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f, int id, int n);
63static LJ_AINLINE GCfunc *lj_lib_pushcc(lua_State *L, lua_CFunction f,
64 int id, int n)
65{
66 GCfunc *fn;
67 lua_pushcclosure(L, f, n);
68 fn = funcV(L->top-1);
69 fn->c.ffid = (uint8_t)id;
70 setmref(fn->c.pc, &G(L)->bc_cfunc_int);
71 return fn;
72}
73
74#define lj_lib_pushcf(L, fn, id) (lj_lib_pushcc(L, (fn), (id), 0)) 63#define lj_lib_pushcf(L, fn, id) (lj_lib_pushcc(L, (fn), (id), 0))
75 64
76/* Library function declarations. Scanned by buildvm. */ 65/* Library function declarations. Scanned by buildvm. */
@@ -91,6 +80,8 @@ LJ_FUNC void lj_lib_register(lua_State *L, const char *libname,
91 const uint8_t *init, const lua_CFunction *cf); 80 const uint8_t *init, const lua_CFunction *cf);
92LJ_FUNC void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f, 81LJ_FUNC void lj_lib_prereg(lua_State *L, const char *name, lua_CFunction f,
93 GCtab *env); 82 GCtab *env);
83LJ_FUNC int lj_lib_postreg(lua_State *L, lua_CFunction cf, int id,
84 const char *name);
94 85
95/* Library init data tags. */ 86/* Library init data tags. */
96#define LIBINIT_LENMASK 0x3f 87#define LIBINIT_LENMASK 0x3f