fix a few bugs

This commit is contained in:
Bill Currie 2003-10-22 09:14:53 +00:00
parent d3e7be755b
commit 5f97de56d1
3 changed files with 61 additions and 12 deletions

View file

@ -440,10 +440,12 @@ build_bool_block (expr_t *block, expr_t *e)
switch (e->type) { switch (e->type) {
case ex_bool: case ex_bool:
build_bool_block (block, e->e.bool.e); build_bool_block (block, e->e.bool.e);
free_tempdefs ();
return; return;
case ex_label: case ex_label:
e->next = 0; e->next = 0;
append_expr (block, e); append_expr (block, e);
free_tempdefs ();
return; return;
case ex_expr: case ex_expr:
if (e->e.expr.op == OR || e->e.expr.op == AND) { if (e->e.expr.op == OR || e->e.expr.op == AND) {
@ -456,11 +458,13 @@ build_bool_block (expr_t *block, expr_t *e)
e->next = 0; e->next = 0;
append_expr (block, e); append_expr (block, e);
} }
free_tempdefs ();
return; return;
case ex_uexpr: case ex_uexpr:
if (e->e.expr.op == 'g') { if (e->e.expr.op == 'g') {
e->next = 0; e->next = 0;
append_expr (block, e); append_expr (block, e);
free_tempdefs ();
return; return;
} }
break; break;
@ -471,6 +475,7 @@ build_bool_block (expr_t *block, expr_t *e)
t = e->next; t = e->next;
build_bool_block (block, e); build_bool_block (block, e);
} }
free_tempdefs ();
return; return;
} }
break; break;

View file

