pub(crate) type CallResult = Result<(), Vec<HeapCellValue>>;
pub(crate) trait CallPolicy: Any {
+ fn context_call<'a>(&mut self, machine_st: &mut MachineState, code_dirs: CodeDirs<'a>,
+ name: ClauseName, arity: usize, lco: bool)
+ -> CallResult
+ {
+ if lco {
+ self.try_execute(machine_st, code_dirs, name, arity)
+ } else {
+ self.try_call(machine_st, code_dirs, name, arity)
+ }
+ }
+
fn try_call<'a>(&mut self, machine_st: &mut MachineState, code_dirs: CodeDirs<'a>,
name: ClauseName, arity: usize)
-> CallResult
},
&ClauseType::CallN =>
if let Some((name, arity)) = machine_st.setup_call_n(arity) {
- if lco {
- self.try_execute(machine_st, code_dirs, name, arity)
- } else {
- self.try_call(machine_st, code_dirs, name, arity)
- }
+ self.context_call(machine_st, code_dirs, name, arity, lco)
} else {
Ok(())
},
Ok(())
},
&ClauseType::Named(ref name) | &ClauseType::Op(ref name, _) =>
- if lco {
- self.try_execute(machine_st, code_dirs, name.clone(), arity)
- } else {
- self.try_call(machine_st, code_dirs, name.clone(), arity)
- },
+ self.context_call(machine_st, code_dirs, name.clone(), arity, lco),
&ClauseType::CallWithInferenceLimit => {
machine_st.goto_ptr(CodePtr::DirEntry(393, clause_name!("builtin")), 3, lco);
Ok(())
self.compare_numbers(cmp, n1, n2);
},
- &BuiltInInstruction::DefaultSetCutPoint(r) => {
- let mut cut_policy = DefaultCutPolicy {};
- cut_policy.cut(self, r);
- },
&BuiltInInstruction::DefaultRetryMeElse(o) => {
let mut call_policy = DefaultCallPolicy {};
try_or_fail!(self, call_policy.retry_me_else(self, o));
},
+ &BuiltInInstruction::DefaultSetCutPoint(r) => {
+ let mut cut_policy = DefaultCutPolicy {};
+ cut_policy.cut(self, r);
+ },
&BuiltInInstruction::DefaultTrustMe => {
let mut call_policy = DefaultCallPolicy {};
try_or_fail!(self, call_policy.trust_me(self));