summaryrefslogtreecommitdiff
path: root/src/lj_ffrecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-05-08 11:10:46 +0200
committerMike Pall <mike>2013-05-08 11:10:46 +0200
commitbb2cc1dcaff90406f431f90ef822ddd7df70200d (patch)
tree0e11ca0b2641120763b698c722b0e2f5eb40eded /src/lj_ffrecord.c
parent71ce1e87067fb2d12629b76d7868d7bb78ad68fb (diff)
parentb03078840100953cff6076dedb5e9a4c1ec12317 (diff)
downloadluajit-bb2cc1dcaff90406f431f90ef822ddd7df70200d.tar.gz
luajit-bb2cc1dcaff90406f431f90ef822ddd7df70200d.tar.bz2
luajit-bb2cc1dcaff90406f431f90ef822ddd7df70200d.zip
Merge branch 'master' into v2.1
Diffstat (limited to 'src/lj_ffrecord.c')
-rw-r--r--src/lj_ffrecord.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 289c5775..d1aa65c0 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -895,23 +895,16 @@ static void LJ_FASTCALL recff_table_concat(jit_State *J, RecordFFData *rd)
895{ 895{
896 TRef tab = J->base[0]; 896 TRef tab = J->base[0];
897 if (tref_istab(tab)) { 897 if (tref_istab(tab)) {
898 TRef sep = 0, tri = 0, tre = 0; 898 TRef sep = !tref_isnil(J->base[1]) ?
899 TRef hdr, tr; 899 lj_ir_tostr(J, J->base[1]) : lj_ir_knull(J, IRT_STR);
900 if (J->base[1]) { 900 TRef tri = (J->base[1] && !tref_isnil(J->base[2])) ?
901 sep = lj_ir_tostr(J, J->base[1]); 901 lj_opt_narrow_toint(J, J->base[2]) : lj_ir_kint(J, 1);
902 if (J->base[2]) { 902 TRef tre = (J->base[1] && J->base[2] && !tref_isnil(J->base[3])) ?
903 tri = lj_opt_narrow_toint(J, J->base[2]); 903 lj_opt_narrow_toint(J, J->base[3]) :
904 if (J->base[3]) 904 lj_ir_call(J, IRCALL_lj_tab_len, tab);
905 tre = lj_opt_narrow_toint(J, J->base[3]); 905 TRef hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
906 } 906 lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
907 } else { 907 TRef tr = lj_ir_call(J, IRCALL_lj_buf_puttab, hdr, tab, sep, tri, tre);
908 sep = lj_ir_knull(J, IRT_STR);
909 }
910 if (!tri) tri = lj_ir_kint(J, 1);
911 if (!tre) tre = lj_ir_call(J, IRCALL_lj_tab_len, tab);
912 hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
913 lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
914 tr = lj_ir_call(J, IRCALL_lj_buf_puttab, hdr, tab, sep, tri, tre);
915 emitir(IRTG(IR_NE, IRT_PTR), tr, lj_ir_kptr(J, NULL)); 908 emitir(IRTG(IR_NE, IRT_PTR), tr, lj_ir_kptr(J, NULL));
916 J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr); 909 J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
917 } /* else: Interpreter will throw. */ 910 } /* else: Interpreter will throw. */