From ef48978bb561c1ad269c2d21513338e482e47aba Mon Sep 17 00:00:00 2001 From: SpookyDervish <78246495+SpookyDervish@users.noreply.github.com> Date: Tue, 2 Sep 2025 16:26:19 +1000 Subject: [PATCH] variable reasignment works!!! --- generators/x86_64.py | 27 ++++++++++++++++++++++----- out | Bin 4656 -> 4672 bytes out.asm | 11 ++++++----- test2.grnd | 2 +- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/generators/x86_64.py b/generators/x86_64.py index 894ea4d..8e47d02 100644 --- a/generators/x86_64.py +++ b/generators/x86_64.py @@ -29,6 +29,17 @@ class X86_64Generator(Generator): ) self.pop(reg) + def change_variable(self, var_name: str, new_value): + var_pos = (self.stack_size - self.variables.get(var_name)['stack_loc'] - 1) * 8 + + if type(new_value) == NumberNode: # we're changing a variable to a number + self.lines.append(f"mov rax, {new_value.value}\n\t") + self.lines.append(f"mov QWORD [rsp + {var_pos}], rax\n\t") + + elif type(new_value) == VarRefNode: # we're changing a variable to the value of another variable + self.get_variable(new_value.var_name, "rax") + self.lines.append(f"mov QWORD [rsp + {var_pos}], rax\n\t") + def generate_InstructionNode(self, node: InstructionNode): if node.instruction == "end": if len(node.arguments) == 0: # example: "end" @@ -53,13 +64,19 @@ class X86_64Generator(Generator): traceback(self.code, "TypeError", "set expects only 2 arguments.") if not isinstance(node.arguments[0], VarPointerNode): traceback(self.code, "TypeError", f"the first argument of set should be a variable pointer, not \"{type(node.arguments[0])}\"") - if type(node.arguments[1]) not in [NumberNode]: + if type(node.arguments[1]) not in [NumberNode, VarRefNode]: traceback(self.code, "TypeError", f"variables can't be of type \"{type(node.arguments[1])}\"") - self.variables[node.arguments[0].var_name] = {"stack_loc": self.stack_size} - if type(node.arguments[1]) == NumberNode: - self.lines.append(f"mov rax, {node.arguments[1].value}\n\t") - self.push("rax") + variable_exists = self.variables.get(node.arguments[0].var_name, None) != None + + if not variable_exists: # create a new variable + self.variables[node.arguments[0].var_name] = {"stack_loc": (self.stack_size), "type": type(node.arguments[1])} + if type(node.arguments[1]) == NumberNode: + self.lines.append(f"mov rax, {node.arguments[1].value}\n\t") + self.push("rax") + else: # modify the existing one + self.change_variable(node.arguments[0].var_name, node.arguments[1]) + else: self.lines.append("; FUCK\n\t") diff --git a/out b/out index e5db3ec7981a86df16648386c4bd8e0c56c64fc7..71a78818b26994a1d023cc5a6c73b49d549591de 100644 GIT binary patch delta 72 zcmdm>azJH*1`~teM6EndB?bsk+PE->pR*ds@#u6>;h4-Lpfd3Q+hzj+1x7}t$$^6A Uj2e?W1??GkOg;%DZvshm0ArsLfdBvi delta 59 zcmX@0vO#5n2Ga+DiCTG_5)2R^v2kGz|739i<;@NP3XF^rlM@Baf#gg