diff options
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r-- | src/lj_crecord.c | 17 |
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 | ||
847 | void 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 | ||
849 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) | 866 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) |