[MacRuby] #1339: macruby crashes when initialize() with optional arg called from File.open block
MacRuby
ruby-noreply at macosforge.org
Wed Jun 29 10:00:34 PDT 2011
#1339: macruby crashes when initialize() with optional arg called from File.open
block
-------------------------------+--------------------------------------------
Reporter: bigwood@… | Owner: lsansonetti@…
Type: defect | Status: new
Priority: critical | Milestone:
Component: MacRuby | Keywords:
-------------------------------+--------------------------------------------
Changes (by watson1978@…):
* milestone: MacRuby 0.11 =>
Old description:
> the following script will always crash.
> 0) TTT.initialize() must have an optional argument (past the first
> argument)
> 1) TTT.new() has to be called from a File.open() block
>
> #!/usr/local/bin/macruby -w
>
> # see http://www.macruby.org/documentation/gcd.html
> class Array
> def parallel_map(&block)
> result = []
> # Creating a group to synchronize block execution.
> group = Dispatch::Group.new
> # We will access the `result` array from within this serial queue,
> # as without a GIL we cannot assume array access to be thread-safe.
> result_queue = Dispatch::Queue.new('access-
> queue.#{result.object_id}')
> 0.upto(size - 1) do |idx|
> # Dispatch a task to the default concurrent queue.
> Dispatch::Queue.concurrent.async(group) do
> #temp = block.call(self[idx])
> temp = block[self[idx]] # same
> #temp = block === self[idx] # same
> #puts "sending #{idx}: #{self[idx]} with #{block.class}\n"
> result_queue.async(group) { result[idx] = temp }
> end
> end
> # Wait for all the blocks to finish.
> group.wait
> result
> end
> end
>
> class TTT
> #def initialize(string)
> def initialize(string, dup = false)
> end
> end
>
> source = $0
> (1..2).to_a.parallel_map do |idx|
> #puts idx
> File.open(source) do |file|
> #Dir.chdir("/tmp") do
> TTT.new("")
> end
> end
New description:
the following script will always crash.[[BR]]
0) TTT.initialize() must have an optional argument (past the first
argument)[[BR]]
1) TTT.new() has to be called from a File.open() block
{{{
#!ruby
#!/usr/local/bin/macruby -w
# see http://www.macruby.org/documentation/gcd.html
class Array
def parallel_map(&block)
result = []
# Creating a group to synchronize block execution.
group = Dispatch::Group.new
# We will access the `result` array from within this serial queue,
# as without a GIL we cannot assume array access to be thread-safe.
result_queue = Dispatch::Queue.new('access-queue.#{result.object_id}')
0.upto(size - 1) do |idx|
# Dispatch a task to the default concurrent queue.
Dispatch::Queue.concurrent.async(group) do
#temp = block.call(self[idx])
temp = block[self[idx]] # same
#temp = block === self[idx] # same
#puts "sending #{idx}: #{self[idx]} with #{block.class}\n"
result_queue.async(group) { result[idx] = temp }
end
end
# Wait for all the blocks to finish.
group.wait
result
end
end
class TTT
#def initialize(string)
def initialize(string, dup = false)
end
end
source = $0
(1..2).to_a.parallel_map do |idx|
#puts idx
File.open(source) do |file|
#Dir.chdir("/tmp") do
TTT.new("")
end
end
}}}
--
--
Ticket URL: <http://www.macruby.org/trac/ticket/1339#comment:1>
MacRuby <http://macruby.org/>
More information about the macruby-tickets
mailing list