From b7c718ac330e5fbb6db89a5be15fffefa6667cbb Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 13 Feb 2004 21:55:18 +0000 Subject: [PATCH] RESTORE has to reverse its argument list. --- mad | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/mad b/mad index a39686e..708194e 100755 --- 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: -- 2.43.0