]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Compile table.concat().
authorMike Pall <mike>
Sat, 27 Apr 2013 13:52:32 +0000 (15:52 +0200)
committerMike Pall <mike>
Sat, 27 Apr 2013 13:52:32 +0000 (15:52 +0200)
src/lib_table.c
src/lj_ffrecord.c
src/lj_ircall.h

index 011b9fdf7a7b5166081ac324fddcdb0333591536..4f5d9d0d5edf71c8a524a4f2e40d29d29fc52363 100644 (file)
@@ -129,7 +129,7 @@ LJLIB_LUA(table_remove) /*
   end
 */
 
-LJLIB_CF(table_concat)
+LJLIB_CF(table_concat)         LJLIB_REC(.)
 {
   GCtab *t = lj_lib_checktab(L, 1);
   GCstr *sep = lj_lib_optstr(L, 2);
index d66aaa533d1fe50684c5864d1df39badacbc3645..5f69ea14e44e63bcd816bfebb4b9de1308624299 100644 (file)
@@ -825,6 +825,33 @@ static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd)
   }  /* else: Interpreter will throw. */
 }
 
+static void LJ_FASTCALL recff_table_concat(jit_State *J, RecordFFData *rd)
+{
+  TRef tab = J->base[0];
+  if (tref_istab(tab)) {
+    TRef sep = 0, tri = 0, tre = 0;
+    TRef hdr, tr;
+    if (J->base[1]) {
+      sep = lj_ir_tostr(J, J->base[1]);
+      if (J->base[2]) {
+       tri = lj_opt_narrow_toint(J, J->base[2]);
+       if (J->base[3])
+         tre = lj_opt_narrow_toint(J, J->base[3]);
+      }
+    } else {
+      sep = lj_ir_knull(J, IRT_STR);
+    }
+    if (!tri) tri = lj_ir_kint(J, 1);
+    if (!tre) tre = lj_ir_call(J, IRCALL_lj_tab_len, tab);
+    hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
+                lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
+    tr = lj_ir_call(J, IRCALL_lj_buf_puttab, hdr, tab, sep, tri, tre);
+    emitir(IRTG(IR_NE, IRT_PTR), tr, lj_ir_kptr(J, NULL));
+    J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
+  }  /* else: Interpreter will throw. */
+  UNUSED(rd);
+}
+
 /* -- I/O library fast functions ------------------------------------------ */
 
 /* Get FILE* for I/O function. Any I/O error aborts recording, so there's
index f652befdfd5af277ac2840d31faa20bcd6eb4261..8713e3f0c10665fbbca82adb5d32746c44a6ad6d 100644 (file)
@@ -115,6 +115,7 @@ typedef struct CCallInfo {
   _(ANY,       lj_buf_putstr_lower,    2,  FL, P32, 0) \
   _(ANY,       lj_buf_putstr_upper,    2,  FL, P32, 0) \
   _(ANY,       lj_buf_putstr_rep,      3,   L, P32, 0) \
+  _(ANY,       lj_buf_puttab,          5,   L, P32, 0) \
   _(ANY,       lj_buf_tostr,           1,  FL, STR, 0) \
   _(ANY,       lj_tab_new1,            2,  FS, TAB, CCI_L) \
   _(ANY,       lj_tab_dup,             2,  FS, TAB, CCI_L) \