diff --git a/ExprPrimaryNodes.py b/ExprPrimaryNodes.py index df1dfe5245dd8340ad6aeb3ba151a4bcc175a9bd..4cf2e64580a6378658d64d409c6891f59237d6e4 100644 --- a/ExprPrimaryNodes.py +++ b/ExprPrimaryNodes.py @@ -353,7 +353,7 @@ class ClassCreateNode(ASTNode): def codeGen(self): if hasattr(self, "code"): - return + return self.code = "" # 1. Allocating space for the object in heap @@ -385,7 +385,7 @@ class ClassCreateNode(ASTNode): p(instruction="pop", arg1="eax", comment="eax now contains pointer to newly created object") self.code += ";End of object creation\n" - + ################################################################################# # condOrExpr class ExprNode(ASTNode): @@ -492,7 +492,7 @@ class ExprNode(ASTNode): # ebx = left result # eax = right result # so, basically do "eax = ebx op eax" - + # Binary operations: # Add, Subtract, Multiply if self.op in ['+', '-', '*']: @@ -681,47 +681,43 @@ class FieldAccessNode(ASTNode): # result stored in eax (address) # NOTE: this is always called by codeGen, so self.code is already intialized to "" def addr(self): + result = "" fieldNode = self.ID.prefixLink - if fieldNode.__class__.__name__ == "VarDclNode": - fieldNode = self.ID.staticField if "static" in fieldNode.mods: + if fieldNode.__class__.__name__ == "VarDclNode": + fieldNode = self.ID.staticField label = fieldNode.typeName + "_" + fieldNode.name - self.code += "; Start of calculating address for static field: " + label + "\n" + \ - importHelper(fieldNode.typeName, self.typeName, "S_"+label) + \ - p(instruction="mov", arg1="eax", arg2="S_"+label, comment="getting address to static field") + \ - "; End of field access\n" + result += "; Start of calculating address for static field: " + label + "\n" + \ + importHelper(fieldNode.typeName, self.typeName, "S_"+label) + \ + p(instruction="mov", arg1="eax", arg2="dword S_"+label, comment="getting address to static field") + \ + "; End of field access\n" else: - self.code += "; Start of calculating address for non-static field\n" + result += "; Start of calculating address for non-static field\n" self.primary.codeGen() - self.code += self.primary.code + result += self.primary.code # Null check # At this point, eax stores the address of the object - self.code += p(instruction="call", arg1="H__Null_Check", comment="calling null check function") + result += p(instruction="call", arg1="H__Null_Check", comment="calling null check function") # Make eax store the address to the field we're accessing - self.code += p(instruction="add", arg1="eax", arg2=self.ID.prefixLink.offset, comment="calculating pointer to the field") - self.code += "; End of calculating address for non-static field\n" - - - def codeGen(self): - if hasattr(self, "code"): - return - - fieldNode = self.ID.prefixLink - label = fieldNode.typeName + "_" + fieldNode.name - self.code = "; Accessing a field :" + label + "\n" - # Evaluating the address of the field we're trying to access - self.addr() - self.code += p(instruction="mov", arg1="eax", arg2="[eax]") + \ - "; End of field access\n" - - - - + result += p(instruction="add", arg1="eax", arg2=self.ID.prefixLink.offset, comment="calculating pointer to the field") + result += "; End of calculating address for non-static field\n" + return result + def codeGen(self): + if hasattr(self, "code"): + return + + fieldNode = self.ID.prefixLink + label = fieldNode.typeName + "_" + fieldNode.name + self.code = "; Accessing a field :" + label + "\n" + # Evaluating the address of the field we're trying to access + self.code += self.addr() + self.code += p(instruction="mov", arg1="eax", arg2="[eax]") + \ + "; End of field access\n" ###################################################################################