Skip to content
Snippets Groups Projects

New new string

Merged Xun Yang requested to merge new-new-string into master
1 file
+ 20
2
Compare changes
  • Side-by-side
  • Inline
+ 20
2
@@ -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"
Loading