summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-05-15 07:57:07 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-05-15 07:57:07 +0000
commit068170e47ac498d4c905bae04fe55c5addf05d64 (patch)
treee924cfdb7d42babbfe13f49e1ecc29a002a55480 /object.c
parent42fd4ff686071388417a5533a6d86d75f89ecbdc (diff)
* object.c (rb_mod_le): returns nil if two classes/modules are not
in class-superclass relationship. * object.c (rb_mod_cmp): uses new rb_mod_le() behavior. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3802 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'object.c')
-rw-r--r--object.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/object.c b/object.c
index 49e7347ee0..c9fc29d5bd 100644
--- a/object.c
+++ b/object.c
@@ -597,6 +597,8 @@ static VALUE
rb_mod_le(mod, arg)
VALUE mod, arg;
{
+ VALUE start = mod;
+
if (mod == arg) return Qtrue;
switch (TYPE(arg)) {
case T_MODULE:
@@ -611,7 +613,13 @@ rb_mod_le(mod, arg)
return Qtrue;
mod = RCLASS(mod)->super;
}
- return Qfalse;
+ /* not mod < arg; check if mod > arg */
+ while (arg) {
+ if (RCLASS(arg)->m_tbl == RCLASS(start)->m_tbl)
+ return Qfalse;
+ arg = RCLASS(arg)->super;
+ }
+ return Qnil;
}
static VALUE
@@ -650,6 +658,7 @@ rb_mod_cmp(mod, arg)
VALUE mod, arg;
{
VALUE start = mod;
+ VALUE cmp;
if (mod == arg) return INT2FIX(0);
switch (TYPE(arg)) {
@@ -660,16 +669,13 @@ rb_mod_cmp(mod, arg)
return Qnil;
}
- if (rb_mod_le(mod, arg)) {
- return INT2FIX(-1);
- }
+ cmp = rb_mod_le(mod, arg);
- while (arg) {
- if (RCLASS(arg)->m_tbl == RCLASS(start)->m_tbl)
- return INT2FIX(1);
- arg = RCLASS(arg)->super;
+ if (cmp) {
+ return INT2FIX(-1);
}
- return Qnil;
+ if (NIL_P(cmp)) return Qnil;
+ return INT2FIX(1);
}
static VALUE