diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index e9f873b7..fc625b84 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -559,20 +559,13 @@ LJFOLDF(bufput_kgc) | |||
559 | { | 559 | { |
560 | if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) { | 560 | if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) { |
561 | GCstr *s2 = ir_kstr(fright); | 561 | GCstr *s2 = ir_kstr(fright); |
562 | MSize len2 = s2->len; | 562 | if (s2->len == 0) { /* Empty string? */ |
563 | if (len2 == 0) { /* Empty string? */ | ||
564 | return LEFTFOLD; | 563 | return LEFTFOLD; |
565 | } else { | 564 | } else { |
566 | if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) && | 565 | if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) && |
567 | !irt_isphi(fleft->t)) { | 566 | !irt_isphi(fleft->t)) { /* Join two constant string puts in a row. */ |
568 | /* Join two constant string puts in a row. */ | ||
569 | GCstr *s1 = ir_kstr(IR(fleft->op2)); | 567 | GCstr *s1 = ir_kstr(IR(fleft->op2)); |
570 | MSize len1 = s1->len; | 568 | IRRef kref = lj_ir_kstr(J, lj_buf_cat2str(J->L, s1, s2)); |
571 | char *buf = lj_buf_tmp(J->L, len1 + len2); | ||
572 | IRRef kref; | ||
573 | memcpy(buf, strdata(s1), len1); | ||
574 | memcpy(buf+len1, strdata(s2), len2); | ||
575 | kref = lj_ir_kstr(J, lj_str_new(J->L, buf, len1 + len2)); | ||
576 | /* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */ | 569 | /* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */ |
577 | IR(fins->op1)->op2 = kref; /* Modify previous BUFPUT. */ | 570 | IR(fins->op1)->op2 = kref; /* Modify previous BUFPUT. */ |
578 | return fins->op1; | 571 | return fins->op1; |