AndStack(mem::replace(&mut self.0, vec![]))
}
+ #[inline]
pub fn push(&mut self, global_index: usize, e: usize, cp: LocalCodePtr, n: usize) {
let len = self.0.len();
self.0.push(Frame::new(global_index, len, e, cp, n));
}
+ #[inline]
pub fn len(&self) -> usize {
self.0.len()
}
+ #[inline]
pub fn clear(&mut self) {
self.0.clear()
}
+
+ #[inline]
+ pub fn top(&self) -> Option<&Frame> {
+ self.0.last()
+ }
/*
});
}
- stub
+ stub
}
}
machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
machine_st.pstr_trail.truncate(machine_st.pstr_tr);
-
machine_st.heap.truncate(machine_st.or_stack[b].h);
let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
machine_st.pstr_trail.truncate(machine_st.pstr_tr);
-
machine_st.heap.truncate(machine_st.or_stack[b].h);
let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
let curr_pstr_tr = machine_st.pstr_tr;
machine_st.unwind_pstr_trail(old_pstr_tr, curr_pstr_tr);
- machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
+ machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
machine_st.pstr_trail.truncate(machine_st.pstr_tr);
machine_st.heap.truncate(machine_st.or_stack[b].h);
attr_var_init_queue_b,
attr_var_init_bindings_b,
);
-
+
machine_st.b = machine_st.or_stack[b].b;
machine_st.or_stack.truncate(machine_st.b);
pub(super) fn next_global_index(&self) -> usize {
max(
- if self.and_stack.len() > 0 {
- self.and_stack[self.e].global_index
- } else {
- 0
- },
- if self.b > 0 {
- self.or_stack[self.b - 1].global_index
- } else {
- 0
- },
+ self.or_stack
+ .top()
+ .map(|or_fr| or_fr.global_index)
+ .unwrap_or(0),
+ self.and_stack
+ .top()
+ .map(|or_fr| or_fr.global_index)
+ .unwrap_or(0),
) + 1
}
(Number::Float(f), _) | (_, Number::Float(f)) => {
let n = Addr::Con(Constant::Float(f));
let stub = MachineError::functor_stub(clause_name!("gcd"), 2);
-
+
Err(self.error_form(MachineError::type_error(ValidType::Integer, n), stub))
}
(Number::Rational(r), _) | (_, Number::Rational(r)) => {
let n = Addr::Con(Constant::Rational(r));
let stub = MachineError::functor_stub(clause_name!("gcd"), 2);
-
+
Err(self.error_form(MachineError::type_error(ValidType::Integer, n), stub))
}
}
}
-
+
fn float_pow(&self, n1: Number, n2: Number) -> Result<Number, MachineStub> {
let f1 = result_f(&n1, rnd_f);
let f2 = result_f(&n2, rnd_f);
}
pub(super) fn set_ball(&mut self) {
+ self.ball.reset();
+
let addr = self[temp_v!(1)].clone();
self.ball.boundary = self.heap.h;
+
copy_term(
CopyBallTerm::new(&mut self.and_stack, &mut self.heap, &mut self.ball.stub),
addr,
pub(super) fn allocate(&mut self, num_cells: usize) {
let gi = self.next_global_index();
-// let new_e = self.e + 1;
+// let new_e = self.e + 1;
self.p += 1;
/*
- /* See issue #244 for an example of a program broken (at the
- top level) by the inclusion of this code. A proper GC must determine if an
- existing AND frame is safe to resize; the check here is not
+ /* See issue #244 for an example of a program broken (at the
+ top level) by the inclusion of this code. A proper GC must determine if an
+ existing AND frame is safe to resize; the check here is not
enough.
*/
}
}
}
-
+
fn handle_call_clause(
&mut self,
indices: &mut IndexStore,
( expand_goals(Term0, Term) -> true
; Term = Term0
),
- ( '$get_b_value'(B), call(Term),
- '$write_eqs_and_read_input'(B, VarList),
+ ( '$get_b_value'(B), call(Term), '$write_eqs_and_read_input'(B, VarList),
!
; write('false.'), nl
).