mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
hash.c: SET_PROC_DEFAULT
* hash.c (SET_PROC_DEFAULT): new macro to set the default proc. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54058 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7522e06424
commit
e684069042
1 changed files with 14 additions and 11 deletions
25
hash.c
25
hash.c
|
@ -36,6 +36,8 @@
|
||||||
FL_UNSET_RAW(hash, HASH_PROC_DEFAULT), \
|
FL_UNSET_RAW(hash, HASH_PROC_DEFAULT), \
|
||||||
RHASH_SET_IFNONE(hash, ifnone))
|
RHASH_SET_IFNONE(hash, ifnone))
|
||||||
|
|
||||||
|
#define SET_PROC_DEFAULT(hash, proc) set_proc_default(hash, proc)
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
has_extra_methods(VALUE klass)
|
has_extra_methods(VALUE klass)
|
||||||
{
|
{
|
||||||
|
@ -528,14 +530,19 @@ tbl_update(VALUE hash, VALUE key, tbl_update_func func, st_data_t optional_arg)
|
||||||
RHASH_UPDATE_ITER(hash, RHASH_ITER_LEV(hash), key, func, arg)
|
RHASH_UPDATE_ITER(hash, RHASH_ITER_LEV(hash), key, func, arg)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
default_proc_arity_check(VALUE proc)
|
set_proc_default(VALUE hash, VALUE proc)
|
||||||
{
|
{
|
||||||
int n = rb_proc_arity(proc);
|
if (rb_proc_lambda_p(proc)) {
|
||||||
|
int n = rb_proc_arity(proc);
|
||||||
|
|
||||||
if (rb_proc_lambda_p(proc) && n != 2 && (n >= 0 || n < -3)) {
|
if (n != 2 && (n >= 0 || n < -3)) {
|
||||||
if (n < 0) n = -n-1;
|
if (n < 0) n = -n-1;
|
||||||
rb_raise(rb_eTypeError, "default_proc takes two arguments (2 for %d)", n);
|
rb_raise(rb_eTypeError, "default_proc takes two arguments (2 for %d)", n);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FL_SET_RAW(hash, HASH_PROC_DEFAULT);
|
||||||
|
RHASH_SET_IFNONE(hash, proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -582,9 +589,7 @@ rb_hash_initialize(int argc, VALUE *argv, VALUE hash)
|
||||||
if (rb_block_given_p()) {
|
if (rb_block_given_p()) {
|
||||||
rb_check_arity(argc, 0, 0);
|
rb_check_arity(argc, 0, 0);
|
||||||
ifnone = rb_block_proc();
|
ifnone = rb_block_proc();
|
||||||
default_proc_arity_check(ifnone);
|
SET_PROC_DEFAULT(hash, ifnone);
|
||||||
RHASH_SET_IFNONE(hash, ifnone);
|
|
||||||
FL_SET(hash, HASH_PROC_DEFAULT);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rb_check_arity(argc, 0, 1);
|
rb_check_arity(argc, 0, 1);
|
||||||
|
@ -1006,9 +1011,7 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
|
||||||
rb_obj_classname(proc));
|
rb_obj_classname(proc));
|
||||||
}
|
}
|
||||||
proc = b;
|
proc = b;
|
||||||
default_proc_arity_check(proc);
|
SET_PROC_DEFAULT(hash, proc);
|
||||||
RHASH_SET_IFNONE(hash, proc);
|
|
||||||
FL_SET(hash, HASH_PROC_DEFAULT);
|
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue