Reduce creating rb_parser_string_t repeatedly for literals.

Since #11698, `parser_str_new` makes `rb_parser_string_t` and `VALUE`
but discards the former, and then `STR_NEW3` makes the same thing
again.
This commit is contained in:
Nobuyoshi Nakada 2024-09-27 21:16:52 +09:00 committed by Nobuyoshi Nakada
parent 710d916c32
commit 94ad2c3fe9
Notes: git 2024-09-27 14:10:32 +00:00

29
parse.y
View File

@ -6926,8 +6926,8 @@ static enum yytokentype here_document(struct parser_params*,rb_strterm_heredoc_t
} }
# define set_yylval_str(x) \ # define set_yylval_str(x) \
do { \ do { \
set_yylval_node(NEW_STR(rb_str_to_parser_string(p, x), &_cur_loc)); \ set_yylval_node(NEW_STR(x, &_cur_loc)); \
set_parser_s_value(x); \ set_parser_s_value(rb_str_new_mutable_parser_string(x)); \
} while(0) } while(0)
# define set_yylval_num(x) { \ # define set_yylval_num(x) { \
yylval.num = (x); \ yylval.num = (x); \
@ -7693,26 +7693,24 @@ enum string_type {
str_dsym = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND) str_dsym = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND)
}; };
static VALUE static rb_parser_string_t *
parser_str_new(struct parser_params *p, const char *ptr, long len, rb_encoding *enc, int func, rb_encoding *enc0) parser_str_new(struct parser_params *p, const char *ptr, long len, rb_encoding *enc, int func, rb_encoding *enc0)
{ {
VALUE str;
rb_parser_string_t *pstr; rb_parser_string_t *pstr;
pstr = rb_parser_encoding_string_new(p, ptr, len, enc); pstr = rb_parser_encoding_string_new(p, ptr, len, enc);
str = rb_str_new_mutable_parser_string(pstr);
if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) { if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) {
if (rb_parser_is_ascii_string(p, pstr)) { if (rb_parser_is_ascii_string(p, pstr)) {
} }
else if (rb_is_usascii_enc((void *)enc0) && enc != rb_utf8_encoding()) { else if (rb_is_usascii_enc((void *)enc0) && enc != rb_utf8_encoding()) {
rb_enc_associate(str, rb_ascii8bit_encoding()); /* everything is valid in ASCII-8BIT */
enc = rb_ascii8bit_encoding();
PARSER_ENCODING_CODERANGE_SET(pstr, enc, RB_PARSER_ENC_CODERANGE_VALID);
} }
} }
rb_parser_string_free(p, pstr); return pstr;
return str;
} }
static int static int
@ -8761,7 +8759,7 @@ parse_string(struct parser_params *p, rb_strterm_literal_t *quote)
int c, space = 0; int c, space = 0;
rb_encoding *enc = p->enc; rb_encoding *enc = p->enc;
rb_encoding *base_enc = 0; rb_encoding *base_enc = 0;
VALUE lit; rb_parser_string_t *lit;
if (func & STR_FUNC_TERM) { if (func & STR_FUNC_TERM) {
if (func & STR_FUNC_QWORDS) nextc(p); /* delayed term */ if (func & STR_FUNC_QWORDS) nextc(p); /* delayed term */
@ -9166,7 +9164,7 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here)
int c, func, indent = 0; int c, func, indent = 0;
const char *eos, *ptr, *ptr_end; const char *eos, *ptr, *ptr_end;
long len; long len;
VALUE str = 0; rb_parser_string_t *str = 0;
rb_encoding *enc = p->enc; rb_encoding *enc = p->enc;
rb_encoding *base_enc = 0; rb_encoding *base_enc = 0;
int bol; int bol;
@ -9252,16 +9250,17 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here)
} }
if (str) if (str)
rb_str_cat(str, ptr, ptr_end - ptr); parser_str_cat(str, ptr, ptr_end - ptr);
else else
str = STR_NEW(ptr, ptr_end - ptr); str = rb_parser_encoding_string_new(p, ptr, ptr_end - ptr, enc);
if (!lex_eol_ptr_p(p, ptr_end)) rb_str_cat(str, "\n", 1); if (!lex_eol_ptr_p(p, ptr_end)) parser_str_cat_cstr(str, "\n");
lex_goto_eol(p); lex_goto_eol(p);
if (p->heredoc_indent > 0) { if (p->heredoc_indent > 0) {
goto flush_str; goto flush_str;
} }
if (nextc(p) == -1) { if (nextc(p) == -1) {
if (str) { if (str) {
rb_parser_string_free(p, str);
str = 0; str = 0;
} }
goto error; goto error;
@ -10067,7 +10066,7 @@ parse_qmark(struct parser_params *p, int space_seen)
{ {
rb_encoding *enc; rb_encoding *enc;
register int c; register int c;
VALUE lit; rb_parser_string_t *lit;
if (IS_END()) { if (IS_END()) {
SET_LEX_STATE(EXPR_VALUE); SET_LEX_STATE(EXPR_VALUE);