From: "Florian Aßmann" Date: 2010-06-11T17:40:26+09:00 Subject: [ruby-core:30730] [Bug #3420] Module#method calling <=> causes SystemStackError Issue #3420 has been updated by Florian A��mann. Please let me ask, why as from 1.9.2: Sat Oct 24 13:38:45 2009 Yukihiro Matsumoto * object.c (rb_obj_cmp): defines Object#<=>. [ruby-core:24063] Before that all ruby implementations did: ruby-1.8.7-p249 > BrokenComparable = Module.new { def ==(other) self <=> other end } BrokenClass = Class.new { include BrokenComparable } BrokenClass.new == nil NoMethodError: undefined method `<=>' for # from (irb):1:in `==' from (irb):3 Which is a lot more verbose on what happened and allowed people to hook into method missing and delegate it to a wrapped object as a SystemStackError. Now, if there is a global defined <=> for all classes which mix in the kernel module (all but BasicObject) I'd suspect it should either just work (not calling rb_equal from rb_obj_cmp) as long people are used to 1.8.x/1.9.1 or be more verbose on what happened. Removing the call of rb_equal in rb_obj_cmp would not just save the extra test of obj identity but also work for all objects; which seems to me like the intended behavior when adding a method like <=> to almost all objects. Otherwise it should be stated in the docs of Comparable what happens if one does not and what the currently undocumented Object#<=> actually does since a SystemStackError only adds confusion and isn't obvious at all. Regards Florian ---------------------------------------- http://redmine.ruby-lang.org/issues/show/3420 ---------------------------------------- http://redmine.ruby-lang.org