1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* insns.def (defineclass): Also raise an error when redeclaring the

superclass of a class as Object and it has another superclass.
  [Bug #12367] [ruby-core:75446]
* test/ruby/test_class.rb: test for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2016-05-10 12:46:43 +00:00
parent 15fbd05e4e
commit 06dd20f7fe
3 changed files with 31 additions and 5 deletions

View file

@ -1,3 +1,11 @@
Tue May 10 21:05:45 2016 Benoit Daloze <eregontp@gmail.com>
* insns.def (defineclass): Also raise an error when redeclaring the
superclass of a class as Object and it has another superclass.
[Bug #12367] [ruby-core:75446]
* test/ruby/test_class.rb: test for above.
Tue May 10 14:57:09 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* random.c (obj_random_bytes): base on bytes method instead of

View file

@ -865,10 +865,6 @@ defineclass
rb_obj_class(super));
}
if (super == Qnil) {
super = rb_cObject;
}
vm_check_if_namespace(cbase);
/* find klass */
@ -881,7 +877,7 @@ defineclass
rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a class", rb_id2str(id));
}
if (super != rb_cObject) {
if (VM_DEFINECLASS_HAS_SUPERCLASS_P(flags)) {
VALUE tmp;
tmp = rb_class_real(RCLASS_SUPER(klass));
@ -892,6 +888,9 @@ defineclass
}
}
else {
if (!VM_DEFINECLASS_HAS_SUPERCLASS_P(flags)) {
super = rb_cObject;
}
/* new class declaration */
klass = rb_define_class_id(id, super);
rb_set_class_path_string(klass, cbase, rb_id2str(id));

View file

@ -378,6 +378,25 @@ class TestClass < Test::Unit::TestCase
}
end
define_method :test_invalid_reset_superclass do
class A; end
class SuperclassCannotBeReset < A
end
assert_equal A, SuperclassCannotBeReset.superclass
assert_raise_with_message(TypeError, /superclass mismatch/) {
class SuperclassCannotBeReset < String
end
}
assert_raise_with_message(TypeError, /superclass mismatch/, "[ruby-core:75446]") {
class SuperclassCannotBeReset < Object
end
}
assert_equal A, SuperclassCannotBeReset.superclass
end
def test_cloned_singleton_method_added
bug5283 = '[ruby-dev:44477]'
added = []