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

ruby-changes:30180

From: glass <ko1@a...>
Date: Mon, 29 Jul 2013 20:24:19 +0900 (JST)
Subject: [ruby-changes:30180] glass:r42232 (trunk): * hash.c (rb_hash_assoc): revert r42224. table->type->compare is

glass	2013-07-29 20:24:08 +0900 (Mon, 29 Jul 2013)

  New Revision: 42232

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

  Log:
    * hash.c (rb_hash_assoc): revert r42224. table->type->compare is
      called only if hashes are matched.
    
    * test/ruby/test_hash.rb: add a test to check using #== to compare.

  Modified files:
    trunk/ChangeLog
    trunk/hash.c
    trunk/test/ruby/test_hash.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 42231)
+++ ChangeLog	(revision 42232)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Mon Jul 29 20:14:24 2013  Masaki Matsushita  <glass.saga@g...>
+
+	* hash.c (rb_hash_assoc): revert r42224. table->type->compare is
+	  called only if hashes are matched.
+
+	* test/ruby/test_hash.rb: add a test to check using #== to compare.
+
 Mon Jul 29 17:00:31 2013  Nobuyoshi Nakada  <nobu@r...>
 
 	* parse.y (yycompile): store file name as String to keep the encoding.
Index: hash.c
===================================================================
--- hash.c	(revision 42231)
+++ hash.c	(revision 42232)
@@ -2123,34 +2123,15 @@ rb_hash_merge(VALUE hash1, VALUE hash2) https://github.com/ruby/ruby/blob/trunk/hash.c#L2123
 }
 
 static int
-assoc_cmp(VALUE a, VALUE b)
+assoc_i(VALUE key, VALUE val, VALUE arg)
 {
-    return !RTEST(rb_equal(a, b));
-}
-
-struct lookup2_arg {
-    VALUE hash;
-    VALUE key;
-};
-
-static VALUE
-lookup2_call(VALUE arg)
-{
-    struct lookup2_arg *p = (struct lookup2_arg *)arg;
-    return rb_hash_lookup2(p->hash, p->key, Qundef);
-}
-
-struct reset_hash_type_arg {
-    VALUE hash;
-    const struct st_hash_type *orighash;
-};
+    VALUE *args = (VALUE *)arg;
 
-static VALUE
-reset_hash_type(VALUE arg)
-{
-    struct reset_hash_type_arg *p = (struct reset_hash_type_arg *)arg;
-    RHASH(p->hash)->ntbl->type = p->orighash;
-    return Qundef;
+    if (RTEST(rb_equal(args[0], key))) {
+	args[1] = rb_assoc_new(key, val);
+	return ST_STOP;
+    }
+    return ST_CONTINUE;
 }
 
 /*
@@ -2168,25 +2149,14 @@ reset_hash_type(VALUE arg) https://github.com/ruby/ruby/blob/trunk/hash.c#L2149
  */
 
 VALUE
-rb_hash_assoc(VALUE hash, VALUE key)
+rb_hash_assoc(VALUE hash, VALUE obj)
 {
-    VALUE value;
-    st_table *table = hash_tbl(hash);
-    struct lookup2_arg arg;
-    struct reset_hash_type_arg ensure_arg;
-    const struct st_hash_type *orighash = table->type;
-    struct st_hash_type assochash;
-
-    assochash.compare = assoc_cmp;
-    assochash.hash = orighash->hash;
-    table->type = &assochash;
-    arg.hash = hash;
-    arg.key = key;
-    ensure_arg.hash = hash;
-    ensure_arg.orighash = orighash;
-    value = rb_ensure(lookup2_call, (VALUE)&arg, reset_hash_type, (VALUE)&ensure_arg);
-    if (value == Qundef) return Qnil;
-    return rb_assoc_new(key, value);
+    VALUE args[2];
+
+    args[0] = obj;
+    args[1] = Qnil;
+    rb_hash_foreach(hash, assoc_i, (VALUE)args);
+    return args[1];
 }
 
 static int
Index: test/ruby/test_hash.rb
===================================================================
--- test/ruby/test_hash.rb	(revision 42231)
+++ test/ruby/test_hash.rb	(revision 42232)
@@ -876,6 +876,7 @@ class TestHash < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_hash.rb#L876
   def test_assoc
     assert_equal([3,4], {1=>2, 3=>4, 5=>6}.assoc(3))
     assert_nil({1=>2, 3=>4, 5=>6}.assoc(4))
+    assert_equal([1.0,1], {1.0=>1}.assoc(1))
   end
 
   def test_rassoc

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

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