From cece0163895c9f62b6b7ffb8724acba1217bf9ab Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 20:18:50 +0900 Subject: Concatenate string literals --- mrbgems/mruby-compiler/core/parse.y | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'mrbgems/mruby-compiler') diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 82aa346d0..09088f3c3 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -852,6 +852,12 @@ new_dstr(parser_state *p, node *a) return cons((node*)NODE_DSTR, a); } +static node* +concat_string(parser_state *p, node *a, node *b) +{ + return new_dstr(p, list2(a, b)); +} + /* (:str . (s . len)) */ static node* new_xstr(parser_state *p, const char *s, int len) @@ -1200,7 +1206,7 @@ heredoc_end(parser_state *p) %token tNTH_REF tBACK_REF %token tREGEXP_END -%type singleton string string_rep string_interp xstring regexp +%type singleton string string_fragment string_rep string_interp xstring regexp %type literal numeric cpath symbol %type top_compstmt top_stmts top_stmt %type bodystmt compstmt stmts stmt expr arg primary command command_call method_call @@ -2852,7 +2858,14 @@ literal : numeric | symbols ; -string : tCHAR +string : string_fragment + | string string_fragment + { + $$ = concat_string(p, $1, $2); + } + ; + +string_fragment : tCHAR | tSTRING | tSTRING_BEG tSTRING { @@ -3478,7 +3491,7 @@ assoc : arg tASSOC arg void_expr_error(p, $3); $$ = cons(new_sym(p, $1), $3); } - | string tLABEL_TAG arg + | string_fragment tLABEL_TAG arg { void_expr_error(p, $3); if ($1->car == (node*)NODE_DSTR) { -- cgit v1.2.3 From 9913643ed8a6d778bc90a932e30e6113e8b3f9e3 Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 21:42:37 +0900 Subject: Compositing `NODE_STR` and `NODE_STR` --- mrbgems/mruby-compiler/core/parse.y | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'mrbgems/mruby-compiler') 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)); } -- cgit v1.2.3 From 477e5285e86afb5f33e74747a54201718a249489 Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 21:46:07 +0900 Subject: Replacement to function for `NODE_STR` cheking --- mrbgems/mruby-compiler/core/parse.y | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'mrbgems/mruby-compiler') diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index e80af7d6d..2771ddeed 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -852,11 +852,17 @@ new_dstr(parser_state *p, node *a) return cons((node*)NODE_DSTR, a); } +static int +string_node_p(node *n) +{ + return (int)((enum node_type)(intptr_t)n->car == NODE_STR); +} + 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) { + 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); -- cgit v1.2.3 From 25957421bcea8070a796428c4dc6638142ffbb56 Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 21:49:41 +0900 Subject: Replacement to function for composite two string nodes --- mrbgems/mruby-compiler/core/parse.y | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'mrbgems/mruby-compiler') 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 @@ -858,19 +858,26 @@ string_node_p(node *n) return (int)((enum node_type)(intptr_t)n->car == NODE_STR); } +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; } -- cgit v1.2.3 From 8ead6da9132e57f2b8e47e4dfb793aa1b90e5daa Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 20:21:35 +0900 Subject: Compositing `NODE_STR` and `NODE_DSTR` --- mrbgems/mruby-compiler/core/parse.y | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'mrbgems/mruby-compiler') diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index ea292c3b9..4c884fa92 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -881,6 +881,17 @@ concat_string(parser_state *p, node *a, node *b) cons_free(b); return a; } + else { + /* a == NODE_STR && b == NODE_DSTR */ + + if (string_node_p(b->cdr->car)) { + /* a == NODE_STR && b->[NODE_STR, ...] */ + composite_string_node(p, a->cdr, b->cdr->car->cdr); + cons_free(b->cdr->car); + b->cdr->car = a; + return b; + } + } } return new_dstr(p, list2(a, b)); -- cgit v1.2.3 From 4d2bb3cb47b3628eb140d1d28f79f29887cf6262 Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 20:22:24 +0900 Subject: Compositing `NODE_DSTR` and `NODE_STR` --- mrbgems/mruby-compiler/core/parse.y | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'mrbgems/mruby-compiler') diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 4c884fa92..fed8cfbbc 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -893,6 +893,21 @@ concat_string(parser_state *p, node *a, node *b) } } } + else if (string_node_p(b)) { + /* a == NODE_DSTR && b == NODE_STR */ + + node *c; + for (c = a; c->cdr != NULL; c = c->cdr) ; + if (string_node_p(c->car)) { + /* a->[..., NODE_STR] && b == NODE_STR */ + composite_string_node(p, c->car->cdr, b->cdr); + cons_free(b); + return a; + } + + push(a, b); + return a; + } return new_dstr(p, list2(a, b)); } -- cgit v1.2.3 From e871a1538d2c84c56d102656d393ecf630f4deef Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 27 Feb 2019 20:22:55 +0900 Subject: Compositing `NODE_DSTR` and `NODE_DSTR` --- mrbgems/mruby-compiler/core/parse.y | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'mrbgems/mruby-compiler') 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)); } -- cgit v1.2.3