Make parameters work
This commit is contained in:
parent
7c327beaa1
commit
5c96834e5c
@ -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)
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
21
src/vm.rs
21
src/vm.rs
@ -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!(),
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user