diff --git a/CodeGenUtils.py b/CodeGenUtils.py index 1897f6a0cb118c233ba94e01cd50b49e35564032..cc8eeaf57cef1f3e62a64cd322ba89c63cf8a04a 100644 --- a/CodeGenUtils.py +++ b/CodeGenUtils.py @@ -86,9 +86,15 @@ def genMethodInvoke(method): return (pro, epi) # generates shorter code for constant value conditionals and comparison conditionals -# cond is either literalNode or ExprNode +# cond is either literalNode or ExprNode or NameNode def iffalse(cond, label): result = "" + if cond.__class__.__name__ == "NameNode": + cond.codeGen() + result += cond.code + result += p("jz", label) + return result + val = cond.getConstant() if val != None: if val == True: @@ -102,7 +108,7 @@ def iffalse(cond, label): return result -# Generates generic (not specific to class) helper functions +# Generates generic (not specific to class) helper functions def genericHelperFunctions(): code = "" @@ -137,9 +143,9 @@ def globalImport(genGlobalFunction=False): if not genGlobalFunction: code += p(instruction="extern", arg1="G__Zero") + \ p(instruction="extern", arg1="H__Throw_Exception") + \ - p(instruction="extern", arg1="H__Null_Check") + p(instruction="extern", arg1="H__Null_Check") - code += "; End of importing helper functions and constants\n" + code += "; End of importing helper functions and constants\n" return code # Helper function for importation of label (only import if it's not already inside the same .s file) diff --git a/MemberNodes.py b/MemberNodes.py index 0c9cb8868b10da4f3226f3c639f36fc9de95f4cd..075604174100ef3f2e8617ef20362c9a3e1ac0ec 100644 --- a/MemberNodes.py +++ b/MemberNodes.py @@ -105,6 +105,7 @@ class MethodNode(ASTNode): self.typeName = typeName self.order = order self.myType = None + # self.SIToffset for methods that implements interface method # get method name nameNodes = getParseTreeNodes(['ID'], parseTree, ['params', 'type', 'methodBody']) @@ -241,7 +242,7 @@ class MethodNode(ASTNode): self.code += genProcedure(bodyCode, "method definition for " + self.name) else: - self.code += ("mov", "eax", "0") + self.code += p("mov", "eax", "0") self.code += p("ret", "") # This method is called instead of codeGen if this is a constructor @@ -292,7 +293,7 @@ class MethodNode(ASTNode): for i in range(len(vars)): bodyCode += p("pop", "edx") else: - bodyCode += ("mov", "eax", "0") + bodyCode += p("mov", "eax", "0") self.code += genProcedure(bodyCode, "Constructor definition for " + self.name + " " + self.paramTypes)