summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_io.rb11
-rw-r--r--variable.c4
2 files changed, 13 insertions, 2 deletions
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 8c7fe69128..82f122489a 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -2489,6 +2489,17 @@ class TestIO < Test::Unit::TestCase
end
end
+ def test_reopen_ivar
+ assert_ruby_status([], "#{<<~"begin;"}\n#{<<~'end;'}")
+ begin;
+ f = File.open(IO::NULL)
+ f.instance_variable_set(:@foo, 42)
+ f.reopen(STDIN)
+ f.instance_variable_defined?(:@foo)
+ f.instance_variable_get(:@foo)
+ end;
+ end
+
def test_foreach
a = []
IO.foreach("|" + EnvUtil.rubybin + " -e 'puts :foo; puts :bar; puts :baz'") {|x| a << x }
diff --git a/variable.c b/variable.c
index 56340820f3..4f66ad3e7f 100644
--- a/variable.c
+++ b/variable.c
@@ -885,7 +885,7 @@ generic_ivar_delete(VALUE obj, ID id, VALUE undef)
st_table *iv_index_tbl = RCLASS_IV_INDEX_TBL(rb_obj_class(obj));
st_data_t index;
- if (st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+ if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
if (index < ivtbl->numiv) {
VALUE ret = ivtbl->ivptr[index];
@@ -906,7 +906,7 @@ generic_ivar_get(VALUE obj, ID id, VALUE undef)
st_table *iv_index_tbl = RCLASS_IV_INDEX_TBL(rb_obj_class(obj));
st_data_t index;
- if (st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
+ if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
if (index < ivtbl->numiv) {
VALUE ret = ivtbl->ivptr[index];