Skip to content

Commit 1d3f389

Browse files
committed
Fix infinite loop caused by re-encountering superclass
1 parent ee4be25 commit 1d3f389

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

History.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
=== 3.6.1
2+
3+
* Bug fixes
4+
* Fix infinite loop created when re-encountering BasicObject.
5+
16
=== 3.6 / 2011-05-13
27

38
* Major Enhancements

lib/rdoc/context.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ def add_class class_type, given_name, superclass = '::Object'
373373
end
374374
end
375375

376+
# fix up superclass
377+
superclass = nil if full_name == 'BasicObject'
378+
superclass = nil if full_name == 'Object' and defined?(::BasicObject)
379+
superclass = '::BasicObject' if
380+
defined?(::BasicObject) and full_name == 'Object'
381+
376382
# find the superclass full name
377383
if superclass then
378384
if superclass =~ /^:+/ then

test/test_rdoc_context.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,38 @@ def test_add_class
105105
assert_includes RDoc::TopLevel.classes.map { |k| k.full_name }, 'C1::Klass'
106106
end
107107

108+
def test_add_class_basic_object
109+
skip 'BasicObject is 1.9 only' unless defined?(BasicObject)
110+
111+
@xref_data.add_class RDoc::NormalClass, 'BasicObject'
112+
113+
basic = @xref_data.find_module_named 'BasicObject'
114+
115+
assert_nil basic.superclass
116+
117+
@c1.add_class RDoc::NormalClass, 'BasicObject'
118+
119+
basic = @c1.find_module_named 'BasicObject'
120+
121+
assert_equal 'Object', basic.superclass
122+
end
123+
124+
def test_add_class_object
125+
root_class = defined?(BasicObject) ? 'BasicObject' : nil
126+
127+
@xref_data.add_class RDoc::NormalClass, 'Object'
128+
129+
object = @xref_data.find_module_named 'Object'
130+
131+
assert_equal root_class, object.superclass
132+
133+
@c1.add_class RDoc::NormalClass, 'Object'
134+
135+
object = @c1.find_module_named 'Object'
136+
137+
assert_equal 'Object', object.superclass.full_name
138+
end
139+
108140
def test_add_class_superclass
109141
@c1.add_class RDoc::NormalClass, 'Klass', 'Object'
110142
@c1.add_class RDoc::NormalClass, 'Klass', 'Other'

test/test_rdoc_ri_store.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ def test_save_cache
215215
},
216216
}
217217

218+
expected[:ancestors]['Object'] = %w[BasicObject] if defined?(::BasicObject)
219+
218220
open File.join(@tmpdir, 'cache.ri'), 'rb' do |io|
219221
cache = Marshal.load io.read
220222

@@ -250,8 +252,10 @@ def test_save_class
250252
assert_directory File.join(@tmpdir, 'Object')
251253
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
252254

255+
object_ancestors = defined?(::BasicObject) ? %w[BasicObject] : []
256+
253257
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
254-
'Object' => %w[])
258+
'Object' => object_ancestors)
255259

256260
assert_equal @klass, @s.load_class('Object')
257261
end
@@ -303,8 +307,10 @@ def test_save_class_methods
303307
assert_directory File.join(@tmpdir, 'Object')
304308
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
305309

310+
object_ancestors = defined?(::BasicObject) ? %w[BasicObject] : []
311+
306312
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
307-
'Object' => %w[])
313+
'Object' => object_ancestors)
308314

309315
assert_equal @klass, @s.load_class('Object')
310316
end

0 commit comments

Comments
 (0)