diff --git a/MemberNodes.py b/MemberNodes.py index 138bd541a24a5016612ca0e609f6b04c300b89c4..0758e0c2332bf373554a54d4a07d3535e5d71391 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 64fcf1bd39ba8ec5b95cb72b7a24a99884635872..68ee3bd75ae648b95be7d89e1939007edd27deca 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 5db74b6f06dc3ce77a2f87dc6b819dc2d5d7fea2..f4a300811f4e033bd7c5d4f292619540fd5a5ce6 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