From be4d8bf85e59b73eb386b59b3e43cf5d7021473c Mon Sep 17 00:00:00 2001
From: Nicholas Wesley Robinson <nwrobinson@uwaterloo.ca>
Date: Mon, 13 Apr 2020 00:47:08 -0400
Subject: [PATCH] literal string improvements

---
 UnitNodes.py | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/UnitNodes.py b/UnitNodes.py
index f036b9b..15d466e 100644
--- a/UnitNodes.py
+++ b/UnitNodes.py
@@ -90,17 +90,9 @@ class LiteralNode(ASTNode):
 
             # 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
+            # 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 += p(instruction="mov", arg1="[eax+"+str(8+i*4)+"]", arg2=str("dword '"+value[i]+"'"), comment="a["+str(i)+"]="+str(value[i]))
             self.code += ";End of populating char array\n"
 
             # 5. Restoring ecx
@@ -109,6 +101,9 @@ class LiteralNode(ASTNode):
 
             # SECOND: create new string object with the char array 
 
+            # push array pointer
+            self.code += p(instruction="push", arg1="eax", comment="save pointer to char array")
+
             # 1. alloc enough space for this object
             classDef = self.env.getNode('java.lang.String', 'type')
             fieldOffset = classDef.fieldOffset
@@ -122,11 +117,14 @@ class LiteralNode(ASTNode):
             self.code += importHelper(classDef.name, self.typeName, "C_"+classDef.name)
             self.code += p(instruction="mov", arg1="[eax]", arg2="dword C_" + classDef.name, comment="first item is vtable pointer")
 
+            # restore pointer to our char array
+            self.code += p("pop", "ebx", comment="restore pointer to our char array")
+
             # 3. Calling constructor
             self.code += "; Calling constructor for String\n"
             self.code += p(instruction="push", arg1="eax", comment="pushing object as first argument")
             # Evaluate arguments and pushing parameters
-            self.code += p("mov", "eax", aLabel) # TODO this is probably wrong, where is my array I just created?
+            self.code += p("push", "ebx", comment="add our char array as arg")
 
             # 4. call String::String(char[] chars)
             label = "M_String_String_char"
-- 
GitLab