class.c: TypeError when superclass mismatch

* class.c (rb_define_class_id_under): raise TypeError exception
  same as ruby level class definition when superclass mismatch.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51048 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-06-28 03:07:37 +00:00
parent 6cdc55f4a3
commit a13ab237c7
4 changed files with 12 additions and 2 deletions

View File

@ -1,3 +1,8 @@
Sun Jun 28 12:07:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* class.c (rb_define_class_id_under): raise TypeError exception
same as ruby level class definition when superclass mismatch.
Sun Jun 14 19:02:03 2015 Benoit Daloze <eregontp@gmail.com> Sun Jun 14 19:02:03 2015 Benoit Daloze <eregontp@gmail.com>
* lib/net/ftp.rb (makeport): close the TCPServer * lib/net/ftp.rb (makeport): close the TCPServer

4
NEWS
View File

@ -143,6 +143,10 @@ with all sufficient information, see the ChangeLog file.
=== C API updates === C API updates
* rb_define_class_id_under() now raises a TypeError exception when the
class is already defined but its superclass does not match the given
superclass, as well as definitions in ruby level.
=== Build system updates === Build system updates
=== Implementation changes === Implementation changes

View File

@ -703,7 +703,8 @@ rb_define_class_id_under(VALUE outer, ID id, VALUE super)
rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a class", rb_id2str(id)); rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a class", rb_id2str(id));
} }
if (rb_class_real(RCLASS_SUPER(klass)) != super) { if (rb_class_real(RCLASS_SUPER(klass)) != super) {
rb_name_error(id, "%"PRIsVALUE" is already defined", rb_id2str(id)); rb_raise(rb_eTypeError, "superclass mismatch for class %"PRIsVALUE"",
rb_id2str(id));
} }
return klass; return klass;
} }

View File

@ -228,7 +228,7 @@ class TestRequire < Test::Unit::TestCase
assert_separately([], <<-INPUT) assert_separately([], <<-INPUT)
module Zlib; end module Zlib; end
class Zlib::Error; end class Zlib::Error; end
assert_raise(NameError) do assert_raise(TypeError) do
require 'zlib' require 'zlib'
end end
INPUT INPUT