#[strum_discriminants(strum(props(Arity = "0", Name = "install_verify_attr")))]
InstallVerifyAttr,
// call verify_attrs.
- #[strum_discriminants(strum(props(Arity = "0", Name = "verify_attr_interrupt")))]
- VerifyAttrInterrupt,
+ #[strum_discriminants(strum(props(Arity = "1", Name = "verify_attr_interrupt")))]
+ VerifyAttrInterrupt(usize),
// procedures
CallClause(ClauseType, usize, usize, bool, bool), // ClauseType,
// arity,
pub type CodeDeque = VecDeque<Instruction>;
impl Instruction {
+ #[inline]
+ pub fn registers(&self) -> Vec<RegType> {
+ match self {
+ &Instruction::GetConstant(_, _, r) => vec![r],
+ &Instruction::GetList(_, r) => vec![r],
+ &Instruction::GetPartialString(_, _, r, _) => vec![r],
+ &Instruction::GetStructure(_, _, _, r) => vec![r],
+ &Instruction::GetVariable(r, t) => vec![r, temp_v!(t)],
+ &Instruction::GetValue(r, t) => vec![r, temp_v!(t)],
+ &Instruction::UnifyLocalValue(r) => vec![r],
+ &Instruction::UnifyVariable(r) => vec![r],
+ &Instruction::PutConstant(_, _, r) => vec![r],
+ &Instruction::PutList(_, r) => vec![r],
+ &Instruction::PutPartialString(_, _, r, _) => vec![r],
+ &Instruction::PutStructure(_, _, r) => vec![r],
+ &Instruction::PutValue(r, t) => vec![r, temp_v!(t)],
+ &Instruction::PutVariable(r, t) => vec![r, temp_v!(t)],
+ &Instruction::SetLocalValue(r) => vec![r],
+ &Instruction::SetVariable(r) => vec![r],
+ &Instruction::SetValue(r) => vec![r],
+ &Instruction::GetLevel(r) => vec![r],
+ &Instruction::GetPrevLevel(r) => vec![r],
+ &Instruction::GetCutPoint(r) => vec![r],
+ _ => vec![],
+ }
+ }
+
#[inline]
pub fn to_indexing_line_mut(&mut self) -> Option<&mut Vec<IndexingLine>> {
match self {
&Instruction::InstallVerifyAttr => {
functor!(atom!("install_verify_attr"))
}
- &Instruction::VerifyAttrInterrupt => {
- functor!(atom!("verify_attr_interrupt"))
+ &Instruction::VerifyAttrInterrupt(arity) => {
+ functor!(atom!("verify_attr_interrupt"), [fixnum(arity)])
}
&Instruction::DynamicElse(birth, death, next_or_fail) => {
match (death, next_or_fail) {
}
let mut p = self.machine_st.p;
+ let mut arity = 0;
while self.code[p].is_head_instr() {
+ for r in self.code[p].registers() {
+ if let RegType::Temp(t) = r {
+ arity = std::cmp::max(arity, t);
+ }
+ }
+
p += 1;
}
- let instr =
- std::mem::replace(&mut self.code[p], Instruction::VerifyAttrInterrupt);
+ let instr = std::mem::replace(
+ &mut self.code[p],
+ Instruction::VerifyAttrInterrupt(arity),
+ );
self.code[VERIFY_ATTR_INTERRUPT_LOC] = instr;
self.machine_st.attr_var_init.cp = p;
}
- &Instruction::VerifyAttrInterrupt => {
- let (_, arity) = self.code[VERIFY_ATTR_INTERRUPT_LOC].to_name_and_arity();
- let arity = std::cmp::max(arity, self.machine_st.num_of_args);
+ &Instruction::VerifyAttrInterrupt(arity) => {
+ // let (_, arity) = self.code[VERIFY_ATTR_INTERRUPT_LOC].to_name_and_arity();
+ // let arity = std::cmp::max(arity, self.machine_st.num_of_args);
self.run_verify_attr_interrupt(arity);
}
&Instruction::Add(ref a1, ref a2, t) => {