diff options
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r-- | src/lj_crecord.c | 34 |
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 | ||
977 | void 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 | |||
995 | void 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 | ||
979 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) | 1013 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) |