mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 21:14:23 +02:00
[ruby/rdoc] ClassModule#superclass= accepts a ClassModule as an
argument
(https://github.com/ruby/rdoc/pull/1222)
It is necessary for ClassModule's instance variable @superclass to
always be a String (or nil) so that the class can be saved with
`#marshal_dump` and loaded with `#marshal_load`.
However, there's no type checking being done, which allows a bug like
the one reported in #1221 (which was introduced in #1217) that sets
superclass to a ClassModule. That bug requires:
- setting a superclass to a NormalClass
- marshal_save
- marshal_load (which raises an exception)
With this change, passing a ClassModule to ClassModule#superclass= is
explicitly allowed by saving the full name of the ClassModule in the
@superclass instance variable.
9ced6d534c
This commit is contained in:
parent
d588a1c880
commit
4cce246d86
2 changed files with 34 additions and 1 deletions
|
@ -705,10 +705,23 @@ class RDoc::ClassModule < RDoc::Context
|
|||
|
||||
##
|
||||
# Set the superclass of this class to +superclass+
|
||||
#
|
||||
# where +superclass+ is one of:
|
||||
#
|
||||
# - +nil+
|
||||
# - a String containing the full name of the superclass
|
||||
# - the RDoc::ClassModule representing the superclass
|
||||
|
||||
def superclass=(superclass)
|
||||
raise NoMethodError, "#{full_name} is a module" if module?
|
||||
@superclass = superclass
|
||||
case superclass
|
||||
when RDoc::ClassModule
|
||||
@superclass = superclass.full_name
|
||||
when nil, String
|
||||
@superclass = superclass
|
||||
else
|
||||
raise TypeError, "superclass must be a String or RDoc::ClassModule, not #{superclass.class}"
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue