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