summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/hash.c b/hash.c
index 2178246662..b7e7516354 100644
--- a/hash.c
+++ b/hash.c
@@ -171,47 +171,51 @@ rb_hash_foreach(hash, func, farg)
}
static VALUE
-rb_hash_s_new(argc, argv, klass)
- int argc;
- VALUE *argv;
+rb_hash_new2(klass)
VALUE klass;
{
- VALUE ifnone;
-
NEWOBJ(hash, struct RHash);
OBJSETUP(hash, klass, T_HASH);
hash->iter_lev = 0;
hash->ifnone = Qnil;
hash->tbl = 0; /* avoid GC crashing */
-
- rb_scan_args(argc, argv, "01", &ifnone);
-
- hash->ifnone = ifnone;
hash->tbl = st_init_table(&objhash);
return (VALUE)hash;
}
+VALUE
+rb_hash_new()
+{
+ return rb_hash_new2(rb_cHash);
+}
+
static VALUE
-rb_hash_new2(klass)
+rb_hash_s_new(argc, argv, klass)
+ int argc;
+ VALUE *argv;
VALUE klass;
{
- NEWOBJ(hash, struct RHash);
- OBJSETUP(hash, klass, T_HASH);
+ VALUE hash = rb_hash_new2(klass);
- hash->iter_lev = 0;
- hash->ifnone = Qnil;
- hash->tbl = 0; /* avoid GC crashing */
- hash->tbl = st_init_table(&objhash);
-
- return (VALUE)hash;
+ rb_obj_call_init(hash, argc, argv);
+ return hash;
}
-VALUE
-rb_hash_new()
+static VALUE
+rb_hash_initialize(argc, argv, hash)
+ int argc;
+ VALUE *argv;
+ VALUE hash;
{
- return rb_hash_new2(rb_cHash);
+ VALUE ifnone;
+
+ rb_scan_args(argc, argv, "01", &ifnone);
+ rb_hash_modify(hash);
+ RHASH(hash)->ifnone = ifnone;
+
+ return hash;
}
static VALUE
@@ -1382,6 +1386,7 @@ Init_Hash()
rb_define_singleton_method(rb_cHash, "new", rb_hash_s_new, -1);
rb_define_singleton_method(rb_cHash, "[]", rb_hash_s_create, -1);
+ rb_define_method(rb_cHash,"initialize", rb_hash_initialize, -1);
rb_define_method(rb_cHash,"clone", rb_hash_clone, 0);
rb_define_method(rb_cHash,"dup", rb_hash_dup, 0);