[#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:20264] Re: Exception#initialize

From: nobu.nakada@...
Date: 2003-05-21 12:19:08 UTC
List: ruby-dev #20264
なかだです。

At Wed, 21 May 2003 14:13:44 +0900,
Yukihiro Matsumoto wrote:
> ||Errno::EXXX#initializeでerrnoのデフォルト値として各Errnoを使う
> ||ようにしてはどうかと思うんですが、やりすぎでしょうか。
> |
> |いいんじゃないでしょうか。どうぞ。
> 
> と、思ったんですが、やっぱりそもそもSytemCallError系でerrno
> を変更できることそのものが良くないような気がしました。という
> ことは、デフォルト値もなにも外側から指定すべきではないわけで
> しょう。変更します。

rb_sys_fail()で、Errnoにマッピングしてるのにさらにerrnoを指定し
てるためにエラーになります。

Rubyレベルでも自動的にErrnoができるほうがいいか悪いか。


Index: error.c
===================================================================
RCS file: /cvs/ruby/src/ruby/error.c,v
retrieving revision 1.68
diff -u -2 -p -r1.68 error.c
--- error.c	21 May 2003 08:48:02 -0000	1.68
+++ error.c	21 May 2003 12:13:45 -0000
@@ -550,5 +550,6 @@ syserr_initialize(argc, argv, self)
 	    error = mesg; mesg = Qnil;
 	}
-	if (!NIL_P(error) && st_lookup(syserr_tbl, NUM2LONG(error), &klass)) {
+	if (!NIL_P(error)) {
+	    klass = get_syserr(NUM2LONG(error));
 	    /* change class */
 	    if (TYPE(self) != T_OBJECT) { /* insurance to avoid type crash */
@@ -737,5 +738,5 @@ rb_sys_fail(mesg)
     argv[0] = mesg ? rb_str_new2(mesg) : Qnil;
     argv[1] = INT2NUM(n);
-    rb_exc_raise(rb_class_new_instance(2, argv, get_syserr(n)));
+    rb_exc_raise(rb_class_new_instance(2, argv, rb_eSystemCallError));
 }
 

Index: error.c
===================================================================
RCS file: //sharui/cvs/ruby/src/ruby/error.c,v
retrieving revision 1.68
diff -u -2 -p -r1.68 error.c
--- error.c	21 May 2003 08:48:02 -0000	1.68
+++ error.c	21 May 2003 12:16:58 -0000
@@ -728,5 +728,5 @@ rb_sys_fail(mesg)
     extern int errno;
     int n = errno;
-    VALUE argv[2];
+    VALUE argv[1];
 
     errno = 0;
@@ -736,6 +736,5 @@ rb_sys_fail(mesg)
 
     argv[0] = mesg ? rb_str_new2(mesg) : Qnil;
-    argv[1] = INT2NUM(n);
-    rb_exc_raise(rb_class_new_instance(2, argv, get_syserr(n)));
+    rb_exc_raise(rb_class_new_instance(1, argv, get_syserr(n)));
 }
 


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

In This Thread