[MacRuby-devel] [MacRuby] #795: GCD inconsistently copies local variables inside blocks
Rob Gleeson
rob at flowof.info
Thu Jul 15 14:34:33 PDT 2010
Hey again,
Sorry just had another idea - since it seems like you don't want the enclosing scope/context to be evaluated in a thread, you could
try using instance_eval in a "blank" context where you won't have surrounding variables available to your block.
That, and passing arguments to the block as parameters should work but I'm way out of my depth as far as GCD goes.
Rob
----
http://robgleeson.github.com Website
http://github.com/robgleeson GitHub
rob at flowof.info E-Mail
On 15 Jul 2010, at 22:29, Rob Gleeson wrote:
> 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
>
> _______________________________________________
> 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