recover from errors in bool expressions (ie, don't segfault)
This commit is contained in:
parent
8e030089a7
commit
58d0f188f1
|
@ -1514,10 +1514,14 @@ convert_bool (expr_t *e, int block)
|
||||||
|
|
||||||
if (e->type == ex_uexpr && e->e.expr.op == '!') {
|
if (e->type == ex_uexpr && e->e.expr.op == '!') {
|
||||||
e = convert_bool (e->e.expr.e1, 0);
|
e = convert_bool (e->e.expr.e1, 0);
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
e = unary_expr ('!', e);
|
e = unary_expr ('!', e);
|
||||||
}
|
}
|
||||||
if (e->type != ex_bool) {
|
if (e->type != ex_bool) {
|
||||||
e = test_expr (e, 1);
|
e = test_expr (e, 1);
|
||||||
|
if (e->type == ex_error)
|
||||||
|
return e;
|
||||||
if (e->type == ex_integer) {
|
if (e->type == ex_integer) {
|
||||||
e = new_unary_expr ('g', 0);
|
e = new_unary_expr ('g', 0);
|
||||||
if (e->e.integer_val)
|
if (e->e.integer_val)
|
||||||
|
@ -1578,7 +1582,12 @@ bool_expr (int op, expr_t *label, expr_t *e1, expr_t *e2)
|
||||||
return binary_expr (op, e1, e2);
|
return binary_expr (op, e1, e2);
|
||||||
|
|
||||||
e1 = convert_bool (e1, 0);
|
e1 = convert_bool (e1, 0);
|
||||||
|
if (e1->type == ex_error)
|
||||||
|
return e1;
|
||||||
|
|
||||||
e2 = convert_bool (e2, 0);
|
e2 = convert_bool (e2, 0);
|
||||||
|
if (e2->type == ex_error)
|
||||||
|
return e2;
|
||||||
|
|
||||||
block = new_block_expr ();
|
block = new_block_expr ();
|
||||||
append_expr (block, e1);
|
append_expr (block, e1);
|
||||||
|
@ -2375,6 +2384,8 @@ conditional_expr (expr_t *cond, expr_t *e1, expr_t *e2)
|
||||||
return e2;
|
return e2;
|
||||||
|
|
||||||
cond = convert_bool (cond, 1);
|
cond = convert_bool (cond, 1);
|
||||||
|
if (cond->type == ex_error)
|
||||||
|
return cond;
|
||||||
|
|
||||||
backpatch (cond->e.bool.true_list, tlabel);
|
backpatch (cond->e.bool.true_list, tlabel);
|
||||||
backpatch (cond->e.bool.false_list, flabel);
|
backpatch (cond->e.bool.false_list, flabel);
|
||||||
|
|
|
@ -671,10 +671,12 @@ statement
|
||||||
append_expr ($$, continue_label);
|
append_expr ($$, continue_label);
|
||||||
|
|
||||||
$5 = convert_bool ($5, 1);
|
$5 = convert_bool ($5, 1);
|
||||||
backpatch ($5->e.bool.true_list, l1);
|
if ($5->type != ex_error) {
|
||||||
backpatch ($5->e.bool.false_list, l2);
|
backpatch ($5->e.bool.true_list, l1);
|
||||||
append_expr ($5->e.bool.e, l2);
|
backpatch ($5->e.bool.false_list, l2);
|
||||||
append_expr ($$, $5);
|
append_expr ($5->e.bool.e, l2);
|
||||||
|
append_expr ($$, $5);
|
||||||
|
}
|
||||||
|
|
||||||
break_label = $2;
|
break_label = $2;
|
||||||
continue_label = $3;
|
continue_label = $3;
|
||||||
|
@ -698,10 +700,12 @@ statement
|
||||||
append_expr ($$, continue_label);
|
append_expr ($$, continue_label);
|
||||||
|
|
||||||
$7 = convert_bool ($7, 1);
|
$7 = convert_bool ($7, 1);
|
||||||
backpatch ($7->e.bool.true_list, l1);
|
if ($7->type != ex_error) {
|
||||||
backpatch ($7->e.bool.false_list, break_label);
|
backpatch ($7->e.bool.true_list, l1);
|
||||||
append_expr ($7->e.bool.e, break_label);
|
backpatch ($7->e.bool.false_list, break_label);
|
||||||
append_expr ($$, $7);
|
append_expr ($7->e.bool.e, break_label);
|
||||||
|
append_expr ($$, $7);
|
||||||
|
}
|
||||||
|
|
||||||
break_label = $2;
|
break_label = $2;
|
||||||
continue_label = $3;
|
continue_label = $3;
|
||||||
|
@ -736,10 +740,12 @@ statement
|
||||||
free_local_inits ($5);
|
free_local_inits ($5);
|
||||||
|
|
||||||
$3 = convert_bool ($3, 1);
|
$3 = convert_bool ($3, 1);
|
||||||
backpatch ($3->e.bool.true_list, tl);
|
if ($3->type != ex_error) {
|
||||||
backpatch ($3->e.bool.false_list, fl);
|
backpatch ($3->e.bool.true_list, tl);
|
||||||
append_expr ($3->e.bool.e, tl);
|
backpatch ($3->e.bool.false_list, fl);
|
||||||
append_expr ($$, $3);
|
append_expr ($3->e.bool.e, tl);
|
||||||
|
append_expr ($$, $3);
|
||||||
|
}
|
||||||
|
|
||||||
append_expr ($$, $6);
|
append_expr ($$, $6);
|
||||||
append_expr ($$, fl);
|
append_expr ($$, fl);
|
||||||
|
@ -774,10 +780,12 @@ statement
|
||||||
free_local_inits ($5);
|
free_local_inits ($5);
|
||||||
|
|
||||||
$3 = convert_bool ($3, 1);
|
$3 = convert_bool ($3, 1);
|
||||||
backpatch ($3->e.bool.true_list, tl);
|
if ($3->type != ex_error) {
|
||||||
backpatch ($3->e.bool.false_list, fl);
|
backpatch ($3->e.bool.true_list, tl);
|
||||||
append_expr ($3->e.bool.e, tl);
|
backpatch ($3->e.bool.false_list, fl);
|
||||||
append_expr ($$, $3);
|
append_expr ($3->e.bool.e, tl);
|
||||||
|
append_expr ($$, $3);
|
||||||
|
}
|
||||||
|
|
||||||
append_expr ($$, $6);
|
append_expr ($$, $6);
|
||||||
|
|
||||||
|
@ -826,10 +834,12 @@ statement
|
||||||
if ($7) {
|
if ($7) {
|
||||||
append_expr ($$, l1);
|
append_expr ($$, l1);
|
||||||
$7 = convert_bool ($7, 1);
|
$7 = convert_bool ($7, 1);
|
||||||
backpatch ($7->e.bool.true_list, tl);
|
if ($7->type != ex_error) {
|
||||||
backpatch ($7->e.bool.false_list, fl);
|
backpatch ($7->e.bool.true_list, tl);
|
||||||
append_expr ($7->e.bool.e, fl);
|
backpatch ($7->e.bool.false_list, fl);
|
||||||
append_expr ($$, $7);
|
append_expr ($7->e.bool.e, fl);
|
||||||
|
append_expr ($$, $7);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
append_expr ($$, fl);
|
append_expr ($$, fl);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue