@@ -534,6 +534,7 @@ struct rb_global_variable {
534534 rb_gvar_compact_t * compactor ;
535535 struct trace_var * trace ;
536536 bool box_ready ;
537+ bool box_dynamic ;
537538};
538539
539540struct rb_global_entry {
@@ -618,6 +619,13 @@ rb_gvar_box_ready(const char *name)
618619 entry -> var -> box_ready = true;
619620}
620621
622+ void
623+ rb_gvar_box_dynamic (const char * name )
624+ {
625+ struct rb_global_entry * entry = rb_find_global_entry (rb_intern (name ));
626+ entry -> var -> box_dynamic = true;
627+ }
628+
621629static void
622630rb_gvar_undef_compactor (void * var )
623631{
@@ -646,6 +654,7 @@ rb_global_entry(ID id)
646654 var -> block_trace = 0 ;
647655 var -> trace = 0 ;
648656 var -> box_ready = false;
657+ var -> box_dynamic = false;
649658 rb_id_table_insert (rb_global_tbl , id , (VALUE )entry );
650659 }
651660 }
@@ -1000,9 +1009,13 @@ rb_gvar_set_entry(struct rb_global_entry *entry, VALUE val)
10001009 return val ;
10011010}
10021011
1003- #define USE_BOX_GVAR_TBL (ns ,entry ) \
1004- (BOX_USER_P(ns) && \
1005- (!entry || !entry->var->box_ready || entry->var->setter != rb_gvar_readonly_setter))
1012+ static inline bool
1013+ gvar_use_box_tbl (const rb_box_t * box , const struct rb_global_entry * entry )
1014+ {
1015+ return BOX_USER_P (box ) &&
1016+ !entry -> var -> box_dynamic &&
1017+ (!entry -> var -> box_ready || entry -> var -> setter != rb_gvar_readonly_setter );
1018+ }
10061019
10071020VALUE
10081021rb_gvar_set (ID id , VALUE val )
@@ -1015,7 +1028,7 @@ rb_gvar_set(ID id, VALUE val)
10151028 RB_VM_LOCKING () {
10161029 entry = rb_global_entry (id );
10171030
1018- if (USE_BOX_GVAR_TBL (box , entry )) {
1031+ if (gvar_use_box_tbl (box , entry )) {
10191032 use_box_tbl = true;
10201033 rb_hash_aset (box -> gvar_tbl , rb_id2sym (entry -> id ), val );
10211034 retval = val ;
@@ -1048,7 +1061,7 @@ rb_gvar_get(ID id)
10481061 entry = rb_global_entry (id );
10491062 var = entry -> var ;
10501063
1051- if (USE_BOX_GVAR_TBL (box , entry )) {
1064+ if (gvar_use_box_tbl (box , entry )) {
10521065 use_box_tbl = true;
10531066 gvars = box -> gvar_tbl ;
10541067 key = rb_id2sym (entry -> id );
0 commit comments