From 4624508fc13791ec4c274692de454f5ba142b9e5 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 6 Nov 2017 20:22:15 -0700 Subject: [PATCH] clean up atomic and var code. --- src/prolog/codegen.rs | 54 ++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index c4bc158f..d5164e5f 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -349,15 +349,23 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker> &Term::Constant(_, _) => { code.push(succeed!()); }, - &Term::Var(ref vr, ref name) => { - let mut target = Vec::new(); - - self.marker.advance(term_loc, *term); // reset self.marker.arg_c to 1. - self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target); - - code.push(Line::Query(target)); - code.push(is_atomic!(vr.get().norm())); - } + &Term::Var(ref vr, ref name) => + 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); + + code.push(Line::Query(target)); + code.push(is_atomic!(vr.get().norm())); + } + }, }, &QueryTermRef::IsVar(inner_term) => match inner_term { @@ -367,15 +375,23 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker> &Term::AnonVar => { code.push(succeed!()); }, - &Term::Var(ref vr, ref name) => { - let mut target = Vec::new(); - - self.marker.advance(term_loc, *term); // reset self.marker.arg_c to 1. - self.marker.mark_var(name, Level::Shallow, vr, term_loc, &mut target); - - code.push(Line::Query(target)); - code.push(is_var!(vr.get().norm())); - } + &Term::Var(ref vr, ref name) => + 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); + + code.push(Line::Query(target)); + code.push(is_var!(vr.get().norm())); + } + } }, _ if chunk_num == 0 => { 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(); body.push(Line::Control(ControlInstruction::Allocate(perm_vars))); - + if conjunct_info.has_deep_cut { body.push(Line::Cut(CutInstruction::GetLevel)); } -- 2.54.0