Hi Carlo,

On Sep 5, 2009, at 7:27 AM, Carlo Cabanilla wrote:

Hi,

I'm Carlo, I'm new to MacRuby and I'd like to contribute if possible. I found this weird bug when requiring modules that define classes that extend Forwardable and define delgates:

$ echo "require 'csv'; puts 'good'" | macirb
require 'csv'; puts 'good'
NameError: undefined local variable or method `str' for CSV::Row:Class
        from 0:in `def_delegator:'

But requiring it from a script works fine:

$ macruby -e "require 'csv'; puts 'good'"
good

Same behavior for rss/parser:

$ echo "require 'rss/parser'; puts 'good'" | macirb
require 'rss/parser'; puts 'good'
NameError: undefined local variable or method `str' for RSS::Parser:Class
        from 0:in `def_delegator:'

$ macruby -e "require 'rss/parser'; puts 'good'"
good


I traced it to the def_instance_delegator method in Forwardable:

  def def_instance_delegator(accessor, method, ali = method)
    str = %Q{
      def #{ali}(*args, &block)
        #{accessor}.send(:#{method}, *args, &block)
      end
    }

    # If it's not a class or module, it's an instance
    begin
      module_eval(str)
    rescue
      instance_eval(str)
    end
  end


I found that if I just hard code the str value as the parameters to module_eval and instance_eval, it works:

  def def_instance_delegator(accessor, method, ali = method)
    # If it's not a class or module, it's an instance
    begin
      module_eval(%Q{
      def #{ali}(*args, &block)
        #{accessor}.send(:#{method}, *args, &block)
      end
    })
    rescue
      instance_eval(%Q{
      def #{ali}(*args, &block)
        #{accessor}.send(:#{method}, *args, &block)
      end
    })
    end
  end

This is kind of hack, so I'm assuming the root cause has to do with how macirb treats variable scope? Is this a known bug? Can I help somehow?

I think this is the same bug that has been reported a few times on trac. Currently eval with Binding has a problem with method-scoped local variables. This is on the top of our TODO list right now, if you want to help you need to discover why MacRuby wrongly compiles local variables in this very specific case. The compiler is compiler.cpp. Let me know if you find anything interesting or if you have any question!

Laurent
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to