diff options
| author | Mike Pall <mike> | 2022-01-23 19:10:47 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2022-01-23 19:10:47 +0100 |
| commit | c929efc0395296a6a1c70c572b2df71bdfca966f (patch) | |
| tree | dfda126e3e5b918f515d3818559ee49cc93a75dd /src | |
| parent | 4077f0c3d66ee9d74c705e605038271ceb39238e (diff) | |
| download | luajit-c929efc0395296a6a1c70c572b2df71bdfca966f.tar.gz luajit-c929efc0395296a6a1c70c572b2df71bdfca966f.tar.bz2 luajit-c929efc0395296a6a1c70c572b2df71bdfca966f.zip | |
Fix compiled error handling for buffer methods.
Contributed by XmiliaH.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_ffrecord.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 13f91333..a19f6fdc 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
| @@ -1223,6 +1223,12 @@ static void LJ_FASTCALL recff_buffer_method_put(jit_State *J, RecordFFData *rd) | |||
| 1223 | ptrdiff_t arg; | 1223 | ptrdiff_t arg; |
| 1224 | if (!J->base[1]) return; | 1224 | if (!J->base[1]) return; |
| 1225 | for (arg = 1; (tr = J->base[arg]); arg++) { | 1225 | for (arg = 1; (tr = J->base[arg]); arg++) { |
| 1226 | if (tref_isudata(tr)) { | ||
| 1227 | TRef ud2 = recff_sbufx_check(J, rd, arg); | ||
| 1228 | emitir(IRTG(IR_NE, IRT_PGC), ud, ud2); | ||
| 1229 | } | ||
| 1230 | } | ||
| 1231 | for (arg = 1; (tr = J->base[arg]); arg++) { | ||
| 1226 | if (tref_isstr(tr)) { | 1232 | if (tref_isstr(tr)) { |
| 1227 | trbuf = emitir(IRTG(IR_BUFPUT, IRT_PGC), trbuf, tr); | 1233 | trbuf = emitir(IRTG(IR_BUFPUT, IRT_PGC), trbuf, tr); |
| 1228 | } else if (tref_isnumber(tr)) { | 1234 | } else if (tref_isnumber(tr)) { |
| @@ -1230,11 +1236,9 @@ static void LJ_FASTCALL recff_buffer_method_put(jit_State *J, RecordFFData *rd) | |||
| 1230 | emitir(IRT(IR_TOSTR, IRT_STR), tr, | 1236 | emitir(IRT(IR_TOSTR, IRT_STR), tr, |
| 1231 | tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT)); | 1237 | tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT)); |
| 1232 | } else if (tref_isudata(tr)) { | 1238 | } else if (tref_isudata(tr)) { |
| 1233 | TRef ud2 = recff_sbufx_check(J, rd, arg); | 1239 | TRef trr = recff_sbufx_get_ptr(J, tr, IRFL_SBUF_R); |
| 1234 | TRef trr = recff_sbufx_get_ptr(J, ud2, IRFL_SBUF_R); | 1240 | TRef trw = recff_sbufx_get_ptr(J, tr, IRFL_SBUF_W); |
| 1235 | TRef trw = recff_sbufx_get_ptr(J, ud2, IRFL_SBUF_W); | ||
| 1236 | TRef len = recff_sbufx_len(J, trr, trw); | 1241 | TRef len = recff_sbufx_len(J, trr, trw); |
| 1237 | emitir(IRTG(IR_NE, IRT_PGC), ud, ud2); | ||
| 1238 | trbuf = lj_ir_call(J, IRCALL_lj_buf_putmem, trbuf, trr, len); | 1242 | trbuf = lj_ir_call(J, IRCALL_lj_buf_putmem, trbuf, trr, len); |
| 1239 | } else { | 1243 | } else { |
| 1240 | recff_nyiu(J, rd); | 1244 | recff_nyiu(J, rd); |
| @@ -1259,14 +1263,18 @@ static void LJ_FASTCALL recff_buffer_method_get(jit_State *J, RecordFFData *rd) | |||
| 1259 | ptrdiff_t arg; | 1263 | ptrdiff_t arg; |
| 1260 | if (!J->base[1]) { J->base[1] = TREF_NIL; J->base[2] = 0; } | 1264 | if (!J->base[1]) { J->base[1] = TREF_NIL; J->base[2] = 0; } |
| 1261 | for (arg = 0; (tr = J->base[arg+1]); arg++) { | 1265 | for (arg = 0; (tr = J->base[arg+1]); arg++) { |
| 1266 | if (!tref_isnil(tr)) { | ||
| 1267 | J->base[arg+1] = recff_sbufx_checkint(J, rd, arg+1); | ||
| 1268 | } | ||
| 1269 | } | ||
| 1270 | for (arg = 0; (tr = J->base[arg+1]); arg++) { | ||
| 1262 | TRef len = recff_sbufx_len(J, trr, trw); | 1271 | TRef len = recff_sbufx_len(J, trr, trw); |
| 1263 | if (tref_isnil(tr)) { | 1272 | if (tref_isnil(tr)) { |
| 1264 | J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len); | 1273 | J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len); |
| 1265 | trr = trw; | 1274 | trr = trw; |
| 1266 | } else { | 1275 | } else { |
| 1267 | TRef trn = recff_sbufx_checkint(J, rd, arg+1); | ||
| 1268 | TRef tru; | 1276 | TRef tru; |
| 1269 | len = emitir(IRTI(IR_MIN), len, trn); | 1277 | len = emitir(IRTI(IR_MIN), len, tr); |
| 1270 | tru = emitir(IRT(IR_ADD, IRT_PTR), trr, len); | 1278 | tru = emitir(IRT(IR_ADD, IRT_PTR), trr, len); |
| 1271 | J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len); | 1279 | J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len); |
| 1272 | trr = tru; /* Doing the ADD before the SNEW generates better code. */ | 1280 | trr = tru; /* Doing the ADD before the SNEW generates better code. */ |
