summaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index ea18f75f..8e68a5d6 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -974,6 +974,40 @@ void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd)
974 } /* else: interpreter will throw. */ 974 } /* else: interpreter will throw. */
975} 975}
976 976
977void LJ_FASTCALL recff_ffi_copy(jit_State *J, RecordFFData *rd)
978{
979 CTState *cts = ctype_ctsG(J2G(J));
980 TRef trdst = J->base[0], trsrc = J->base[1], trlen = J->base[2];
981 if (trdst && trsrc && (trlen || tref_isstr(trsrc))) {
982 trdst = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, trdst, &rd->argv[0]);
983 trsrc = crec_ct_tv(J, ctype_get(cts, CTID_P_CVOID), 0, trsrc, &rd->argv[1]);
984 if (trlen) {
985 trlen = crec_toint(J, cts, trlen, &rd->argv[2]);
986 } else {
987 trlen = emitir(IRTI(IR_FLOAD), trsrc, IRFL_STR_LEN);
988 trlen = emitir(IRTI(IR_ADD), trlen, lj_ir_kint(J, 1));
989 }
990 lj_ir_call(J, IRCALL_memcpy, trdst, trsrc, trlen);
991 emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);
992 } /* else: interpreter will throw. */
993}
994
995void LJ_FASTCALL recff_ffi_fill(jit_State *J, RecordFFData *rd)
996{
997 CTState *cts = ctype_ctsG(J2G(J));
998 TRef tr = J->base[0], trlen = J->base[1], trfill = J->base[2];
999 if (tr && trlen) {
1000 tr = crec_ct_tv(J, ctype_get(cts, CTID_P_VOID), 0, tr, &rd->argv[0]);
1001 trlen = crec_toint(J, cts, trlen, &rd->argv[1]);
1002 if (trfill)
1003 trfill = crec_toint(J, cts, trfill, &rd->argv[2]);
1004 else
1005 trfill = lj_ir_kint(J, 0);
1006 lj_ir_call(J, IRCALL_memset, tr, trfill, trlen);
1007 emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);
1008 } /* else: interpreter will throw. */
1009}
1010
977/* -- Miscellaneous library functions ------------------------------------- */ 1011/* -- Miscellaneous library functions ------------------------------------- */
978 1012
979void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) 1013void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd)