ps5: fix unsafe STASH() by using stack
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user