diff --git a/object.c b/object.c index 1e005e5..279fec8 100644 --- a/object.c +++ b/object.c @@ -1622,7 +1622,7 @@ rb_mod_initialize(VALUE module) static VALUE rb_class_initialize(int argc, VALUE *argv, VALUE klass) { - VALUE super; + VALUE super, i; if (RCLASS_SUPER(klass) != 0 || klass == rb_cBasicObject) { rb_raise(rb_eTypeError, "already initialized class"); @@ -1634,6 +1634,11 @@ rb_class_initialize(int argc, VALUE *argv, VALUE klass) rb_scan_args(argc, argv, "01", &super); rb_check_inheritable(super); } + for(i = super; i && i != rb_cBasicObject; i = RCLASS_SUPER(i)) { + if(i == klass) { + rb_raise(rb_eTypeError, "circular inheritance detected"); + } + } RCLASS_SUPER(klass) = super; rb_make_metaclass(klass, RBASIC(super)->klass); rb_class_inherited(super, klass);