diff --git a/ChangeLog b/ChangeLog index 5c1a39a233..27652ffc82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Fri Aug 15 19:34:33 2014 Koichi Sasada + + * string.c (setup_fake_str): fake strings should not set class by + RBASIC_SET_CLASS() because it insert write barriers to fake + (non-RVALUE) structure. + + It can cause unexpected behaviour. + + Ruby 2.1 also have a same problem (setup_fake_str() in parse.y). + + * symbol.c (setup_fake_str): ditto. + Fri Aug 15 19:27:25 2014 Koichi Sasada * array.c (rb_ary_tmp_new): added. diff --git a/string.c b/string.c index bec0bfd839..470cb9a4d1 100644 --- a/string.c +++ b/string.c @@ -240,7 +240,7 @@ setup_fake_str(struct RString *fake_str, const char *name, long len, int encidx) ENCODING_SET_INLINED((VALUE)fake_str, encidx); - RBASIC_SET_CLASS((VALUE)fake_str, rb_cString); + RBASIC_SET_CLASS_RAW((VALUE)fake_str, rb_cString); fake_str->as.heap.len = len; fake_str->as.heap.ptr = (char *)name; fake_str->as.heap.aux.capa = len; diff --git a/symbol.c b/symbol.c index 99c7512332..c50607b51b 100644 --- a/symbol.c +++ b/symbol.c @@ -414,7 +414,7 @@ static VALUE setup_fake_str(struct RString *fake_str, const char *name, long len) { fake_str->basic.flags = T_STRING|RSTRING_NOEMBED; - RBASIC_SET_CLASS((VALUE)fake_str, rb_cString); + RBASIC_SET_CLASS_RAW((VALUE)fake_str, rb_cString); fake_str->as.heap.len = len; fake_str->as.heap.ptr = (char *)name; fake_str->as.heap.aux.capa = len;