diff options
author | Peter Wu <lekensteyn@gmail.com> | 2011-12-03 11:28:39 +0000 |
---|---|---|
committer | Peter Wu <lekensteyn@gmail.com> | 2011-12-03 11:28:39 +0000 |
commit | 1ef20f9e52551d6cdca02ecd9bc829bdb859c7f7 (patch) | |
tree | ec6b9ab063b2ef0ca38d9a90178d077af1584fa8 /pp2cc.py | |
parent | 3e8b807851337de5abf668892da2a589b6d8fad2 (diff) | |
download | pp2cc-1ef20f9e52551d6cdca02ecd9bc829bdb859c7f7.tar.gz |
Process function declarations to avoid "undefined function" warnings
Diffstat (limited to 'pp2cc.py')
-rwxr-xr-x | pp2cc.py | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -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) |