summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-24 01:40:51 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-04-24 01:40:51 +0000
commita15fd1d9f2b4213417a5e3902fa7efe1195cdd05 (patch)
tree2b635425fb05d3325a5c58ed0c0de6801f950ce3 /hash.c
parentb3209c258eddc093ffdcbf77ee079cdc93f094ae (diff)
revert newhash refactoring
We need to fix GC bug before merging this. Revert revisions 58452, 58435, 58434, 58428, 58427 in this order. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58463 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c170
1 files changed, 62 insertions, 108 deletions
diff --git a/hash.c b/hash.c
index ea31e085ca..b583390819 100644
--- a/hash.c
+++ b/hash.c
@@ -626,110 +626,6 @@ rb_hash_initialize(int argc, VALUE *argv, VALUE hash)
return hash;
}
-static inline VALUE
-hash_alloc_from_st(VALUE klass, st_table *ntbl)
-{
- VALUE h = hash_alloc(klass);
- RHASH(h)->ntbl = ntbl;
- return h;
-}
-
-static inline void
-hash_insert_raw(VALUE hash, st_table *tbl, VALUE key, VALUE val)
-{
- st_data_t v = (st_data_t)val;
- st_data_t k = (rb_obj_class(key) == rb_cString) ?
- (st_data_t)rb_str_new_frozen(key) :
- (st_data_t)key;
-
- st_insert(tbl, k, v);
- RB_OBJ_WRITTEN(hash, Qundef, key);
- RB_OBJ_WRITTEN(hash, Qundef, val);
-}
-
-static VALUE
-rb_hash_new_from_values_with_klass(long argc, const VALUE *argv, VALUE klass)
-{
- long i;
- st_table *t;
- VALUE v;
-
- if (argc % 2) {
- rb_raise(rb_eArgError, "odd number of arguments for Hash");
- }
-
- t = st_init_table_with_size(&objhash, argc / 2);
- v = hash_alloc_from_st(klass, t);
-
- for (i = 0; i < argc; /* */) {
- VALUE key = argv[i++];
- VALUE val = argv[i++];
-
- hash_insert_raw(v, t, key, val);
- }
- return v;
-}
-
-VALUE
-rb_hash_new_from_values(long argc, const VALUE *argv)
-{
- return rb_hash_new_from_values_with_klass(argc, argv, rb_cHash);
-}
-
-static VALUE
-rb_hash_new_from_object(VALUE klass, VALUE obj)
-{
- VALUE tmp = rb_hash_s_try_convert(Qnil, obj);
- if (!NIL_P(tmp)) {
- VALUE hash = hash_alloc(klass);
- if (RHASH(tmp)->ntbl) {
- RHASH(hash)->ntbl = st_copy(RHASH(tmp)->ntbl);
- }
- return hash;
- }
-
- tmp = rb_check_array_type(obj);
- if (!NIL_P(tmp)) {
- long i;
- long len = RARRAY_LEN(tmp);
- st_table *tbl = len ? st_init_table_with_size(&objhash, len) : NULL;
- VALUE hv = hash_alloc_from_st(klass, tbl);;
-
- for (i = 0; i < len; ++i) {
- VALUE e = RARRAY_AREF(tmp, i);
- VALUE v = rb_check_array_type(e);
- VALUE key, val = Qnil;
-
- if (NIL_P(v)) {
-#if 0 /* refix in the next release */
- rb_raise(rb_eArgError, "wrong element type %s at %ld (expected array)",
- rb_builtin_class_name(e), i);
-
-#else
- rb_warn("wrong element type %s at %ld (expected array)",
- rb_builtin_class_name(e), i);
- rb_warn("ignoring wrong elements is deprecated, remove them explicitly");
- rb_warn("this causes ArgumentError in the next release");
- continue;
-#endif
- }
- switch (RARRAY_LEN(v)) {
- default:
- rb_raise(rb_eArgError, "invalid number of elements (%ld for 1..2)",
- RARRAY_LEN(v));
- case 2:
- val = RARRAY_AREF(v, 1);
- case 1:
- key = RARRAY_AREF(v, 0);
- hash_insert_raw(hv, tbl, key, val);
- }
- }
- return hv;
- }
-
- rb_raise(rb_eArgError, "odd number of arguments for Hash");
-}
-
/*
* call-seq:
* Hash[ key, value, ... ] -> new_hash
@@ -753,11 +649,69 @@ rb_hash_new_from_object(VALUE klass, VALUE obj)
static VALUE
rb_hash_s_create(int argc, VALUE *argv, VALUE klass)
{
- switch (argc) {
- case 0: return hash_alloc(klass);
- case 1: return rb_hash_new_from_object(klass, argv[0]);
- default: return rb_hash_new_from_values_with_klass(argc, argv, klass);
+ VALUE hash, tmp;
+ int i;
+
+ if (argc == 1) {
+ tmp = rb_hash_s_try_convert(Qnil, argv[0]);
+ if (!NIL_P(tmp)) {
+ hash = hash_alloc(klass);
+ if (RHASH(tmp)->ntbl) {
+ RHASH(hash)->ntbl = st_copy(RHASH(tmp)->ntbl);
+ }
+ return hash;
+ }
+
+ tmp = rb_check_array_type(argv[0]);
+ if (!NIL_P(tmp)) {
+ long i;
+
+ hash = hash_alloc(klass);
+ for (i = 0; i < RARRAY_LEN(tmp); ++i) {
+ VALUE e = RARRAY_AREF(tmp, i);
+ VALUE v = rb_check_array_type(e);
+ VALUE key, val = Qnil;
+
+ if (NIL_P(v)) {
+#if 0 /* refix in the next release */
+ rb_raise(rb_eArgError, "wrong element type %s at %ld (expected array)",
+ rb_builtin_class_name(e), i);
+
+#else
+ rb_warn("wrong element type %s at %ld (expected array)",
+ rb_builtin_class_name(e), i);
+ rb_warn("ignoring wrong elements is deprecated, remove them explicitly");
+ rb_warn("this causes ArgumentError in the next release");
+ continue;
+#endif
+ }
+ switch (RARRAY_LEN(v)) {
+ default:
+ rb_raise(rb_eArgError, "invalid number of elements (%ld for 1..2)",
+ RARRAY_LEN(v));
+ case 2:
+ val = RARRAY_AREF(v, 1);
+ case 1:
+ key = RARRAY_AREF(v, 0);
+ rb_hash_aset(hash, key, val);
+ }
+ }
+ return hash;
+ }
+ }
+ if (argc % 2 != 0) {
+ rb_raise(rb_eArgError, "odd number of arguments for Hash");
+ }
+
+ hash = hash_alloc(klass);
+ if (argc > 0) {
+ RHASH(hash)->ntbl = st_init_table_with_size(&objhash, argc / 2);
+ }
+ for (i=0; i<argc; i+=2) {
+ rb_hash_aset(hash, argv[i], argv[i + 1]);
}
+
+ return hash;
}
static VALUE