From: nobu@... Date: 2017-07-31T11:18:12+00:00 Subject: [ruby-core:82216] [Ruby trunk Bug#13770] Can't create valid Cyrillic-named class/module Issue #13770 has been updated by nobu (Nobuyoshi Nakada). I'm uncertain about the usage of `mbc_case_fold`. ```diff diff --git i/parse.y w/parse.y index 02d9412a2c..96f25d893e 100644 --- i/parse.y +++ w/parse.y @@ -7790,6 +7790,8 @@ parse_atmark(struct parser_params *parser, const enum lex_state_e last_state) return result; } +int rb_enc_const_id_char_p(const char *name, const char *end, rb_encoding *enc); + static enum yytokentype parse_ident(struct parser_params *parser, int c, int cmd_state) { @@ -7827,7 +7829,9 @@ parse_ident(struct parser_params *parser, int c, int cmd_state) pushback(c); } } - if (result == 0 && ISUPPER(tok()[0])) { + if (result == 0 && + (ISUPPER(tok()[0]) || + rb_enc_const_id_char_p(tok(), tok()+toklen(), current_enc))) { result = tCONSTANT; } else { diff --git i/symbol.c w/symbol.c index f4516ebbe4..490cae0127 100644 --- i/symbol.c +++ w/symbol.c @@ -198,6 +198,28 @@ rb_enc_symname_p(const char *name, rb_encoding *enc) return rb_enc_symname2_p(name, strlen(name), enc); } +int +rb_enc_const_id_char_p(const char *name, const char *end, rb_encoding *enc) +{ + int c, len; + + if (end <= name) return FALSE; + if (ISASCII(*name)) return ISUPPER(*name); + c = rb_enc_codepoint_len(name, end, &len, enc); + if (c < 0) return FALSE; + if (rb_enc_isupper(c, enc)) return TRUE; + { + OnigUChar fold[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM]; + const OnigUChar *beg = (const OnigUChar *)name; + int r = enc->mbc_case_fold(ONIGENC_CASE_FOLD, + &beg, (const OnigUChar *)end, + fold, enc); + if (r > 0 && (r != len || memcmp(fold, name, r))) + return TRUE; + } + return FALSE; +} + #define IDSET_ATTRSET_FOR_SYNTAX ((1U<= e || (*m != '_' && !ISALPHA(*m) && ISASCII(*m))) { if (len > 1 && *(e-1) == '=') { ``` ---------------------------------------- Bug #13770: Can't create valid Cyrillic-named class/module https://bugs.ruby-lang.org/issues/13770#change-65983 * Author: sb (Sergey Borodanov) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Can't create a valid Cyrillic-named class. If I have a file **������.rb**: ~~~ ruby # Content of ������.rb: class ������ def ���������������������������� "������������, ������!" end end ~~~ and do in **bash**: ~~~ ruby ������.rb ~~~ I get the error (**SyntaxError**): ~~~ ������.rb:1: class/module name must be CONSTANT ~~~ Same error with module creating and same behavior in **irb** (please, see attachment). At the same time Cyrillic-named constants and methods work fine. It is expected that creating Cyrillic-named class/modules should work without error. ---Files-------------------------------- Screenshot from 2017-07-26 19-08-14.png (64.2 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: