[MacRuby-devel] [MacRuby] #752: description -> to_s infinite loop

MacRuby ruby-noreply at macosforge.org
Fri Jun 18 17:29:57 PDT 2010


#752: description -> to_s infinite loop
--------------------------------------+-------------------------------------
 Reporter:  ryand-ruby@…              |        Owner:  lsansonetti@…        
     Type:  defect                    |       Status:  closed               
 Priority:  blocker                   |    Milestone:  MacRuby 0.7          
Component:  MacRuby                   |   Resolution:  wontfix              
 Keywords:                            |  
--------------------------------------+-------------------------------------
Changes (by martinlagardette@…):

  * status:  new => closed
  * resolution:  => wontfix
  * milestone:  => MacRuby 0.7


Old description:

> I had a failing unit test that was causing an infinite stack trace. The
> code in question was:
>
> {{{
> class SimpleNodeData
>   attr_accessor :name, :path, :image, :expandable, :selectable,
> :container
>
>   def initialize name = "Untitled", path = nil
>     self.name       = name
>     self.path       = path
>     self.expandable = true
>     self.selectable = true
>     self.container  = true
>   end
>
>   def compare other
>     if SimpleNodeData === other
>       return name.compare other.name
>     end
>     return NSOrderedAscending
>   end
>
>   alias :<=> :compare
>
>   def description
>     "%@ - '%@' expandable: %@, selectable: %@, container: %@" %
>       [super, name, expandable, selectable, container]
>   end
>
>   alias :to_s :description
> end
> }}}
>
> That last alias is the real problem... comment it out and everything
> works fine.
>
> I believe the failing test line was:
>
> {{{
>       assert child.representedObject.path,
> child.representedObject.description
> }}}
>
> and the representedObject was a SimpleNodeData instance.

New description:

 I had a failing unit test that was causing an infinite stack trace. The
 code in question was:

 {{{
 #!ruby
 class SimpleNodeData
   attr_accessor :name, :path, :image, :expandable, :selectable, :container

   def initialize name = "Untitled", path = nil
     self.name       = name
     self.path       = path
     self.expandable = true
     self.selectable = true
     self.container  = true
   end

   def compare other
     if SimpleNodeData === other
       return name.compare other.name
     end
     return NSOrderedAscending
   end

   alias :<=> :compare

   def description
     "%@ - '%@' expandable: %@, selectable: %@, container: %@" %
       [super, name, expandable, selectable, container]
   end

   alias :to_s :description
 end
 }}}

 That last alias is the real problem... comment it out and everything works
 fine.

 I believe the failing test line was:

 {{{
       assert child.representedObject.path,
 child.representedObject.description
 }}}

 and the representedObject was a SimpleNodeData instance.

--

Comment:

 The problem is the following line:
 {{{
 #!ruby
   alias :to_s :description
 }}}

 When the programmer calls `-description` on MacRuby classes, MacRuby
 actually calls `#to_s`. This is both syntaxic sugar and needed in some
 cases. This also means that aliasing to_s to description is not needed.

 The reason it crashes it because of the `super` call actually.[[BR]]
 When you try to print it, Obj-C will send `-description` on the `super`
 object, which will actually dispatched to `#to_s`, because that's how
 `-description` is implemented on it.

 Note that your code works well if you replace `super` by `self`, since
 `self` re-implements `-description`. But MacRuby's default `-description`
 aliases to `#to_s` :-)

 Closing this as won't fix :-)

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/752#comment:1>
MacRuby <http://macruby.org/>



More information about the MacRuby-devel mailing list