422422rb_enc_register (const char * name , rb_encoding * encoding )
423423{
424424 int index ;
425+ bool set_const = false;
425426
426427 GLOBAL_ENC_TABLE_LOCKING (enc_table ) {
427428 index = enc_registered (enc_table , name );
@@ -440,9 +441,12 @@ rb_enc_register(const char *name, rb_encoding *encoding)
440441 }
441442 else {
442443 index = enc_register (enc_table , name , encoding );
443- set_encoding_const ( name , rb_enc_from_index ( index )) ;
444+ set_const = true ;
444445 }
445446 }
447+ if (set_const ) {
448+ set_encoding_const (name , rb_enc_from_index (index ));
449+ }
446450 return index ;
447451}
448452
@@ -473,13 +477,14 @@ rb_enc_registered(const char *name)
473477void
474478rb_encdb_declare (const char * name )
475479{
480+ int idx ;
476481 GLOBAL_ENC_TABLE_LOCKING (enc_table ) {
477- int idx = enc_registered (enc_table , name );
482+ idx = enc_registered (enc_table , name );
478483 if (idx < 0 ) {
479484 idx = enc_register (enc_table , name , 0 );
480485 }
481- set_encoding_const (name , rb_enc_from_index (idx ));
482486 }
487+ set_encoding_const (name , rb_enc_from_index (idx ));
483488}
484489
485490static void
@@ -538,7 +543,6 @@ enc_replicate(struct enc_table *enc_table, const char *name, rb_encoding *encodi
538543 idx = enc_register (enc_table , name , encoding );
539544 if (idx < 0 ) rb_raise (rb_eArgError , "invalid encoding name: %s" , name );
540545 set_base_encoding (enc_table , idx , encoding );
541- set_encoding_const (name , rb_enc_from_index (idx ));
542546 return idx ;
543547}
544548
@@ -553,7 +557,6 @@ enc_replicate_with_index(struct enc_table *enc_table, const char *name, rb_encod
553557 }
554558 if (idx >= 0 ) {
555559 set_base_encoding (enc_table , idx , origenc );
556- set_encoding_const (name , rb_enc_from_index (idx ));
557560 }
558561 else {
559562 rb_raise (rb_eArgError , "failed to replicate encoding" );
@@ -576,6 +579,8 @@ rb_encdb_replicate(const char *name, const char *orig)
576579 r = enc_replicate_with_index (enc_table , name , rb_enc_from_index (origidx ), idx );
577580 }
578581
582+ set_encoding_const (name , rb_enc_from_index (r ));
583+
579584 return r ;
580585}
581586
@@ -589,6 +594,7 @@ rb_define_dummy_encoding(const char *name)
589594 rb_encoding * enc = enc_table -> list [index ].enc ;
590595 ENC_SET_DUMMY ((rb_raw_encoding * )enc );
591596 }
597+ set_encoding_const (name , rb_enc_from_index (index ));
592598
593599 return index ;
594600}
@@ -606,6 +612,8 @@ rb_encdb_dummy(const char *name)
606612 ENC_SET_DUMMY ((rb_raw_encoding * )enc );
607613 }
608614
615+ set_encoding_const (name , rb_enc_from_index (index ));
616+
609617 return index ;
610618}
611619
@@ -672,18 +680,20 @@ enc_alias_internal(struct enc_table *enc_table, const char *alias, int idx)
672680}
673681
674682static int
675- enc_alias (struct enc_table * enc_table , const char * alias , int idx )
683+ enc_alias (struct enc_table * enc_table , const char * alias , int idx , bool * set_const )
676684{
677685 if (!valid_encoding_name_p (alias )) return -1 ;
678- if (!enc_alias_internal (enc_table , alias , idx ))
679- set_encoding_const (alias , enc_from_index (enc_table , idx ));
686+ if (!enc_alias_internal (enc_table , alias , idx )) {
687+ * set_const = true;
688+ }
680689 return idx ;
681690}
682691
683692int
684693rb_enc_alias (const char * alias , const char * orig )
685694{
686695 int idx , r ;
696+ bool set_const = false;
687697 GLOBAL_ENC_TABLE_LOCKING (enc_table ) {
688698 enc_check_addable (enc_table , alias ); // can raise
689699 }
@@ -692,7 +702,11 @@ rb_enc_alias(const char *alias, const char *orig)
692702 if (idx < 0 ) return -1 ;
693703
694704 GLOBAL_ENC_TABLE_LOCKING (enc_table ) {
695- r = enc_alias (enc_table , alias , idx );
705+ r = enc_alias (enc_table , alias , idx , & set_const );
706+ }
707+
708+ if (set_const ) {
709+ set_encoding_const (alias , rb_enc_from_index (idx ));
696710 }
697711
698712 return r ;
@@ -702,14 +716,18 @@ int
702716rb_encdb_alias (const char * alias , const char * orig )
703717{
704718 int r ;
719+ bool set_const = false;
705720
706721 GLOBAL_ENC_TABLE_LOCKING (enc_table ) {
707722 int idx = enc_registered (enc_table , orig );
708723
709724 if (idx < 0 ) {
710725 idx = enc_register (enc_table , orig , 0 );
711726 }
712- r = enc_alias (enc_table , alias , idx );
727+ r = enc_alias (enc_table , alias , idx , & set_const );
728+ }
729+ if (set_const ) {
730+ set_encoding_const (alias , rb_enc_from_index (r ));
713731 }
714732
715733 return r ;
@@ -1818,6 +1836,7 @@ set_default_internal(VALUE klass, VALUE encoding)
18181836static void
18191837set_encoding_const (const char * name , rb_encoding * enc )
18201838{
1839+ ASSERT_vm_unlocking ();
18211840 VALUE encoding = rb_enc_from_encoding (enc );
18221841 char * s = (char * )name ;
18231842 int haslower = 0 , hasupper = 0 , valid = 0 ;
0 commit comments