aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent618b4516488a4fec332bb1ff29ece18821767917 (diff)
downloadluajit-c29ed4dbbf9089c6a7ba22c785e342c12862cbd8.tar.gz
luajit-c29ed4dbbf9089c6a7ba22c785e342c12862cbd8.tar.bz2
luajit-c29ed4dbbf9089c6a7ba22c785e342c12862cbd8.zip
FFI: Record ffi.string().
Diffstat (limited to 'src')
-rw-r--r--src/lib_ffi.c16
-rw-r--r--src/lj_crecord.c17
-rw-r--r--src/lj_crecord.h2
-rw-r--r--src/lj_ir.h3
4 files changed, 31 insertions, 7 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 85a4e9c1..72128574 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -425,17 +425,21 @@ LJLIB_CF(ffi_cast)
425 return 1; 425 return 1;
426} 426}
427 427
428LJLIB_CF(ffi_string) 428LJLIB_CF(ffi_string) LJLIB_REC(.)
429{ 429{
430 CTState *cts = ctype_cts(L); 430 CTState *cts = ctype_cts(L);
431 TValue *o = lj_lib_checkany(L, 1); 431 TValue *o = lj_lib_checkany(L, 1);
432 size_t sz = (size_t)(CTSize)lj_lib_optint(L, 2, (int32_t)CTSIZE_INVALID);
433 CType *ct = ctype_get(cts, sz==CTSIZE_INVALID ? CTID_P_CVOID : CTID_P_CCHAR);
434 const char *p; 432 const char *p;
433 size_t len;
434 if (o+1 < L->top) {
435 len = (size_t)lj_lib_checkint(L, 2);
436 lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CVOID), (uint8_t *)&p, o, 0);
437 } else {
438 lj_cconv_ct_tv(cts, ctype_get(cts, CTID_P_CCHAR), (uint8_t *)&p, o, 0);
439 len = strlen(p);
440 }
435 L->top = o+1; /* Make sure this is the last item on the stack. */ 441 L->top = o+1; /* Make sure this is the last item on the stack. */
436 lj_cconv_ct_tv(cts, ct, (uint8_t *)&p, o, 0); 442 setstrV(L, o, lj_str_new(L, p, len));
437 if (sz == CTSIZE_INVALID) sz = strlen(p);
438 setstrV(L, o, lj_str_new(L, p, sz));
439 lj_gc_check(L); 443 lj_gc_check(L);
440 return 1; 444 return 1;
441} 445}
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)
diff --git a/src/lj_crecord.h b/src/lj_crecord.h
index 3b2249c5..4ac5b3e2 100644
--- a/src/lj_crecord.h
+++ b/src/lj_crecord.h
@@ -15,12 +15,14 @@ LJ_FUNC void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd);
15LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd); 15LJ_FUNC void LJ_FASTCALL recff_cdata_call(jit_State *J, RecordFFData *rd);
16LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd); 16LJ_FUNC void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd);
17LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd); 17LJ_FUNC void LJ_FASTCALL recff_ffi_new(jit_State *J, RecordFFData *rd);
18LJ_FUNC void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd);
18LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); 19LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
19#else 20#else
20#define recff_cdata_index recff_nyi 21#define recff_cdata_index recff_nyi
21#define recff_cdata_call recff_nyi 22#define recff_cdata_call recff_nyi
22#define recff_cdata_arith recff_nyi 23#define recff_cdata_arith recff_nyi
23#define recff_ffi_new recff_nyi 24#define recff_ffi_new recff_nyi
25#define recff_ffi_string recff_nyi
24#endif 26#endif
25 27
26#endif 28#endif
diff --git a/src/lj_ir.h b/src/lj_ir.h
index bde0ac04..bedb4c2b 100644
--- a/src/lj_ir.h
+++ b/src/lj_ir.h
@@ -273,7 +273,8 @@ typedef struct CCallInfo {
273 _(lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ 273 _(lj_carith_modi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \
274 _(lj_carith_modu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \ 274 _(lj_carith_modu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \
275 _(lj_carith_powi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \ 275 _(lj_carith_powi64, ARG2_64, N, I64, CCI_NOFPRCLOBBER) \
276 _(lj_carith_powu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) 276 _(lj_carith_powu64, ARG2_64, N, U64, CCI_NOFPRCLOBBER) \
277 _(strlen, 1, N, INT, 0)
277#else 278#else
278#define IRCALLDEF_FFI(_) 279#define IRCALLDEF_FFI(_)
279#endif 280#endif