From fce667ed08f25fa7ce43c9b07be170f341a04c4e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 13 Feb 2020 09:34:49 +0900 Subject: Get rid of warnings/exceptions at cleanup After the encoding index instance variable is removed when all instance variables are removed in `obj_free`, then `rb_str_free` causes uninitialized instance variable warning and nil-to-integer conversion exception. Both cases result in object allocation during GC, and crashes. --- encoding.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'encoding.c') diff --git a/encoding.c b/encoding.c index f2e67ff508..e713b0a922 100644 --- a/encoding.c +++ b/encoding.c @@ -779,8 +779,18 @@ enc_get_index_str(VALUE str) if (i == ENCODING_INLINE_MAX) { VALUE iv; +#if 0 iv = rb_ivar_get(str, rb_id_encoding()); i = NUM2INT(iv); +#else + /* + * Tentatively, assume ASCII-8BIT, if encoding index instance + * variable is not found. This can happen when freeing after + * all instance variables are removed in `obj_free`. + */ + iv = rb_attr_get(str, rb_id_encoding()); + i = NIL_P(iv) ? ENCINDEX_ASCII : NUM2INT(iv); +#endif } return i; } -- cgit v1.2.1