aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--string.c2
-rw-r--r--symbol.c2
3 files changed, 14 insertions, 2 deletions
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 <ko1@atdot.net>
+
+ * 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 <ko1@atdot.net>
* 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;