@@ -200,23 +200,24 @@ parse_string_encoded(const pm_node_t *node, const pm_string_t *string, const pm_
200
200
}
201
201
202
202
static inline ID
203
- parse_symbol (const uint8_t * start , const uint8_t * end , const pm_parser_t * parser )
203
+ parse_symbol (const uint8_t * start , const uint8_t * end , const char * encoding )
204
204
{
205
- rb_encoding * enc = rb_enc_from_index (rb_enc_find_index (parser -> encoding -> name ));
205
+ rb_encoding * enc = rb_enc_from_index (rb_enc_find_index (encoding ));
206
206
return rb_intern3 ((const char * ) start , end - start , enc );
207
207
}
208
208
209
209
static inline ID
210
- parse_string_symbol (const pm_string_t * string , const pm_parser_t * parser )
210
+ parse_string_symbol (const pm_symbol_node_t * symbol , const pm_parser_t * parser )
211
211
{
212
- const uint8_t * start = pm_string_source (string );
213
- return parse_symbol (start , start + pm_string_length (string ), parser );
212
+ const char * encoding = symbol -> base .flags & PM_SYMBOL_FLAGS_FORCED_UTF8_ENCODING ? "UTF-8" : parser -> encoding -> name ;
213
+ const uint8_t * start = pm_string_source (& symbol -> unescaped );
214
+ return parse_symbol (start , start + pm_string_length (& symbol -> unescaped ), encoding );
214
215
}
215
216
216
217
static inline ID
217
218
parse_location_symbol (const pm_location_t * location , const pm_parser_t * parser )
218
219
{
219
- return parse_symbol (location -> start , location -> end , parser );
220
+ return parse_symbol (location -> start , location -> end , parser -> encoding -> name );
220
221
}
221
222
222
223
static int
@@ -395,7 +396,7 @@ pm_static_literal_value(const pm_node_t *node, const pm_scope_node_t *scope_node
395
396
case PM_STRING_NODE :
396
397
return parse_string (& ((pm_string_node_t * ) node )-> unescaped , parser );
397
398
case PM_SYMBOL_NODE :
398
- return ID2SYM (parse_string_symbol (& (( pm_symbol_node_t * ) node ) -> unescaped , parser ));
399
+ return ID2SYM (parse_string_symbol (( pm_symbol_node_t * )node , parser ));
399
400
case PM_TRUE_NODE :
400
401
return Qtrue ;
401
402
default :
@@ -1870,7 +1871,7 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t
1870
1871
const pm_node_t * key = ((const pm_assoc_node_t * ) element )-> key ;
1871
1872
assert (PM_NODE_TYPE_P (key , PM_SYMBOL_NODE ));
1872
1873
1873
- VALUE symbol = ID2SYM (parse_string_symbol (& (( const pm_symbol_node_t * ) key ) -> unescaped , scope_node -> parser ));
1874
+ VALUE symbol = ID2SYM (parse_string_symbol (( const pm_symbol_node_t * )key , scope_node -> parser ));
1874
1875
rb_ary_push (keys , symbol );
1875
1876
}
1876
1877
}
@@ -1915,7 +1916,7 @@ pm_compile_pattern(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_node_t
1915
1916
const pm_node_t * key = assoc -> key ;
1916
1917
assert (PM_NODE_TYPE_P (key , PM_SYMBOL_NODE ));
1917
1918
1918
- VALUE symbol = ID2SYM (parse_string_symbol (& (( const pm_symbol_node_t * ) key ) -> unescaped , scope_node -> parser ));
1919
+ VALUE symbol = ID2SYM (parse_string_symbol (( const pm_symbol_node_t * )key , scope_node -> parser ));
1919
1920
ADD_INSN (ret , & line .node , dup );
1920
1921
ADD_INSN1 (ret , & line .node , putobject , symbol );
1921
1922
ADD_SEND (ret , & line .node , rb_intern ("key?" ), INT2FIX (1 ));
0 commit comments