aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-12-20 14:14:07 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-12-20 14:18:20 +0900
commit435a4ca2a38f3be1f5d2db0f71487a52c8285e9c (patch)
tree11388cf5f47b7944287db1388c86eb176a019593
parent216b62aa87f069c51085e9f9abb548930370bc53 (diff)
downloadruby-435a4ca2a38f3be1f5d2db0f71487a52c8285e9c.tar.gz
Makes the receiver to FrozenError.new a keyword parameter
[Feature #16419]
-rw-r--r--error.c23
-rw-r--r--spec/ruby/core/exception/frozen_error_spec.rb2
-rw-r--r--test/ruby/test_exception.rb2
3 files changed, 17 insertions, 10 deletions
diff --git a/error.c b/error.c
index e5dc0c3852..b261f2ea04 100644
--- a/error.c
+++ b/error.c
@@ -1431,9 +1431,16 @@ exit_success_p(VALUE exc)
return Qfalse;
}
+static VALUE
+err_init_recv(VALUE exc, VALUE recv)
+{
+ if (recv != Qundef) rb_ivar_set(exc, id_recv, recv);
+ return exc;
+}
+
/*
* call-seq:
- * FrozenError.new(msg=nil, receiver=nil) -> frozen_error
+ * FrozenError.new(msg=nil, receiver: nil) -> frozen_error
*
* Construct a new FrozenError exception. If given the <i>receiver</i>
* parameter may subsequently be examined using the FrozenError#receiver
@@ -1446,14 +1453,14 @@ exit_success_p(VALUE exc)
static VALUE
frozen_err_initialize(int argc, VALUE *argv, VALUE self)
{
- VALUE mesg, recv;
+ ID keywords[1];
+ VALUE values[numberof(keywords)], options;
- argc = rb_scan_args(argc, argv, "02", &mesg, &recv);
- if (argc > 1) {
- argc--;
- rb_ivar_set(self, id_recv, recv);
- }
+ argc = rb_scan_args(argc, argv, "*:", NULL, &options);
+ keywords[0] = id_receiver;
+ rb_get_kwargs(options, keywords, 0, numberof(values), values);
rb_call_super(argc, argv);
+ err_init_recv(self, values[0]);
return self;
}
@@ -1503,7 +1510,7 @@ name_err_init_attr(VALUE exc, VALUE recv, VALUE method)
rb_control_frame_t *cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(ec->cfp);
cfp = rb_vm_get_ruby_level_next_cfp(ec, cfp);
rb_ivar_set(exc, id_name, method);
- if (recv != Qundef) rb_ivar_set(exc, id_recv, recv);
+ err_init_recv(exc, recv);
if (cfp) rb_ivar_set(exc, id_iseq, rb_iseqw_new(cfp->iseq));
return exc;
}
diff --git a/spec/ruby/core/exception/frozen_error_spec.rb b/spec/ruby/core/exception/frozen_error_spec.rb
index 7b356253c4..1b5ea71148 100644
--- a/spec/ruby/core/exception/frozen_error_spec.rb
+++ b/spec/ruby/core/exception/frozen_error_spec.rb
@@ -12,7 +12,7 @@ describe "FrozenError.new" do
ruby_version_is "2.7" do
it "should take optional receiver argument" do
o = Object.new
- FrozenError.new("msg", o).receiver.should equal(o)
+ FrozenError.new("msg", receiver: o).receiver.should equal(o)
end
end
end
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index c7cfe816b0..94b59dac47 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -845,7 +845,7 @@ end.join
def test_frozen_error_initialize
obj = Object.new
- exc = FrozenError.new("bar", obj)
+ exc = FrozenError.new("bar", receiver: obj)
assert_equal("bar", exc.message)
assert_same(obj, exc.receiver)