diff options
-rw-r--r-- | encoding.c | 10 | ||||
-rw-r--r-- | string.c | 1 | ||||
-rw-r--r-- | test/ruby/test_encoding.rb | 3 |
3 files changed, 14 insertions, 0 deletions
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; } @@ -181,6 +181,7 @@ VALUE rb_cSymbol; #define STR_HEAP_PTR(str) (RSTRING(str)->as.heap.ptr) #define STR_HEAP_SIZE(str) ((size_t)RSTRING(str)->as.heap.aux.capa + TERM_LEN(str)) +/* TODO: include the terminator size in capa. */ #define STR_ENC_GET(str) get_encoding(str) diff --git a/test/ruby/test_encoding.rb b/test/ruby/test_encoding.rb index 80bed39936..6fc5c48179 100644 --- a/test/ruby/test_encoding.rb +++ b/test/ruby/test_encoding.rb @@ -76,6 +76,9 @@ class TestEncoding < Test::Unit::TestCase assert_equal("0", format % 0) assert_equal(e, format.dup.encoding) assert_equal(e, (format*1).encoding) + + assert_equal(e, (("x"*30).force_encoding(e)*1).encoding) + GC.start end; end |