clean up call clause stuff.
This commit is contained in:
@@ -215,6 +215,17 @@ pub struct MachineState {
|
|||||||
pub(crate) type CallResult = Result<(), Vec<HeapCellValue>>;
|
pub(crate) type CallResult = Result<(), Vec<HeapCellValue>>;
|
||||||
|
|
||||||
pub(crate) trait CallPolicy: Any {
|
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>,
|
fn try_call<'a>(&mut self, machine_st: &mut MachineState, code_dirs: CodeDirs<'a>,
|
||||||
name: ClauseName, arity: usize)
|
name: ClauseName, arity: usize)
|
||||||
-> CallResult
|
-> CallResult
|
||||||
@@ -408,11 +419,7 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
},
|
},
|
||||||
&ClauseType::CallN =>
|
&ClauseType::CallN =>
|
||||||
if let Some((name, arity)) = machine_st.setup_call_n(arity) {
|
if let Some((name, arity)) = machine_st.setup_call_n(arity) {
|
||||||
if lco {
|
self.context_call(machine_st, code_dirs, name, arity, lco)
|
||||||
self.try_execute(machine_st, code_dirs, name, arity)
|
|
||||||
} else {
|
|
||||||
self.try_call(machine_st, code_dirs, name, arity)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
@@ -510,11 +517,7 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
&ClauseType::Named(ref name) | &ClauseType::Op(ref name, _) =>
|
&ClauseType::Named(ref name) | &ClauseType::Op(ref name, _) =>
|
||||||
if lco {
|
self.context_call(machine_st, code_dirs, name.clone(), arity, lco),
|
||||||
self.try_execute(machine_st, code_dirs, name.clone(), arity)
|
|
||||||
} else {
|
|
||||||
self.try_call(machine_st, code_dirs, name.clone(), arity)
|
|
||||||
},
|
|
||||||
&ClauseType::CallWithInferenceLimit => {
|
&ClauseType::CallWithInferenceLimit => {
|
||||||
machine_st.goto_ptr(CodePtr::DirEntry(393, clause_name!("builtin")), 3, lco);
|
machine_st.goto_ptr(CodePtr::DirEntry(393, clause_name!("builtin")), 3, lco);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -1285,14 +1285,14 @@ impl MachineState {
|
|||||||
|
|
||||||
self.compare_numbers(cmp, n1, n2);
|
self.compare_numbers(cmp, n1, n2);
|
||||||
},
|
},
|
||||||
&BuiltInInstruction::DefaultSetCutPoint(r) => {
|
|
||||||
let mut cut_policy = DefaultCutPolicy {};
|
|
||||||
cut_policy.cut(self, r);
|
|
||||||
},
|
|
||||||
&BuiltInInstruction::DefaultRetryMeElse(o) => {
|
&BuiltInInstruction::DefaultRetryMeElse(o) => {
|
||||||
let mut call_policy = DefaultCallPolicy {};
|
let mut call_policy = DefaultCallPolicy {};
|
||||||
try_or_fail!(self, call_policy.retry_me_else(self, o));
|
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 => {
|
&BuiltInInstruction::DefaultTrustMe => {
|
||||||
let mut call_policy = DefaultCallPolicy {};
|
let mut call_policy = DefaultCallPolicy {};
|
||||||
try_or_fail!(self, call_policy.trust_me(self));
|
try_or_fail!(self, call_policy.trust_me(self));
|
||||||
|
|||||||
Reference in New Issue
Block a user