山本です。

>これもException#exceptionが常にException#initializeを呼ぶことを
>利用していたためですね。これはRegexpやRangeと同様にすれば通ると
>思うのですが、それとも#exceptionは特別扱いにしたほうがいいでしょ
>うか。

元々の問題は NameError のような一部例外で super が呼ばれていない
という物だったと思います。Exception#exception で initialize と initalize_copy の
両方が呼ばれてるのも気持ち悪いですし、Exception#exception は以前の挙動で
いいんじゃないかという気がします。


////////////////////////////
// コード

class Exception
  alias initialize_ initialize
  def initialize(*a)
    initialize_(*a)
    puts "initialize"
  end
  alias initialize_copy_ initialize_copy
  def initialize_copy(*a)
    initialize_copy_(*a)
    puts "initialize_copy"
  end
end

e = NameError.new
puts "-------------------------"
e.exception("aaa")

////////////////////////////
// 以前の挙動

E:\>ruby -v d.rb
ruby 1.8.2 (2005-05-12) [i386-bccwin32]
-------------------------
initialize_copy

////////////////////////////
// 現在の挙動

E:\ruby-cvs\bcc32_1_8>ruby18 -v \d.rb
ruby 1.8.3 (2005-05-17) [i386-bccwin32]
initialize
-------------------------
initialize_copy
initialize

/////////////////////////
// 添付パッチ後

E:\ruby-cvs\bcc32_1_8>ruby18 -v \d.rb
ruby 1.8.3 (2005-05-17) [i386-bccwin32]
initialize
-------------------------
initialize_copy

Index: error.c
===================================================================
RCS file: /src/ruby/error.c,v
retrieving revision 1.85.2.13
diff -u -w -b -p -r1.85.2.13 error.c
--- error.c	14 May 2005 14:59:53 -0000	1.85.2.13
+++ error.c	18 May 2005 07:12:00 -0000
@@ -384,7 +384,7 @@ exc_exception(argc, argv, self)
     if (argc == 0) return self;
     if (argc == 1 && self == argv[0]) return self;
     exc = rb_obj_clone(self);
-    rb_obj_call_init(exc, argc, argv);
+    exc_initialize(argc, argv, exc);
 
     return exc;
 }