summaryrefslogtreecommitdiff
path: root/pp2cc.py
diff options
context:
space:
mode:
Diffstat (limited to 'pp2cc.py')
-rwxr-xr-xpp2cc.py12
1 files changed, 8 insertions, 4 deletions
diff --git a/pp2cc.py b/pp2cc.py
index 4c83afb..8f6a581 100755
--- a/pp2cc.py
+++ b/pp2cc.py
@@ -201,11 +201,14 @@ class Parse(object):
linked_node.incrementLevel()
self.asm.level = linked_node.level
+ # parse function declaration (which will parse params as well)
+ assert not self.parseStatement(node.decl, linked_node), ("Function"
+ " declaration should not return a line of assembly")
funcname = node.decl.name
- if funcname in self.functions:
+ function = self.functions[funcname]
+ if function.isLinked():
self.logger.error("Redefinition of function '{}'".format(funcname),
linked_node=linked_node)
- function = self.functions[funcname] = Function(node)
lbl_func = function.labelBegin()
lbl_end = function.labelEnd()
@@ -215,8 +218,6 @@ class Parse(object):
# save Base Pointer
lines = [self.asm.push(self.registers.BP, lbl_func)]
lines.append(self.asm.binary_op("LOAD", self.registers.BP, "SP"))
- # parse function declaration (which will parse params as well)
- lines += self.parseStatement(node.decl, linked_node)
body = self.parseStatement(node.body, linked_node)
self.asm.level = linked_node.level
@@ -1211,6 +1212,9 @@ class Parse(object):
def parseFuncDecl(self, linked_node):
lines = []
node = linked_node.node
+ funcname = node.type.declname
+ if not funcname in self.functions:
+ self.functions[funcname] = Function(node)
if node.args:
argstype = type(node.args).__name__
assert argstype == "ParamList", "Expected function arguments, found '{}' instead".format(argstype)