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