diff options
| -rw-r--r-- | src/lj_ffrecord.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 4349f748f..ef8e554bd 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
| @@ -846,6 +846,17 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd) | |||
| 846 | lj_ir_kint(J, 1)); | 846 | lj_ir_kint(J, 1)); |
| 847 | end = end+(int32_t)str->len+1; | 847 | end = end+(int32_t)str->len+1; |
| 848 | } else if ((MSize)end <= str->len) { | 848 | } else if ((MSize)end <= str->len) { |
| 849 | if (trstart == trend && start != 0) { /* Common 1-char case. */ | ||
| 850 | TRef trptr, tr = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, -1)); | ||
| 851 | emitir(IRTGI(IR_ULT), tr, trlen); | ||
| 852 | trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr); | ||
| 853 | if (rd->data) { /* Return string.sub result. */ | ||
| 854 | J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, lj_ir_kint(J, 1)); | ||
| 855 | } else { /* Return string.byte result. */ | ||
| 856 | J->base[0] = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY); | ||
| 857 | } | ||
| 858 | return; | ||
| 859 | } | ||
| 849 | emitir(IRTGI(IR_ULE), trend, trlen); | 860 | emitir(IRTGI(IR_ULE), trend, trlen); |
| 850 | } else { | 861 | } else { |
| 851 | emitir(IRTGI(IR_GT), trend, trlen); | 862 | emitir(IRTGI(IR_GT), trend, trlen); |
