aboutsummaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c13
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;