get struct copy to/from struct fields via pointers. fixes a bug found by

snax
This commit is contained in:
Bill Currie 2005-06-09 10:34:03 +00:00
parent 6355674bd3
commit 9f662787e0
3 changed files with 14 additions and 2 deletions

View file

@ -1147,7 +1147,7 @@ static operation_t op_struct[ev_type_count] = {
do_op_invalid, // ev_entity
do_op_invalid, // ev_field
do_op_invalid, // ev_func
do_op_invalid, // ev_pointer
do_op_pointer, // ev_pointer
do_op_invalid, // ev_quaternion
do_op_invalid, // ev_integer
do_op_invalid, // ev_uinteger

View file

@ -419,6 +419,16 @@ emit_deref_expr (expr_t *e, def_t *dest)
dest->file = e->file;
dest->users += 2;
}
if (dest->type->type == ev_struct) {
expr_t *d = new_def_expr (dest);
expr_t *m = new_move_expr (d, e, dest->type);
d->line = dest->line;
d->file = dest->file;
m->line = e->line;
m->file = e->file;
emit_sub_expr (m, 0);
return dest;
}
if (e->type == ex_expr
&& e->e.expr.op == '&'

View file

@ -277,8 +277,10 @@ ReuseConstant (expr_t *expr, def_t *def)
reloc_def_field_ofs (e.e.pointer.def, cn->ofs);
break;
case ex_pointer:
if (e.e.pointer.def)
if (e.e.pointer.def) {
EMIT_DEF_OFS (G_INT (cn->ofs), e.e.pointer.def);
e.e.pointer.def->users--;
}
break;
default:
break;