[#18440] racc segv revisited — "Akinori MUSHA" <knu@...>

 次のバグの件なんですが、現時点では原因究明を含めて未解決という

24 messages 2002/10/02
[#18617] Re: racc segv revisited — "Akinori MUSHA" <knu@...> 2002/11/02

At Wed, 2 Oct 2002 23:19:59 +0900,

[ruby-dev:18456] Re: break from proc-closure

From: m_seki@...
Date: 2002-10-04 03:44:53 UTC
List: ruby-dev #18456
咳です。

> |ruby 1.6.7のCVS版の方で dRuby のUnitTestが通らなくなりました。
> |いつころからかはっきり分からないですが、ruby 1.6.7 (2002-03-19)はOKで
> |(2002-06-04)では失敗します。
> 
> 試してみたのですが、これはどこがどういう風に変わったのか自分
> でもよくわかりませんでした(ダメすぎ)。
> 
> 1.6.7とCVS版で動作が違うスクリプトがいただけませんか?

すみません。まだdRuby抜きで発生させるスクリプトが書けてません。
とりあえず、drb-1.3.8を使って動作が異なるスクリプトを載せます。

 * ruby-1.6.7 (2002-03-01) OK
 * ruby-1.6.7 (2002-04-04) OK
 * ruby-1.6.7 (2002-05-20) NG
 * ruby-1.6.8 (2002-10-03) NG

でした。

== OK
* 端末1
  % ruby -v
  ruby 1.6.7 (2002-03-01) [i686-linux]

  % ruby a.rb
  druby://localhost:12345

* 端末2
  % ruby b.rb
  1 
  2
  3
  4

  % ruby b.rb 1
  1 
  2
  3
  4


== NG
* 端末1
  % ruby -v
  ruby 1.6.8 (2002-10-03) [i686-linux]

  % ruby a.rb
  druby://localhost:12345

* 端末2
  % ruby b.rb
  1 
  2
  3
  4

  % ruby b.rb 1
  1
  2  
  3
  4
  (druby://juke:1575) b.rb:12:in `obj_send': undefined method `[]' for nil (NameError)
          from (druby://juke:1575) /usr/local/lib/ruby/site_ruby/1.6/drb/drb.rb:517:in `proc
          ....


# a.rb
require 'drb/drb'
DRb.start_service('druby://localhost:12345', 1..8)
puts DRb.uri
gets


# b.rb
require 'drb/drb'

# 失敗するバージョンにする再定義
module DRb
  class DRbServer
    def obj_send(obj, msg_id, *argv)
      if Proc === obj && msg_id == :yield_call
	if argv.size == 1
	  ary = argv
	else
	  ary = [argv]
	end
	ary.collect(&obj)[0]
	# it = ary.collect(&obj)
	# raise(LocalJumpError, 'break from proc-closure') if it.nil?
	# it[0]
      else
	obj.__send__(msg_id, *argv)
      end
    end
  end
end

def test(uri)
  ary = DRbObject.new(nil, uri)
  ary.each do |x|
    puts x
    break if x == 4
  end
end

uri = 'druby://localhost:12345'
DRb.start_service

if ARGV.shift
  test(uri)
else
  ary = DRbObject.new(nil, uri)
  ary.each do |x|
    puts x
    break if x == 4
  end
end


> |ですが、LocalJumpErrorはどういうときに発生するでしょうか ?
> 
> 現在では
    ...
>   * yieldしてblock->tagがないとき(※)
    ...
> ※ なんでこうなってるかよくわかりません。eval.c難しい ^^;;;

^^;

In This Thread