summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authordearblue <[email protected]>2019-02-27 20:22:55 +0900
committerdearblue <[email protected]>2019-02-27 22:58:13 +0900
commite871a1538d2c84c56d102656d393ecf630f4deef (patch)
treed0e60d3734d63e39ed2bfba06b013cdbfff5a8c7
parent4d2bb3cb47b3628eb140d1d28f79f29887cf6262 (diff)
downloadmruby-e871a1538d2c84c56d102656d393ecf630f4deef.tar.gz
mruby-e871a1538d2c84c56d102656d393ecf630f4deef.zip
Compositing `NODE_DSTR` and `NODE_DSTR`
-rw-r--r--mrbgems/mruby-compiler/core/parse.y21
1 files changed, 21 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y
index fed8cfbbc..57eb03cc6 100644
--- a/mrbgems/mruby-compiler/core/parse.y
+++ b/mrbgems/mruby-compiler/core/parse.y
@@ -908,6 +908,27 @@ concat_string(parser_state *p, node *a, node *b)
push(a, b);
return a;
}
+ else {
+ /* a == NODE_DSTR && b == NODE_DSTR */
+
+ node *c, *d;
+ for (c = a; c->cdr != NULL; c = c->cdr) ;
+ if (string_node_p(c->car) && string_node_p(b->cdr->car)) {
+ /* a->[..., NODE_STR] && b->[NODE_STR, ...] */
+ d = b->cdr;
+ cons_free(b);
+ composite_string_node(p, c->car->cdr, d->car->cdr);
+ cons_free(d->car);
+ c->cdr = d->cdr;
+ cons_free(d);
+ return a;
+ }
+ else {
+ c->cdr = b->cdr;
+ cons_free(b);
+ return a;
+ }
+ }
return new_dstr(p, list2(a, b));
}