Make parameters work

This commit is contained in:
Sofia 2026-03-14 23:19:01 +02:00
parent 7c327beaa1
commit 5c96834e5c
3 changed files with 21 additions and 15 deletions

View File

@ -1,5 +1,6 @@
function test() function add(x)
return 5 return x
end end
global c = print(test()) global d = add(5)
global c = print(d)

View File

@ -87,9 +87,9 @@ fn main() {
let closure = vm.create_closure(0); let closure = vm.create_closure(0);
let mut run = closure.run(); let mut run = closure.run(Vec::new());
while run.next().is_none() {} while run.next().is_none() {}
// dbg!(&vm.environment.borrow().globals); dbg!(&vm.environment.borrow().globals);
} }

View File

@ -98,7 +98,7 @@ impl Debug for Value {
.field(&LuaNumber::from_bits(*arg0)) .field(&LuaNumber::from_bits(*arg0))
.finish(), .finish(),
Self::RustFunction(arg0) => f.debug_tuple("RustFunction").field(arg0).finish(), Self::RustFunction(arg0) => f.debug_tuple("RustFunction").field(arg0).finish(),
Self::Function(arg0) => f.debug_tuple("Function").field(arg0).finish(), Self::Function(_) => f.debug_tuple("Function").finish(),
Self::Nil => write!(f, "Nil"), Self::Nil => write!(f, "Nil"),
} }
} }
@ -135,11 +135,15 @@ pub struct Closure {
} }
impl Closure { impl Closure {
pub fn run(&self) -> ClosureRunner { pub fn run(&self, params: Vec<Value>) -> ClosureRunner {
let mut stack = HashMap::new();
for (i, param) in params.iter().enumerate() {
stack.insert(i as u16, param.clone());
}
ClosureRunner { ClosureRunner {
closure: self.clone(), closure: self.clone(),
program_counter: 0, program_counter: 0,
stack: HashMap::new(), stack,
inner: None, inner: None,
return_registers: Vec::new(), return_registers: Vec::new(),
} }
@ -159,8 +163,9 @@ impl ClosureRunner {
if let Some(inner) = &mut self.inner { if let Some(inner) = &mut self.inner {
if let Some(ret_values) = inner.next() { if let Some(ret_values) = inner.next() {
self.inner = None; self.inner = None;
for (value, reg) in ret_values.iter().zip(&self.return_registers) { for (i, reg) in self.return_registers.iter().enumerate() {
self.stack.insert(*reg, value.clone()); self.stack
.insert(*reg, ret_values.get(i).cloned().unwrap_or(Value::Nil));
} }
} else { } else {
return None; return None;
@ -209,12 +214,12 @@ impl ClosureRunner {
} }
} }
Instruction::Call(func_reg, param_len, ret_len) => { Instruction::Call(func_reg, param_len, ret_len) => {
match self.stack.get(func_reg).unwrap_or(&Value::Nil) {
Value::RustFunction(func) => {
let mut params = Vec::new(); let mut params = Vec::new();
for i in 0..*param_len { for i in 0..*param_len {
params.push(self.stack.get(&(func_reg + i + 1)).unwrap().clone()); params.push(self.stack.get(&(func_reg + i + 1)).unwrap().clone());
} }
match self.stack.get(func_reg).unwrap_or(&Value::Nil) {
Value::RustFunction(func) => {
let ret_values = func.borrow_mut().execute(params); let ret_values = func.borrow_mut().execute(params);
for i in 0..=(*ret_len - 2) { for i in 0..=(*ret_len - 2) {
self.stack.insert( self.stack.insert(
@ -228,7 +233,7 @@ impl ClosureRunner {
for i in 0..=(*ret_len - 2) { for i in 0..=(*ret_len - 2) {
self.return_registers.push(*func_reg + i); self.return_registers.push(*func_reg + i);
} }
self.inner = Some(Box::new(closure.run())); self.inner = Some(Box::new(closure.run(params)));
} }
_ => panic!(), _ => panic!(),
} }