summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/string.c3
-rw-r--r--src/vm.c1
2 files changed, 4 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c
index e4bfd034c..5cca6d460 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2615,6 +2615,9 @@ mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr)
MRB_API mrb_value
mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2)
{
+ if (mrb_str_ptr(str) == mrb_str_ptr(str2)) {
+ mrb_str_modify(mrb, mrb_str_ptr(str));
+ }
return mrb_str_cat(mrb, str, RSTRING_PTR(str2), RSTRING_LEN(str2));
}
diff --git a/src/vm.c b/src/vm.c
index a80d170b4..c9e923ee0 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -300,6 +300,7 @@ mrb_env_unshare(mrb_state *mrb, struct REnv *e)
if (!MRB_ENV_STACK_SHARED_P(e)) return;
if (e->cxt != mrb->c) return;
+ if (e == mrb->c->cibase->env) return; /* for mirb */
p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
if (len > 0) {
stack_copy(p, e->stack, len);