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]
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:
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]
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: