Fix segmentation fault causing bugs.
This commit is contained in:
parent
e5c2570bac
commit
919cfb495c
10
src/parser.c
10
src/parser.c
|
@ -373,6 +373,7 @@ libab_result _parse_expression(struct parser_state* state, libab_tree** store_in
|
||||||
|
|
||||||
ll_init(&out_stack);
|
ll_init(&out_stack);
|
||||||
ll_init(&op_stack);
|
ll_init(&op_stack);
|
||||||
|
*store_into = NULL;
|
||||||
|
|
||||||
while(result == LIBAB_SUCCESS && !_parser_eof(state)) {
|
while(result == LIBAB_SUCCESS && !_parser_eof(state)) {
|
||||||
enum parser_expression_type new_type = EXPR_NONE;
|
enum parser_expression_type new_type = EXPR_NONE;
|
||||||
|
@ -450,6 +451,10 @@ libab_result _parse_expression(struct parser_state* state, libab_tree** store_in
|
||||||
result = LIBAB_UNEXPECTED;
|
result = LIBAB_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS && *store_into == NULL) {
|
||||||
|
result = LIBAB_UNEXPECTED;
|
||||||
|
}
|
||||||
|
|
||||||
ll_free(&op_stack);
|
ll_free(&op_stack);
|
||||||
ll_foreach(&out_stack, NULL, compare_always, _parser_foreach_free_tree);
|
ll_foreach(&out_stack, NULL, compare_always, _parser_foreach_free_tree);
|
||||||
ll_free(&out_stack);
|
ll_free(&out_stack);
|
||||||
|
@ -460,7 +465,7 @@ libab_result _parse_expression(struct parser_state* state, libab_tree** store_in
|
||||||
libab_result _parse_block(struct parser_state* state,
|
libab_result _parse_block(struct parser_state* state,
|
||||||
libab_tree** store_into, int expect_braces) {
|
libab_tree** store_into, int expect_braces) {
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
libab_tree* temp;
|
libab_tree* temp = NULL;
|
||||||
result = _parser_construct_node_vec(state, state->current_match, store_into);
|
result = _parser_construct_node_vec(state, state->current_match, store_into);
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
(*store_into)->variant = BLOCK;
|
(*store_into)->variant = BLOCK;
|
||||||
|
@ -500,6 +505,7 @@ libab_result _parse_block(struct parser_state* state,
|
||||||
|
|
||||||
if(result != LIBAB_SUCCESS && *store_into) {
|
if(result != LIBAB_SUCCESS && *store_into) {
|
||||||
libab_tree_free_recursive(*store_into);
|
libab_tree_free_recursive(*store_into);
|
||||||
|
*store_into = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -517,7 +523,7 @@ libab_result libab_parser_parse(libab_parser* parser, ll* tokens,
|
||||||
result = _parse_block(&state, store_into, 0);
|
result = _parse_block(&state, store_into, 0);
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
(*store_into)->variant = BASE;
|
(*store_into)->variant = BASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user