diff options
| author | Mike Pall <mike> | 2013-10-09 17:01:22 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2013-10-09 17:02:01 +0200 |
| commit | c8cfca05578932567d2c65d59262f398e8acaed2 (patch) | |
| tree | 5699e7f2df3a5166eee667b0971775cea6c0ab4b | |
| parent | 47df3ae5136521da96767e6daed4cdd241de2fa6 (diff) | |
| download | luajit-c8cfca05578932567d2c65d59262f398e8acaed2.tar.gz luajit-c8cfca05578932567d2c65d59262f398e8acaed2.tar.bz2 luajit-c8cfca05578932567d2c65d59262f398e8acaed2.zip | |
Add table.new().
| -rw-r--r-- | doc/extensions.html | 9 | ||||
| -rw-r--r-- | src/Makefile.dep | 2 | ||||
| -rw-r--r-- | src/lib_table.c | 20 | ||||
| -rw-r--r-- | src/lj_api.c | 4 | ||||
| -rw-r--r-- | src/lj_asm.c | 3 | ||||
| -rw-r--r-- | src/lj_ffrecord.c | 8 | ||||
| -rw-r--r-- | src/lj_ir.h | 1 | ||||
| -rw-r--r-- | src/lj_ircall.h | 2 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 5 | ||||
| -rw-r--r-- | src/lj_tab.c | 6 | ||||
| -rw-r--r-- | src/lj_tab.h | 1 |
11 files changed, 55 insertions, 6 deletions
diff --git a/doc/extensions.html b/doc/extensions.html index 33bcfb28..48f4220c 100644 --- a/doc/extensions.html +++ b/doc/extensions.html | |||
| @@ -208,6 +208,15 @@ minor releases (2.0 → 2.1) or between any beta release. Foreign | |||
| 208 | bytecode (e.g. from Lua 5.1) is incompatible and cannot be loaded. | 208 | bytecode (e.g. from Lua 5.1) is incompatible and cannot be loaded. |
| 209 | </p> | 209 | </p> |
| 210 | 210 | ||
| 211 | <h3 id="table_new"><tt>table.new(narray, nhash)</tt> allocates a pre-sized table</h3> | ||
| 212 | <p> | ||
| 213 | An extra library function <tt>table.new()</tt> can be made available via | ||
| 214 | <tt>require("table.new")</tt>. This creates a pre-sized table, just like | ||
| 215 | the C API equivalent <tt>lua_createtable()</tt>. This is useful for big | ||
| 216 | tables if the final table size is known and automatic table resizing is | ||
| 217 | too expensive. | ||
| 218 | </p> | ||
| 219 | |||
| 211 | <h3 id="math_random">Enhanced PRNG for <tt>math.random()</tt></h3> | 220 | <h3 id="math_random">Enhanced PRNG for <tt>math.random()</tt></h3> |
| 212 | <p> | 221 | <p> |
| 213 | LuaJIT uses a Tausworthe PRNG with period 2^223 to implement | 222 | LuaJIT uses a Tausworthe PRNG with period 2^223 to implement |
diff --git a/src/Makefile.dep b/src/Makefile.dep index a285df2c..5b35ddf5 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep | |||
| @@ -40,7 +40,7 @@ lib_string.o: lib_string.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ | |||
| 40 | lj_char.h lj_strfmt.h lj_lib.h lj_libdef.h | 40 | lj_char.h lj_strfmt.h lj_lib.h lj_libdef.h |
| 41 | lib_table.o: lib_table.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ | 41 | lib_table.o: lib_table.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ |
| 42 | lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h \ | 42 | lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h \ |
| 43 | lj_tab.h lj_lib.h lj_libdef.h | 43 | lj_tab.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h |
| 44 | lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h | 44 | lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h |
| 45 | lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ | 45 | lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ |
| 46 | lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \ | 46 | lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h lj_func.h lj_udata.h \ |
diff --git a/src/lib_table.c b/src/lib_table.c index d7df8399..85ca660e 100644 --- a/src/lib_table.c +++ b/src/lib_table.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include "lj_err.h" | 18 | #include "lj_err.h" |
| 19 | #include "lj_buf.h" | 19 | #include "lj_buf.h" |
| 20 | #include "lj_tab.h" | 20 | #include "lj_tab.h" |
| 21 | #include "lj_ff.h" | ||
| 21 | #include "lj_lib.h" | 22 | #include "lj_lib.h" |
| 22 | 23 | ||
| 23 | /* ------------------------------------------------------------------------ */ | 24 | /* ------------------------------------------------------------------------ */ |
| @@ -264,6 +265,24 @@ LJLIB_CF(table_pack) | |||
| 264 | } | 265 | } |
| 265 | #endif | 266 | #endif |
| 266 | 267 | ||
| 268 | LJLIB_NOREG LJLIB_CF(table_new) LJLIB_REC(.) | ||
| 269 | { | ||
| 270 | int32_t a = lj_lib_checkint(L, 1); | ||
| 271 | int32_t h = lj_lib_checkint(L, 2); | ||
| 272 | lua_createtable(L, a, h); | ||
| 273 | return 1; | ||
| 274 | } | ||
| 275 | |||
| 276 | static int luaopen_table_new(lua_State *L) | ||
| 277 | { | ||
| 278 | GCfunc *fn = lj_lib_pushcc(L, lj_cf_table_new, FF_table_new, 0); | ||
| 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 | } | ||
| 285 | |||
| 267 | /* ------------------------------------------------------------------------ */ | 286 | /* ------------------------------------------------------------------------ */ |
| 268 | 287 | ||
| 269 | #include "lj_libdef.h" | 288 | #include "lj_libdef.h" |
| @@ -275,6 +294,7 @@ LUALIB_API int luaopen_table(lua_State *L) | |||
| 275 | lua_getglobal(L, "unpack"); | 294 | lua_getglobal(L, "unpack"); |
| 276 | lua_setfield(L, -2, "unpack"); | 295 | lua_setfield(L, -2, "unpack"); |
| 277 | #endif | 296 | #endif |
| 297 | lj_lib_prereg(L, LUA_TABLIBNAME ".new", luaopen_table_new, tabV(L->top-1)); | ||
| 278 | return 1; | 298 | return 1; |
| 279 | } | 299 | } |
| 280 | 300 | ||
diff --git a/src/lj_api.c b/src/lj_api.c index 8aaafdc5..05fb41a7 100644 --- a/src/lj_api.c +++ b/src/lj_api.c | |||
| @@ -640,10 +640,8 @@ LUA_API void lua_pushlightuserdata(lua_State *L, void *p) | |||
| 640 | 640 | ||
| 641 | LUA_API void lua_createtable(lua_State *L, int narray, int nrec) | 641 | LUA_API void lua_createtable(lua_State *L, int narray, int nrec) |
| 642 | { | 642 | { |
| 643 | GCtab *t; | ||
| 644 | lj_gc_check(L); | 643 | lj_gc_check(L); |
| 645 | t = lj_tab_new(L, (uint32_t)(narray > 0 ? narray+1 : 0), hsize2hbits(nrec)); | 644 | settabV(L, L->top, lj_tab_new_ah(L, narray, nrec)); |
| 646 | settabV(L, L->top, t); | ||
| 647 | incr_top(L); | 645 | incr_top(L); |
| 648 | } | 646 | } |
| 649 | 647 | ||
diff --git a/src/lj_asm.c b/src/lj_asm.c index 2bf273e1..0d6875a6 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -1659,6 +1659,9 @@ static void asm_ir(ASMState *as, IRIns *ir) | |||
| 1659 | case IR_STRTO: asm_strto(as, ir); break; | 1659 | case IR_STRTO: asm_strto(as, ir); break; |
| 1660 | 1660 | ||
| 1661 | /* Calls. */ | 1661 | /* Calls. */ |
| 1662 | case IR_CALLA: | ||
| 1663 | as->gcsteps++; | ||
| 1664 | /* fallthrough */ | ||
| 1662 | case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break; | 1665 | case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break; |
| 1663 | case IR_CALLXS: asm_callx(as, ir); break; | 1666 | case IR_CALLXS: asm_callx(as, ir); break; |
| 1664 | case IR_CARG: break; | 1667 | case IR_CARG: break; |
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 918cc9cf..29916e71 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
| @@ -1003,6 +1003,14 @@ static void LJ_FASTCALL recff_table_concat(jit_State *J, RecordFFData *rd) | |||
| 1003 | UNUSED(rd); | 1003 | UNUSED(rd); |
| 1004 | } | 1004 | } |
| 1005 | 1005 | ||
| 1006 | static void LJ_FASTCALL recff_table_new(jit_State *J, RecordFFData *rd) | ||
| 1007 | { | ||
| 1008 | TRef tra = lj_opt_narrow_toint(J, J->base[0]); | ||
| 1009 | TRef trh = lj_opt_narrow_toint(J, J->base[1]); | ||
| 1010 | J->base[0] = lj_ir_call(J, IRCALL_lj_tab_new_ah, tra, trh); | ||
| 1011 | UNUSED(rd); | ||
| 1012 | } | ||
| 1013 | |||
| 1006 | /* -- I/O library fast functions ------------------------------------------ */ | 1014 | /* -- I/O library fast functions ------------------------------------------ */ |
| 1007 | 1015 | ||
| 1008 | /* Get FILE* for I/O function. Any I/O error aborts recording, so there's | 1016 | /* Get FILE* for I/O function. Any I/O error aborts recording, so there's |
diff --git a/src/lj_ir.h b/src/lj_ir.h index 54bbbdda..30878b91 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
| @@ -139,6 +139,7 @@ | |||
| 139 | \ | 139 | \ |
| 140 | /* Calls. */ \ | 140 | /* Calls. */ \ |
| 141 | _(CALLN, N , ref, lit) \ | 141 | _(CALLN, N , ref, lit) \ |
| 142 | _(CALLA, A , ref, lit) \ | ||
| 142 | _(CALLL, L , ref, lit) \ | 143 | _(CALLL, L , ref, lit) \ |
| 143 | _(CALLS, S , ref, lit) \ | 144 | _(CALLS, S , ref, lit) \ |
| 144 | _(CALLXS, S , ref, ref) \ | 145 | _(CALLXS, S , ref, ref) \ |
diff --git a/src/lj_ircall.h b/src/lj_ircall.h index 9e1fb367..53eb4638 100644 --- a/src/lj_ircall.h +++ b/src/lj_ircall.h | |||
| @@ -25,6 +25,7 @@ typedef struct CCallInfo { | |||
| 25 | #define CCI_OP(ci) ((ci)->flags >> CCI_OPSHIFT) /* Get op. */ | 25 | #define CCI_OP(ci) ((ci)->flags >> CCI_OPSHIFT) /* Get op. */ |
| 26 | 26 | ||
| 27 | #define CCI_CALL_N (IR_CALLN << CCI_OPSHIFT) | 27 | #define CCI_CALL_N (IR_CALLN << CCI_OPSHIFT) |
| 28 | #define CCI_CALL_A (IR_CALLA << CCI_OPSHIFT) | ||
| 28 | #define CCI_CALL_L (IR_CALLL << CCI_OPSHIFT) | 29 | #define CCI_CALL_L (IR_CALLL << CCI_OPSHIFT) |
| 29 | #define CCI_CALL_S (IR_CALLS << CCI_OPSHIFT) | 30 | #define CCI_CALL_S (IR_CALLS << CCI_OPSHIFT) |
| 30 | #define CCI_CALL_FN (CCI_CALL_N|CCI_CC_FASTCALL) | 31 | #define CCI_CALL_FN (CCI_CALL_N|CCI_CC_FASTCALL) |
| @@ -140,6 +141,7 @@ typedef struct CCallInfo { | |||
| 140 | _(ANY, lj_buf_putstr_rep, 3, L, P32, 0) \ | 141 | _(ANY, lj_buf_putstr_rep, 3, L, P32, 0) \ |
| 141 | _(ANY, lj_buf_puttab, 5, L, P32, 0) \ | 142 | _(ANY, lj_buf_puttab, 5, L, P32, 0) \ |
| 142 | _(ANY, lj_buf_tostr, 1, FL, STR, 0) \ | 143 | _(ANY, lj_buf_tostr, 1, FL, STR, 0) \ |
| 144 | _(ANY, lj_tab_new_ah, 3, A, TAB, CCI_L) \ | ||
| 143 | _(ANY, lj_tab_new1, 2, FS, TAB, CCI_L) \ | 145 | _(ANY, lj_tab_new1, 2, FS, TAB, CCI_L) \ |
| 144 | _(ANY, lj_tab_dup, 2, FS, TAB, CCI_L) \ | 146 | _(ANY, lj_tab_dup, 2, FS, TAB, CCI_L) \ |
| 145 | _(ANY, lj_tab_newkey, 3, S, P32, CCI_L) \ | 147 | _(ANY, lj_tab_newkey, 3, S, P32, CCI_L) \ |
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 9c00f7e7..2ca04a69 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -165,7 +165,7 @@ typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J); | |||
| 165 | (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \ | 165 | (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \ |
| 166 | J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ | 166 | J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ |
| 167 | J->chain[IR_CNEW] || J->chain[IR_CNEWI] || \ | 167 | J->chain[IR_CNEW] || J->chain[IR_CNEWI] || \ |
| 168 | J->chain[IR_BUFSTR] || J->chain[IR_TOSTR])) | 168 | J->chain[IR_BUFSTR] || J->chain[IR_TOSTR] || J->chain[IR_CALLA])) |
| 169 | 169 | ||
| 170 | /* -- Constant folding for FP numbers ------------------------------------- */ | 170 | /* -- Constant folding for FP numbers ------------------------------------- */ |
| 171 | 171 | ||
| @@ -2319,8 +2319,9 @@ LJFOLD(XSTORE any any) | |||
| 2319 | LJFOLDX(lj_opt_dse_xstore) | 2319 | LJFOLDX(lj_opt_dse_xstore) |
| 2320 | 2320 | ||
| 2321 | LJFOLD(NEWREF any any) /* Treated like a store. */ | 2321 | LJFOLD(NEWREF any any) /* Treated like a store. */ |
| 2322 | LJFOLD(CALLS any any) | 2322 | LJFOLD(CALLA any any) |
| 2323 | LJFOLD(CALLL any any) /* Safeguard fallback. */ | 2323 | LJFOLD(CALLL any any) /* Safeguard fallback. */ |
| 2324 | LJFOLD(CALLS any any) | ||
| 2324 | LJFOLD(CALLXS any any) | 2325 | LJFOLD(CALLXS any any) |
| 2325 | LJFOLD(XBAR) | 2326 | LJFOLD(XBAR) |
| 2326 | LJFOLD(RETF any any) /* Modifies BASE. */ | 2327 | LJFOLD(RETF any any) /* Modifies BASE. */ |
diff --git a/src/lj_tab.c b/src/lj_tab.c index ccad1f68..496904ee 100644 --- a/src/lj_tab.c +++ b/src/lj_tab.c | |||
| @@ -149,6 +149,12 @@ GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits) | |||
| 149 | return t; | 149 | return t; |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | /* The API of this function conforms to lua_createtable(). */ | ||
| 153 | GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h) | ||
| 154 | { | ||
| 155 | return lj_tab_new(L, (uint32_t)(a > 0 ? a+1 : 0), hsize2hbits(h)); | ||
| 156 | } | ||
| 157 | |||
| 152 | #if LJ_HASJIT | 158 | #if LJ_HASJIT |
| 153 | GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize) | 159 | GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize) |
| 154 | { | 160 | { |
diff --git a/src/lj_tab.h b/src/lj_tab.h index d361137c..c57bdd82 100644 --- a/src/lj_tab.h +++ b/src/lj_tab.h | |||
| @@ -34,6 +34,7 @@ static LJ_AINLINE uint32_t hashrot(uint32_t lo, uint32_t hi) | |||
| 34 | #define hsize2hbits(s) ((s) ? ((s)==1 ? 1 : 1+lj_fls((uint32_t)((s)-1))) : 0) | 34 | #define hsize2hbits(s) ((s) ? ((s)==1 ? 1 : 1+lj_fls((uint32_t)((s)-1))) : 0) |
| 35 | 35 | ||
| 36 | LJ_FUNCA GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits); | 36 | LJ_FUNCA GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits); |
| 37 | LJ_FUNC GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h); | ||
| 37 | #if LJ_HASJIT | 38 | #if LJ_HASJIT |
| 38 | LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize); | 39 | LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize); |
| 39 | #endif | 40 | #endif |
