From e7da8dfe382b360525c2caa1e18763284ff768b9 Mon Sep 17 00:00:00 2001 From: r4 Date: Thu, 30 Dec 2021 18:07:59 +0100 Subject: [PATCH] make put all frees after set_err I had the case that frees would invalidate memory set_err would later use, so putting frees after set_err is probably good practice. --- lex.c | 1 + parse.c | 4 ++-- vm.c | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lex.c b/lex.c index a5be97b..a3fc7e0 100644 --- a/lex.c +++ b/lex.c @@ -339,6 +339,7 @@ TokList lex(const char *s) { c = get_esc_char(s[0]); if (!c) { set_err("Unrecognized escape sequence: '\\%c'", c); + free(str); return toks; } } diff --git a/parse.c b/parse.c index abb832b..176f222 100644 --- a/parse.c +++ b/parse.c @@ -454,9 +454,9 @@ static ExprRet expr(IRList *out_ir, TokList *toks, Map *funcs, Scope *parent_sc, for (size_t i = 0; i < elems_len; i++) { Value *v = &elems[i].Literal; if (v->type != arr_ty) { + set_err("Type of array item %zu (%s) differs from array type (%s)", i, type_str[v->type], type_str[arr_ty]); free(arr_vals); free(elems); - set_err("Type of array item %zu (%s) differs from array type (%s)", i, type_str[v->type], type_str[arr_ty]); return (ExprRet){0}; } memcpy((uint8_t*)arr_vals + type_size[arr_ty] * i, &v->Void, type_size[arr_ty]); @@ -729,9 +729,9 @@ static void stmt(IRList *out_ir, TokList *toks, Map *funcs, Scope *sc, TokListIt skip_newlns(toks, t->next); if (t->next->tok.kind == TokOp) { if (t->next->tok.Op == OpEOF) { - term_scope(&inner_sc); mark_err(&start->tok); set_err("Unclosed '{'"); + term_scope(&inner_sc); return; } if (t->next->tok.Op == OpRCurl) diff --git a/vm.c b/vm.c index ea6107d..109f7da 100644 --- a/vm.c +++ b/vm.c @@ -92,9 +92,9 @@ void run(IRList *ir, const BuiltinFunc *builtin_funcs) { } case IRAddrOf: { if (instr->Unary.val.kind != IRParamAddr) { + set_err("Unable to take the address of a literal"); free(fn_args); stack_term(&s); - set_err("Unable to take the address of a literal"); return; } Value *v = &s.mem[instr->Unary.val.Addr]; @@ -195,10 +195,10 @@ void run(IRList *ir, const BuiltinFunc *builtin_funcs) { for (size_t j = 0; j < arr_len; j++) { Value *v = irparam_to_val(&s, &instr->ArrMake.vals[j]); if (v->type != arr_ty) { + set_err("Type of array item %zu (%s) differs from array type (%s)", j, type_str[v->type], type_str[arr_ty]); free(arr_vals); free(fn_args); stack_term(&s); - set_err("Type of array item %zu (%s) differs from array type (%s)", j, type_str[v->type], type_str[arr_ty]); return; } memcpy((uint8_t*)arr_vals + type_size[arr_ty] * j, &v->Void, type_size[arr_ty]);