[MacRuby-devel] [MacRuby] #795: GCD inconsistently copies local variables inside blocks

Rob Gleeson rob at flowof.info
Thu Jul 15 14:29:13 PDT 2010


Hey ernest,

I haven't got any experience with GCD but wouldn't it make more sense if block arguments were received as parameters to the block?
This would make the variables block-local.

Dispatch::Queue.new("i").sync { |i| # block local 'i' }

Remember blocks in Ruby are closures, too. 

Rob
----
http://robgleeson.github.com	Website
http://github.com/robgleeson   GitHub
rob at flowof.info			        E-Mail


On 15 Jul 2010, at 21:47, MacRuby wrote:

> #795: GCD inconsistently copies local variables inside blocks
> ----------------------------------------+-----------------------------------
> Reporter:  ernest.prabhakar@…          |       Owner:  lsansonetti@…        
>     Type:  defect                      |      Status:  new                  
> Priority:  critical                    |   Milestone:                       
> Component:  MacRuby                     |    Keywords:                       
> ----------------------------------------+-----------------------------------
> The expectation is that Ruby blocks will have their local variables copied
> before being passed to GCD, to avoid errors from accessing them after they
> are destroyed.
> 
> However, that does not seem to always happen.  For example:
> 
>     $ macruby -e 'i=0; Dispatch::Queue.new("i").sync {i = 42}; puts i'
> 
> returns '0' as expected.  However, this does not:
> 
>     $ macirb
>     irb(main):001:0> i=0; Dispatch::Queue.new("i").sync {i = 42}; puts i
>     42
>     => nil
> 
> It appears to be copied properly in the block_spec.rb test:
> 
>     it "should create const copies of dynamic (local) variables" do
>       i = 42
>       @q.sync {i = 1}
>       i.should == 42
>     end
> 
> But not in the README.rdoc for the dispatch module (aka
> dispatch_methods.rb sample):
> 
>     n = 0
>     job = Dispatch::Job.new { n = 21 }
>     job.join
>     puts "n (after): #{n} => 0?!?" # [returns 21, not 0]
> 
> Any suggestions?
> 
> -- 
> Ticket URL: <http://www.macruby.org/trac/ticket/795>
> MacRuby <http://macruby.org/>
> 
> _______________________________________________
> 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