summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler
diff options
context:
space:
mode:
authordearblue <[email protected]>2019-02-27 21:42:37 +0900
committerdearblue <[email protected]>2019-02-27 22:57:45 +0900
commit9913643ed8a6d778bc90a932e30e6113e8b3f9e3 (patch)
tree8c78be8bb3242689e12c2a1cb2935e15cd7ddcd4 /mrbgems/mruby-compiler
parentcece0163895c9f62b6b7ffb8724acba1217bf9ab (diff)
downloadmruby-9913643ed8a6d778bc90a932e30e6113e8b3f9e3.tar.gz
mruby-9913643ed8a6d778bc90a932e30e6113e8b3f9e3.zip
Compositing `NODE_STR` and `NODE_STR`
Diffstat (limited to 'mrbgems/mruby-compiler')
-rw-r--r--mrbgems/mruby-compiler/core/parse.y15
1 files changed, 15 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index 09088f3c3..e80af7d6d 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -855,6 +855,21 @@ new_dstr(parser_state *p, node *a)
static node*
concat_string(parser_state *p, node *a, node *b)
{
+ if ((enum node_type)(intptr_t)a->car == NODE_STR) {
+ if ((enum node_type)(intptr_t)b->car == NODE_STR) {
+ /* a == NODE_STR && b == NODE_STR */
+ size_t newlen = (size_t)a->cdr->cdr + (size_t)b->cdr->cdr;
+ char *str = (char*)mrb_pool_realloc(p->pool, a->cdr->car, (size_t)a->cdr->cdr + 1, newlen + 1);
+ memcpy(str + (size_t)a->cdr->cdr, b->cdr->car, (size_t)b->cdr->cdr);
+ str[newlen] = '\0';
+ a->cdr->car = (node*)str;
+ a->cdr->cdr = (node*)newlen;
+ cons_free(b->cdr);
+ cons_free(b);
+ return a;
+ }
+ }
+
return new_dstr(p, list2(a, b));
}