From 7c34e359a1d8e1affabeaa43377cf49f09933dfd Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 21 Dec 2003 08:29:06 +0000 Subject: * class.c (rb_check_inheritable): new function. [ruby-dev:22316] * intern.h: add prototype. * eval.c (superclass): use rb_check_inheritable(). * object.c (rb_class_initialize): check argument validity. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5236 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ class.c | 13 +++++++++++++ eval.c | 8 +------- intern.h | 1 + object.c | 3 +++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index ea99d23820..157ecaa4e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Sun Dec 21 17:29:00 2003 Nobuyoshi Nakada + + * class.c (rb_check_inheritable): new function. [ruby-dev:22316] + + * intern.h: add prototype. + + * eval.c (superclass): use rb_check_inheritable(). + + * object.c (rb_class_initialize): check argument validity. + Sun Dec 21 16:25:10 2003 Tanaka Akira * lib/pathname.rb (Pathname#+): re-implemented to resolve ".." in diff --git a/class.c b/class.c index 666548dde3..29fe34a915 100644 --- a/class.c +++ b/class.c @@ -178,6 +178,19 @@ rb_define_class_id(id, super) return klass; } +void +rb_check_inheritable(super) + VALUE super; +{ + if (TYPE(super) != T_CLASS) { + rb_raise(rb_eTypeError, "superclass must be a Class (%s given)", + rb_obj_classname(super)); + } + if (RBASIC(super)->flags & FL_SINGLETON) { + rb_raise(rb_eTypeError, "can't make subclass of virtual class"); + } +} + VALUE rb_class_inherited(super, klass) VALUE super, klass; diff --git a/eval.c b/eval.c index 10d52d6511..545d678be2 100644 --- a/eval.c +++ b/eval.c @@ -1699,13 +1699,7 @@ superclass(self, node) } JUMP_TAG(state); } - if (TYPE(val) != T_CLASS) { - rb_raise(rb_eTypeError, "superclass must be a Class (%s given)", - rb_obj_classname(val)); - } - if (FL_TEST(val, FL_SINGLETON)) { - rb_raise(rb_eTypeError, "can't make subclass of virtual class"); - } + rb_check_inheritable(val); return val; } diff --git a/intern.h b/intern.h index 6cdba0840e..5d7e9e78f3 100644 --- a/intern.h +++ b/intern.h @@ -102,6 +102,7 @@ VALUE rb_class_init_copy _((VALUE, VALUE)); VALUE rb_singleton_class_clone _((VALUE)); void rb_singleton_class_attached _((VALUE,VALUE)); VALUE rb_make_metaclass _((VALUE, VALUE)); +void rb_check_inheritable _((VALUE)); VALUE rb_class_inherited _((VALUE, VALUE)); VALUE rb_define_class_id _((ID, VALUE)); VALUE rb_module_new _((void)); diff --git a/object.c b/object.c index 355d1e4f61..fda6410274 100644 --- a/object.c +++ b/object.c @@ -776,6 +776,9 @@ rb_class_initialize(argc, argv, klass) if (rb_scan_args(argc, argv, "01", &super) == 0) { super = rb_cObject; } + else { + rb_check_inheritable(super); + } RCLASS(klass)->super = super; rb_make_metaclass(klass, RBASIC(super)->klass); rb_mod_initialize(klass); -- cgit v1.2.3