[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]