implement __functor
This commit is contained in:
@@ -85,8 +85,30 @@ impl<'gc> crate::Vm<'gc> {
|
||||
new_app.args[position] = arg;
|
||||
self.push(Value::new_gc(Gc::new(mc, new_app)))
|
||||
}
|
||||
} else if let Some(attrs) = func.as_gc::<AttrSet>()
|
||||
&& let Some(functor) = attrs.lookup(self.functor_sym)
|
||||
{
|
||||
// f arg => (f.__functor f) arg
|
||||
//
|
||||
// Stage the work for `CallFunctor1` so retries during force are
|
||||
// safe: the stack invariant `[..., orig_arg, self, functor]`
|
||||
// holds every time control re-enters phase 1.
|
||||
self.call_depth -= 1;
|
||||
self.call_stack.push(CallFrame {
|
||||
pc: resume_pc,
|
||||
thunk: None,
|
||||
env: self.env,
|
||||
});
|
||||
self.push(arg);
|
||||
self.push(func.relax());
|
||||
self.push(functor);
|
||||
reader.set_pc(PrimOpPhase::CallFunctor1.ip() as usize);
|
||||
return Step::Continue(());
|
||||
} else {
|
||||
todo!("call other types: {func:?}")
|
||||
return self.finish_err(Error::eval_error(format!(
|
||||
"attempt to call something which is not a function but {}",
|
||||
func.ty()
|
||||
)));
|
||||
}
|
||||
Step::Continue(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user