@@ -717,11 +717,9 @@ generic_ivar_set(obj, id, val)
717
717
VALUE val ;
718
718
{
719
719
st_table * tbl ;
720
- int special = Qfalse ;
721
720
722
721
if (rb_special_const_p (obj )) {
723
722
special_generic_ivar = 1 ;
724
- special = Qtrue ;
725
723
}
726
724
if (!generic_iv_tbl ) {
727
725
generic_iv_tbl = st_init_numtable ();
@@ -771,26 +769,27 @@ generic_ivar_remove(obj, id)
771
769
return val ;
772
770
}
773
771
774
- static int
775
- givar_mark_i (key , value )
776
- ID key ;
777
- VALUE value ;
778
- {
779
- rb_gc_mark (value );
780
- return ST_CONTINUE ;
781
- }
782
-
783
772
void
784
773
rb_mark_generic_ivar (obj )
785
774
VALUE obj ;
786
775
{
787
776
st_table * tbl ;
788
777
778
+ if (!generic_iv_tbl ) return ;
789
779
if (st_lookup (generic_iv_tbl , obj , & tbl )) {
790
780
rb_mark_tbl (tbl );
791
781
}
792
782
}
793
783
784
+ static int
785
+ givar_mark_i (key , value )
786
+ ID key ;
787
+ VALUE value ;
788
+ {
789
+ rb_gc_mark (value );
790
+ return ST_CONTINUE ;
791
+ }
792
+
794
793
static int
795
794
givar_i (obj , tbl )
796
795
VALUE obj ;
@@ -805,8 +804,8 @@ givar_i(obj, tbl)
805
804
void
806
805
rb_mark_generic_ivar_tbl ()
807
806
{
808
- if (special_generic_ivar == 0 ) return ;
809
807
if (!generic_iv_tbl ) return ;
808
+ if (special_generic_ivar == 0 ) return ;
810
809
st_foreach (generic_iv_tbl , givar_i , 0 );
811
810
}
812
811
@@ -820,6 +819,18 @@ rb_free_generic_ivar(obj)
820
819
st_free_table (tbl );
821
820
}
822
821
822
+ void
823
+ rb_clone_generic_ivar (clone , obj )
824
+ VALUE clone , obj ;
825
+ {
826
+ st_table * tbl ;
827
+
828
+ if (!generic_iv_tbl ) return ;
829
+ if (st_lookup (generic_iv_tbl , obj , & tbl )) {
830
+ st_add_direct (generic_iv_tbl , clone , st_copy (tbl ));
831
+ }
832
+ }
833
+
823
834
VALUE
824
835
rb_ivar_get (obj , id )
825
836
VALUE obj ;
0 commit comments