summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/state.c4
-rw-r--r--src/string.c3
-rw-r--r--src/variable.c4
3 files changed, 5 insertions, 6 deletions
diff --git a/src/state.c b/src/state.c
index c42df71ba..e5e0161bf 100644
--- a/src/state.c
+++ b/src/state.c
@@ -221,10 +221,10 @@ mrb_close(mrb_state *mrb)
}
/* free */
- mrb_gc_free_gv(mrb);
+ mrb_gc_destroy(mrb, &mrb->gc);
mrb_free_context(mrb, mrb->root_c);
+ mrb_gc_free_gv(mrb);
mrb_free_symtbl(mrb);
- mrb_gc_destroy(mrb, &mrb->gc);
mrb_free(mrb, mrb);
}
diff --git a/src/string.c b/src/string.c
index a6031b0ef..7d3480d2a 100644
--- a/src/string.c
+++ b/src/string.c
@@ -594,6 +594,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
RSTR_SET_EMBED_FLAG(s1);
memcpy(s1->as.ary, RSTR_PTR(s2), len);
RSTR_SET_EMBED_LEN(s1, len);
+ RSTR_PTR(s1)[len] = '\0';
}
else {
str_make_shared(mrb, s2, s1);
@@ -1263,7 +1264,7 @@ str_replace_partial(mrb_state *mrb, mrb_value src, mrb_int pos, mrb_int end, mrb
memmove(strp + newlen - (len - end), strp + end, len - end);
if (!mrb_nil_p(rep)) {
- memcpy(strp + pos, RSTRING_PTR(rep), replen);
+ memmove(strp + pos, RSTRING_PTR(rep), replen);
}
RSTR_SET_LEN(str, newlen);
strp[newlen] = '\0';
diff --git a/src/variable.c b/src/variable.c
index ab3bea327..32416da4e 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -268,10 +268,8 @@ mrb_gc_mark_gv(mrb_state *mrb)
void
mrb_gc_free_gv(mrb_state *mrb)
{
- if (mrb->globals) {
+ if (mrb->globals)
iv_free(mrb, mrb->globals);
- mrb->globals = NULL;
- }
}
void