From 5bbcbe0185daa638e89030d8251c45ce66853dff Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 13 Jun 2002 07:20:15 +0000 Subject: [PATCH] arrays seem to be working nicely now (menus work:) --- tools/qfcc/source/emit.c | 35 ++++++++++++++++++++--------------- tools/qfcc/source/expr.c | 11 ++++++++++- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/tools/qfcc/source/emit.c b/tools/qfcc/source/emit.c index 405911382..9d0208aa9 100644 --- a/tools/qfcc/source/emit.c +++ b/tools/qfcc/source/emit.c @@ -294,6 +294,7 @@ emit_address_expr (expr_t *e) def_t *def_a, *def_b, *d; opcode_t *op; +print_expr (e); printf (" %d\n", e->line); def_a = emit_sub_expr (e->e.expr.e1, 0); def_b = emit_sub_expr (e->e.expr.e2, 0); op = opcode_find ("&", def_a, def_b, 0); @@ -306,28 +307,42 @@ emit_deref_expr (expr_t *e, def_t *dest) { def_t *d; type_t *type = e->e.expr.type; + def_t *z; + opcode_t *op; e = e->e.expr.e1; + if (e->type == ex_pointer) { + if (e->e.pointer.val > 0 && e->e.pointer.val < 65536) { + d = new_def (e->e.pointer.type, 0, current_scope); + d->ofs = e->e.pointer.val; + d->absolute = e->e.pointer.abs; + } else { + d = ReuseConstant (e, 0); + zero.type = ex_short; + z = emit_sub_expr (&zero, 0); + op = opcode_find (".", d, z, dest); + d = emit_statement (e->line, op, d, z, dest); + } + return d; + } if (!dest && (e->type != ex_pointer || !(e->e.pointer.val > 0 && e->e.pointer.val < 65536))) { dest = get_tempdef (type, current_scope); dest->users += 2; } -print_expr (e); printf ("%p\n", dest); +print_expr (e); printf (" %d %p\n", e->line, dest); if (e->type == ex_expr && e->e.expr.op == '&' && e->e.expr.e1->type < ex_string) e->e.expr.op = '.'; d = emit_sub_expr (e, dest); +print_expr (e); printf (" %d %p\n", e->line, dest); if (dest && d != dest) { - def_t *z; - opcode_t *op; - zero.type = ex_short; z = emit_sub_expr (&zero, 0); op = opcode_find (".", d, z, dest); - return emit_statement (e->line, op, d, z, dest); + d = emit_statement (e->line, op, d, z, dest); } else { if (!d->name) d->type = type; @@ -466,16 +481,6 @@ emit_sub_expr (expr_t *e, def_t *dest) d = e->e.temp.def; break; case ex_pointer: - if (e->e.pointer.val > 0 && e->e.pointer.val < 65536 - && e->e.pointer.type->type != ev_struct) { - d = new_def (pointer_type (e->e.pointer.type), 0, - current_scope); - d->ofs = e->e.short_val; - d->absolute = e->e.pointer.abs; - d->users = 1; - break; - } - // fall through case ex_string: case ex_float: case ex_vector: diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index a93b7bc47..404e8dfe5 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -1798,7 +1798,16 @@ address_expr (expr_t *e1, expr_t *e2, type_t *t) switch (e1->type) { case ex_def: type = e1->e.def->type; - if (type->type == ev_struct || type->type == ev_array) { + if (type->type == ev_struct) { + int abs = e1->e.def->global; + def_t *def = e1->e.def; + + e = e1; + e->type = ex_pointer; + e->e.pointer.val = def->ofs; + e->e.pointer.type = t; + e->e.pointer.abs = abs; + } else if (type->type == ev_array) { int abs = e1->e.def->global; def_t *def = e1->e.def;