From 1a7cbc93b80fd16925cff0c310d55eab426c8f44 Mon Sep 17 00:00:00 2001 From: Nicholas Wesley Robinson <nwrobinson@uwaterloo.ca> Date: Sun, 12 Apr 2020 23:24:12 -0400 Subject: [PATCH] populate strliteral char array --- UnitNodes.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/UnitNodes.py b/UnitNodes.py index 294bc05..88b3200 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" -- GitLab