diff options
| author | dearblue <[email protected]> | 2019-02-27 21:49:41 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2019-02-27 22:58:13 +0900 |
| commit | 25957421bcea8070a796428c4dc6638142ffbb56 (patch) | |
| tree | 24ffaf754f188f6a0c6f676db1abec8a5b4339a3 /mrbgems/mruby-compiler/core | |
| parent | 477e5285e86afb5f33e74747a54201718a249489 (diff) | |
| download | mruby-25957421bcea8070a796428c4dc6638142ffbb56.tar.gz mruby-25957421bcea8070a796428c4dc6638142ffbb56.zip | |
Replacement to function for composite two string nodes
Diffstat (limited to 'mrbgems/mruby-compiler/core')
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 2771ddeed..ea292c3b9 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -859,18 +859,25 @@ string_node_p(node *n) } static node* +composite_string_node(parser_state *p, node *a, node *b) +{ + size_t newlen = (size_t)a->cdr + (size_t)b->cdr; + char *str = (char*)mrb_pool_realloc(p->pool, a->car, (size_t)a->cdr + 1, newlen + 1); + memcpy(str + (size_t)a->cdr, b->car, (size_t)b->cdr); + str[newlen] = '\0'; + a->car = (node*)str; + a->cdr = (node*)newlen; + cons_free(b); + return a; +} + +static node* concat_string(parser_state *p, node *a, node *b) { if (string_node_p(a)) { if (string_node_p(b)) { /* 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); + composite_string_node(p, a->cdr, b->cdr); cons_free(b); return a; } |
