1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Workaround of instance variable on hidden object

Since 9d9aea7fe5, generic instance
variables need `iv_index_tbl` in the object's class.  As hidden
objects, however, have no class, access to the variables causes a
segfault.  Get rid of that segfault by raising an exception, for
the time being.
This commit is contained in:
Nobuyoshi Nakada 2020-02-11 11:28:31 +09:00
parent 921916ff9e
commit 52cdf400ef
No known key found for this signature in database
GPG key ID: 4BC7D6DF58D8DF60
2 changed files with 17 additions and 2 deletions

View file

@ -65,6 +65,18 @@ class TestEncoding < Test::Unit::TestCase
END;
end
def test_extra_encoding
assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
begin;
200.times {|i|
Encoding::UTF_8.replicate("dummy#{i}")
}
e = Encoding.list.last
format = "%d".force_encoding(e)
assert_raise(TypeError) {format % 0}
end;
end
def test_dummy_p
assert_equal(true, Encoding::ISO_2022_JP.dummy?)
assert_equal(false, Encoding::UTF_8.dummy?)

View file

@ -1134,9 +1134,12 @@ static st_table *
iv_index_tbl_make(VALUE obj)
{
VALUE klass = rb_obj_class(obj);
st_table *iv_index_tbl = RCLASS_IV_INDEX_TBL(klass);
st_table *iv_index_tbl;
if (!iv_index_tbl) {
if (!klass) {
rb_raise(rb_eTypeError, "hidden object cannot have instance variables");
}
if (!(iv_index_tbl = RCLASS_IV_INDEX_TBL(klass))) {
iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable();
}