diff options
| author | dearblue <[email protected]> | 2019-02-27 20:22:55 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2019-02-27 22:58:13 +0900 |
| commit | e871a1538d2c84c56d102656d393ecf630f4deef (patch) | |
| tree | d0e60d3734d63e39ed2bfba06b013cdbfff5a8c7 | |
| parent | 4d2bb3cb47b3628eb140d1d28f79f29887cf6262 (diff) | |
| download | mruby-e871a1538d2c84c56d102656d393ecf630f4deef.tar.gz mruby-e871a1538d2c84c56d102656d393ecf630f4deef.zip | |
Compositing `NODE_DSTR` and `NODE_DSTR`
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 21 |
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)); } |
