summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/class.c12
-rw-r--r--test/t/argumenterror.rb5
-rw-r--r--test/t/array.rb4
-rw-r--r--test/t/basicobject.rb11
-rw-r--r--test/t/class.rb10
-rw-r--r--test/t/exception.rb4
-rw-r--r--test/t/false.rb4
-rw-r--r--test/t/float.rb4
-rw-r--r--test/t/hash.rb4
-rw-r--r--test/t/indexerror.rb5
-rw-r--r--test/t/integer.rb4
-rw-r--r--test/t/module.rb4
-rw-r--r--test/t/nameerror.rb4
-rw-r--r--test/t/nomethoderror.rb5
-rw-r--r--test/t/numeric.rb4
-rw-r--r--test/t/object.rb5
-rw-r--r--test/t/proc.rb4
-rw-r--r--test/t/range.rb4
-rw-r--r--test/t/rangeerror.rb5
-rw-r--r--test/t/standarderror.rb5
-rw-r--r--test/t/string.rb4
-rw-r--r--test/t/struct.rb5
-rw-r--r--test/t/symbol.rb4
-rw-r--r--test/t/time.rb4
-rw-r--r--test/t/true.rb4
-rw-r--r--test/t/typeerror.rb5
26 files changed, 127 insertions, 6 deletions
diff --git a/src/class.c b/src/class.c
index c689552f5..594ed08bc 100644
--- a/src/class.c
+++ b/src/class.c
@@ -822,10 +822,16 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv)
mrb_value
mrb_class_superclass(mrb_state *mrb, mrb_value klass)
{
- struct RClass *c, *s;
+ struct RClass *c;
+ mrb_value superclass;
+
c = mrb_class_ptr(klass);
- s = mrb_class_real(c->super);
- return mrb_obj_value(s);
+ if (c->super)
+ superclass = mrb_obj_value(mrb_class_real(c->super));
+ else
+ superclass = mrb_nil_value();
+
+ return superclass;
}
static mrb_value
diff --git a/test/t/argumenterror.rb b/test/t/argumenterror.rb
index ca998f8de..71cf38e26 100644
--- a/test/t/argumenterror.rb
+++ b/test/t/argumenterror.rb
@@ -13,3 +13,8 @@ assert('ArgumentError', '15.2.24') do
ArgumentError.class == Class and e2.class == ArgumentError
end
+
+assert('ArgumentError superclass', '15.2.24.2') do
+ ArgumentError.superclass == StandardError
+end
+
diff --git a/test/t/array.rb b/test/t/array.rb
index dba1b035d..4e53f1120 100644
--- a/test/t/array.rb
+++ b/test/t/array.rb
@@ -5,6 +5,10 @@ assert('Array', '15.2.12') do
Array.class == Class
end
+assert('Array superclass', '15.2.12.2') do
+ Array.superclass == Object
+end
+
assert('Array.[]', '15.2.12.4.1') do
Array.[](1,2,3) == [1, 2, 3]
end
diff --git a/test/t/basicobject.rb b/test/t/basicobject.rb
new file mode 100644
index 000000000..f7e95af89
--- /dev/null
+++ b/test/t/basicobject.rb
@@ -0,0 +1,11 @@
+##
+# BasicObject
+
+assert('BasicObject') do
+ BasicObject.class == Class
+end
+
+assert('BasicObject superclass') do
+ BasicObject.superclass == nil
+end
+
diff --git a/test/t/class.rb b/test/t/class.rb
index d252cf590..1b809a832 100644
--- a/test/t/class.rb
+++ b/test/t/class.rb
@@ -5,9 +5,8 @@ assert('Class', '15.2.3') do
Class.class == Class
end
-assert('Class#superclass', '15.2.3.3.4') do
- class SubClass < String; end
- SubClass.superclass == String
+assert('Class superclass', '15.2.3.2') do
+ Class.superclass == Module
end
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
end
+assert('Class#superclass', '15.2.3.3.4') do
+ class SubClass < String; end
+ SubClass.superclass == String
+end
+
# Not ISO specified
assert('Class 1') do
diff --git a/test/t/exception.rb b/test/t/exception.rb
index d68ed8bd7..22795161f 100644
--- a/test/t/exception.rb
+++ b/test/t/exception.rb
@@ -5,6 +5,10 @@ assert('Exception', '15.2.22') do
Exception.class == Class
end
+assert('Exception superclass', '15.2.22.2') do
+ Exception.superclass == Object
+end
+
assert('Exception.exception', '15.2.22.4.1') do
e = Exception.exception('a')
diff --git a/test/t/false.rb b/test/t/false.rb
index c2db283c8..ae605205d 100644
--- a/test/t/false.rb
+++ b/test/t/false.rb
@@ -5,6 +5,10 @@ assert('FalseClass', '15.2.6') do
FalseClass.class == Class
end
+assert('FalseClass superclass', '15.2.6.2') do
+ FalseClass.superclass == Object
+end
+
assert('FalseClass false', '15.2.6.1') do
not false
end
diff --git a/test/t/float.rb b/test/t/float.rb
index fc87a5b22..5c5245c73 100644
--- a/test/t/float.rb
+++ b/test/t/float.rb
@@ -5,6 +5,10 @@ assert('Float', '15.2.9') do
Float.class == Class
end
+assert('Float superclass', '15.2.9.2') do
+ Float.superclass == Numeric
+end
+
assert('Float#+', '15.2.9.3.1') do
a = 3.123456788 + 0.000000001
b = 3.123456789 + 1
diff --git a/test/t/hash.rb b/test/t/hash.rb
index df21dd1fa..04a9a1c24 100644
--- a/test/t/hash.rb
+++ b/test/t/hash.rb
@@ -5,6 +5,10 @@ assert('Hash', '15.2.13') do
Hash.class == Class
end
+assert('Hash superclass', '15.2.13.2') do
+ Hash.superclass == Object
+end
+
assert('Hash#==', '15.2.13.4.1') do
({ 'abc' => 'abc' } == { 'abc' => 'abc' }) and
not ({ 'abc' => 'abc' } == { 'cba' => 'cba' })
diff --git a/test/t/indexerror.rb b/test/t/indexerror.rb
index d0cb81f32..d7c8ba148 100644
--- a/test/t/indexerror.rb
+++ b/test/t/indexerror.rb
@@ -4,3 +4,8 @@
assert('IndexError', '15.2.33') do
IndexError.class == Class
end
+
+assert('IndexError superclass', '15.2.33.2') do
+ IndexError.superclass == StandardError
+end
+
diff --git a/test/t/integer.rb b/test/t/integer.rb
index 8c112861a..872723445 100644
--- a/test/t/integer.rb
+++ b/test/t/integer.rb
@@ -5,6 +5,10 @@ assert('Integer', '15.2.8') do
Integer.class == Class
end
+assert('Integer superclass', '15.2.8.2') do
+ Integer.superclass == Numeric
+end
+
assert('Integer#+', '15.2.8.3.1') do
a = 1+1
b = 1+1.0
diff --git a/test/t/module.rb b/test/t/module.rb
index a5331e96d..95fbb7a86 100644
--- a/test/t/module.rb
+++ b/test/t/module.rb
@@ -5,6 +5,10 @@ assert('Module', '15.2.2') do
Module.class == Class
end
+assert('Module superclass', '15.2.2.2') do
+ Module.superclass == Object
+end
+
assert('Module#const_defined?', '15.2.2.4.20') do
module Test4ConstDefined
Const4Test4ConstDefined = true
diff --git a/test/t/nameerror.rb b/test/t/nameerror.rb
index 67451ecf8..8e57ac18b 100644
--- a/test/t/nameerror.rb
+++ b/test/t/nameerror.rb
@@ -5,6 +5,10 @@ assert('NameError', '15.2.31') do
NameError.class == Class
end
+assert('NameError superclass', '15.2.31.2') do
+ NameError.superclass == StandardError
+end
+
# TODO 15.2.31.2.1 NameError#name
assert('NameError#initialize', '15.2.31.2.2') do
diff --git a/test/t/nomethoderror.rb b/test/t/nomethoderror.rb
index 9eb122158..caab04a41 100644
--- a/test/t/nomethoderror.rb
+++ b/test/t/nomethoderror.rb
@@ -11,3 +11,8 @@ assert('NoMethodError', '15.2.32') do
NoMethodError.class == Class and e2.class == NoMethodError
end
+
+assert('NoMethodError superclass', '15.2.32.2') do
+ NoMethodError.superclass == NameError
+end
+
diff --git a/test/t/numeric.rb b/test/t/numeric.rb
index 924889a0e..3cdb9a8cf 100644
--- a/test/t/numeric.rb
+++ b/test/t/numeric.rb
@@ -5,6 +5,10 @@ assert('Numeric', '15.2.7') do
Numeric.class == Class
end
+assert('Numeric superclass', '15.2.7.2') do
+ Numeric.superclass == Object
+end
+
assert('Numeric#+@', '15.2.7.4.1') do
+1 == +1
end
diff --git a/test/t/object.rb b/test/t/object.rb
index 96929031b..7dfaf6589 100644
--- a/test/t/object.rb
+++ b/test/t/object.rb
@@ -4,3 +4,8 @@
assert('Object', '15.2.1') do
Object.class == Class
end
+
+assert('Object superclass', '15.2.1.2') do
+ Object.superclass == BasicObject
+end
+
diff --git a/test/t/proc.rb b/test/t/proc.rb
index 6d98cb40c..c0a1cf90f 100644
--- a/test/t/proc.rb
+++ b/test/t/proc.rb
@@ -5,6 +5,10 @@ assert('Proc', '15.2.17') do
Proc.class == Class
end
+assert('Proc superclass', '15.2.17.2') do
+ Proc.superclass == Object
+end
+
assert('Proc.new', '15.2.17.3.1') do
a = nil
diff --git a/test/t/range.rb b/test/t/range.rb
index 05bac8779..691ca7898 100644
--- a/test/t/range.rb
+++ b/test/t/range.rb
@@ -5,6 +5,10 @@ assert('Range', '15.2.14') do
Range.class == Class
end
+assert('Range superclass', '15.2.14.2') do
+ Range.superclass == Object
+end
+
assert('Range#==', '15.2.14.4.1') do
(1..10) == (1..10) and not (1..10) == (1..100)
end
diff --git a/test/t/rangeerror.rb b/test/t/rangeerror.rb
index 7edb5d2d9..57afdc4bd 100644
--- a/test/t/rangeerror.rb
+++ b/test/t/rangeerror.rb
@@ -4,3 +4,8 @@
assert('RangeError', '15.2.26') do
RangeError.class == Class
end
+
+assert('RangeError superclass', '15.2.26.2') do
+ RangeError.superclass == StandardError
+end
+
diff --git a/test/t/standarderror.rb b/test/t/standarderror.rb
index 550c337c1..3868d7567 100644
--- a/test/t/standarderror.rb
+++ b/test/t/standarderror.rb
@@ -4,3 +4,8 @@
assert('StandardError', '15.2.23') do
StandardError.class == Class
end
+
+assert('StandardError superclass', '15.2.23.2') do
+ StandardError.superclass == Exception
+end
+
diff --git a/test/t/string.rb b/test/t/string.rb
index ee969a696..964ec0e63 100644
--- a/test/t/string.rb
+++ b/test/t/string.rb
@@ -5,6 +5,10 @@ assert('String', '15.2.10') do
String.class == Class
end
+assert('String superclass', '15.2.10.2') do
+ String.superclass == Object
+end
+
assert('String#*', '15.2.10.5.1') do
'a' * 5 == 'aaaaa'
end
diff --git a/test/t/struct.rb b/test/t/struct.rb
index c41319f8a..798cf6728 100644
--- a/test/t/struct.rb
+++ b/test/t/struct.rb
@@ -4,3 +4,8 @@
assert('Struct', '15.2.18') do
Struct.class == Class
end
+
+assert('Struct superclass', '15.2.18.2') do
+ Struct.superclass == Object
+end
+
diff --git a/test/t/symbol.rb b/test/t/symbol.rb
index e9c310971..b28573e92 100644
--- a/test/t/symbol.rb
+++ b/test/t/symbol.rb
@@ -5,6 +5,10 @@ assert('Symbol', '15.2.11') do
Symbol.class == Class
end
+assert('Symbol superclass', '15.2.11.2') do
+ Symbol.superclass == Object
+end
+
assert('Symbol#===', '15.2.11.3.1') do
:abc === :abc and not :abc === :cba
end
diff --git a/test/t/time.rb b/test/t/time.rb
index 22fc2e7c3..7d1519f63 100644
--- a/test/t/time.rb
+++ b/test/t/time.rb
@@ -5,6 +5,10 @@ assert('Time', '15.2.19') do
Time.class == Class
end
+assert('Time superclass', '15.2.19.2') do
+ Time.superclass == Object
+end
+
assert('Time.at', '15.2.19.6.1') do
Time.at(1300000000.0)
end
diff --git a/test/t/true.rb b/test/t/true.rb
index bb648a7cd..2662f7cd8 100644
--- a/test/t/true.rb
+++ b/test/t/true.rb
@@ -5,6 +5,10 @@ assert('TrueClass', '15.2.5') do
TrueClass.class == Class
end
+assert('TrueClass superclass', '15.2.5.2') do
+ TrueClass.superclass == Object
+end
+
assert('TrueClass true', '15.2.5.1') do
true
end
diff --git a/test/t/typeerror.rb b/test/t/typeerror.rb
index c4434aa24..d48db111a 100644
--- a/test/t/typeerror.rb
+++ b/test/t/typeerror.rb
@@ -4,3 +4,8 @@
assert('TypeError', '15.2.29') do
TypeError.class == Class
end
+
+assert('TypeError superclass', '15.2.29.2') do
+ TypeError.superclass == StandardError
+end
+