summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-04-28 00:32:34 +0900
committerYukihiro Matsumoto <[email protected]>2012-04-28 00:32:34 +0900
commit32db0e5d8ca2aa2d8e7ce6577f9e0c5cee76ba0d (patch)
tree38ae4bc1ebcaee6e4b9656a0c77e11561df140d3
parent9e45eb185b50d7f45096b4edb0ec7ae49b6886b2 (diff)
downloadmruby-32db0e5d8ca2aa2d8e7ce6577f9e0c5cee76ba0d.tar.gz
mruby-32db0e5d8ca2aa2d8e7ce6577f9e0c5cee76ba0d.zip
struct RString member should not be mrb_value
-rw-r--r--include/mruby/string.h2
-rw-r--r--src/gc.c5
-rw-r--r--src/string.c14
3 files changed, 11 insertions, 10 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h
index ea9ca71ec..d35a5fe53 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -29,7 +29,7 @@ struct RString {
long len;
union {
size_t capa;
- mrb_value shared;
+ struct RString *shared;
} aux;
char *buf;
};
diff --git a/src/gc.c b/src/gc.c
index 995678b0c..687e601a9 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -351,8 +351,9 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
{
struct RString *s = (struct RString*)obj;
- if (s->flags & MRB_STR_SHARED) {
- mrb_gc_mark_value(mrb, s->aux.shared)
+ while (s->flags & MRB_STR_SHARED) {
+ s = s->aux.shared;
+ if (!s) break;
}
}
break;
diff --git a/src/string.c b/src/string.c
index efa4a107c..0ba97f851 100644
--- a/src/string.c
+++ b/src/string.c
@@ -492,13 +492,13 @@ str_new4(mrb_state *mrb, enum mrb_vtype ttype, mrb_value str)
RSTRING(str2)->buf = RSTRING_PTR(str);
if (MRB_STR_SHARED_P(str)) {
- mrb_value shared = RSTRING_SHARED(str);
+ struct RString *shared = RSTRING_SHARED(str);
FL_SET(str2, MRB_STR_SHARED);
RSTRING_SHARED(str2) = shared;
}
else {
FL_SET(str, MRB_STR_SHARED);
- RSTRING_SHARED(str) = str2;
+ RSTRING_SHARED(str) = mrb_str_ptr(str2);
}
mrb_enc_cr_str_exact_copy(mrb, str2, str);
return str2;
@@ -2185,7 +2185,7 @@ str_replace_shared(mrb_state *mrb, mrb_value str2, mrb_value str)
str = mrb_str_new_frozen(mrb, str);
RSTRING(str2)->len = RSTRING_LEN(str);
RSTRING(str2)->buf = RSTRING_PTR(str);
- RSTRING_SHARED(str2) = str;
+ RSTRING_SHARED(str2) = mrb_str_ptr(str);
FL_SET(str2, MRB_STR_SHARED);
mrb_enc_cr_str_exact_copy(mrb, str2, str);
@@ -2220,9 +2220,9 @@ mrb_str_new_frozen(mrb_state *mrb, mrb_value orig)
klass = mrb_obj_class(mrb, orig);
- if (MRB_STR_SHARED_P(orig) && !mrb_nil_p(RSTRING_SHARED(orig))) {
+ if (MRB_STR_SHARED_P(orig) && RSTRING_SHARED(orig)) {
long ofs;
- ofs = RSTRING_LEN(str) - RSTRING_LEN(orig);
+ ofs = RSTRING_LEN(str) - RSTRING_SHARED(orig)->len;
#ifdef INCLUDE_ENCODING
if ((ofs > 0) || (klass != RBASIC(str)->c) ||
ENCODING_GET(mrb, str) != ENCODING_GET(mrb, orig)) {
@@ -2776,9 +2776,9 @@ str_replace(mrb_state *mrb, mrb_value str, mrb_value str2)
len = RSTRING_LEN(str2);
if (MRB_STR_SHARED_P(str2)) {
- mrb_value shared = RSTRING_SHARED(str2);
+ struct RString *shared = RSTRING_SHARED(str2);
RSTRING_LEN(str) = len;
- RSTRING_PTR(str) = RSTRING_PTR(str2);
+ RSTRING_PTR(str) = shared->buf;
FL_SET(str, MRB_STR_SHARED);
RSTRING_SHARED(str) = shared;
}