added arguments, fixed some memory bugs
This commit is contained in:
parent
9b0335e8d6
commit
7276312961
2 changed files with 60 additions and 4 deletions
|
@ -505,7 +505,32 @@ impl Machine {
|
||||||
panic!("Memory with variable ID {} not found", operation.arg2);
|
panic!("Memory with variable ID {} not found", operation.arg2);
|
||||||
}
|
}
|
||||||
let mem = mem.unwrap();
|
let mem = mem.unwrap();
|
||||||
set_register(&mut self.registers, Register { id: operation.arg1, pointer: mem });
|
if mem >= self.memory.len() || mem < 1 {
|
||||||
|
panic!("Memory location out of bounds for variable ID {}", operation.arg2);
|
||||||
|
}
|
||||||
|
let mut nmem = self.memory[mem].clone();
|
||||||
|
match &mut nmem {
|
||||||
|
VMMemory::Number(num) => {
|
||||||
|
num.variable_id = 0;
|
||||||
|
},
|
||||||
|
VMMemory::String(str) => {
|
||||||
|
str.variable_id = 0;
|
||||||
|
},
|
||||||
|
VMMemory::Boolean(bool) => {
|
||||||
|
bool.variable_id = 0;
|
||||||
|
},
|
||||||
|
VMMemory::Null(null) => {
|
||||||
|
null.variable_id = 0;
|
||||||
|
},
|
||||||
|
VMMemory::Function(func) => {
|
||||||
|
func.variable_id = 0;
|
||||||
|
},
|
||||||
|
VMMemory::Table(tbl) => {
|
||||||
|
tbl.variable_id = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.memory.push(nmem);
|
||||||
|
set_register(&mut self.registers, Register { id: operation.arg1, pointer: self.memory.len() - 1 });
|
||||||
},
|
},
|
||||||
3 => {
|
3 => {
|
||||||
//LDI
|
//LDI
|
||||||
|
@ -708,9 +733,38 @@ impl Machine {
|
||||||
if mem.is_none() {
|
if mem.is_none() {
|
||||||
panic!("Memory location not found for register");
|
panic!("Memory location not found for register");
|
||||||
}
|
}
|
||||||
let mem = mem.unwrap();
|
let mem = mem.unwrap().clone();
|
||||||
match mem {
|
match mem {
|
||||||
VMMemory::Function(func) => {
|
VMMemory::Function(func) => {
|
||||||
|
let arg = 0;
|
||||||
|
for i in &self.stack {
|
||||||
|
let mut new_mem = i.clone();
|
||||||
|
if self.functions[func.id].variables.len() <= arg || self.functions[func.id].variables[arg].start != 0 {
|
||||||
|
panic!("Function {} does not have enough arguments", func.id);
|
||||||
|
}
|
||||||
|
match &mut new_mem {
|
||||||
|
VMMemory::String(str) => {
|
||||||
|
str.variable_id = self.functions[func.id].variables[arg].id;
|
||||||
|
},
|
||||||
|
VMMemory::Number(num) => {
|
||||||
|
num.variable_id = self.functions[func.id].variables[arg].id;
|
||||||
|
},
|
||||||
|
VMMemory::Boolean(bool) => {
|
||||||
|
bool.variable_id = self.functions[func.id].variables[arg].id;
|
||||||
|
},
|
||||||
|
VMMemory::Null(null) => {
|
||||||
|
null.variable_id = self.functions[func.id].variables[arg].id;
|
||||||
|
},
|
||||||
|
VMMemory::Function(func) => {
|
||||||
|
func.variable_id = self.functions[func.id].variables[arg].id;
|
||||||
|
},
|
||||||
|
VMMemory::Table(tbl) => {
|
||||||
|
tbl.variable_id = self.functions[func.id].variables[arg].id;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
self.memory.push(new_mem);
|
||||||
|
}
|
||||||
|
|
||||||
self.call_stack.push(CallStack { func: func.id, return_reg: operation.arg2 as usize, pc: 0 });
|
self.call_stack.push(CallStack { func: func.id, return_reg: operation.arg2 as usize, pc: 0 });
|
||||||
executed_func = &self.functions[func.id];
|
executed_func = &self.functions[func.id];
|
||||||
let last_stack = self.call_stack.len() - 1;
|
let last_stack = self.call_stack.len() - 1;
|
||||||
|
|
6
test.as
6
test.as
|
@ -1,2 +1,4 @@
|
||||||
gethelj a = {1,2,3}
|
gethelj a = lőcsve(m) {
|
||||||
gethelj b = a[0]
|
gethelj b = m
|
||||||
|
}
|
||||||
|
a(69)
|
Loading…
Add table
Add a link
Reference in a new issue