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

ruby-changes:32446

From: nobu <ko1@a...>
Date: Wed, 8 Jan 2014 15:55:29 +0900 (JST)
Subject: [ruby-changes:32446] nobu:r44525 (trunk): object.c: hash value from objid with salt

nobu	2014-01-08 15:55:24 +0900 (Wed, 08 Jan 2014)

  New Revision: 44525

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=44525

  Log:
    object.c: hash value from objid with salt
    
    * hash.c (rb_objid_hash): return hash value from object ID with a
      salt, extract from rb_any_hash().
    * object.c (rb_obj_hash): return same value as rb_any_hash().
      fix r44125.  [ruby-core:59638] [Bug #9381]

  Modified files:
    trunk/ChangeLog
    trunk/hash.c
    trunk/object.c
    trunk/test/ruby/test_hash.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 44524)
+++ ChangeLog	(revision 44525)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Jan  8 15:55:21 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* hash.c (rb_objid_hash): return hash value from object ID with a
+	  salt, extract from rb_any_hash().
+
+	* object.c (rb_obj_hash): return same value as rb_any_hash().
+	  fix r44125.  [ruby-core:59638] [Bug #9381]
+
 Wed Jan  8 13:12:41 2014  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/timeout.rb (Timeout::ExitException.catch): pass arguments
Index: object.c
===================================================================
--- object.c	(revision 44524)
+++ object.c	(revision 44525)
@@ -161,6 +161,7 @@ rb_obj_equal(VALUE obj1, VALUE obj2) https://github.com/ruby/ruby/blob/trunk/object.c#L161
 VALUE
 rb_obj_hash(VALUE obj)
 {
+    st_index_t rb_objid_hash(st_index_t index);
     VALUE oid = rb_obj_id(obj);
 #if SIZEOF_LONG == SIZEOF_VOIDP
     st_index_t index = NUM2LONG(oid);
@@ -169,7 +170,7 @@ rb_obj_hash(VALUE obj) https://github.com/ruby/ruby/blob/trunk/object.c#L170
 #else
 # error not supported
 #endif
-    st_index_t h = rb_hash_end(rb_hash_start(index));
+    st_index_t h = rb_objid_hash(index);
     return LONG2FIX(h);
 }
 
Index: hash.c
===================================================================
--- hash.c	(revision 44524)
+++ hash.c	(revision 44525)
@@ -122,6 +122,8 @@ rb_hash(VALUE obj) https://github.com/ruby/ruby/blob/trunk/hash.c#L122
     return hval;
 }
 
+st_index_t rb_objid_hash(st_index_t index);
+
 static st_index_t
 rb_any_hash(VALUE a)
 {
@@ -130,9 +132,7 @@ rb_any_hash(VALUE a) https://github.com/ruby/ruby/blob/trunk/hash.c#L132
 
     if (SPECIAL_CONST_P(a)) {
 	if (a == Qundef) return 0;
-	hnum = rb_hash_start((st_index_t)a);
-	hnum = rb_hash_uint(hnum, (st_index_t)rb_any_hash);
-	hnum = rb_hash_end(hnum);
+	hnum = rb_objid_hash((st_index_t)a);
     }
     else if (BUILTIN_TYPE(a) == T_STRING) {
 	hnum = rb_str_hash(a);
@@ -145,6 +145,15 @@ rb_any_hash(VALUE a) https://github.com/ruby/ruby/blob/trunk/hash.c#L145
     return (st_index_t)RSHIFT(hnum, 1);
 }
 
+st_index_t
+rb_objid_hash(st_index_t index)
+{
+    st_index_t hnum = rb_hash_start(index);
+    hnum = rb_hash_uint(hnum, (st_index_t)rb_any_hash);
+    hnum = rb_hash_end(hnum);
+    return hnum;
+}
+
 static const struct st_hash_type objhash = {
     rb_any_cmp,
     rb_any_hash,
Index: test/ruby/test_hash.rb
===================================================================
--- test/ruby/test_hash.rb	(revision 44524)
+++ test/ruby/test_hash.rb	(revision 44525)
@@ -1215,6 +1215,27 @@ class TestHash < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_hash.rb#L1215
     assert_no_memory_leak([], prepare, code, bug9187)
   end
 
+  def test_wrapper_of_special_const
+    bug9381 = '[ruby-core:59638] [Bug #9381]'
+
+    wrapper = Class.new do
+      def initialize(obj)
+        @obj = obj
+      end
+
+      def hash
+        @obj.hash
+      end
+
+      def eql?(other)
+        @obj.eql?(other)
+      end
+    end
+
+    hash = {5 => bug9381}
+    assert_equal(bug9381, hash[wrapper.new(5)])
+  end
+
   class TestSubHash < TestHash
     class SubHash < Hash
       def reject(*)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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