add global_count inference counter that is always incremented (#2009)
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
use crate::parser::ast::*;
|
||||
use crate::parser::parser::*;
|
||||
|
||||
use dashu::integer::Sign;
|
||||
use dashu::integer::UBig;
|
||||
use dashu::integer::{Sign, UBig};
|
||||
use lazy_static::lazy_static;
|
||||
use num_order::NumOrd;
|
||||
|
||||
@@ -5516,11 +5515,8 @@ impl Machine {
|
||||
let a2 = self.deref_register(2);
|
||||
|
||||
let n = match Number::try_from(a2) {
|
||||
Ok(Number::Fixnum(bp)) => bp.get_num() as usize,
|
||||
Ok(Number::Integer(n)) => {
|
||||
let value: usize = (&*n).try_into().unwrap();
|
||||
value
|
||||
}
|
||||
Ok(Number::Fixnum(bp)) => Integer::from(bp.get_num() as usize),
|
||||
Ok(Number::Integer(n)) => (*n).clone(),
|
||||
_ => {
|
||||
let stub = functor_stub(atom!("call_with_inference_limit"), 3);
|
||||
|
||||
@@ -5531,21 +5527,24 @@ impl Machine {
|
||||
|
||||
let bp = cell_as_fixnum!(a1).get_num() as usize;
|
||||
let a3 = self.deref_register(3);
|
||||
let count = self.machine_st.cwil.add_limit(n, bp);
|
||||
|
||||
let result = count.try_into();
|
||||
if let Ok(value) = result {
|
||||
self.machine_st.unify_fixnum(Fixnum::build_with(value), a3);
|
||||
} else {
|
||||
let count = arena_alloc!(count.clone(), &mut self.machine_st.arena);
|
||||
self.machine_st.unify_big_int(count, a3);
|
||||
}
|
||||
|
||||
self.machine_st.increment_call_count_fn = MachineState::increment_call_count;
|
||||
let count = self.machine_st.cwil.add_limit(n, bp).clone();
|
||||
self.inference_count(a3, count);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn inference_count(&mut self, count_var: HeapCellValue, count: Integer) {
|
||||
if let Some(value) = <&Integer as TryInto<i64>>::try_into(&count).ok() {
|
||||
self.machine_st
|
||||
.unify_fixnum(Fixnum::build_with(value), count_var);
|
||||
} else {
|
||||
let count = arena_alloc!(count, &mut self.machine_st.arena);
|
||||
self.machine_st.unify_big_int(count, count_var);
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn module_exists(&mut self) {
|
||||
let module = self.deref_register(1);
|
||||
@@ -5671,7 +5670,6 @@ impl Machine {
|
||||
|
||||
if bp == self.machine_st.b && self.machine_st.cwil.is_empty() {
|
||||
self.machine_st.cwil.reset();
|
||||
self.machine_st.increment_call_count_fn = |_| true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user