[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:801

From: SASADA Koichi <ko1 atdot.net>
Date: Sat, 04 Feb 2006 08:46:24 +0900
Subject: [yarv-dev:801] fixed> Re: open> Marshal.dump(NoMethodError)

 ささだです。

 ありがたくパッチを適用しました。

Minero Aoki wrote:
> 青木です。
> 
> 以下のプログラムで SEGV します。
> 
> ~/c/yarv/BUGS/test_marshal % cat test_marshal.rb
> begin
>   no_such_method()
> rescue => err
>   Marshal.dump(err)
> end
> 
> ~/c/yarv/BUGS/test_marshal % ../../ruby -v test_marshal.rb
> ruby 1.9.0 (2005-11-18) [x86_64-linux]
> YARVCore 0.3.3 (rev: 356) [opts: ]
> DBG> : "test_marshal.rb:4:in `rescue in <main>'"
> DBG> : "test_marshal.rb:1:in `<main>'"
> -- stack frame ------------
> 0x2a95ee2010 (0000): 00000001
> 0x2a95ee2018 (0001): 00000004
> 0x2a95ee2020 (0002): 00000004
> 0x2a95ee2028 (0003): 2a95eafec8
> 0x2a95ee2030 (0004): 2a95eafe28
> 0x2a95ee2038 (0005): 0066b701
> 0x2a95ee2040 (0006): 2a95eb38c0
> 0x2a95ee2048 (0007): 2a95eafe28
> 0x2a95ee2050 (0008): 00000001 <- lfp <- dfp
> -- control frame ----------
> c:0005 p:-001 s:0009 b:0009 l:0008 d:0008 CFUNC  i:dump     s:         -  
> c:0004 p:0033 s:0006 b:0006 l:-754 d:0005 BLOCK  i:rescue in <main> s:         -  
> c:0003 p:0008 s:0004 b:0004 l:-754 d:-754 TOP    i:<main>   s:         -  
> c:0002 p:-001 s:0001 b:0001 l:0000 d:0000 FINISH i:-        s:         -  
> c:0001 p:-001 s:0000 b:-001 l:0000 d:0000 ------ i:-        s:         -  
> ---------------------------
> [BUG] Segmentation fault
> ruby 1.9.0 (2005-11-18) [x86_64-linux]
> 
> zsh: 25861 abort (core dumped)  ../../ruby -v test_marshal.rb
> 
> 原因は vm.c:th_eval_body() の以下のところだと思います。
> 
>     if(state == TAG_RAISE){
>       rb_ivar_set(err, idThrowState, state);
>     }
> 
> ここで例外オブジェクトのインスタンス変数 #__ThrowState に TAG_RAISE (0x6)
> をセットしているため、Marshal.dump すると Qundef として扱われてしまい、
> 落ちます。
> 
> 以下のパッチのように FIXNUM にしたら落ちなくなりました。
> 
> Index: insns.def
> ===================================================================
> --- insns.def	(revision 358)
> +++ insns.def	(working copy)
> @@ -1590,7 +1590,9 @@
>        th->state = GET_THROWOBJ_STATE(err);
>      }
>      else{
> -      th->state = rb_ivar_get(err, idThrowState);
> +      VALUE st;
> +      st = rb_ivar_get(err, idThrowState);
> +      th->state = FIX2INT(st);
>      }
>      return err;
>    }
> Index: vm.c
> ===================================================================
> --- vm.c	(revision 358)
> +++ vm.c	(working copy)
> @@ -1289,7 +1289,7 @@
>      
>      err = th->errinfo;
>      if(state == TAG_RAISE){
> -      rb_ivar_set(err, idThrowState, state);
> +      rb_ivar_set(err, idThrowState, INT2FIX(state));
>      }
>      
>    exception_handler:
> 
> --
> 青木峰郎
> 


-- 
// SASADA Koichi at atdot dot net


-- 
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

       799 2006-02-02 20:06 [aamine loveruby.net ] open> Marshal.dump(NoMethodError)       
->     801 2006-02-04 08:46 ┗[ko1 atdot.net       ] fixed> Re: open> Marshal.dump(NoMethodError)