diff --git a/UnitNodes.py b/UnitNodes.py index 294bc059244536b987d33df9b22ccecc8c52b495..88b3200c14943c2cdc44537ec07a1aaba53a3307 100644 --- a/UnitNodes.py +++ b/UnitNodes.py @@ -65,12 +65,15 @@ class LiteralNode(ASTNode): self.code += ";Start of String Literal Creation for class " + self.typeName + "\n" # generate array of characters # then call new String(array) + + # remove quotation marks + value = self.value[1:-1] # FIRST: create char array for this string TODO figure out how to populate this array # 1. Allocating space for the char array in heap # Note: uses ecx to temporarily store the array length self.code += ";Start of char array creation\n" + \ - p(instruction="push", arg1="eax", arg2=str(len(self.value)), comment="array length") + \ + p(instruction="mov", arg1="eax", arg2=str(len(value)), comment="array length") + \ p(instruction="push", arg1="ecx", comment="saving ecx's value") + \ p(instruction="mov", arg1="ecx", arg2="eax", comment="ecx now stroes the array's length") + \ p(instruction="add", arg1="eax", arg2=2, comment="number of items to allocate on heap") + \ @@ -85,7 +88,22 @@ class LiteralNode(ASTNode): # 3. Storing length in the second slot self.code += p(instruction="mov", arg1="[eax+4]", arg2="ecx", comment="storing array length in second slot") - # 4. Restoring ecx + # 4. populate array with this string literal's chars + self.code += ";Start of populating char array\n" + # 4.1. store array pointer + self.code += p(instruction="push", arg1="eax", comment="push arrray pointer") + # 4.2. point to a[0] + self.code += p(instruction="add", arg1="eax", arg2=8, comment="eax points at a[0]") + # 4.3. loop through string + for i in range(len(value)): + if i != 0: + self.code += p(instruction="add", arg1="eax", arg2=4, comment="eax points at a["+str(i)+"]") + self.code += p(instruction="mov", arg1="[eax]", arg2=str("dword \""+value[i]+"\""), comment="a["+str(i)+"]="+str(value[i])) + # 4.4. restore array pointer + self.code += p(instruction="pop", arg1="eax", comment="eax is pointer to array") + self.code += ";End of populating char array\n" + + # 5. Restoring ecx self.code += p(instruction="pop", arg1="ecx", comment="restoring register ecx") self.code += ";End of char array creation\n"