@@ -4448,9 +4448,10 @@ pm_super_node_create(pm_parser_t *parser, const pm_token_t *keyword, pm_argument
4448
4448
return node;
4449
4449
}
4450
4450
4451
- // Allocate a new SymbolNode node.
4451
+ // Allocate and initialize a new SymbolNode node with the given unescaped
4452
+ // string.
4452
4453
static pm_symbol_node_t *
4453
- pm_symbol_node_create (pm_parser_t *parser, const pm_token_t *opening, const pm_token_t *value, const pm_token_t *closing) {
4454
+ pm_symbol_node_create_unescaped (pm_parser_t *parser, const pm_token_t *opening, const pm_token_t *value, const pm_token_t *closing, const pm_string_t *unescaped ) {
4454
4455
pm_symbol_node_t *node = PM_ALLOC_NODE(parser, pm_symbol_node_t);
4455
4456
4456
4457
*node = (pm_symbol_node_t) {
@@ -4465,12 +4466,18 @@ pm_symbol_node_create(pm_parser_t *parser, const pm_token_t *opening, const pm_t
4465
4466
.opening_loc = PM_OPTIONAL_LOCATION_TOKEN_VALUE(opening),
4466
4467
.value_loc = PM_LOCATION_TOKEN_VALUE(value),
4467
4468
.closing_loc = PM_OPTIONAL_LOCATION_TOKEN_VALUE(closing),
4468
- .unescaped = PM_EMPTY_STRING
4469
+ .unescaped = *unescaped
4469
4470
};
4470
4471
4471
4472
return node;
4472
4473
}
4473
4474
4475
+ // Allocate a new SymbolNode node.
4476
+ static inline pm_symbol_node_t *
4477
+ pm_symbol_node_create(pm_parser_t *parser, const pm_token_t *opening, const pm_token_t *value, const pm_token_t *closing) {
4478
+ return pm_symbol_node_create_unescaped(parser, opening, value, closing, &PM_EMPTY_STRING);
4479
+ }
4480
+
4474
4481
// Allocate and initialize a new SymbolNode node from a label.
4475
4482
static pm_symbol_node_t *
4476
4483
pm_symbol_node_label_create(pm_parser_t *parser, const pm_token_t *token) {
@@ -10909,7 +10916,6 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s
10909
10916
10910
10917
if (lex_mode->mode != PM_LEX_STRING) {
10911
10918
if (next_state != PM_LEX_STATE_NONE) lex_state_set(parser, next_state);
10912
- pm_token_t symbol;
10913
10919
10914
10920
switch (parser->current.type) {
10915
10921
case PM_TOKEN_IDENTIFIER:
@@ -10922,21 +10928,21 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s
10922
10928
case PM_TOKEN_BACK_REFERENCE:
10923
10929
case PM_CASE_KEYWORD:
10924
10930
parser_lex(parser);
10925
- symbol = parser->previous;
10926
10931
break;
10927
10932
case PM_CASE_OPERATOR:
10928
10933
lex_state_set(parser, next_state == PM_LEX_STATE_NONE ? PM_LEX_STATE_ENDFN : next_state);
10929
10934
parser_lex(parser);
10930
- symbol = parser->previous;
10931
10935
break;
10932
10936
default:
10933
10937
expect2(parser, PM_TOKEN_IDENTIFIER, PM_TOKEN_METHOD_NAME, PM_ERR_SYMBOL_INVALID);
10934
- symbol = parser->previous;
10935
10938
break;
10936
10939
}
10937
10940
10938
10941
pm_token_t closing = not_provided(parser);
10939
- return (pm_node_t *) pm_symbol_node_create_and_unescape(parser, &opening, &symbol, &closing, PM_UNESCAPE_ALL);
10942
+ pm_symbol_node_t *symbol = pm_symbol_node_create(parser, &opening, &parser->previous, &closing);
10943
+
10944
+ pm_string_shared_init(&symbol->unescaped, parser->previous.start, parser->previous.end);
10945
+ return (pm_node_t *) symbol;
10940
10946
}
10941
10947
10942
10948
if (lex_mode->as.string.interpolation) {
@@ -10947,7 +10953,7 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s
10947
10953
10948
10954
pm_token_t content = not_provided(parser);
10949
10955
pm_token_t closing = parser->previous;
10950
- return (pm_node_t *) pm_symbol_node_create_and_unescape (parser, &opening, &content, &closing, PM_UNESCAPE_NONE );
10956
+ return (pm_node_t *) pm_symbol_node_create (parser, &opening, &content, &closing);
10951
10957
}
10952
10958
10953
10959
// Now we can parse the first part of the symbol.
@@ -10980,18 +10986,23 @@ parse_symbol(pm_parser_t *parser, pm_lex_mode_t *lex_mode, pm_lex_state_t next_s
10980
10986
}
10981
10987
10982
10988
pm_token_t content;
10983
- if (accept1(parser, PM_TOKEN_STRING_CONTENT)) {
10984
- content = parser->previous;
10989
+ pm_string_t unescaped;
10990
+
10991
+ if (match1(parser, PM_TOKEN_STRING_CONTENT)) {
10992
+ content = parser->current;
10993
+ unescaped = parser->current_string;
10994
+ parser_lex(parser);
10985
10995
} else {
10986
10996
content = (pm_token_t) { .type = PM_TOKEN_STRING_CONTENT, .start = parser->previous.end, .end = parser->previous.end };
10997
+ pm_string_shared_init(&unescaped, content.start, content.end);
10987
10998
}
10988
10999
10989
11000
if (next_state != PM_LEX_STATE_NONE) {
10990
11001
lex_state_set(parser, next_state);
10991
11002
}
10992
- expect1(parser, PM_TOKEN_STRING_END, PM_ERR_SYMBOL_TERM_DYNAMIC);
10993
11003
10994
- return (pm_node_t *) pm_symbol_node_create_and_unescape(parser, &opening, &content, &parser->previous, PM_UNESCAPE_ALL);
11004
+ expect1(parser, PM_TOKEN_STRING_END, PM_ERR_SYMBOL_TERM_DYNAMIC);
11005
+ return (pm_node_t *) pm_symbol_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped);
10995
11006
}
10996
11007
10997
11008
// Parse an argument to undef which can either be a bare word, a
0 commit comments