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