Skip to content
This repository has been archived by the owner on Aug 30, 2024. It is now read-only.

Commit

Permalink
fix: args
Browse files Browse the repository at this point in the history
  • Loading branch information
julio4 committed Aug 1, 2024
1 parent 20e0391 commit 56aaa16
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions src/interpreter/vm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -345,17 +345,16 @@ impl VM {

fn set_args(&mut self, args: Vec<String>) {
let mut argv_pointers = Vec::new();

let mut total_length = 0;

for arg in &args {
total_length += arg.len() + 1; // each argument string + null terminator
}

let initial_sp = self.regs.get(Register::SP);
self.regs
.set(Register::SP, initial_sp.wrapping_sub(total_length as u16));
let arg_data_start = initial_sp.wrapping_sub(total_length as u16);

let mut current_sp = initial_sp.wrapping_sub(total_length as u16);
let mut current_sp = arg_data_start;
for arg in &args {
argv_pointers.push(current_sp); // Record the pointer to this argument

Expand All @@ -368,16 +367,19 @@ impl VM {
current_sp = current_sp.wrapping_add(1);
}

self.regs.set(Register::SP, arg_data_start);

self.regs
.set(Register::SP, self.regs.get(Register::SP).wrapping_sub(2));
self.data.write_word(self.regs.get(Register::SP), 0);

for &pointer in argv_pointers.iter() {
for &pointer in argv_pointers.iter().rev() {
self.regs
.set(Register::SP, self.regs.get(Register::SP).wrapping_sub(2));
self.data.write_word(self.regs.get(Register::SP), pointer);
}

// Push argc
let argc = argv_pointers.len() as u16;
self.regs
.set(Register::SP, self.regs.get(Register::SP).wrapping_sub(2));
Expand Down

0 comments on commit 56aaa16

Please sign in to comment.