diff options
author | Jeremy Evans <code@jeremyevans.net> | 2021-06-15 10:06:52 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2021-06-24 12:25:33 -0700 |
commit | be230615d016e27d5b45b465d1481f6ecf7f1d28 (patch) | |
tree | 96ce3b8d68dcefe8372bc4d95561875dbfd94b98 | |
parent | 3ab68b910fc2c7bad0432892bddd9874e77ad35e (diff) | |
download | ruby-be230615d016e27d5b45b465d1481f6ecf7f1d28.tar.gz |
Remove shift of ep when computing Proc#hash
The shift was causing far fewer unique values of hash than expected.
Fix pointed out by xtkoba (Tee KOBAYASHI)
Fixes [Bug #17951]
-rw-r--r-- | proc.c | 2 | ||||
-rw-r--r-- | test/ruby/test_proc.rb | 9 |
2 files changed, 10 insertions, 1 deletions
@@ -1451,7 +1451,7 @@ rb_hash_proc(st_index_t hash, VALUE prc) GetProcPtr(prc, proc); hash = rb_hash_uint(hash, (st_index_t)proc->block.as.captured.code.val); hash = rb_hash_uint(hash, (st_index_t)proc->block.as.captured.self); - return rb_hash_uint(hash, (st_index_t)proc->block.as.captured.ep >> 16); + return rb_hash_uint(hash, (st_index_t)proc->block.as.captured.ep); } MJIT_FUNC_EXPORTED VALUE diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb index 5f2f797992..16efd13d7c 100644 --- a/test/ruby/test_proc.rb +++ b/test/ruby/test_proc.rb @@ -159,6 +159,15 @@ class TestProc < Test::Unit::TestCase assert_equal(*m_nest{}, "[ruby-core:84583] Feature #14627") end + def test_hash + def self.capture(&block) + block + end + + procs = Array.new(1000){capture{:foo }} + assert_operator(procs.map(&:hash).uniq.size, :>=, 500) + end + def test_block_par assert_equal(10, Proc.new{|&b| b.call(10)}.call {|x| x}) assert_equal(12, Proc.new{|a,&b| b.call(a)}.call(12) {|x| x}) |