From 7f91acd0130e1d18c3e02099a53d167780e90a2d Mon Sep 17 00:00:00 2001 From: Xun Yang <x299yang@uwaterloo.ca> Date: Mon, 13 Apr 2020 14:51:27 -0400 Subject: [PATCH] fix segfault on forward ref --- LineNodes.py | 3 ++- MemberNodes.py | 4 ++-- codeGenNodes.py | 19 +++++++++++++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/LineNodes.py b/LineNodes.py index 2033842..be57251 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 7847238..671559b 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 828dc5b..f5ae3c8 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 -- GitLab