diff --git a/ExprPrimaryNodes.py b/ExprPrimaryNodes.py index 527c93e9a07cae62f8b51a9463f831cbeae84de5..033c66c78601bc7138e1c08736afe9deb9ff9768 100644 --- a/ExprPrimaryNodes.py +++ b/ExprPrimaryNodes.py @@ -595,28 +595,40 @@ class ExprNode(ASTNode): self.myType = TypeStruct('java.lang.String', self.env.getNode('java.lang.String', 'type')) self.myType.link(self.env) + # if left/right is a string, we don't need value of + concatLeft = self.left + concatRight = self.right + # var1 + var2 === String.valueOf(var1).concat( String.valueOf(var2) ) - # methodInvoc name LPAREN args RPAREN (because it's static) - # MethodInvNode - # ID = NameNode - # - name = "String.valueOf" - # args = ArgsNode - # - exprs = [self.left] - - # create MethodInvNode to call String.valueOf(left) and String.valueOf(right) - # 1. Make NameNode for String.valueOf - valueOfNameNode = NameNode(self.parseTree, True, self.typeName, "String.valueOf") - valueOfNameNode.env = self.env - # 2. Make ArgsNode for left and right - leftArg = ArgsNode(self.parseTree, self.typeName, [self.left]) - rightArg = ArgsNode(self.parseTree, self.typeName, [self.right]) - # 3. Put it all together - valueOfMethodInvLeft = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, leftArg) - valueOfMethodInvRight = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, rightArg) - # 4. Check type to be safe - # valueOfMethodInvLeft.checkType() - # valueOfMethodInvRight.checkType() + if self.left.myType.name != 'java.lang.String' or self.right.myType.name != 'java.lang.String': + # methodInvoc name LPAREN args RPAREN (because it's static) + # MethodInvNode + # ID = NameNode + # - name = "String.valueOf" + # args = ArgsNode + # - exprs = [self.left] + + # create MethodInvNode to call String.valueOf(left) and String.valueOf(right) + # 1. Make NameNode for String.valueOf + valueOfNameNode = NameNode(self.parseTree, True, self.typeName, "String.valueOf") + valueOfNameNode.env = self.env + + if self.left.myType.name != 'java.lang.String': + # 2. Make ArgsNode + leftArg = ArgsNode(self.parseTree, self.typeName, [self.left]) + # 3. Put it all together + concatLeft = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, leftArg) + + if self.right.myType.name != 'java.lang.String': + # 2. Make ArgsNode + rightArg = ArgsNode(self.parseTree, self.typeName, [self.right]) + # 3. Put it all together + concatRight = MethodInvNode(self.parseTree, self.typeName, valueOfNameNode, rightArg) + + # 4. Check type to be safe + # concatLeft.checkType() + # concatRight.checkType() # methodInvoc primary PERIOD ID LPAREN args RPAREN @@ -631,9 +643,9 @@ class ExprNode(ASTNode): # 1. Make NameNode for String.concat (name = "concat") concatNameNode = NameNode(self.parseTree, True, self.typeName, "concat") # 2. Make ArgsNode for right - rightArgMethodInv = ArgsNode(self.parseTree, self.typeName, [valueOfMethodInvRight]) + rightArg = ArgsNode(self.parseTree, self.typeName, [concatRight]) # 3. Put it all together - self.concatMethodInv = MethodInvNode(self.parseTree, self.typeName, concatNameNode, rightArgMethodInv, valueOfMethodInvLeft) + self.concatMethodInv = MethodInvNode(self.parseTree, self.typeName, concatNameNode, rightArg, concatLeft) # 4. Check type to be safe self.concatMethodInv.checkType() @@ -727,6 +739,14 @@ class ExprNode(ASTNode): self.code += p(endLabel + ":", "") return + # String Add TODO + if (self.left.myType.name =='java.lang.String' or self.right.myType.name =='java.lang.String') and self.op == '+': + # ( String.valueOf(right) ).concat( left ) + if not hasattr(self.concatMethodInv, "code"): + self.concatMethodInv.codeGen() + self.code += self.concatMethodInv.code + return + # is binary and rest can use helper function: self.code += self.codeGenLeftRight() @@ -753,24 +773,7 @@ class ExprNode(ASTNode): return # Binary operations: - # String Add TODO - if (self.left.myType.name =='java.lang.String' or self.right.myType.name =='java.lang.String') \ - and self.op == '+': - # String.valueOf(left) - # if not hasattr(self.valueOfMethodInvLeft, "code"): - # self.valueOfMethodInvLeft.codeGen() - # self.code += self.valueOfMethodInvLeft.code - - # String.valueOf(right) - # if not hasattr(self.valueOfMethodInvLeft, "code"): - # self.valueOfMethodInvLeft.codeGen() - # self.code += self.valueOfMethodInvLeft.code - - # ( String.valueOf(right) ).concat( left ) - if not hasattr(self.concatMethodInv, "code"): - self.concatMethodInv.codeGen() - self.code += self.concatMethodInv.code - return + # Number Add, Subtract, Multiply if self.op in ['+', '-', '*']: # operation -> generated code diff --git a/NameNode.py b/NameNode.py index 70ce82cf4de5bb8c57ac120ea9f530274ac48b5b..fcfe485d0e8568c40ef9a6d08855ffa01f550e6d 100644 --- a/NameNode.py +++ b/NameNode.py @@ -242,6 +242,11 @@ class NameNode(ASTNode): self.methodClass = meth.env.getNode(meth.typeName, 'type') self.methodName = self.IDs[0] + + if self.name == 'length': + cNameNode = genNameNode(self.typeName) + cNameNode.isThis = True + self.prefixNodes.append(cNameNode) else: if curType.myType and curType.myType.isArray and self.IDs[0] == 'length': self.myType = TypeStruct("int", None)