diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-05-15 07:57:07 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-05-15 07:57:07 +0000 |
commit | 068170e47ac498d4c905bae04fe55c5addf05d64 (patch) | |
tree | e924cfdb7d42babbfe13f49e1ecc29a002a55480 /object.c | |
parent | 42fd4ff686071388417a5533a6d86d75f89ecbdc (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.c | 24 |
1 files changed, 15 insertions, 9 deletions
@@ -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 |