Commit 0719f523 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #240 from bovi/superclass-improvement

Class#superclass improvement
parents 7009a1d8 0c2d7402
...@@ -822,10 +822,16 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv) ...@@ -822,10 +822,16 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv)
mrb_value mrb_value
mrb_class_superclass(mrb_state *mrb, mrb_value klass) mrb_class_superclass(mrb_state *mrb, mrb_value klass)
{ {
struct RClass *c, *s; struct RClass *c;
mrb_value superclass;
c = mrb_class_ptr(klass); c = mrb_class_ptr(klass);
s = mrb_class_real(c->super); if (c->super)
return mrb_obj_value(s); superclass = mrb_obj_value(mrb_class_real(c->super));
else
superclass = mrb_nil_value();
return superclass;
} }
static mrb_value static mrb_value
......
...@@ -13,3 +13,8 @@ assert('ArgumentError', '15.2.24') do ...@@ -13,3 +13,8 @@ assert('ArgumentError', '15.2.24') do
ArgumentError.class == Class and e2.class == ArgumentError ArgumentError.class == Class and e2.class == ArgumentError
end end
assert('ArgumentError superclass', '15.2.24.2') do
ArgumentError.superclass == StandardError
end
...@@ -5,6 +5,10 @@ assert('Array', '15.2.12') do ...@@ -5,6 +5,10 @@ assert('Array', '15.2.12') do
Array.class == Class Array.class == Class
end end
assert('Array superclass', '15.2.12.2') do
Array.superclass == Object
end
assert('Array.[]', '15.2.12.4.1') do assert('Array.[]', '15.2.12.4.1') do
Array.[](1,2,3) == [1, 2, 3] Array.[](1,2,3) == [1, 2, 3]
end end
......
##
# BasicObject
assert('BasicObject') do
BasicObject.class == Class
end
assert('BasicObject superclass') do
BasicObject.superclass == nil
end
...@@ -5,9 +5,8 @@ assert('Class', '15.2.3') do ...@@ -5,9 +5,8 @@ assert('Class', '15.2.3') do
Class.class == Class Class.class == Class
end end
assert('Class#superclass', '15.2.3.3.4') do assert('Class superclass', '15.2.3.2') do
class SubClass < String; end Class.superclass == Module
SubClass.superclass == String
end end
assert('Class#new', '15.2.3.3.3') do assert('Class#new', '15.2.3.3.3') do
...@@ -40,6 +39,11 @@ assert('Class#new', '15.2.3.3.3') do ...@@ -40,6 +39,11 @@ assert('Class#new', '15.2.3.3.3') do
# with block doesn't work yet # with block doesn't work yet
end end
assert('Class#superclass', '15.2.3.3.4') do
class SubClass < String; end
SubClass.superclass == String
end
# Not ISO specified # Not ISO specified
assert('Class 1') do assert('Class 1') do
......
...@@ -5,6 +5,10 @@ assert('Exception', '15.2.22') do ...@@ -5,6 +5,10 @@ assert('Exception', '15.2.22') do
Exception.class == Class Exception.class == Class
end end
assert('Exception superclass', '15.2.22.2') do
Exception.superclass == Object
end
assert('Exception.exception', '15.2.22.4.1') do assert('Exception.exception', '15.2.22.4.1') do
e = Exception.exception('a') e = Exception.exception('a')
......
...@@ -5,6 +5,10 @@ assert('FalseClass', '15.2.6') do ...@@ -5,6 +5,10 @@ assert('FalseClass', '15.2.6') do
FalseClass.class == Class FalseClass.class == Class
end end
assert('FalseClass superclass', '15.2.6.2') do
FalseClass.superclass == Object
end
assert('FalseClass false', '15.2.6.1') do assert('FalseClass false', '15.2.6.1') do
not false not false
end end
......
...@@ -5,6 +5,10 @@ assert('Float', '15.2.9') do ...@@ -5,6 +5,10 @@ assert('Float', '15.2.9') do
Float.class == Class Float.class == Class
end end
assert('Float superclass', '15.2.9.2') do
Float.superclass == Numeric
end
assert('Float#+', '15.2.9.3.1') do assert('Float#+', '15.2.9.3.1') do
a = 3.123456788 + 0.000000001 a = 3.123456788 + 0.000000001
b = 3.123456789 + 1 b = 3.123456789 + 1
......
...@@ -5,6 +5,10 @@ assert('Hash', '15.2.13') do ...@@ -5,6 +5,10 @@ assert('Hash', '15.2.13') do
Hash.class == Class Hash.class == Class
end end
assert('Hash superclass', '15.2.13.2') do
Hash.superclass == Object
end
assert('Hash#==', '15.2.13.4.1') do assert('Hash#==', '15.2.13.4.1') do
({ 'abc' => 'abc' } == { 'abc' => 'abc' }) and ({ 'abc' => 'abc' } == { 'abc' => 'abc' }) and
not ({ 'abc' => 'abc' } == { 'cba' => 'cba' }) not ({ 'abc' => 'abc' } == { 'cba' => 'cba' })
......
...@@ -4,3 +4,8 @@ ...@@ -4,3 +4,8 @@
assert('IndexError', '15.2.33') do assert('IndexError', '15.2.33') do
IndexError.class == Class IndexError.class == Class
end end
assert('IndexError superclass', '15.2.33.2') do
IndexError.superclass == StandardError
end
...@@ -5,6 +5,10 @@ assert('Integer', '15.2.8') do ...@@ -5,6 +5,10 @@ assert('Integer', '15.2.8') do
Integer.class == Class Integer.class == Class
end end
assert('Integer superclass', '15.2.8.2') do
Integer.superclass == Numeric
end
assert('Integer#+', '15.2.8.3.1') do assert('Integer#+', '15.2.8.3.1') do
a = 1+1 a = 1+1
b = 1+1.0 b = 1+1.0
......
...@@ -5,6 +5,10 @@ assert('Module', '15.2.2') do ...@@ -5,6 +5,10 @@ assert('Module', '15.2.2') do
Module.class == Class Module.class == Class
end end
assert('Module superclass', '15.2.2.2') do
Module.superclass == Object
end
assert('Module#const_defined?', '15.2.2.4.20') do assert('Module#const_defined?', '15.2.2.4.20') do
module Test4ConstDefined module Test4ConstDefined
Const4Test4ConstDefined = true Const4Test4ConstDefined = true
......
...@@ -5,6 +5,10 @@ assert('NameError', '15.2.31') do ...@@ -5,6 +5,10 @@ assert('NameError', '15.2.31') do
NameError.class == Class NameError.class == Class
end end
assert('NameError superclass', '15.2.31.2') do
NameError.superclass == StandardError
end
# TODO 15.2.31.2.1 NameError#name # TODO 15.2.31.2.1 NameError#name
assert('NameError#initialize', '15.2.31.2.2') do assert('NameError#initialize', '15.2.31.2.2') do
......
...@@ -11,3 +11,8 @@ assert('NoMethodError', '15.2.32') do ...@@ -11,3 +11,8 @@ assert('NoMethodError', '15.2.32') do
NoMethodError.class == Class and e2.class == NoMethodError NoMethodError.class == Class and e2.class == NoMethodError
end end
assert('NoMethodError superclass', '15.2.32.2') do
NoMethodError.superclass == NameError
end
...@@ -5,6 +5,10 @@ assert('Numeric', '15.2.7') do ...@@ -5,6 +5,10 @@ assert('Numeric', '15.2.7') do
Numeric.class == Class Numeric.class == Class
end end
assert('Numeric superclass', '15.2.7.2') do
Numeric.superclass == Object
end
assert('Numeric#+@', '15.2.7.4.1') do assert('Numeric#+@', '15.2.7.4.1') do
+1 == +1 +1 == +1
end end
......
...@@ -4,3 +4,8 @@ ...@@ -4,3 +4,8 @@
assert('Object', '15.2.1') do assert('Object', '15.2.1') do
Object.class == Class Object.class == Class
end end
assert('Object superclass', '15.2.1.2') do
Object.superclass == BasicObject
end
...@@ -5,6 +5,10 @@ assert('Proc', '15.2.17') do ...@@ -5,6 +5,10 @@ assert('Proc', '15.2.17') do
Proc.class == Class Proc.class == Class
end end
assert('Proc superclass', '15.2.17.2') do
Proc.superclass == Object
end
assert('Proc.new', '15.2.17.3.1') do assert('Proc.new', '15.2.17.3.1') do
a = nil a = nil
......
...@@ -5,6 +5,10 @@ assert('Range', '15.2.14') do ...@@ -5,6 +5,10 @@ assert('Range', '15.2.14') do
Range.class == Class Range.class == Class
end end
assert('Range superclass', '15.2.14.2') do
Range.superclass == Object
end
assert('Range#==', '15.2.14.4.1') do assert('Range#==', '15.2.14.4.1') do
(1..10) == (1..10) and not (1..10) == (1..100) (1..10) == (1..10) and not (1..10) == (1..100)
end end
......
...@@ -4,3 +4,8 @@ ...@@ -4,3 +4,8 @@
assert('RangeError', '15.2.26') do assert('RangeError', '15.2.26') do
RangeError.class == Class RangeError.class == Class
end end
assert('RangeError superclass', '15.2.26.2') do
RangeError.superclass == StandardError
end
...@@ -4,3 +4,8 @@ ...@@ -4,3 +4,8 @@
assert('StandardError', '15.2.23') do assert('StandardError', '15.2.23') do
StandardError.class == Class StandardError.class == Class
end end
assert('StandardError superclass', '15.2.23.2') do
StandardError.superclass == Exception
end
...@@ -5,6 +5,10 @@ assert('String', '15.2.10') do ...@@ -5,6 +5,10 @@ assert('String', '15.2.10') do
String.class == Class String.class == Class
end end
assert('String superclass', '15.2.10.2') do
String.superclass == Object
end
assert('String#*', '15.2.10.5.1') do assert('String#*', '15.2.10.5.1') do
'a' * 5 == 'aaaaa' 'a' * 5 == 'aaaaa'
end end
......
...@@ -4,3 +4,8 @@ ...@@ -4,3 +4,8 @@
assert('Struct', '15.2.18') do assert('Struct', '15.2.18') do
Struct.class == Class Struct.class == Class
end end
assert('Struct superclass', '15.2.18.2') do
Struct.superclass == Object
end
...@@ -5,6 +5,10 @@ assert('Symbol', '15.2.11') do ...@@ -5,6 +5,10 @@ assert('Symbol', '15.2.11') do
Symbol.class == Class Symbol.class == Class
end end
assert('Symbol superclass', '15.2.11.2') do
Symbol.superclass == Object
end
assert('Symbol#===', '15.2.11.3.1') do assert('Symbol#===', '15.2.11.3.1') do
:abc === :abc and not :abc === :cba :abc === :abc and not :abc === :cba
end end
......
...@@ -5,6 +5,10 @@ assert('Time', '15.2.19') do ...@@ -5,6 +5,10 @@ assert('Time', '15.2.19') do
Time.class == Class Time.class == Class
end end
assert('Time superclass', '15.2.19.2') do
Time.superclass == Object
end
assert('Time.at', '15.2.19.6.1') do assert('Time.at', '15.2.19.6.1') do
Time.at(1300000000.0) Time.at(1300000000.0)
end end
......
...@@ -5,6 +5,10 @@ assert('TrueClass', '15.2.5') do ...@@ -5,6 +5,10 @@ assert('TrueClass', '15.2.5') do
TrueClass.class == Class TrueClass.class == Class
end end
assert('TrueClass superclass', '15.2.5.2') do
TrueClass.superclass == Object
end
assert('TrueClass true', '15.2.5.1') do assert('TrueClass true', '15.2.5.1') do
true true
end end
......
...@@ -4,3 +4,8 @@ ...@@ -4,3 +4,8 @@
assert('TypeError', '15.2.29') do assert('TypeError', '15.2.29') do
TypeError.class == Class TypeError.class == Class
end end
assert('TypeError superclass', '15.2.29.2') do
TypeError.superclass == StandardError
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment