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