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:
parent
710d916c32
commit
94ad2c3fe9
Notes:
git
2024-09-27 14:10:32 +00:00
29
parse.y
29
parse.y
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user