diff options
author | Mike Pall <mike> | 2019-12-08 19:54:21 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2019-12-08 19:54:21 +0100 |
commit | 9600e4318e17ef73d73c1980008d648c1c98f959 (patch) | |
tree | 6f5b24026b66bc2ead3411bca41d38c9eb8ab939 /src | |
parent | 2a7c200dc2f7c2b0fd29effc4cdc7bdae19d278d (diff) | |
download | luajit-9600e4318e17ef73d73c1980008d648c1c98f959.tar.gz luajit-9600e4318e17ef73d73c1980008d648c1c98f959.tar.bz2 luajit-9600e4318e17ef73d73c1980008d648c1c98f959.zip |
Don't use STRREF for pointer diff in string.find().
Thanks to Sergey Ostanevich and Vyacheslav Egorov.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_ffrecord.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 849d7a27..cb374beb 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
@@ -949,7 +949,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd) | |||
949 | str->len-(MSize)start, pat->len)) { | 949 | str->len-(MSize)start, pat->len)) { |
950 | TRef pos; | 950 | TRef pos; |
951 | emitir(IRTG(IR_NE, IRT_PGC), tr, trp0); | 951 | emitir(IRTG(IR_NE, IRT_PGC), tr, trp0); |
952 | pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr0)); | 952 | /* Don't use STRREF of trstr. We need a pointer diff. */ |
953 | pos = emitir(IRTI(IR_SUB), emitir(IRTI(IR_SUB), tr, trstr), lj_ir_kint(J, sizeof(GCstr))); | ||
953 | J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1)); | 954 | J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1)); |
954 | J->base[1] = emitir(IRTI(IR_ADD), pos, trplen); | 955 | J->base[1] = emitir(IRTI(IR_ADD), pos, trplen); |
955 | rd->nres = 2; | 956 | rd->nres = 2; |