From 1ef20f9e52551d6cdca02ecd9bc829bdb859c7f7 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 3 Dec 2011 11:28:39 +0000 Subject: Process function declarations to avoid "undefined function" warnings --- pp2cc.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'pp2cc.py') 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) -- cgit v1.2.1