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:
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
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;
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