diff options
author | Mike Pall <mike> | 2011-02-28 19:46:55 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-28 19:47:51 +0100 |
commit | e1aa8d0d9772aad198483cf9ac2794895ff07558 (patch) | |
tree | dc8aa9c65f2580e0c2b5918cafd82be10298dd9e /src | |
parent | 83a37aeca74724ef76dee7c8246bdbb88132940d (diff) | |
download | luajit-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.c | 2 | ||||
-rw-r--r-- | src/lj_asm.c | 2 | ||||
-rw-r--r-- | src/lj_crecord.c | 2 | ||||
-rw-r--r-- | src/lj_ir.h | 1 | ||||
-rw-r--r-- | src/lj_opt_fold.c | 6 |
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) | |||
445 | LJFOLDF(kfold_snew_empty) | 446 | LJFOLDF(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. */ | |||
1900 | LJFOLD(TNEW any any) | 1901 | LJFOLD(TNEW any any) |
1901 | LJFOLD(TDUP any) | 1902 | LJFOLD(TDUP any) |
1902 | LJFOLD(CNEW any any) | 1903 | LJFOLD(CNEW any any) |
1904 | LJFOLD(XSNEW any any) | ||
1903 | LJFOLDX(lj_ir_emit) | 1905 | LJFOLDX(lj_ir_emit) |
1904 | 1906 | ||
1905 | /* ------------------------------------------------------------------------ */ | 1907 | /* ------------------------------------------------------------------------ */ |