From 85963975b1a1ae5fa9205fa78f3d309172a28afb Mon Sep 17 00:00:00 2001
From: Xun Yang <x299yang@uwaterloo.ca>
Date: Mon, 6 Apr 2020 14:39:50 -0400
Subject: [PATCH] fix return Node

---
 LineNodes.py   | 5 +++++
 MemberNodes.py | 4 ++++
 2 files changed, 9 insertions(+)

diff --git a/LineNodes.py b/LineNodes.py
index 9141c44..f697308 100644
--- a/LineNodes.py
+++ b/LineNodes.py
@@ -332,6 +332,7 @@ class ReturnNode(ASTNode):
         self.children = []
         self.expr = None # could be None
         self.typeName = typeName
+        self.method = None # methodNode that this return belongs to
 
         if len(parseTree.children) == 3:
             self.expr = makeNodeFromExpr(parseTree.children[1], typeName)
@@ -355,10 +356,14 @@ class ReturnNode(ASTNode):
         self.outMaybe = False # out[L] = no
 
     def codeGen(self):
+        if hasattr(self, "code") and self.code != "":
+            return
+
         self.code = ""
         if self.expr:
             self.expr.codeGen()
             self.code += self.expr.code
+        self.code += p("jmp", self.method.label + "_end", None, "Return to the end of this method.")
 
 # forStatement and forStatementNoShortIf
 # Rules:
diff --git a/MemberNodes.py b/MemberNodes.py
index 58cd412..e7c13c8 100644
--- a/MemberNodes.py
+++ b/MemberNodes.py
@@ -153,6 +153,7 @@ class MethodNode(ASTNode):
 
 
         for n in returnNodes:
+            n.method = self
             # Checking for functions of type void
             # Only valid if either the function doesn't have a return statement, or the return statement is a semicolon (return;)
             if self.myType and self.myType.name == "void":
@@ -183,6 +184,7 @@ class MethodNode(ASTNode):
         if hasattr(self, "code") and self.code != "":
             return
 
+        self.label = "M_" + self.typeName + "_" + self.name + "_" + self.paramTypes
         self.code = pLabel(self.typeName + "_" + self.name + "_" + self.paramTypes, "method")
 
         if self.body:
@@ -197,6 +199,8 @@ class MethodNode(ASTNode):
             self.body.codeGen()
             bodyCode += self.body.code
 
+            bodyCode += self.label + "_end:            ; end of method for " + self.name + "\n"
+
             # pop off all the local var
             for i in range(len(vars)):
                 bodyCode += p("pop", "edx")
-- 
GitLab