Project

General

Profile

Actions

Bug #12367

closed

[PATCH] Declaring an already defined class with Object as the new superclass does not raise an error

Bug #12367: [PATCH] Declaring an already defined class with Object as the new superclass does not raise an error

Added by Eregon (Benoit Daloze) almost 10 years ago. Updated almost 10 years ago.

Status:
Closed
Target version:
-
[ruby-core:75446]

Description

For example:

class SuperclassIgnoresObject < A
end
SuperclassIgnoresObject.superclass # A

class SuperclassIgnoresObject < Object # Should raise a superclass mismatch but it doesn't.
end
SuperclassIgnoresObject.superclass # A

This seems an unintended side-effect of using Object as the default superclass in the code and not differentiating given/non-given superclass.
In insns.def defineclass:

if (super == Qnil) {
    super = rb_cObject;
}
...
if (super != rb_cObject) {
    // check is superclass mismatch
}

Proposed patch:

diff --git a/insns.def b/insns.def
index d34a663..ae7f98f 100644
--- a/insns.def
+++ b/insns.def
@@ -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));

Can I commit?

Actions

Also available in: PDF Atom