diff --git a/LineNodes.py b/LineNodes.py index 20338426a2c6dfafa0f6e43120f470d14fc4f8ed..be572513acf7298856bd71447d9e0e6932e9da1f 100644 --- a/LineNodes.py +++ b/LineNodes.py @@ -111,7 +111,7 @@ class BlockNode(ASTNode): # 1. variableDcl type ID # 2. variableDcl type ID ASSIGN variableInit class VarDclNode(ASTNode): - def __init__(self, parseTree, typeName, checkAssign=False): + def __init__(self, parseTree, typeName, checkAssign=False, isField=None): self.parseTree = parseTree self.dclType = None self.name = None # variable name @@ -119,6 +119,7 @@ class VarDclNode(ASTNode): self.env = None self.children = [] self.typeName = typeName + self.isField = isField self.dclType = TypeNode(parseTree.children[0], typeName) self.name = parseTree.children[1].lex diff --git a/MemberNodes.py b/MemberNodes.py index 78472385adf9d50546abb66b7bd29abf3cdaaeb5..671559bb9290d3ca3fcd36668bf2902d5e755cc9 100644 --- a/MemberNodes.py +++ b/MemberNodes.py @@ -26,7 +26,7 @@ class FieldNode(ASTNode): self.mods.append(m.lex) elif node.name == 'variableDcl': - self.variableDcl = VarDclNode(node, self.typeName) + self.variableDcl = VarDclNode(node, self.typeName, isField=self) self.name = self.variableDcl.name self.myType = self.variableDcl.myType @@ -357,7 +357,7 @@ def getNameNodes(node): # Output: A list of local var dcl to be pushed onto the stack def getVarDclNodes(node): result = [] - + if node.__class__.__name__ == 'VarDclNode': return [node] elif node.__class__.__name__ == 'BlockNode': diff --git a/codeGenNodes.py b/codeGenNodes.py index 828dc5bd2a13dc32f6d11b36c4b56bf8cbf310d8..f5ae3c8781f24e4bd435f36f3dda564e48bb0364 100644 --- a/codeGenNodes.py +++ b/codeGenNodes.py @@ -20,7 +20,13 @@ class genNameNode(): self.code += p("add", "eax", 4) self.code += p("mov", "eax", "[eax]") elif self.nodeLink.__class__.__name__ == "VarDclNode": - self.code = p("mov", "eax", "[ebp - " + str(self.nodeLink.offset) + "]") + if self.nodeLink.isField : + self.code = p("mov", "eax", "[ebp + 8]") + self.code += p("call", "H__Null_Check") + self.code += p("add", "eax", self.nodeLink.isField.offset) + self.code += p("mov", "eax", "[eax]") + else: + self.code = p("mov", "eax", "[ebp - " + str(self.nodeLink.offset) + "]") elif self.nodeLink.__class__.__name__ == "ParamNode": self.code = p("mov", "eax", "[ebp + " + str(self.nodeLink.offset) + "]") elif self.nodeLink.__class__.__name__ == "FieldNode": @@ -47,15 +53,20 @@ class genNameNode(): result += p("call", "H__Null_Check") result += p("add", "eax", 4) elif self.nodeLink.__class__.__name__ == "VarDclNode": - result = p("mov", "eax", "ebp") - result += p("sub", "eax", str(self.nodeLink.offset)) + if self.nodeLink.isField : + result = p("mov", "eax", "[ebp + 8]") + result += p("call", "H__Null_Check") + result += p("add", "eax", self.nodeLink.isField.offset) + else: + result = p("mov", "eax", "ebp") + result += p("sub", "eax", str(self.nodeLink.offset)) elif self.nodeLink.__class__.__name__ == "ParamNode": result = p("mov", "eax", "ebp") result += p("add", "eax", str(self.nodeLink.offset)) elif self.nodeLink.__class__.__name__ == "FieldNode": if self.isStatic: label = self.nodeLink.typeName + "_" + self.nodeLink.name - self.code += importHelper(self.nodeLink.typeName, self.typeName, "S_"+label) + \ + result += importHelper(self.nodeLink.typeName, self.typeName, "S_"+label) + \ p("mov", "eax", "dword S_"+label) else: # object will already be in eax