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/