clean up atomic and var code.

This commit is contained in:
Mark Thom
2017-11-06 20:22:15 -07:00
parent 2225674b58
commit 4624508fc1

View File

@@ -349,15 +349,23 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
&Term::Constant(_, _) => { &Term::Constant(_, _) => {
code.push(succeed!()); code.push(succeed!());
}, },
&Term::Var(ref vr, ref name) => { &Term::Var(ref vr, ref name) =>
let mut target = Vec::new(); match self.marker.bindings().get(name) {
Some(&VarData::Temp(_, t, _)) if t != 0 =>
code.push(is_atomic!(RegType::Temp(t))),
Some(&VarData::Perm(p)) if p != 0 =>
code.push(is_atomic!(RegType::Perm(p))),
_ => {
let mut target = Vec::new();
// reset self.marker.arg_c to 1.
self.marker.advance(term_loc, *term);
self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target);
self.marker.advance(term_loc, *term); // reset self.marker.arg_c to 1. code.push(Line::Query(target));
self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target); code.push(is_atomic!(vr.get().norm()));
}
code.push(Line::Query(target)); },
code.push(is_atomic!(vr.get().norm()));
}
}, },
&QueryTermRef::IsVar(inner_term) => &QueryTermRef::IsVar(inner_term) =>
match inner_term { match inner_term {
@@ -367,15 +375,23 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
&Term::AnonVar => { &Term::AnonVar => {
code.push(succeed!()); code.push(succeed!());
}, },
&Term::Var(ref vr, ref name) => { &Term::Var(ref vr, ref name) =>
let mut target = Vec::new(); match self.marker.bindings().get(name) {
Some(&VarData::Temp(_, t, _)) if t != 0 =>
code.push(is_var!(RegType::Temp(t))),
Some(&VarData::Perm(p)) if p != 0 =>
code.push(is_var!(RegType::Perm(p))),
_ => {
let mut target = Vec::new();
// reset self.marker.arg_c to 1.
self.marker.advance(term_loc, *term);
self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target);
self.marker.advance(term_loc, *term); // reset self.marker.arg_c to 1. code.push(Line::Query(target));
self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target); code.push(is_var!(vr.get().norm()));
}
code.push(Line::Query(target)); }
code.push(is_var!(vr.get().norm()));
}
}, },
_ if chunk_num == 0 => { _ if chunk_num == 0 => {
self.marker.advance(GenContext::Head, *term); self.marker.advance(GenContext::Head, *term);
@@ -403,7 +419,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
let perm_vars = conjunct_info.perm_vars(); let perm_vars = conjunct_info.perm_vars();
body.push(Line::Control(ControlInstruction::Allocate(perm_vars))); body.push(Line::Control(ControlInstruction::Allocate(perm_vars)));
if conjunct_info.has_deep_cut { if conjunct_info.has_deep_cut {
body.push(Line::Cut(CutInstruction::GetLevel)); body.push(Line::Cut(CutInstruction::GetLevel));
} }