From 9590ea43f10e4c34db1053a31f39bcc06d700d4c Mon Sep 17 00:00:00 2001 From: Fredrik Robertsen Date: Wed, 1 Apr 2026 19:48:29 +0200 Subject: [PATCH] ps5: fix unsafe STASH() by using stack --- ps5/src/generator.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ps5/src/generator.c b/ps5/src/generator.c index c73bd2e..cbc06b2 100644 --- a/ps5/src/generator.c +++ b/ps5/src/generator.c @@ -214,8 +214,9 @@ static void generate_expression(node_t* expression) break; case ARRAY_INDEXING: generate_base_address(expression->children[0]); // identifier child - STASH(); + PUSHQ(RAX); generate_expression(expression->children[1]); // index expression + POPQ(RCX); EMIT("leaq (%s, %s, 8), %s", RCX, RAX, RAX); // rcx + 8*rax -> rax EMIT("movq (%s), %s", RAX, RAX); // deref rax break; @@ -288,8 +289,9 @@ static void generate_assignment_statement(node_t* statement) EMIT("movq %s, (%s)", RCX, RAX); } else if (child->type == ARRAY_INDEXING) { generate_base_address(child->children[0]); - STASH(); + PUSHQ(RAX); generate_expression(child->children[1]); + POPQ(RCX); EMIT("leaq (%s, %s, 8), %s", RCX, RAX, RCX); generate_expression(statement->children[1]); EMIT("movq %s, (%s)", RAX, RCX); // save the value in rax to the address of identifier[index]