From a4b29c9fbd050f19d89c3d0ee8cad28f45ffa46e Mon Sep 17 00:00:00 2001 From: Xun Yang <x299yang@uwaterloo.ca> Date: Sun, 12 Apr 2020 10:44:29 -0400 Subject: [PATCH] fix nameNode THIS access, field access now working --- MemberNodes.py | 2 +- NameNode.py | 6 ++---- codeGenNodes.py | 12 ++++++------ 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/MemberNodes.py b/MemberNodes.py index 138bd54..0758e0c 100644 --- a/MemberNodes.py +++ b/MemberNodes.py @@ -285,7 +285,7 @@ class MethodNode(ASTNode): if not 'static' in f.mods and f.variableDcl.variableInit: f.variableDcl.variableInit.codeGen() bodyCode += f.variableDcl.variableInit.code - bodyCode += p("mov", "ebx", "[ebp - " + str(thisLoc) + "]") # THIS + bodyCode += p("mov", "ebx", "[ebp + " + str(thisLoc) + "]") # THIS bodyCode += p("mov", "[ebx + " + str(f.offset) + " ]", "eax") # body code diff --git a/NameNode.py b/NameNode.py index 64fcf1b..68ee3bd 100644 --- a/NameNode.py +++ b/NameNode.py @@ -109,13 +109,11 @@ class NameNode(ASTNode): self.prefixLink = "contain" self.addToPrefix("contain") + # evaluate THIS first, fieldnode will be added to prefixNodes in checkType() cNameNode = genNameNode(self.typeName) cNameNode.isThis = True self.prefixNodes.append(cNameNode) - cNameNode = genNameNode(self.typeName) - if self.env.findNode(ID, "fieldDcl"): # only resolve up to the object for methods - cNameNode.nodeLink = self.env.getNode(ID, "fieldDcl") - self.prefixNodes.append(cNameNode) + return True return False diff --git a/codeGenNodes.py b/codeGenNodes.py index 5db74b6..f4a3008 100644 --- a/codeGenNodes.py +++ b/codeGenNodes.py @@ -12,15 +12,15 @@ class genNameNode(): # returns code def codeGen(self): if self.isThis: - self.code = p("mov", "eax", "[ebp - 8]") + self.code = p("mov", "eax", "[ebp + 8]") elif self.nodeLink.__class__.__name__ == "VarDclNode": 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": if self.isStatic: - label = nodeLink.typeName + "_" + nodeLink.name - self.code += importHelper(fieldNode.typeName, self.typeName, "S_"+label) + \ + label = self.nodeLink.typeName + "_" + self.nodeLink.name + self.code += importHelper(self.nodeLink.typeName, self.typeName, "S_"+label) + \ p("mov", "eax", "dword S_"+label) self.code += p("mov", "eax", "[eax]") else: @@ -35,7 +35,7 @@ class genNameNode(): result = "" if self.isThis: result = p("mov", "eax", "ebp") - result += p("sub", "eax", "8") + result += p("add", "eax", "8") elif self.nodeLink.__class__.__name__ == "VarDclNode": result = p("mov", "eax", "ebp") result += p("sub", "eax", str(self.nodeLink.offset)) @@ -44,8 +44,8 @@ class genNameNode(): result += p("add", "eax", str(self.nodeLink.offset)) elif self.nodeLink.__class__.__name__ == "FieldNode": if self.isStatic: - label = nodeLink.typeName + "_" + nodeLink.name - self.code += importHelper(fieldNode.typeName, self.typeName, "S_"+label) + \ + label = self.nodeLink.typeName + "_" + self.nodeLink.name + self.code += importHelper(self.nodeLink.typeName, self.typeName, "S_"+label) + \ p("mov", "eax", "dword S_"+label) else: # object will already be in eax -- GitLab