diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/state.c | 4 | ||||
| -rw-r--r-- | src/string.c | 3 | ||||
| -rw-r--r-- | src/variable.c | 4 |
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 |
