[前][次][番号順一覧][スレッド一覧]

ruby-changes:50384

From: nobu <ko1@a...>
Date: Tue, 20 Feb 2018 19:08:33 +0900 (JST)
Subject: [ruby-changes:50384] nobu:r62500 (trunk): error.c: bypass Exception.new

nobu	2018-02-20 19:08:27 +0900 (Tue, 20 Feb 2018)

  New Revision: 62500

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62500

  Log:
    error.c: bypass Exception.new
    
    * error.c (rb_exc_new, rb_exc_new_str): instantiate exception
      object directly without Exception.new method call.
    
    Redefinition of class method `new` is an outdated style, and
    internal exceptions should not be affected by it.

  Modified files:
    trunk/bootstraptest/test_exception.rb
    trunk/error.c
Index: error.c
===================================================================
--- error.c	(revision 62499)
+++ error.c	(revision 62500)
@@ -882,7 +882,7 @@ VALUE rb_eSystemCallError; https://github.com/ruby/ruby/blob/trunk/error.c#L882
 VALUE rb_mErrno;
 static VALUE rb_eNOERROR;
 
-static ID id_new, id_cause, id_message, id_backtrace;
+static ID id_cause, id_message, id_backtrace;
 static ID id_name, id_key, id_args, id_Errno, id_errno, id_i_path;
 static ID id_receiver, id_iseq, id_local_variables;
 static ID id_private_call_p;
@@ -895,7 +895,8 @@ static ID id_private_call_p; https://github.com/ruby/ruby/blob/trunk/error.c#L895
 VALUE
 rb_exc_new(VALUE etype, const char *ptr, long len)
 {
-    return rb_funcall(etype, id_new, 1, rb_str_new(ptr, len));
+    VALUE mesg = rb_str_new(ptr, len);
+    return rb_class_new_instance(1, &mesg, etype);
 }
 
 VALUE
@@ -908,7 +909,7 @@ VALUE https://github.com/ruby/ruby/blob/trunk/error.c#L909
 rb_exc_new_str(VALUE etype, VALUE str)
 {
     StringValue(str);
-    return rb_funcall(etype, id_new, 1, str);
+    return rb_class_new_instance(1, &str, etype);
 }
 
 /*
@@ -2415,7 +2416,6 @@ Init_Exception(void) https://github.com/ruby/ruby/blob/trunk/error.c#L2416
 
     rb_define_global_function("warn", rb_warn_m, -1);
 
-    id_new = rb_intern_const("new");
     id_cause = rb_intern_const("cause");
     id_message = rb_intern_const("message");
     id_backtrace = rb_intern_const("backtrace");
Index: bootstraptest/test_exception.rb
===================================================================
--- bootstraptest/test_exception.rb	(revision 62499)
+++ bootstraptest/test_exception.rb	(revision 62500)
@@ -402,7 +402,7 @@ assert_equal 'nil', %q{ https://github.com/ruby/ruby/blob/trunk/bootstraptest/test_exception.rb#L402
   exc.inspect
 }, '[ruby-dev:32608]'
 
-assert_equal 'exception class/object expected', %q{
+assert_equal 'divided by 0', %q{
   class ZeroDivisionError
     def self.new(message)
       42

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]