summaryrefslogtreecommitdiffhomepage
path: root/src/hash.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-04 11:03:26 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-04 11:03:26 +0900
commitb9a4d6406428e6075d2dd3c5bd8ba73dd2fa94aa (patch)
treef4f054730861c9bbc018f723142a7dd04ab6b7f5 /src/hash.c
parent786ed10d59372433aefdf5451f081ba7aa2964be (diff)
downloadmruby-b9a4d6406428e6075d2dd3c5bd8ba73dd2fa94aa.tar.gz
mruby-b9a4d6406428e6075d2dd3c5bd8ba73dd2fa94aa.zip
implement Hash#initialize in C
Diffstat (limited to 'src/hash.c')
-rw-r--r--src/hash.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/src/hash.c b/src/hash.c
index c91a8a884..a09d509d0 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -309,25 +309,16 @@ mrb_hash_modify(mrb_state *mrb, mrb_value hash)
*/
static mrb_value
-mrb_hash_init_core(mrb_state *mrb, mrb_value hash)
+mrb_hash_init(mrb_state *mrb, mrb_value hash)
{
mrb_value block, ifnone;
- mrb_value *argv;
- int argc;
+ mrb_bool ifnone_p;
- mrb_get_args(mrb, "o*", &block, &argv, &argc);
+ ifnone = mrb_nil_value();
+ mrb_get_args(mrb, "&|o?", &block, &ifnone, &ifnone_p);
mrb_hash_modify(mrb, hash);
- if (mrb_nil_p(block)) {
- if (argc > 0) {
- if (argc != 1) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
- ifnone = argv[0];
- }
- else {
- ifnone = mrb_nil_value();
- }
- }
- else {
- if (argc > 0) {
+ if (!mrb_nil_p(block)) {
+ if (ifnone_p) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
}
RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
@@ -849,7 +840,7 @@ mrb_init_hash(mrb_state *mrb)
mrb_define_method(mrb, h, "has_key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.13 */
mrb_define_method(mrb, h, "has_value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.14 */
mrb_define_method(mrb, h, "include?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.15 */
- mrb_define_method(mrb, h, "__init_core", mrb_hash_init_core, MRB_ARGS_ANY()); /* core of 15.2.13.4.16 */
+ mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1)); /* 15.2.13.4.16 */
mrb_define_method(mrb, h, "key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.18 */
mrb_define_method(mrb, h, "keys", mrb_hash_keys, MRB_ARGS_NONE()); /* 15.2.13.4.19 */
mrb_define_method(mrb, h, "length", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.20 */