From 594472579a9ea43fd2fc65be125570900b8bba12 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 1 Aug 2026 11:37:20 +0200 Subject: Optimize common 1-char case of string.sub/string.byte. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported by Kacper Michajłow. #1497 --- src/lj_ffrecord.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src') 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) lj_ir_kint(J, 1)); end = end+(int32_t)str->len+1; } else if ((MSize)end <= str->len) { + if (trstart == trend && start != 0) { /* Common 1-char case. */ + TRef trptr, tr = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, -1)); + emitir(IRTGI(IR_ULT), tr, trlen); + trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr); + if (rd->data) { /* Return string.sub result. */ + J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, lj_ir_kint(J, 1)); + } else { /* Return string.byte result. */ + J->base[0] = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY); + } + return; + } emitir(IRTGI(IR_ULE), trend, trlen); } else { emitir(IRTGI(IR_GT), trend, trlen); -- cgit v1.2.3-55-g6feb