From: Eric S. Raymond Date: Fri, 13 Feb 2004 21:55:18 +0000 (+0000) Subject: RESTORE has to reverse its argument list. X-Git-Tag: 1.0~112 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=b7c718ac330e5fbb6db89a5be15fffefa6667cbb;p=mad.git RESTORE has to reverse its argument list. --- 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: