From 121b2b2802a3219821c23435f9ca8db6ff89aac1 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 26 Oct 2009 10:30:15 +0000 Subject: * hash.c (default_proc_arity_check): new support function. * hash.c (rb_hash_initialize): should do arity check as #default_proc=. [ruby-core:26281] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@25490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- hash.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'hash.c') diff --git a/hash.c b/hash.c index 6c8fa5e0c..ef8b9a82e 100644 --- a/hash.c +++ b/hash.c @@ -268,6 +268,17 @@ rb_hash_modify(VALUE hash) rb_hash_tbl(hash); } +static void +default_proc_arity_check(VALUE proc) +{ + int n = rb_proc_arity(proc); + + if (rb_proc_lambda_p(proc) && n != 2 && (n >= 0 || n < -3)) { + if (n < 0) n = -n-1; + rb_raise(rb_eTypeError, "default_proc takes two arguments (2 for %d)", n); + } +} + /* * call-seq: * Hash.new => hash @@ -313,7 +324,9 @@ rb_hash_initialize(int argc, VALUE *argv, VALUE hash) if (argc > 0) { rb_raise(rb_eArgError, "wrong number of arguments"); } - RHASH(hash)->ifnone = rb_block_proc(); + ifnone = rb_block_proc(); + default_proc_arity_check(ifnone); + RHASH(hash)->ifnone = ifnone; FL_SET(hash, HASH_PROC_DEFAULT); } else { @@ -667,7 +680,6 @@ static VALUE rb_hash_set_default_proc(VALUE hash, VALUE proc) { VALUE b; - int n; rb_hash_modify(hash); b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); @@ -677,11 +689,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc) rb_obj_classname(proc)); } proc = b; - n = rb_proc_arity(proc); - if (rb_proc_lambda_p(proc) && n != 2 && (n >= 0 || n < -3)) { - if (n < 0) n = -n-1; - rb_raise(rb_eTypeError, "default_proc takes two arguments (2 for %d)", n); - } + default_proc_arity_check(proc); RHASH(hash)->ifnone = proc; FL_SET(hash, HASH_PROC_DEFAULT); return proc; -- cgit