self.0.clear()
}
+ /*
+
+ // See MachineState::allocate for why this is commented out.
+
pub fn resize(&mut self, fr: usize, n: usize) {
let len = self[fr].perms.len();
}
}
}
-
+ */
+
#[inline]
pub fn truncate(&mut self, len: usize) {
self.0.truncate(len);
machine_st.e = machine_st.or_stack[b].e;
machine_st.cp = machine_st.or_stack[b].cp.clone();
- machine_st.pop_stack_frames();
-
machine_st.or_stack[b].bp = machine_st.p.clone() + offset;
let old_tr = machine_st.or_stack[b].tr;
machine_st.e = machine_st.or_stack[b].e;
machine_st.cp = machine_st.or_stack[b].cp.clone();
- machine_st.pop_stack_frames();
-
machine_st.or_stack[b].bp = machine_st.p.clone() + 1;
let old_tr = machine_st.or_stack[b].tr;
machine_st.registers[i] = machine_st.or_stack[b][i].clone();
}
+ machine_st.pop_stack_frames();
+
machine_st.num_of_args = n;
machine_st.e = machine_st.or_stack[b].e;
machine_st.cp = machine_st.or_stack[b].cp.clone();
machine_st.b = machine_st.or_stack[b].b;
machine_st.or_stack.truncate(machine_st.b);
- machine_st.pop_stack_frames();
-
machine_st.hb = machine_st.heap.h;
machine_st.p += offset;
machine_st.registers[i] = machine_st.or_stack[b][i].clone();
}
+ machine_st.pop_stack_frames();
+
machine_st.num_of_args = n;
machine_st.e = machine_st.or_stack[b].e;
machine_st.cp = machine_st.or_stack[b].cp.clone();
machine_st.b = machine_st.or_stack[b].b;
machine_st.or_stack.truncate(machine_st.b);
- machine_st.pop_stack_frames();
-
machine_st.hb = machine_st.heap.h;
machine_st.p += 1;
self.flags
}
- fn next_global_index(&self) -> usize {
+ pub(super) fn next_global_index(&self) -> usize {
max(
if self.and_stack.len() > 0 {
self.and_stack[self.e].global_index
pub(super) fn allocate(&mut self, num_cells: usize) {
let gi = self.next_global_index();
+// let new_e = self.e + 1;
self.p += 1;
- if self.e + 1 < self.and_stack.len() {
+/*
+ /* 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.
+ */
+
+ if new_e < self.and_stack.len() {
let and_gi = self.and_stack[self.e].global_index;
let or_gi = self
.or_stack
.unwrap_or(0);
if and_gi > or_gi {
- let new_e = self.e + 1;
-
self.and_stack[new_e].e = self.e;
- self.and_stack[new_e].cp = self.cp.clone();
+ self.and_stack[new_e].cp = self.cp;
self.and_stack[new_e].global_index = gi;
self.and_stack.resize(new_e, num_cells);
return;
}
}
-
+*/
self.and_stack.push(gi, self.e, self.cp.clone(), num_cells);
self.e = self.and_stack.len() - 1;
}
self.b = self.or_stack.len();
let b = self.b - 1;
- for i in 1..n + 1 {
+ for i in 1 .. n + 1 {
self.or_stack[b][i] = self.registers[i].clone();
}
; !,
catch(throw(error(type_error(atom, Item), repl/0)),
E,
- '$print_exception_with_check'(E))
+ '$print_exception_with_check'(E))
).
'$instruction_match'(Term, VarList) :-
'$submit_query_and_print_results'(Term, VarList),
( 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
).
( '$needs_bracketing'(Value, (=)) ->
write('('),
write_term(Value, [quoted(true), variable_names(VarList)]),
- write(')')
+ write(')')
; write_term(Value, [quoted(true), variable_names(VarList)]),
( '$trailing_period_is_ambiguous'(Value) ->
write(' ')
'$write_eq'(G2, VarList).
'$write_eq'(G, VarList) :-
'$write_last_goal'(G, VarList).
-
+
'$graphic_token_char'(C) :-
memberchk(C, ['#', '$', '&', '*', '+', '-', '.', ('/'), ':',
'<', '=', '>', '?', '@', '^', '~', ('\\')]).