@ -1467,6 +1467,9 @@ backpatch (ex_list_t *list, expr_t *label)
int i; int i;
expr_t *e; expr_t *e;
if (!list)
return;
for (i = 0; i < list->size; i++) { for (i = 0; i < list->size; i++) {
e = list->e[i]; e = list->e[i];
if (e->type == ex_uexpr && e->e.expr.op == 'g') if (e->type == ex_uexpr && e->e.expr.op == 'g')
@ -1537,6 +1540,20 @@ convert_bool (expr_t *e, int block)
return e; return e;
} }
static expr_t *
convert_from_bool (expr_t *e, type_t *type)
{
if (type == &type_float)
e = conditional_expr (e, new_float_expr (1), new_float_expr (0));
else if (type == &type_integer)
e = conditional_expr (e, new_integer_expr (1), new_integer_expr (0));
else if (type == &type_uinteger)
e = conditional_expr (e, new_uinteger_expr (1), new_uinteger_expr (0));
else
e = error (e, "can't convert from bool value");
return e;
}
expr_t * expr_t *
bool_expr (int op, expr_t *label, expr_t *e1, expr_t *e2) bool_expr (int op, expr_t *label, expr_t *e1, expr_t *e2)
{ {
@ -1738,10 +1755,10 @@ binary_expr (int op, expr_t *e1, expr_t *e2)
} }
if (e1->type == ex_bool) if (e1->type == ex_bool)
e1 = conditional_expr (e1, new_integer_expr (1), new_integer_expr (0)); e1 = convert_from_bool (e1, t2);
if (e2->type == ex_bool) if (e2->type == ex_bool)
e2 = conditional_expr (e2, new_integer_expr (1), new_integer_expr (0)); e2 = convert_from_bool (e2, t1);
if (e1->type == ex_short) { if (e1->type == ex_short) {
if (t2 == &type_integer) { if (t2 == &type_integer) {
@ -2296,16 +2313,8 @@ return_expr (function_t *f, expr_t *e)
return error (e, "returning a value for a void function"); return error (e, "returning a value for a void function");
warning (e, "returning a value for a void function"); warning (e, "returning a value for a void function");
} }
if (e->type == ex_bool) { if (e->type == ex_bool)
if (f->def->type->aux_type == &type_float) e = convert_from_bool (e, f->def->type->aux_type);
e = conditional_expr (e, new_float_expr (1), new_float_expr (0));
else if (f->def->type->aux_type == &type_integer)
e = conditional_expr (e, new_integer_expr (1),
new_integer_expr (0));
else if (f->def->type->aux_type == &type_uinteger)
e = conditional_expr (e, new_uinteger_expr (1),
new_uinteger_expr (0));
}
if (f->def->type->aux_type == &type_float && e->type == ex_integer) { if (f->def->type->aux_type == &type_float && e->type == ex_integer) {
e->type = ex_float; e->type = ex_float;
e->e.float_val = e->e.integer_val; e->e.float_val = e->e.integer_val;
@ -2594,6 +2603,9 @@ assign_expr (expr_t *e1, expr_t *e2)
error (e1, "internal error"); error (e1, "internal error");
abort (); abort ();
} }
if (e2->type == ex_bool)
e2 = convert_from_bool (e2, t1);
if (e2->type == ex_integer) { if (e2->type == ex_integer) {
if (t1 == &type_float if (t1 == &type_float
|| t1 == &type_vector || t1 == &type_vector

View file

@ -654,6 +654,11 @@ statement
{ {
expr_t *l1 = new_label_expr (); expr_t *l1 = new_label_expr ();
expr_t *l2 = break_label; expr_t *l2 = break_label;
int line = pr.source_line;
string_t file = pr.source_file;
pr.source_line = $5->line;
pr.source_file = $5->file;
restore_local_inits ($7); restore_local_inits ($7);
free_local_inits ($7); free_local_inits ($7);
@ -673,10 +678,18 @@ statement
break_label = $2; break_label = $2;
continue_label = $3; continue_label = $3;
pr.source_line = line;
pr.source_file = file;
} }
| DO break_label continue_label statement WHILE '(' expr ')' ';' | DO break_label continue_label statement WHILE '(' expr ')' ';'
{ {
expr_t *l1 = new_label_expr (); expr_t *l1 = new_label_expr ();
int line = pr.source_line;
string_t file = pr.source_file;
pr.source_line = $7->line;
pr.source_file = $7->file;
$$ = new_block_expr (); $$ = new_block_expr ();
@ -692,6 +705,9 @@ statement
break_label = $2; break_label = $2;
continue_label = $3; continue_label = $3;
pr.source_line = line;
pr.source_file = file;
} }
| LOCAL type | LOCAL type
{ {
@ -708,6 +724,11 @@ statement
{ {
expr_t *tl = new_label_expr (); expr_t *tl = new_label_expr ();
expr_t *fl = new_label_expr (); expr_t *fl = new_label_expr ();
int line = pr.source_line;
string_t file = pr.source_file;
pr.source_line = $3->line;
pr.source_file = $3->file;
$$ = new_block_expr (); $$ = new_block_expr ();
@ -722,6 +743,9 @@ statement
append_expr ($$, $6); append_expr ($$, $6);
append_expr ($$, fl); append_expr ($$, fl);
pr.source_line = line;
pr.source_file = file;
} }
| IF '(' expr ')' save_inits statement ELSE | IF '(' expr ')' save_inits statement ELSE
{ {
@ -736,6 +760,11 @@ statement
expr_t *e; expr_t *e;
hashtab_t *merged; hashtab_t *merged;
hashtab_t *else_ini; hashtab_t *else_ini;
int line = pr.source_line;
string_t file = pr.source_file;
pr.source_line = $3->line;
pr.source_file = $3->file;
$$ = new_block_expr (); $$ = new_block_expr ();
@ -764,6 +793,9 @@ statement
free_local_inits (merged); free_local_inits (merged);
free_local_inits (else_ini); free_local_inits (else_ini);
free_local_inits ($<def_list>8); free_local_inits ($<def_list>8);
pr.source_line = line;
pr.source_file = file;
} }
| FOR break_label continue_label | FOR break_label continue_label
'(' opt_expr ';' opt_expr ';' opt_expr ')' save_inits statement '(' opt_expr ';' opt_expr ';' opt_expr ')' save_inits statement