[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20241] Re: Exception#initialize

From: nobu.nakada@...
Date: 2003-05-20 07:24:01 UTC
List: ruby-dev #20241
なかだです。

At Tue, 20 May 2003 10:09:09 +0900,
Yukihiro Matsumoto wrote:
> |Exceptionのサブクラスで、いくつかRubyレベルで触れないインスタン
> |ス変数があるので、initializeを通して初期化するようにしてみまし
> |た。
> |
> |すべての引数は省略可能です。
> |
> |NameError#initialize(msg, name)
> |NoMethodError#initialize(msg, name, args)
> |SystemCallError#initialize(msg, err)
> 
> あ、わたし、この修正について誤解してました。
> これで構いません。取り込んでくださいませんか?

リファレンスマニュアル(SystemCallError)に追加してて思ったんです
が、エラーを発生させようとすると、これでもやはりちょっと面倒で
す。

# http://www.ruby-lang.org/ja/man-1.6/index.cgi?cmd=view;name=SystemCallError

  begin
    raise Errno::ENOENT
  rescue Errno::ENOENT
    p Errno::ENOENT::Errno      # => 2
    p $!.errno                  # => nil
  end

# 現状
    raise SystemCallError.new("nonexistent file", Errno::ENOENT::Errno)

Errno::EXXX#initializeでerrnoのデフォルト値として各Errnoを使う
ようにしてはどうかと思うんですが、やりすぎでしょうか。

    raise Errno::ENOENT.new("nonexistent file")
# または
    raise Errno::ENOENT, "nonexistent file"


Index: error.c
===================================================================
RCS file: /cvs/ruby/src/ruby/error.c,v
retrieving revision 1.66
diff -u -2 -p -r1.66 error.c
--- error.c	20 May 2003 01:51:32 -0000	1.66
+++ error.c	20 May 2003 03:13:10 -0000
@@ -543,8 +543,14 @@ syserr_initialize(argc, argv, self)
     char *buf;
     VALUE error, mesg;
+    VALUE klass = rb_obj_class(self);
 
-    if (rb_scan_args(argc, argv, "11", &mesg, &error) == 1 && FIXNUM_P(mesg)) {
+    rb_scan_args(argc, argv, klass == rb_eSystemCallError ? "11" : "02",
+		 &mesg, &error);
+    if (argc == 1 && FIXNUM_P(mesg)) {
 	error = mesg;
 	mesg = Qnil;
+    }
+    if (klass != rb_eSystemCallError && NIL_P(error)) {
+	error = rb_const_get_at(klass, rb_intern("Errno"));
     }
     err = strerror(NUM2LONG(error));


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread