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/