1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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().



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48958 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2014-12-24 02:53:37 +00:00
parent 0cd829c339
commit 9c6eaad723
6 changed files with 72 additions and 20 deletions

View file

@ -1,3 +1,19 @@
Wed Dec 24 11:50:19 2014 Koichi Sasada <ko1@atdot.net>
* 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@ruby-lang.org>
* ext/fiddle/extconf.rb: remove ffitarget.h generated by configure on

View file

@ -3,7 +3,7 @@
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);
}

65
hash.c
View file

@ -969,22 +969,48 @@ rb_hash_index(VALUE hash, VALUE value)
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 (st_delete(RHASH(hash)->ntbl, &ktmp, &val))
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;
return Qundef;
}
else if (st_delete(RHASH(hash)->ntbl, &ktmp, &val)) {
return (VALUE)val;
}
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)
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)
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);
}
}

View file

@ -1119,6 +1119,9 @@ int rb_bug_reporter_add(void (*func)(FILE *, void *), void *data);
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);

View file

@ -740,7 +740,7 @@ rb_sym2id(VALUE sym)
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 {

View file

@ -4806,13 +4806,13 @@ recursive_pop(VALUE list, VALUE obj, VALUE paired_obj)
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;
}