fix allocator bug.
This commit is contained in:
@@ -18,7 +18,6 @@ pub trait Allocator<'a>
|
|||||||
fn reset(&mut self);
|
fn reset(&mut self);
|
||||||
fn reset_contents(&mut self) {}
|
fn reset_contents(&mut self) {}
|
||||||
fn reset_arg(&mut self, usize);
|
fn reset_arg(&mut self, usize);
|
||||||
fn reset_arg_at_head(&mut self, &'a Term);
|
|
||||||
|
|
||||||
fn advance_arg(&mut self);
|
fn advance_arg(&mut self);
|
||||||
|
|
||||||
|
|||||||
@@ -574,7 +574,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
|
|||||||
let mut code = Vec::new();
|
let mut code = Vec::new();
|
||||||
|
|
||||||
if let &QueryTerm::Term(ref term) = p0 {
|
if let &QueryTerm::Term(ref term) = p0 {
|
||||||
self.marker.reset_arg_at_head(term);
|
self.marker.reset_arg(term.arity());
|
||||||
self.compile_seq_prelude(&conjunct_info, &mut code);
|
self.compile_seq_prelude(&conjunct_info, &mut code);
|
||||||
|
|
||||||
if let &Term::Clause(..) = term {
|
if let &Term::Clause(..) = term {
|
||||||
@@ -586,8 +586,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// self.marker.reset_arg_at_head(term);
|
|
||||||
|
|
||||||
let iter = ChunkedIterator::from_rule_body(p1, clauses);
|
let iter = ChunkedIterator::from_rule_body(p1, clauses);
|
||||||
try!(self.compile_seq(iter, &conjunct_info, &mut code, false));
|
try!(self.compile_seq(iter, &conjunct_info, &mut code, false));
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ impl<'a> DebrayAllocator<'a> {
|
|||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn occurs_shallowly_in_head(&self, var: &'a Var, r: usize) -> bool
|
fn occurs_shallowly_in_head(&self, var: &'a Var, r: usize) -> bool
|
||||||
{
|
{
|
||||||
match self.bindings.get(var).unwrap() {
|
match self.bindings.get(var).unwrap() {
|
||||||
@@ -188,7 +188,7 @@ impl<'a> DebrayAllocator<'a> {
|
|||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
||||||
@@ -202,7 +202,7 @@ impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
|||||||
in_use: BTreeSet::new()
|
in_use: BTreeSet::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mark_anon_var<Target>(&mut self, lvl: Level, target: &mut Vec<Target>)
|
fn mark_anon_var<Target>(&mut self, lvl: Level, target: &mut Vec<Target>)
|
||||||
where Target: CompilationTarget<'a>
|
where Target: CompilationTarget<'a>
|
||||||
{
|
{
|
||||||
@@ -263,22 +263,20 @@ impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
|||||||
RegType::Perm(0) => {
|
RegType::Perm(0) => {
|
||||||
let pr = cell.get().norm();
|
let pr = cell.get().norm();
|
||||||
self.record_register(var, pr);
|
self.record_register(var, pr);
|
||||||
|
|
||||||
(pr, true)
|
(pr, true)
|
||||||
},
|
},
|
||||||
r => (r, false)
|
r => (r, false)
|
||||||
};
|
};
|
||||||
|
|
||||||
match lvl {
|
match lvl {
|
||||||
Level::Shallow => {
|
Level::Shallow => {
|
||||||
let k = self.arg_c;
|
let k = self.arg_c;
|
||||||
|
|
||||||
if !r.is_perm() {
|
if self.is_curr_arg_distinct_from(var) {
|
||||||
if self.is_curr_arg_distinct_from(var) {
|
self.evacuate_arg(term_loc.chunk_num(), target);
|
||||||
self.evacuate_arg(term_loc.chunk_num(), target);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.arg_c += 1;
|
self.arg_c += 1;
|
||||||
|
|
||||||
cell.set(VarReg::ArgAndNorm(r, k));
|
cell.set(VarReg::ArgAndNorm(r, k));
|
||||||
@@ -304,14 +302,14 @@ impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
|||||||
Level::Deep =>
|
Level::Deep =>
|
||||||
target.push(Target::subterm_to_value(r))
|
target.push(Target::subterm_to_value(r))
|
||||||
};
|
};
|
||||||
|
|
||||||
if !r.is_perm() {
|
if !r.is_perm() {
|
||||||
let o = r.reg_num();
|
let o = r.reg_num();
|
||||||
|
|
||||||
self.contents.insert(o, var);
|
self.contents.insert(o, var);
|
||||||
self.record_register(var, r);
|
self.record_register(var, r);
|
||||||
self.in_use.insert(o);
|
self.in_use.insert(o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset(&mut self) {
|
fn reset(&mut self) {
|
||||||
@@ -324,7 +322,7 @@ impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
|||||||
self.contents.clear();
|
self.contents.clear();
|
||||||
self.in_use.clear();
|
self.in_use.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn advance_arg(&mut self) {
|
fn advance_arg(&mut self) {
|
||||||
self.arg_c += 1;
|
self.arg_c += 1;
|
||||||
}
|
}
|
||||||
@@ -332,7 +330,7 @@ impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
|||||||
fn bindings(&self) -> &AllocVarDict<'a> {
|
fn bindings(&self) -> &AllocVarDict<'a> {
|
||||||
&self.bindings
|
&self.bindings
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bindings_mut(&mut self) -> &mut AllocVarDict<'a> {
|
fn bindings_mut(&mut self) -> &mut AllocVarDict<'a> {
|
||||||
&mut self.bindings
|
&mut self.bindings
|
||||||
}
|
}
|
||||||
@@ -340,24 +338,9 @@ impl<'a> Allocator<'a> for DebrayAllocator<'a>
|
|||||||
fn take_bindings(self) -> AllocVarDict<'a> {
|
fn take_bindings(self) -> AllocVarDict<'a> {
|
||||||
self.bindings
|
self.bindings
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset_arg(&mut self, arity: usize) {
|
fn reset_arg(&mut self, arity: usize) {
|
||||||
self.arg_c = 1;
|
self.arg_c = 1;
|
||||||
self.temp_lb = arity + 1;
|
self.temp_lb = arity + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset_arg_at_head(&mut self, term: &'a Term) {
|
|
||||||
self.arg_c = 1;
|
|
||||||
self.temp_lb = term.arity() + 1;
|
|
||||||
|
|
||||||
match term {
|
|
||||||
&Term::Clause(_, _, ref subterms, _) =>
|
|
||||||
for (idx, tr) in subterms.iter().enumerate() {
|
|
||||||
if let &Term::Var(_, _) = tr.as_ref() {
|
|
||||||
self.in_use.insert(idx + 1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
_ => {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -517,7 +517,7 @@ fn compile_decl<'a, 'b: 'a>(wam: &'a mut Machine, tl: &'b TopLevel, queue: &'b V
|
|||||||
if let Err(e) = compile_appendix(&mut code, queue) {
|
if let Err(e) = compile_appendix(&mut code, queue) {
|
||||||
return EvalSession::from(e);
|
return EvalSession::from(e);
|
||||||
};
|
};
|
||||||
|
|
||||||
if !code.is_empty() {
|
if !code.is_empty() {
|
||||||
if let Some(name) = tl.name() {
|
if let Some(name) = tl.name() {
|
||||||
wam.add_user_code(name, tl.arity(), code)
|
wam.add_user_code(name, tl.arity(), code)
|
||||||
|
|||||||
Reference in New Issue
Block a user