diff options
| author | dearblue <[email protected]> | 2019-02-27 21:42:37 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2019-02-27 22:57:45 +0900 |
| commit | 9913643ed8a6d778bc90a932e30e6113e8b3f9e3 (patch) | |
| tree | 8c78be8bb3242689e12c2a1cb2935e15cd7ddcd4 /mrbgems/mruby-compiler | |
| parent | cece0163895c9f62b6b7ffb8724acba1217bf9ab (diff) | |
| download | mruby-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.y | 15 |
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)); } |
