[MacRuby-devel] Help with bug from Cucumber codebase

M. Scott Ford scott at vaderpi.com
Wed Feb 11 12:11:41 PST 2009


And the fix.

Change rb_hash_merge to use rb_obj_dup instead of rb_hash_dup.

On Feb 11, 2009, at 2:48 PM, M. Scott Ford wrote:

> Sorry to reply to my own post but I have been playing with this all  
> day to figure out what is wrong. I have narrowed the problem down to  
> the merge method, but I am not sure how to fix it. Here are some  
> test cases. These all pass in ruby 1.9.1. The first one fails in  
> MacRuby trunk, but the other two pass.
>
> h = Hash.new do |h, k|
>  12
> end
> h = h.merge({1 => 2})
> assert_equal(h[1], 2)
> assert_equal(h[:random], 12)
>
> h = Hash.new do |h, k|
>  12
> end
> h.merge!({1 => 2})
> assert_equal(h[1], 2)
> assert_equal(h[:random], 12)
>
> h = Hash.new do |h, k|
>  12
> end
> h.merge({1 => 2})
> assert_equal(h[1], 12)
> assert_equal(h[:random], 12)
>
>
> On Feb 11, 2009, at 11:53 AM, M. Scott Ford wrote:
>
>> Hello,
>>
>> I have been trying to get cucumber working with MacRuby, and I have  
>> run into a bug. I have tracked the source of it down to a block of  
>> code in cucumber's code base[BLOCK 1]. I have condensed this down  
>> to a much smaller example[BLOCK 2]. In ruby 1.9.1 the second block  
>> results in 'yellow,bold', but in macruby the second block results  
>> in nil.
>>
>> My guess is that there is a bug in the merge implementation or the  
>> constructor implementation. I am not familiar enough with ruby to  
>> know which, so I will take a look at both. I feel this should be  
>> added as a test case, but I am not sure where to put that, since I  
>> am new to the project. Any tips?
>>
>> -Scott
>>
>> ----- BLOCK 1 ----------
>>     ALIASES = Hash.new do |h,k|
>>       if k.to_s =~ /(.*)_param/
>>         h[$1] + ',bold'
>>       end
>>     end.merge({
>>       'missing' => 'yellow',
>>       'pending' => 'yellow',
>>       'failed'  => 'red',
>>       'passed'  => 'green',
>>       'outline' => 'cyan',
>>       'skipped' => 'cyan',
>>       'comment' => 'grey',
>>       'tag'     => 'blue'
>>     })
>>
>>     if ENV['CUCUMBER_COLORS'] # Example: export  
>> CUCUMBER_COLORS="passed=red:failed=yellow"
>>       ENV['CUCUMBER_COLORS'].split(':').each do |pair|
>>         a = pair.split('=')
>>         ALIASES[a[0]] = a[1]
>>       end
>>     end
>>
>>     ALIASES.each do |method, color|
>>       unless method =~ /.*_param/
>>         code = <<-EOF
>>         def #{method}(string=nil, &proc)
>>           #{ALIASES[method].split(",").join("(") + "(string, &proc"  
>> + ")" * ALIASES[method].split(",").length}
>>         end
>>         # This resets the colour to the non-param colour
>>         def #{method}_param(string=nil, &proc)
>>           #{ALIASES[method+'_param'].split(",").join("(") +  
>> "(string, &proc" + ")" * ALIASES[method 
>> +'_param'].split(",").length} + #{ALIASES[method].split(",").join('  
>> + ')}
>>         end
>>         EOF
>>         eval(code)
>>       end
>>     end
>> -------------- END BLOCK 1 --------------
>>
>> ------- BLOCK 2 ------------------
>>
>> ALIASES = Hash.new do |h,k|
>> if k.to_s =~ /(.*)_param/
>>   h[$1] + ',bold'
>> end
>> end.merge({
>> 'missing' => 'yellow'
>> })
>>
>> puts ALIASES['missing_param']
>>
>> --------- END BLOCK 2 ---------
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel



More information about the MacRuby-devel mailing list