$call_with_default_policy.
#[derive(Copy, Clone, PartialEq)]
pub enum SystemClauseType {
- CallWithDefaultPolicy,
CheckCutPoint,
GetBValue,
GetSCCCleaner,
pub fn name(&self) -> ClauseName {
match self {
- &SystemClauseType::CallWithDefaultPolicy => clause_name!("$call_with_default_policy"),
&SystemClauseType::CheckCutPoint => clause_name!("$check_cp"),
&SystemClauseType::GetBValue => clause_name!("$get_b_value"),
&SystemClauseType::GetSCCCleaner => clause_name!("$get_scc_cleaner"),
pub fn from(name: &str, arity: usize) -> Option<SystemClauseType> {
match (name, arity) {
- ("$call_with_default_policy", 1) => Some(SystemClauseType::CallWithDefaultPolicy),
("$check_cp", 1) => Some(SystemClauseType::CheckCutPoint),
("$get_b_value", 1) => Some(SystemClauseType::GetBValue),
("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner),
Ok(())
}
- fn context_call<'a>(&mut self, machine_st: &mut MachineState, name: ClauseName, arity: usize,
- idx: CodeIndex, code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ fn context_call(&mut self, machine_st: &mut MachineState, name: ClauseName, arity: usize,
+ idx: CodeIndex, code_dirs: CodeDirs)
-> CallResult
{
if machine_st.last_call {
}
fn try_call<'a>(&mut self, machine_st: &mut MachineState, name: ClauseName, arity: usize,
- idx: CodeIndex, code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ idx: CodeIndex, code_dirs: CodeDirs)
-> CallResult
{
match idx.0.borrow().0 {
}
fn try_execute<'a>(&mut self, machine_st: &mut MachineState, name: ClauseName,
- arity: usize, idx: CodeIndex, code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ arity: usize, idx: CodeIndex, code_dirs: CodeDirs)
-> CallResult
{
match idx.0.borrow().0 {
}
fn call_builtin<'a>(&mut self, machine_st: &mut MachineState, ct: &BuiltInClauseType,
- code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ code_dirs: CodeDirs)
-> CallResult
{
match ct {
}
fn call_n<'a>(&mut self, machine_st: &mut MachineState, arity: usize,
- code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ code_dirs: CodeDirs)
-> CallResult
{
if let Some((name, arity)) = machine_st.setup_call_n(arity) {
impl CallPolicy for CWILCallPolicy {
fn context_call<'a>(&mut self, machine_st: &mut MachineState, name: ClauseName,
- arity: usize, idx: CodeIndex, code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ arity: usize, idx: CodeIndex, code_dirs: CodeDirs)
-> CallResult
{
self.prev_policy.context_call(machine_st, name, arity, idx, code_dirs)?;
}
fn call_builtin<'a>(&mut self, machine_st: &mut MachineState, ct: &BuiltInClauseType,
- code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ code_dirs: CodeDirs)
-> CallResult
{
self.prev_policy.call_builtin(machine_st, ct, code_dirs)?;
}
fn call_n<'a>(&mut self, machine_st: &mut MachineState, arity: usize,
- code_dirs: Box<CodeDirsAdapter<'a> + 'a>)
+ code_dirs: CodeDirs)
-> CallResult
{
self.prev_policy.call_n(machine_st, arity, code_dirs)?;
match ct {
&ClauseType::BuiltIn(ref ct) =>
- try_or_fail!(self, call_policy.call_builtin(self, ct, Box::new(code_dirs))),
+ try_or_fail!(self, call_policy.call_builtin(self, ct, code_dirs)),
&ClauseType::CallN =>
- try_or_fail!(self, call_policy.call_n(self, arity, Box::new(code_dirs))),
+ try_or_fail!(self, call_policy.call_n(self, arity, code_dirs)),
&ClauseType::Inlined(ref ct) =>
self.execute_inlined(ct),
&ClauseType::Named(ref name, ref idx) | &ClauseType::Op(ref name, _, ref idx) =>
try_or_fail!(self, call_policy.context_call(self, name.clone(), arity, idx.clone(),
- Box::new(code_dirs))),
+ code_dirs)),
&ClauseType::System(ref ct) =>
try_or_fail!(self, self.system_call(ct, code_dirs, call_policy, cut_policy))
};
-> CallResult
{
match ct {
- // this system call is only to be used within the builtins module.
- // TODO: in the future I'd like to use serde to serialize/deserialize builtins
- // and thereby avoid this kludge, but for now it's ok.
- &SystemClauseType::CallWithDefaultPolicy =>
- if let Some(builtins) = code_dirs.modules.get(&clause_name!("builtins")) {
- let mut call_policy = DefaultCallPolicy {};
- return call_policy.call_n(self, 1, Box::new(builtins));
- },
&SystemClauseType::CheckCutPoint => {
let addr = self.store(self.deref(self[temp_v!(1)].clone()));