diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | lib/ostruct.rb | 2 | ||||
-rw-r--r-- | test/ostruct/test_ostruct.rb | 3 |
3 files changed, 8 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Sat Jan 2 02:27:22 2016 Marc-Andre Lafortune <ruby-core@marc-andre.ca> + + * lib/ostruct.rb: Fix case of frozen object with initializer. + Bug revealed by RubySpec [ruby-core:72639] + Fri Jan 1 22:01:52 2016 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> * NEWS: mention about CSV's liberal_parsing option. diff --git a/lib/ostruct.rb b/lib/ostruct.rb index 17efcdc8d3..a95a0f1963 100644 --- a/lib/ostruct.rb +++ b/lib/ostruct.rb @@ -195,7 +195,7 @@ class OpenStruct modifiable[new_ostruct_member(mname)] = args[0] elsif len == 0 if @table.key?(mid) - new_ostruct_member(mid) + new_ostruct_member(mid) unless frozen? @table[mid] end else diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb index 02c4c74152..8b9b647720 100644 --- a/test/ostruct/test_ostruct.rb +++ b/test/ostruct/test_ostruct.rb @@ -61,13 +61,14 @@ class TC_OpenStruct < Test::Unit::TestCase end def test_frozen - o = OpenStruct.new + o = OpenStruct.new(foo: 42) o.a = 'a' o.freeze assert_raise(RuntimeError) {o.b = 'b'} assert_not_respond_to(o, :b) assert_raise(RuntimeError) {o.a = 'z'} assert_equal('a', o.a) + assert_equal(42, o.foo) o = OpenStruct.new :a => 42 def o.frozen?; nil end o.freeze |