Parser: Clean up more things and make sure to not deinit uninitialized data
This commit is contained in:
parent
8d1eaf5d78
commit
74e43e61ce
1 changed files with 31 additions and 8 deletions
39
src/parser.c
39
src/parser.c
|
|
@ -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(¶ms);
|
||||
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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue