Parser: Clean up more things and make sure to not deinit uninitialized data

This commit is contained in:
Laria 2021-12-19 00:28:35 +01:00
parent 8d1eaf5d78
commit 74e43e61ce

View file

@ -759,9 +759,9 @@ after_mapsto:
&pair,
1
)) {
// \mystuff\TODO:destroy pair!
apfl_expr_dict_pair_deinit(&pair);
p->error = apfl_error_simple(APFL_ERR_MALLOC_FAILED);
return false;
goto error;
}
}
@ -790,7 +790,7 @@ error:
if (cleanup_value) {
fragment_deinit(&value);
}
free(dict.items); // \mystuff\TODO:also destroy all items!
apfl_expr_dict_deinit(&dict);
return false;
}
@ -1278,7 +1278,6 @@ fragment_to_assignable_inner(
assert(false); // Should not be reached
error:
apfl_expr_assignable_deinit(out);
return false;
}
@ -1287,10 +1286,20 @@ fragment_to_assignable(
apfl_parser_ptr p,
bool expand_ok,
struct fragment fragment,
struct apfl_expr_assignable *out
struct apfl_expr_assignable *outptr
) {
bool result = fragment_to_assignable_inner(p, expand_ok, &fragment, out);
struct apfl_expr_assignable out = { // Just a value that can be safely deinited
.type = APFL_EXPR_ASSIGNABLE_EXPAND,
.expand = NULL,
};
bool result = fragment_to_assignable_inner(p, expand_ok, &fragment, &out);
fragment_deinit(&fragment);
if (result) {
*outptr = out;
} else {
apfl_expr_assignable_deinit(&out);
}
return result;
}
@ -1387,6 +1396,13 @@ parse_body_or_toplevel_finalize(
struct partial_assignment_list partial_assignments,
struct apfl_expr *out
) {
*out = (struct apfl_expr) {
.type = APFL_EXPR_CONSTANT,
.constant = {
.type = APFL_EXPR_CONST_NIL,
}
};
if (fragments.len == 0) {
if (partial_assignments.len > 0) {
p->error = (struct apfl_error) {
@ -1537,7 +1553,6 @@ break_inner:
fragment_list_deinit(fragments); // Reset fragment list
if (!fragment_to_assignable(p, false, fragment, &cur_partial->lhs)) {
fragment_deinit(&fragment);
goto error;
}
@ -1584,7 +1599,7 @@ break_inner:
}
}
error: // \mystuff\TODO:also on other non ok results???
error:
DEINIT_LIST(partial_assignments.items, partial_assignments.len, partial_assignment_deinit);
return PF_ERROR;
}
@ -1738,13 +1753,21 @@ parse_braces(
}
error:
apfl_expr_body_deinit(&body);
apfl_expr_params_deinit(&params);
fragment_list_deinit(&fragments);
DEINIT_LIST(subfuncs, subfuncs_len, apfl_expr_subfunc_deinit);
return false;
}
static enum parse_fragment_result
parse_fragment(apfl_parser_ptr p, struct fragment *fragment, bool need, enum parse_fragment_flags flags)
{
*fragment = (struct fragment) { // Something we can safely deinit
.type = FRAG_EXPAND,
.expand = NULL,
};
struct fragment *lhs = NULL;
struct fragment *rhs = NULL;