From bee2087ab4e301805f2fa3653f6bd6ffe51f4dcc Mon Sep 17 00:00:00 2001 From: SpookyDervish <78246495+SpookyDervish@users.noreply.github.com> Date: Sun, 7 Sep 2025 07:25:11 +1000 Subject: [PATCH] WE'RE REFORMATTING THE STACK LESS GOOO --- generators/x86_64.py | 36 ++++++++++++++++++++++++--- ground_ast.py | 4 +++ out | Bin 9248 -> 8944 bytes out.asm | 57 +++++++++++-------------------------------- test2.grnd | 8 ++---- 5 files changed, 52 insertions(+), 53 deletions(-) diff --git a/generators/x86_64.py b/generators/x86_64.py index fe810fc..e611649 100644 --- a/generators/x86_64.py +++ b/generators/x86_64.py @@ -54,7 +54,10 @@ class X86_64Generator(Generator): return var["type"] def get_var_pos(self, var_name: str): - return (self.stack_size - self.variables.get(var_name)['stack_loc'] - 1) * 8 + try: + return (self.stack_size - self.variables.get(var_name)['stack_loc'] - 1) * 8 + except TypeError: # not defined + traceback(self.code, "TypeError", f"\"{var_name}\" is not defined.") def create_variable(self, var_name: str, starting_value, var_type: Any = None): if var_type == None: @@ -102,15 +105,37 @@ class X86_64Generator(Generator): def change_variable(self, var_name: str, new_value): var_pos = self.get_var_pos(var_name) + print(self.variables[var_name]["type"]) if type(new_value) == IntNode: # we're changing a variable to a number self.lines.append(f"mov QWORD [rsp + {var_pos}], {new_value.value}\n\t") + self.variables[var_name]["type"] = IntNode elif type(new_value) == VarRefNode: # we're changing a variable to the value of another variable - self.get_variable(new_value.var_name, "rax") + var_type = self.get_variable(new_value.var_name, "rax") self.lines.append(f"mov QWORD [rsp + {var_pos}], rax\n\t") + self.variables[var_name]["type"] = var_type + + elif type(new_value) == StringNode: # we're changing a variable to a string + self.lines.append(f"mov QWORD [rsp + {var_pos}], 0\n\t") + + + string_pointer = self.add_constant(new_value.value) + string_len = self.add_constant(f"equ $ - {string_pointer[1:-1]}", no_string=True) + #self.lines.append(f"lea QWORD [rsp + {var_pos}], {string_pointer}\n\t") + ##self.lines.append(f"mov QWORD [rsp + {var_pos + 8}], {string_len[1:-1]}\n\t") + + self.variables[var_name]["stack_loc"] = self.stack_size + self.lines.append(f"lea rax, {string_pointer}\n\t") + self.push("rax") + self.lines.append(f"mov rax, {string_len[1:-1]}\n\t") + self.push("rax") + + self.variables[var_name]["type"] = StringNode elif type(new_value) == str: # we're changing a variable to the value of a register self.lines.append(f"mov QWORD [rsp + {var_pos}], {new_value}\n\t") + self.variables[var_name]["type"] = IntNode + print(self.variables[var_name]["type"]) def generate_InstructionNode(self, node: InstructionNode): ### MISC ### @@ -369,8 +394,11 @@ class X86_64Generator(Generator): printed_value = arg.__str__() if isinstance(arg, VarRefNode): - self.get_variable(arg.var_name, "rsi", False, 0, True) - self.get_variable(arg.var_name, "rdx", False, -8, True) + var_type = self.get_variable(arg.var_name, "rsi", offset=0, no_stack_pop=True) + if var_type == StringNode: + self.get_variable(arg.var_name, "rdx", offset=-8, no_stack_pop=True) + else: + traceback(self.code, "TypeError", f"You can't print \"{var_type(None).__repr__()}\", try converting it to a string first.") else: string_pointer = self.add_constant(printed_value)[1:-1] string_len = self.add_constant(f"equ $ - {string_pointer}", True)[1:-1] diff --git a/ground_ast.py b/ground_ast.py index aebdfa8..ba360a8 100644 --- a/ground_ast.py +++ b/ground_ast.py @@ -52,6 +52,8 @@ class TypeNode: value: str def __repr__(self): return "Type" + def __str__(self): + return "-" + self.value @dataclass class ArgNode: arg_type: str @@ -84,6 +86,8 @@ class BoolNode: value: bool def __repr__(self): return "Boolean" + def __str__(self): + return str(self.value).lower() def generate_ast(tokens: list[Token], code: str) -> RootNode: root_node = RootNode([]) diff --git a/out b/out index 12f9193bee5de3f12ab80096a7188dc4840e4168..40d3a2bae54c64c5f48d83f1ebe1fbd452b42eb3 100644 GIT binary patch delta 288 zcmZ4B@xgV122+9JM6Eo|NCpUqoVZY*lO4)o-*{792keS?|U?Is0H3UY#+9C3(yK*c#G-&Ay+oS@V&`JR#zW8`E;WqU^U r$&SkAq8thkb3Q;Q1{NUAHn~?>oAU=$#&_~TWphqfMTi1*AWt3ugZnH_ literal 9248 zcmeHN&1(}u6o1_&r3S?aJqRA0mWUrIj zzuLXEi%Z)|`Dy4c|Y(GKCfb8~sG4y=#V$kc$PFo!Lz5X-d ziI?7>=d}(xizpe${P9h&)sTW)!pICB7S+2&Krg7R}Jo#N>ZSuFq)ULo4;5{ZN!Md~RnMXs( oMWX=!2jSV)hw2nxOvz`X!qsjU+7}f1RsC?uq+AU%4M^612fb~ZI{*Lx diff --git a/out.asm b/out.asm index 886c93b..edd111a 100644 --- a/out.asm +++ b/out.asm @@ -1,66 +1,37 @@ ; ~~~ Auto generated by the GroundPY compiler for Linux x86_64 targets. ~~~ section .data -.LC0: db "123", 0 +.LC0: db "hiii", 0 .LC1: equ $ - .LC0 -.LC2: db "", 10, "WE CAN PRINT FUCKING NUMBERS AND SHITT", 10, 0 +.LC2: db "", 10, 0 .LC3: equ $ - .LC2 -.LC4: db "LESS GOOOOO", 10, 0 -.LC5: equ $ - .LC4 -.LC6: db "this was printed using a variable!!!!!", 10, 0 -.LC7: equ $ - .LC6 -.LC8: db "", 10, 0 -.LC9: equ $ - .LC8 section .text global _start _start: - ; InstructionNode(instruction='stdout', parent=RootNode(statements=[..., InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[Int]) - mov rsi, .LC0 - mov rdx, .LC1 - mov rax, 1 - mov rdi, 1 - syscall - ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), ..., InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[String]) - mov rsi, .LC2 - mov rdx, .LC3 - mov rax, 1 - mov rdi, 1 - syscall - ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), ..., InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[String]) - mov rsi, .LC4 - mov rdx, .LC5 - mov rax, 1 - mov rdi, 1 - syscall - ; InstructionNode(instruction='set', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), ..., InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariablePointer, String]) - lea rax, [.LC6] + ; InstructionNode(instruction='set', parent=RootNode(statements=[..., InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariablePointer, Int]) + mov rax, 123 push rax - mov rax, .LC7 + ; InstructionNode(instruction='set', parent=RootNode(statements=[InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), ..., InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariablePointer, String]) + mov QWORD [rsp + 0], 0 + lea rax, [.LC0] push rax - ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), ..., InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariableReference]) + mov rax, .LC1 + push rax + ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), ..., InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariableReference]) mov rsi, [rsp + 8] mov rdx, [rsp + 0] mov rax, 1 mov rdi, 1 syscall - ; InstructionNode(instruction='set', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), ..., InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariablePointer, Int]) - mov rax, 123 - push rax - ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), ..., InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[VariableReference]) - mov rsi, [rsp + 0] - mov rdx, [rsp + -8] + ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), ..., InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[String]) + mov rsi, .LC2 + mov rdx, .LC3 mov rax, 1 mov rdi, 1 syscall - ; InstructionNode(instruction='stdout', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), ..., InstructionNode(instruction='end', parent=..., arguments=[Int])]), arguments=[String]) - mov rsi, .LC8 - mov rdx, .LC9 - mov rax, 1 - mov rdi, 1 - syscall - ; InstructionNode(instruction='end', parent=RootNode(statements=[InstructionNode(instruction='stdout', parent=..., arguments=[Int]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), ...]), arguments=[Int]) + ; InstructionNode(instruction='end', parent=RootNode(statements=[InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, Int]), InstructionNode(instruction='set', parent=..., arguments=[VariablePointer, String]), InstructionNode(instruction='stdout', parent=..., arguments=[VariableReference]), InstructionNode(instruction='stdout', parent=..., arguments=[String]), ...]), arguments=[Int]) mov rax, 60 mov rdi, 0 syscall diff --git a/test2.grnd b/test2.grnd index 9ccfc3a..8163406 100644 --- a/test2.grnd +++ b/test2.grnd @@ -1,9 +1,5 @@ -stdout 123 -stdout "\nWE CAN PRINT FUCKING NUMBERS AND SHITT\n" -stdout "LESS GOOOOO\n" -set &x "this was printed using a variable!!!!!\n" +set &x 123 +set &x "hiii" stdout $x -set &y 123 -stdout $y stdout "\n" end 0 \ No newline at end of file