CallClause(ClauseType, usize, usize, bool), // name, arity, perm_vars after threshold, last call.
CheckCpExecute,
Deallocate,
- DynamicIs,
GetCleanerCall,
Goto(usize, usize, bool), // p, arity, last call.
IsClause(bool, RegType, ArithmeticTerm), // last call, register of var, term.
pub fn is_jump_instr(&self) -> bool {
match self {
&ControlInstruction::CallClause(..) => true,
- &ControlInstruction::DynamicIs => true,
&ControlInstruction::GetCleanerCall => true,
&ControlInstruction::Goto(..) => true,
&ControlInstruction::IsClause(..) => true,
write!(f, "is_call {}, {}", r, at),
&ControlInstruction::IsClause(true, r, ref at) =>
write!(f, "is_execute {}, {}", r, at),
- &ControlInstruction::DynamicIs =>
- write!(f, "call_is"),
&ControlInstruction::JmpBy(arity, offset, pvs, false) =>
write!(f, "jmp_by_call {}/{}, {}", offset, arity, pvs),
&ControlInstruction::JmpBy(arity, offset, pvs, true) =>
machine_st.goto_ptr(CodePtr::DirEntry(294, clause_name!("builtin")), 3, lco);
Ok(())
},
- _ => panic!("(is)/2 or an inlined command: should have been superseded by previous clause.")
+ &ClauseType::Is => {
+ let a = machine_st[temp_v!(1)].clone();
+ let result = machine_st.arith_eval_by_metacall(temp_v!(2))?;
+
+ machine_st.unify(a, Addr::Con(Constant::Number(result)));
+ machine_st.p += 1;
+
+ Ok(())
+ },
+ _ => panic!("inlined command: should have been superseded by previous clause.")
}
}
}
Rc::new(BigInt::from_signed_bytes_le(&f(&u_n1, &u_n2).to_bytes_le()))
}
- fn arith_eval_by_metacall(&self, r: RegType) -> Result<Number, Vec<HeapCellValue>>
+ pub(super) fn arith_eval_by_metacall(&self, r: RegType) -> Result<Number, Vec<HeapCellValue>>
{
let instantiation_err = functor!("instantiation_error", 1, [heap_atom!("(is)/2")]);
let a = self[r].clone();
self.p += 1;
},
- &ControlInstruction::DynamicIs => {
- let a = self[temp_v!(1)].clone();
- let result = try_or_fail!(self, self.arith_eval_by_metacall(temp_v!(2)));
-
- self.unify(a, Addr::Con(Constant::Number(result)));
- self.p += 1;
- },
&ControlInstruction::GetCleanerCall => {
let dest = self[temp_v!(1)].clone();
macro_rules! dynamic_is {
() => (
- Line::Control(ControlInstruction::DynamicIs)
+ Line::Control(ControlInstruction::CallClause(ClauseType::Is, 2, 0, false))
)
}