From: ceriel Date: Tue, 20 Oct 1987 09:36:34 +0000 (+0000) Subject: fixed some problems: ADS was generated with size > pointer_size; X-Git-Tag: release-5-5~3796 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=a24c90f5a905f9b8cb600a0d6b557ca396590a1f;p=ack.git fixed some problems: ADS was generated with size > pointer_size; some (most) backends dont implement that. Unstacking of macros did not quite work properly, but I dont know why --- diff --git a/lang/cem/cemcom/Parameters b/lang/cem/cemcom/Parameters index 1671e564d..817457b2d 100644 --- a/lang/cem/cemcom/Parameters +++ b/lang/cem/cemcom/Parameters @@ -78,7 +78,7 @@ !File: debug.h -#undef DEBUG 1 /* perform various self-tests */ +#define DEBUG 1 /* perform various self-tests */ !File: use_tmp.h diff --git a/lang/cem/cemcom/eval.c b/lang/cem/cemcom/eval.c index fbf930c20..439b66b0a 100644 --- a/lang/cem/cemcom/eval.c +++ b/lang/cem/cemcom/eval.c @@ -122,7 +122,10 @@ EVAL(expr, val, code, true_label, false_label) C_adi(tp->tp_size); break; case POINTER: - C_ads(right->ex_type->tp_size); + C_loc(right->ex_type->tp_size); + C_loc(pointer_size); + C_ciu(); + C_ads(pointer_size); break; #ifndef NOFLOAT case DOUBLE: @@ -176,7 +179,10 @@ EVAL(expr, val, code, true_label, false_label) C_sbs(pointer_size); else { C_ngi(right->ex_type->tp_size); - C_ads(right->ex_type->tp_size); + C_loc(right->ex_type->tp_size); + C_loc(pointer_size); + C_ciu(); + C_ads(pointer_size); } break; #ifndef NOFLOAT @@ -748,7 +754,10 @@ assop(type, oper) case POINTER: if (oper == MINAB || oper == MINMIN || oper == POSTDECR) C_ngi(size); - C_ads(size); + C_loc(size); + C_loc(pointer_size); + C_ciu(); + C_ads(pointer_size); break; case ERRONEOUS: break; diff --git a/lang/cem/cemcom/macro.str b/lang/cem/cemcom/macro.str index 74d42f6e0..3979ecbee 100644 --- a/lang/cem/cemcom/macro.str +++ b/lang/cem/cemcom/macro.str @@ -37,6 +37,7 @@ struct mlist { struct mlist *next; struct macro *m_mac; char *m_repl; + char m_unstack; }; /* ALLOCDEF "mlist" 20 */ diff --git a/lang/cem/cemcom/replace.c b/lang/cem/cemcom/replace.c index f7cdd472e..dafa2fa2a 100644 --- a/lang/cem/cemcom/replace.c +++ b/lang/cem/cemcom/replace.c @@ -190,26 +190,36 @@ macro2buffer(idef, actpars, siztext) EXPORT DoUnstack() { + register struct mlist *p = ReplaceList; + + while (p->m_unstack) p = p->next; + p->m_unstack = 1; Unstacked++; } EXPORT EnableMacros() { - register struct mlist *p = ReplaceList; + register struct mlist *p = ReplaceList, *prev = 0; + int cnt = 0; ASSERT(Unstacked > 0); - while (Unstacked > 0) { + while (p) { struct mlist *nxt = p->next; - ASSERT(p != 0); - p->m_mac->mc_flag &= ~NOREPLACE; - if (p->m_mac->mc_count) p->m_mac->mc_count--; - if (p->m_repl) free(p->m_repl); - free_mlist(p); + if (p->m_unstack) { + p->m_mac->mc_flag &= ~NOREPLACE; + if (p->m_mac->mc_count) p->m_mac->mc_count--; + if (p->m_repl) free(p->m_repl); + if (! prev) ReplaceList = nxt; + else prev->next = nxt; + free_mlist(p); + cnt++; + } + else prev = p; p = nxt; - Unstacked--; } - ReplaceList = p; + ASSERT(cnt == Unstacked); + Unstacked = 0; } #endif NOPP