From: Mark Thom Date: Sat, 17 Mar 2018 21:01:31 +0000 (-0600) Subject: remove DynamicIs X-Git-Tag: v0.8.110~522 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=64ab9a033775a299af21e42438b112e8a52ae935;p=scryer-prolog.git remove DynamicIs --- diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 80456e2b..c09f1189 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -1236,7 +1236,6 @@ pub enum ControlInstruction { 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. @@ -1248,7 +1247,6 @@ impl ControlInstruction { pub fn is_jump_instr(&self) -> bool { match self { &ControlInstruction::CallClause(..) => true, - &ControlInstruction::DynamicIs => true, &ControlInstruction::GetCleanerCall => true, &ControlInstruction::Goto(..) => true, &ControlInstruction::IsClause(..) => true, diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 3b4824c4..8652983a 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -127,8 +127,6 @@ impl fmt::Display for ControlInstruction { 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) => diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index dbc34905..7fed09af 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -523,7 +523,16 @@ pub(crate) trait CallPolicy: Any { 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.") } } } diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 1d72446e..ba003d03 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -304,7 +304,7 @@ impl MachineState { Rc::new(BigInt::from_signed_bytes_le(&f(&u_n1, &u_n2).to_bytes_le())) } - fn arith_eval_by_metacall(&self, r: RegType) -> Result> + pub(super) fn arith_eval_by_metacall(&self, r: RegType) -> Result> { let instantiation_err = functor!("instantiation_error", 1, [heap_atom!("(is)/2")]); let a = self[r].clone(); @@ -1873,13 +1873,6 @@ impl MachineState { 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(); diff --git a/src/prolog/macros.rs b/src/prolog/macros.rs index 4c3a5816..baa27346 100644 --- a/src/prolog/macros.rs +++ b/src/prolog/macros.rs @@ -498,7 +498,7 @@ macro_rules! display { macro_rules! dynamic_is { () => ( - Line::Control(ControlInstruction::DynamicIs) + Line::Control(ControlInstruction::CallClause(ClauseType::Is, 2, 0, false)) ) }