@@ -901,14 +901,52 @@ def io.binmode; raise "binmode"; end
901901 end
902902
903903 describe "for a Regexp" do
904- it "loads an extended Regexp" do
905- obj = /[a-z]/ . dup . extend ( Meths , MethsMore )
906- new_obj = Marshal . send ( @method , "\004 \b e:\n Methse:\016 MethsMore/\n [a-z]\000 " )
904+ ruby_version_is "4.1" do
905+ it "raises FrozenError for an extended Regexp" do
906+ -> {
907+ Marshal . send ( @method , "\004 \b e:\n Methse:\016 MethsMore/\n [a-z]\000 " )
908+ } . should raise_error ( FrozenError )
909+ end
910+
911+ it "raises FrozenError when regexp has instance variables" do
912+ -> {
913+ Marshal . send ( @method , "\x04 \b I/\n hello\x00 \a :\x06 EF:\x11 @regexp_ivar[\x06 i/" )
914+ } . should raise_error ( FrozenError )
915+ end
916+ end
917+
918+ ruby_version_is "" ..."4.1" do
919+ it "loads an extended Regexp" do
920+ obj = /[a-z]/ . dup . extend ( Meths , MethsMore )
921+ new_obj = Marshal . send ( @method , "\004 \b e:\n Methse:\016 MethsMore/\n [a-z]\000 " )
922+
923+ new_obj . should == obj
924+ new_obj_metaclass_ancestors = class << new_obj ; ancestors ; end
925+ new_obj_metaclass_ancestors [ @num_self_class , 3 ] . should ==
926+ [ Meths , MethsMore , Regexp ]
927+ end
928+
929+ it "restore the regexp instance variables" do
930+ obj = Regexp . new ( "hello" )
931+ obj . instance_variable_set ( :@regexp_ivar , [ 42 ] )
932+
933+ new_obj = Marshal . send ( @method , "\x04 \b I/\n hello\x00 \a :\x06 EF:\x11 @regexp_ivar[\x06 i/" )
934+ new_obj . instance_variables . should == [ :@regexp_ivar ]
935+ new_obj . instance_variable_get ( :@regexp_ivar ) . should == [ 42 ]
936+ end
937+ end
938+
939+ it "loads a Regexp subclass instance variables" do
940+ obj = UserRegexp . new ( 'abc' )
941+ obj . instance_variable_set ( :@noise , 'much' )
942+
943+ new_obj = Marshal . send ( @method , Marshal . dump ( obj ) )
907944
908945 new_obj . should == obj
946+ new_obj . instance_variable_get ( :@noise ) . should == 'much'
909947 new_obj_metaclass_ancestors = class << new_obj ; ancestors ; end
910- new_obj_metaclass_ancestors [ @num_self_class , 3 ] . should ==
911- [ Meths , MethsMore , Regexp ]
948+ new_obj_metaclass_ancestors [ @num_self_class , 2 ] . should ==
949+ [ UserRegexp , Regexp ]
912950 end
913951
914952 it "loads a Regexp subclass instance variables when it is extended with a module" do
@@ -924,15 +962,6 @@ def io.binmode; raise "binmode"; end
924962 [ Meths , UserRegexp , Regexp ]
925963 end
926964
927- it "restore the regexp instance variables" do
928- obj = Regexp . new ( "hello" )
929- obj . instance_variable_set ( :@regexp_ivar , [ 42 ] )
930-
931- new_obj = Marshal . send ( @method , "\x04 \b I/\n hello\x00 \a :\x06 EF:\x11 @regexp_ivar[\x06 i/" )
932- new_obj . instance_variables . should == [ :@regexp_ivar ]
933- new_obj . instance_variable_get ( :@regexp_ivar ) . should == [ 42 ]
934- end
935-
936965 it "preserves Regexp encoding" do
937966 source_object = Regexp . new ( "a" . encode ( "utf-32le" ) )
938967 regexp = Marshal . send ( @method , Marshal . dump ( source_object ) )
0 commit comments