fixed some problems: ADS was generated with size > pointer_size;
authorceriel <none@none>
Tue, 20 Oct 1987 09:36:34 +0000 (09:36 +0000)
committerceriel <none@none>
Tue, 20 Oct 1987 09:36:34 +0000 (09:36 +0000)
some (most) backends dont implement that.
Unstacking of macros did not quite work properly, but I dont know why

lang/cem/cemcom/Parameters
lang/cem/cemcom/eval.c
lang/cem/cemcom/macro.str
lang/cem/cemcom/replace.c

index 1671e56..817457b 100644 (file)
@@ -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
index fbf930c..439b66b 100644 (file)
@@ -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;
index 74d42f6..3979ecb 100644 (file)
@@ -37,6 +37,7 @@ struct mlist {
        struct mlist *next;
        struct macro *m_mac;
        char *m_repl;
+       char m_unstack;
 };
 
 /* ALLOCDEF "mlist" 20 */
index f7cdd47..dafa2fa 100644 (file)
@@ -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