summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-01-08 18:13:35 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-01-08 18:14:04 +0900
commit5b06dd3a4237114aac093e560abe24f87536b621 (patch)
tree4a36c5e26f3641104f691b11d832a4980af661c2 /hash.c
parentb8fa18079df01df41debc4dbc63e22ee98425b5e (diff)
Hoisted out call_default_proc
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/hash.c b/hash.c
index d99d41a10d..4f72b4ca36 100644
--- a/hash.c
+++ b/hash.c
@@ -1942,17 +1942,21 @@ rb_hash_rehash(VALUE hash)
return hash;
}
+static VALUE
+call_default_proc(VALUE proc, VALUE hash, VALUE key)
+{
+ VALUE args[2] = {hash, key};
+ return rb_proc_call_with_block(proc, 2, args, Qnil);
+}
+
VALUE
rb_hash_default_value(VALUE hash, VALUE key)
{
- VALUE args[2];
if (LIKELY(rb_method_basic_definition_p(CLASS_OF(hash), id_default))) {
VALUE ifnone = RHASH_IFNONE(hash);
if (!FL_TEST(hash, RHASH_PROC_DEFAULT)) return ifnone;
if (key == Qundef) return Qnil;
- args[0] = hash;
- args[1] = key;
- return rb_proc_call_with_block(ifnone, 2, args, Qnil);
+ return call_default_proc(ifnone, hash, key);
}
else {
return rb_funcall(hash, id_default, 1, key);
@@ -2119,15 +2123,13 @@ rb_hash_fetch(VALUE hash, VALUE key)
static VALUE
rb_hash_default(int argc, VALUE *argv, VALUE hash)
{
- VALUE args[2], ifnone;
+ VALUE ifnone;
rb_check_arity(argc, 0, 1);
ifnone = RHASH_IFNONE(hash);
if (FL_TEST(hash, RHASH_PROC_DEFAULT)) {
if (argc == 0) return Qnil;
- args[0] = hash;
- args[1] = argv[0];
- return rb_proc_call_with_block(ifnone, 2, args, Qnil);
+ return call_default_proc(ifnone, hash, argv[0]);
}
return ifnone;
}