Bläddra i källkod

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

ceriel 37 år sedan
förälder
incheckning
6dc819dd38
4 ändrade filer med 33 tillägg och 13 borttagningar
  1. 1 1
      lang/cem/cemcom/Parameters
  2. 12 3
      lang/cem/cemcom/eval.c
  3. 1 0
      lang/cem/cemcom/macro.str
  4. 19 9
      lang/cem/cemcom/replace.c

+ 1 - 1
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

+ 12 - 3
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;

+ 1 - 0
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 */

+ 19 - 9
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