]> thyrsus.com Git - mad.git/commitdiff
RESTORE has to reverse its argument list.
authorEric S. Raymond <esr@thyrsus,com>
Fri, 13 Feb 2004 21:55:18 +0000 (21:55 +0000)
committerEric S. Raymond <esr@thyrsus,com>
Fri, 13 Feb 2004 21:55:18 +0000 (21:55 +0000)
mad

diff --git a/mad b/mad
index a39686e07717ffe6e63415c93a2b975a78d4c14e..708194e294cbece933341af8be2f2dce3528f3db 100755 (executable)
--- a/mad
+++ b/mad
@@ -592,6 +592,9 @@ def analyze():
                 returntypes[currentfunc] = m
                 if m != normalmode and returntypes[currentfunc] != m:
                     deductions += 1
+            elif statement[0] == 'restore':
+                for var in statement[1]:
+                    typedict[currentfunc][var] = normalmode
             elif statement[0] == 'substitution':
                 # Propagate type markers through assignment
                 var = statement[1]
@@ -918,8 +921,10 @@ def print_C_statement(statement):
             return "/* %s */" % statement[1].strip()
     elif statement[0] == 'restore':
         rep = ""
-        for var in statement[1]:
-            rep += "%s = (%s)(*--recursor); " % (var, typedict[currentfunc][var])
+        popoff = list(statement[1])
+        popoff.reverse()
+        for var in popoff:
+            rep += "%s = (%s)(*--recursor); " % (var, typedict[currentfunc].get(var, normalmode))
         return rep;
     elif statement[0] == 'return':
         if len(statement) == 1:
@@ -929,7 +934,7 @@ def print_C_statement(statement):
     elif statement[0] == 'save':
         rep = ''
         for expr in statement[1]:
-            rep += '*recursor++ = (double)(%s); ' % print_C_expr(expr)
+            rep += '*recursor++ = (%s)(%s); ' % (normalmode,print_C_expr(expr))
         return rep
     elif statement[0] == 'set_list_to':
         var = statement[1]
@@ -967,7 +972,12 @@ def generate_C_code(out):
             out.write("  " + label+':\n')
         if statement[0] in ('for', 'map'):
             scopes.append(statement[1])
-        rep = print_C_statement(statement)
+        try:
+            rep = print_C_statement(statement)
+        except:
+            sys.stderr.write("mad: internal error while generating code for line %d\n" % sourceline)
+            (exc_type, exc_value, exc_traceback) = sys.exc_info()
+            raise exc_type, exc_value, exc_traceback
         if rep:
             indentchange = rep.count('{') - rep.count('}')
             if indentchange < 0: