aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-28 19:46:55 +0100
committerMike Pall <mike>2011-02-28 19:47:51 +0100
commite1aa8d0d9772aad198483cf9ac2794895ff07558 (patch)
treedc8aa9c65f2580e0c2b5918cafd82be10298dd9e /src
parent83a37aeca74724ef76dee7c8246bdbb88132940d (diff)
downloadluajit-e1aa8d0d9772aad198483cf9ac2794895ff07558.tar.gz
luajit-e1aa8d0d9772aad198483cf9ac2794895ff07558.tar.bz2
luajit-e1aa8d0d9772aad198483cf9ac2794895ff07558.zip
FFI: Fix compiled ffi.string() semantics.
Diffstat (limited to 'src')
-rw-r--r--src/lj_api.c2
-rw-r--r--src/lj_asm.c2
-rw-r--r--src/lj_crecord.c2
-rw-r--r--src/lj_ir.h1
-rw-r--r--src/lj_opt_fold.c6
5 files changed, 8 insertions, 5 deletions
diff --git a/src/lj_api.c b/src/lj_api.c
index f33748ce..10f9f3cb 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -713,7 +713,7 @@ LUA_API void lua_concat(lua_State *L, int n)
713 copyTV(L, L->top-1, L->top); 713 copyTV(L, L->top-1, L->top);
714 } while (--n > 0); 714 } while (--n > 0);
715 } else if (n == 0) { /* Push empty string. */ 715 } else if (n == 0) { /* Push empty string. */
716 setstrV(L, L->top, lj_str_new(L, "", 0)); 716 setstrV(L, L->top, &G(L)->strempty);
717 incr_top(L); 717 incr_top(L);
718 } 718 }
719 /* else n == 1: nothing to do. */ 719 /* else n == 1: nothing to do. */
diff --git a/src/lj_asm.c b/src/lj_asm.c
index c349c990..17cbd848 100644
--- a/src/lj_asm.c
+++ b/src/lj_asm.c
@@ -4098,7 +4098,7 @@ static void asm_ir(ASMState *as, IRIns *ir)
4098 case IR_FSTORE: case IR_XSTORE: asm_fxstore(as, ir); break; 4098 case IR_FSTORE: case IR_XSTORE: asm_fxstore(as, ir); break;
4099 4099
4100 /* Allocations. */ 4100 /* Allocations. */
4101 case IR_SNEW: asm_snew(as, ir); break; 4101 case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break;
4102 case IR_TNEW: asm_tnew(as, ir); break; 4102 case IR_TNEW: asm_tnew(as, ir); break;
4103 case IR_TDUP: asm_tdup(as, ir); break; 4103 case IR_TDUP: asm_tdup(as, ir); break;
4104 case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break; 4104 case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break;
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 5e058a6f..d689b81b 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -970,7 +970,7 @@ void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)
970 tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]); 970 tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]);
971 trlen = lj_ir_call(J, IRCALL_strlen, tr); 971 trlen = lj_ir_call(J, IRCALL_strlen, tr);
972 } 972 }
973 J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), tr, trlen); 973 J->base[0] = emitir(IRT(IR_XSNEW, IRT_STR), tr, trlen);
974 } /* else: interpreter will throw. */ 974 } /* else: interpreter will throw. */
975} 975}
976 976
diff --git a/src/lj_ir.h b/src/lj_ir.h
index f9ca4627..4813f250 100644
--- a/src/lj_ir.h
+++ b/src/lj_ir.h
@@ -110,6 +110,7 @@
110 \ 110 \
111 /* Allocations. */ \ 111 /* Allocations. */ \
112 _(SNEW, N , ref, ref) /* CSE is ok, not marked as A. */ \ 112 _(SNEW, N , ref, ref) /* CSE is ok, not marked as A. */ \
113 _(XSNEW, A , ref, ref) \
113 _(TNEW, AW, lit, lit) \ 114 _(TNEW, AW, lit, lit) \
114 _(TDUP, AW, ref, ___) \ 115 _(TDUP, AW, ref, ___) \
115 _(CNEW, AW, ref, ref) \ 116 _(CNEW, AW, ref, ref) \
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index e5ed7ade..e7a1ca54 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -153,7 +153,8 @@ typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);
153*/ 153*/
154#define gcstep_barrier(J, ref) \ 154#define gcstep_barrier(J, ref) \
155 ((ref) < J->chain[IR_LOOP] && \ 155 ((ref) < J->chain[IR_LOOP] && \
156 (J->chain[IR_SNEW] || J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ 156 (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \
157 J->chain[IR_TNEW] || J->chain[IR_TDUP] || \
157 J->chain[IR_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR])) 158 J->chain[IR_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR]))
158 159
159/* -- Constant folding for FP numbers ------------------------------------- */ 160/* -- Constant folding for FP numbers ------------------------------------- */
@@ -445,7 +446,7 @@ LJFOLD(SNEW any KINT)
445LJFOLDF(kfold_snew_empty) 446LJFOLDF(kfold_snew_empty)
446{ 447{
447 if (fright->i == 0) 448 if (fright->i == 0)
448 return lj_ir_kstr(J, lj_str_new(J->L, "", 0)); 449 return lj_ir_kstr(J, &J2G(J)->strempty);
449 return NEXTFOLD; 450 return NEXTFOLD;
450} 451}
451 452
@@ -1900,6 +1901,7 @@ LJFOLD(RETF any any) /* Modifies BASE. */
1900LJFOLD(TNEW any any) 1901LJFOLD(TNEW any any)
1901LJFOLD(TDUP any) 1902LJFOLD(TDUP any)
1902LJFOLD(CNEW any any) 1903LJFOLD(CNEW any any)
1904LJFOLD(XSNEW any any)
1903LJFOLDX(lj_ir_emit) 1905LJFOLDX(lj_ir_emit)
1904 1906
1905/* ------------------------------------------------------------------------ */ 1907/* ------------------------------------------------------------------------ */