зеркало из https://github.com/github/ruby.git
* 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@25490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
66f5c5eb30
Коммит
327d58f720
|
@ -1,3 +1,10 @@
|
|||
Mon Oct 26 18:37:57 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* hash.c (default_proc_arity_check): new support function.
|
||||
|
||||
* hash.c (rb_hash_initialize): should do arity check as #default_proc=.
|
||||
[ruby-core:26281]
|
||||
|
||||
Mon Oct 26 13:24:17 2009 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* ext/tk/lib/remote-tk.rb: typo fixed.
|
||||
|
|
22
hash.c
22
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче