summaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-02-05 01:05:56 +0100
committerMike Pall <mike>2011-02-05 01:05:56 +0100
commitc29ed4dbbf9089c6a7ba22c785e342c12862cbd8 (patch)
tree7c0d7e32739ad77d95a9e5d34f6cd23bac98cb85 /src/lj_crecord.c
parent618b4516488a4fec332bb1ff29ece18821767917 (diff)
downloadluajit-c29ed4dbbf9089c6a7ba22c785e342c12862cbd8.tar.gz
luajit-c29ed4dbbf9089c6a7ba22c785e342c12862cbd8.tar.bz2
luajit-c29ed4dbbf9089c6a7ba22c785e342c12862cbd8.zip
FFI: Record ffi.string().
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 1223eb8e..80f00e18 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -844,6 +844,23 @@ void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd)
844 crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0])); 844 crec_alloc(J, rd, argv2ctype(J, J->base[0], &rd->argv[0]));
845} 845}
846 846
847void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)
848{
849 CTState *cts = ctype_ctsG(J2G(J));
850 TRef tr = J->base[0];
851 if (tr) {
852 TRef trlen = J->base[1];
853 if (trlen) {
854 trlen = lj_ir_toint(J, trlen);
855 tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, tr, &rd->argv[0]);
856 } else {
857 tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]);
858 trlen = lj_ir_call(J, IRCALL_strlen, tr);
859 }
860 J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), tr, trlen);
861 } /* else: interpreter will throw. */
862}
863
847/* -- Miscellaneous library functions ------------------------------------- */ 864/* -- Miscellaneous library functions ------------------------------------- */
848 865
849void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) 866void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd)