summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--struct.c4
-rw-r--r--test/ruby/test_struct.rb5
3 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 4387482db7..c85aa5eb5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Nov 19 16:30:59 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (rb_struct_each_pair): yield associated pairs so that
+ an unsplat argument can get both, for consistency with Hash,
+ OpenStruct, and etc. [ruby-dev:46533] [Bug #7382]
+
Mon Nov 19 16:17:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (LIBS): libelf is need on only FreeBSD.
diff --git a/struct.c b/struct.c
index 17e53ab4e0..7f01acbb88 100644
--- a/struct.c
+++ b/struct.c
@@ -495,7 +495,9 @@ rb_struct_each_pair(VALUE s)
RETURN_SIZED_ENUMERATOR(s, 0, 0, rb_struct_size);
members = rb_struct_members(s);
for (i=0; i<RSTRUCT_LEN(s); i++) {
- rb_yield_values(2, rb_ary_entry(members, i), RSTRUCT_PTR(s)[i]);
+ VALUE key = rb_ary_entry(members, i);
+ VALUE value = RSTRUCT_PTR(s)[i];
+ rb_yield(rb_assoc_new(key, vlaue));
}
return s;
}
diff --git a/test/ruby/test_struct.rb b/test/ruby/test_struct.rb
index b3191902a3..03cb55999c 100644
--- a/test/ruby/test_struct.rb
+++ b/test/ruby/test_struct.rb
@@ -1,3 +1,4 @@
+# -*- coding: us-ascii -*-
require 'test/unit'
require 'timeout'
require_relative 'envutil'
@@ -117,6 +118,10 @@ class TestStruct < Test::Unit::TestCase
klass = Struct.new(:a, :b)
o = klass.new(1, 2)
assert_equal([[:a, 1], [:b, 2]], o.each_pair.to_a)
+ bug7382 = '[ruby-dev:46533]'
+ a = []
+ o.each_pair {|x| a << x}
+ assert_equal([[:a, 1], [:b, 2]], a, bug7382)
end
def test_inspect