aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2013-11-25 15:18:31 +0100
committerMike Pall <mike>2013-11-25 15:19:17 +0100
commit4593fb5e29adc09cd53beaba8777f5656434c08d (patch)
tree104b63db5384ad540451645294879e2cdc91ad28 /src
parentc378f7dbb882068d1ae06edc8e7049fb1907db2d (diff)
downloadluajit-4593fb5e29adc09cd53beaba8777f5656434c08d.tar.gz
luajit-4593fb5e29adc09cd53beaba8777f5656434c08d.tar.bz2
luajit-4593fb5e29adc09cd53beaba8777f5656434c08d.zip
Add table.clear().
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.dep2
-rw-r--r--src/lib_table.c12
-rw-r--r--src/lj_ffrecord.c10
-rw-r--r--src/lj_ircall.h1
-rw-r--r--src/lj_opt_mem.c11
-rw-r--r--src/lj_tab.c11
-rw-r--r--src/lj_tab.h1
7 files changed, 46 insertions, 2 deletions
diff --git a/src/Makefile.dep b/src/Makefile.dep
index 97f8125a..9aefb236 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -155,7 +155,7 @@ lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
155 lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h \ 155 lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h \
156 lj_vm.h 156 lj_vm.h
157lj_opt_mem.o: lj_opt_mem.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ 157lj_opt_mem.o: lj_opt_mem.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
158 lj_tab.h lj_ir.h lj_jit.h lj_iropt.h 158 lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_ircall.h
159lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \ 159lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \
160 lj_arch.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ 160 lj_arch.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \
161 lj_traceerr.h lj_vm.h lj_strscan.h 161 lj_traceerr.h lj_vm.h lj_strscan.h
diff --git a/src/lib_table.c b/src/lib_table.c
index 91c022bb..4436ebd7 100644
--- a/src/lib_table.c
+++ b/src/lib_table.c
@@ -273,11 +273,22 @@ LJLIB_NOREG LJLIB_CF(table_new) LJLIB_REC(.)
273 return 1; 273 return 1;
274} 274}
275 275
276LJLIB_NOREG LJLIB_CF(table_clear) LJLIB_REC(.)
277{
278 lj_tab_clear(lj_lib_checktab(L, 1));
279 return 0;
280}
281
276static int luaopen_table_new(lua_State *L) 282static int luaopen_table_new(lua_State *L)
277{ 283{
278 return lj_lib_postreg(L, lj_cf_table_new, FF_table_new, "new"); 284 return lj_lib_postreg(L, lj_cf_table_new, FF_table_new, "new");
279} 285}
280 286
287static int luaopen_table_clear(lua_State *L)
288{
289 return lj_lib_postreg(L, lj_cf_table_clear, FF_table_clear, "clear");
290}
291
281/* ------------------------------------------------------------------------ */ 292/* ------------------------------------------------------------------------ */
282 293
283#include "lj_libdef.h" 294#include "lj_libdef.h"
@@ -290,6 +301,7 @@ LUALIB_API int luaopen_table(lua_State *L)
290 lua_setfield(L, -2, "unpack"); 301 lua_setfield(L, -2, "unpack");
291#endif 302#endif
292 lj_lib_prereg(L, LUA_TABLIBNAME ".new", luaopen_table_new, tabV(L->top-1)); 303 lj_lib_prereg(L, LUA_TABLIBNAME ".new", luaopen_table_new, tabV(L->top-1));
304 lj_lib_prereg(L, LUA_TABLIBNAME ".clear", luaopen_table_clear, tabV(L->top-1));
293 return 1; 305 return 1;
294} 306}
295 307
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index de74a3ec..69614d92 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -1024,6 +1024,16 @@ static void LJ_FASTCALL recff_table_new(jit_State *J, RecordFFData *rd)
1024 UNUSED(rd); 1024 UNUSED(rd);
1025} 1025}
1026 1026
1027static void LJ_FASTCALL recff_table_clear(jit_State *J, RecordFFData *rd)
1028{
1029 TRef tr = J->base[0];
1030 if (tref_istab(tr)) {
1031 rd->nres = 0;
1032 lj_ir_call(J, IRCALL_lj_tab_clear, tr);
1033 J->needsnap = 1;
1034 } /* else: Interpreter will throw. */
1035}
1036
1027/* -- I/O library fast functions ------------------------------------------ */ 1037/* -- I/O library fast functions ------------------------------------------ */
1028 1038
1029/* Get FILE* for I/O function. Any I/O error aborts recording, so there's 1039/* Get FILE* for I/O function. Any I/O error aborts recording, so there's
diff --git a/src/lj_ircall.h b/src/lj_ircall.h
index 53eb4638..db5ed5ab 100644
--- a/src/lj_ircall.h
+++ b/src/lj_ircall.h
@@ -144,6 +144,7 @@ typedef struct CCallInfo {
144 _(ANY, lj_tab_new_ah, 3, A, TAB, CCI_L) \ 144 _(ANY, lj_tab_new_ah, 3, A, TAB, CCI_L) \
145 _(ANY, lj_tab_new1, 2, FS, TAB, CCI_L) \ 145 _(ANY, lj_tab_new1, 2, FS, TAB, CCI_L) \
146 _(ANY, lj_tab_dup, 2, FS, TAB, CCI_L) \ 146 _(ANY, lj_tab_dup, 2, FS, TAB, CCI_L) \
147 _(ANY, lj_tab_clear, 1, FS, NIL, 0) \
147 _(ANY, lj_tab_newkey, 3, S, P32, CCI_L) \ 148 _(ANY, lj_tab_newkey, 3, S, P32, CCI_L) \
148 _(ANY, lj_tab_len, 1, FL, INT, 0) \ 149 _(ANY, lj_tab_len, 1, FL, INT, 0) \
149 _(ANY, lj_gc_step_jit, 2, FS, NIL, CCI_L) \ 150 _(ANY, lj_gc_step_jit, 2, FS, NIL, CCI_L) \
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c
index 7177ce2c..d705bf3d 100644
--- a/src/lj_opt_mem.c
+++ b/src/lj_opt_mem.c
@@ -17,6 +17,7 @@
17#include "lj_ir.h" 17#include "lj_ir.h"
18#include "lj_jit.h" 18#include "lj_jit.h"
19#include "lj_iropt.h" 19#include "lj_iropt.h"
20#include "lj_ircall.h"
20 21
21/* Some local macros to save typing. Undef'd at the end. */ 22/* Some local macros to save typing. Undef'd at the end. */
22#define IR(ref) (&J->cur.ir[(ref)]) 23#define IR(ref) (&J->cur.ir[(ref)])
@@ -308,7 +309,7 @@ int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J)
308 return 1; /* No conflict. Can fold to niltv. */ 309 return 1; /* No conflict. Can fold to niltv. */
309} 310}
310 311
311/* Check whether there's no aliasing NEWREF for the left operand. */ 312/* Check whether there's no aliasing NEWREF/table.clear for the left operand. */
312int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim) 313int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim)
313{ 314{
314 IRRef ta = fins->op1; 315 IRRef ta = fins->op1;
@@ -319,6 +320,14 @@ int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim)
319 return 0; /* Conflict. */ 320 return 0; /* Conflict. */
320 ref = newref->prev; 321 ref = newref->prev;
321 } 322 }
323 ref = J->chain[IR_CALLS];
324 while (ref > lim) {
325 IRIns *calls = IR(ref);
326 if (calls->op2 == IRCALL_lj_tab_clear &&
327 (ta == calls->op1 || aa_table(J, ta, calls->op1) != ALIAS_NO))
328 return 0; /* Conflict. */
329 ref = calls->prev;
330 }
322 return 1; /* No conflict. Can safely FOLD/CSE. */ 331 return 1; /* No conflict. Can safely FOLD/CSE. */
323} 332}
324 333
diff --git a/src/lj_tab.c b/src/lj_tab.c
index 37a3c32c..643d0819 100644
--- a/src/lj_tab.c
+++ b/src/lj_tab.c
@@ -204,6 +204,17 @@ GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt)
204 return t; 204 return t;
205} 205}
206 206
207/* Clear a table. */
208void LJ_FASTCALL lj_tab_clear(GCtab *t)
209{
210 clearapart(t);
211 if (t->hmask > 0) {
212 Node *node = noderef(t->node);
213 setmref(node->freetop, &node[t->hmask+1]);
214 clearhpart(t);
215 }
216}
217
207/* Free a table. */ 218/* Free a table. */
208void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t) 219void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t)
209{ 220{
diff --git a/src/lj_tab.h b/src/lj_tab.h
index 5ec73286..b6e85579 100644
--- a/src/lj_tab.h
+++ b/src/lj_tab.h
@@ -39,6 +39,7 @@ LJ_FUNC GCtab *lj_tab_new_ah(lua_State *L, int32_t a, int32_t h);
39LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize); 39LJ_FUNC GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize);
40#endif 40#endif
41LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt); 41LJ_FUNCA GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt);
42LJ_FUNC void LJ_FASTCALL lj_tab_clear(GCtab *t);
42LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t); 43LJ_FUNC void LJ_FASTCALL lj_tab_free(global_State *g, GCtab *t);
43#if LJ_HASFFI 44#if LJ_HASFFI
44LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t); 45LJ_FUNC void lj_tab_rehash(lua_State *L, GCtab *t);