ruby-changes:36877
From: ko1 <ko1@a...>
Date: Wed, 24 Dec 2014 11:54:11 +0900 (JST)
Subject: [ruby-changes:36877] ko1:r48958 (trunk): * hash.c (rb_hash_delete): return Qnil if there are no corresponding
ko1 2014-12-24 11:53:37 +0900 (Wed, 24 Dec 2014) New Revision: 48958 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=48958 Log: * hash.c (rb_hash_delete): return Qnil if there are no corresponding entry. [Bug #10623] * hash.c (rb_hash_delete_entry): try delete and return Qundef if there are no corresponding entry. * internal.h: add rb_hash_delete_entry()'s declaration. * symbol.c: use rb_hash_delete_entry(). * thread.c: use rb_hash_delete_entry(). * ext/-test-/hash/delete.c: use rb_hash_delete_entry(). Modified files: trunk/ChangeLog trunk/ext/-test-/hash/delete.c trunk/hash.c trunk/internal.h trunk/symbol.c trunk/thread.c Index: symbol.c =================================================================== --- symbol.c (revision 48957) +++ symbol.c (revision 48958) @@ -740,7 +740,7 @@ rb_sym2id(VALUE sym) https://github.com/ruby/ruby/blob/trunk/symbol.c#L740 RSYMBOL(sym)->id = id |= num; /* make it permanent object */ set_id_entry(num >>= ID_SCOPE_SHIFT, fstr, sym); - rb_hash_delete(global_symbols.dsymbol_fstr_hash, fstr); + rb_hash_delete_entry(global_symbols.dsymbol_fstr_hash, fstr); } } else { Index: ChangeLog =================================================================== --- ChangeLog (revision 48957) +++ ChangeLog (revision 48958) @@ -1,3 +1,19 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Wed Dec 24 11:50:19 2014 Koichi Sasada <ko1@a...> + + * hash.c (rb_hash_delete): return Qnil if there are no corresponding + entry. [Bug #10623] + + * hash.c (rb_hash_delete_entry): try delete and return Qundef if there + are no corresponding entry. + + * internal.h: add rb_hash_delete_entry()'s declaration. + + * symbol.c: use rb_hash_delete_entry(). + + * thread.c: use rb_hash_delete_entry(). + + * ext/-test-/hash/delete.c: use rb_hash_delete_entry(). + Wed Dec 24 09:35:11 2014 NAKAMURA Usaku <usa@r...> * ext/fiddle/extconf.rb: remove ffitarget.h generated by configure on Index: thread.c =================================================================== --- thread.c (revision 48957) +++ thread.c (revision 48958) @@ -4806,13 +4806,13 @@ recursive_pop(VALUE list, VALUE obj, VAL https://github.com/ruby/ruby/blob/trunk/thread.c#L4806 return 0; } if (RB_TYPE_P(pair_list, T_HASH)) { - rb_hash_delete(pair_list, paired_obj); + rb_hash_delete_entry(pair_list, paired_obj); if (!RHASH_EMPTY_P(pair_list)) { return 1; /* keep hash until is empty */ } } } - rb_hash_delete(list, obj); + rb_hash_delete_entry(list, obj); return 1; } Index: ext/-test-/hash/delete.c =================================================================== --- ext/-test-/hash/delete.c (revision 48957) +++ ext/-test-/hash/delete.c (revision 48958) @@ -3,7 +3,7 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/hash/delete.c#L3 static VALUE hash_delete(VALUE hash, VALUE key) { - VALUE ret = rb_hash_delete(hash, key); + VALUE ret = rb_hash_delete_entry(hash, key); return ret == Qundef ? Qnil : rb_ary_new_from_values(1, &ret); } Index: hash.c =================================================================== --- hash.c (revision 48957) +++ hash.c (revision 48958) @@ -969,22 +969,48 @@ rb_hash_index(VALUE hash, VALUE value) https://github.com/ruby/ruby/blob/trunk/hash.c#L969 return rb_hash_key(hash, value); } +/* + * delete a specified entry a given key. + * if there is the corresponding entry, return a value of the entry. + * if there is no corresponding entry, return Qundef. + */ VALUE -rb_hash_delete(VALUE hash, VALUE key) +rb_hash_delete_entry(VALUE hash, VALUE key) { st_data_t ktmp = (st_data_t)key, val; - if (!RHASH(hash)->ntbl) - return Qundef; - if (RHASH_ITER_LEV(hash) > 0) { - if (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef)) { - FL_SET(hash, HASH_DELETED); - return (VALUE)val; - } + if (!RHASH(hash)->ntbl) { + return Qundef; + } + else if (RHASH_ITER_LEV(hash) > 0 && + (st_delete_safe(RHASH(hash)->ntbl, &ktmp, &val, (st_data_t)Qundef))) { + FL_SET(hash, HASH_DELETED); + return (VALUE)val; } - else if (st_delete(RHASH(hash)->ntbl, &ktmp, &val)) + else if (st_delete(RHASH(hash)->ntbl, &ktmp, &val)) { return (VALUE)val; - return Qundef; + } + else { + return Qundef; + } +} + +/* + * delete a specified entry by a given key. + * if there is the corresponding entry, return a value of the entry. + * if there is no corresponding entry, return Qnil. + */ +VALUE +rb_hash_delete(VALUE hash, VALUE key) +{ + VALUE deleted_value = rb_hash_delete_entry(hash, key); + + if (deleted_value != Qundef) { /* likely pass */ + return deleted_value; + } + else { + return Qnil; + } } /* @@ -1011,12 +1037,19 @@ rb_hash_delete_m(VALUE hash, VALUE key) https://github.com/ruby/ruby/blob/trunk/hash.c#L1037 VALUE val; rb_hash_modify_check(hash); - val = rb_hash_delete(hash, key); - if (val != Qundef) return val; - if (rb_block_given_p()) { - return rb_yield(key); + val = rb_hash_delete_entry(hash, key); + + if (val != Qundef) { + return val; + } + else { + if (rb_block_given_p()) { + return rb_yield(key); + } + else { + return Qnil; + } } - return Qnil; } struct shift_var { @@ -1063,7 +1096,7 @@ rb_hash_shift(VALUE hash) https://github.com/ruby/ruby/blob/trunk/hash.c#L1096 else { rb_hash_foreach(hash, shift_i_safe, (VALUE)&var); if (var.key != Qundef) { - rb_hash_delete(hash, var.key); + rb_hash_delete_entry(hash, var.key); return rb_assoc_new(var.key, var.val); } } Index: internal.h =================================================================== --- internal.h (revision 48957) +++ internal.h (revision 48958) @@ -1119,6 +1119,9 @@ int rb_bug_reporter_add(void (*func)(FIL https://github.com/ruby/ruby/blob/trunk/internal.h#L1119 VALUE rb_str_normalize_ospath(const char *ptr, long len); #endif +/* hash.c (export) */ +VALUE rb_hash_delete_entry(VALUE hash, VALUE key); + /* io.c (export) */ void rb_maygvl_fd_fix_cloexec(int fd); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/