From: Mark Thom Date: Thu, 2 Nov 2017 21:29:31 +0000 (-0600) Subject: fix incorrect handling of terminal cuts. X-Git-Tag: v0.8.110~688 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=2abec91360c9d2bff21a07097791c2da36ed6bf5;p=scryer-prolog.git fix incorrect handling of terminal cuts. --- diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index d67c32e0..1a9bb743 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -247,6 +247,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker> if let &mut Line::Control(ref mut ctrl) = body.last_mut().unwrap() { *ctrl = ControlInstruction::CatchExecute; }, + QueryTermRef::Cut => {}, QueryTermRef::Throw(_) => if let &mut Line::Control(ref mut ctrl) = body.last_mut().unwrap() { *ctrl = ControlInstruction::ThrowExecute; diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 6610c233..320c9e59 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -255,7 +255,7 @@ pub fn eval<'a, 'b: 'a>(wam: &'a mut Machine, tl: &'b TopLevel) -> EvalSession<' &TopLevel::Predicate(ref clauses) => { let mut cg = CodeGenerator::::new(); - let compiled_pred = cg.compile_predicate(clauses); + let compiled_pred = cg.compile_predicate(clauses); wam.add_predicate(clauses, compiled_pred) }, &TopLevel::Fact(ref fact) => { diff --git a/src/prolog/machine.rs b/src/prolog/machine.rs index 6c235647..3c93ff67 100644 --- a/src/prolog/machine.rs +++ b/src/prolog/machine.rs @@ -36,7 +36,7 @@ struct MachineState { tr: usize, hb: usize, block: usize, // an offset into the OR stack. - ball: (usize, Heap) // heap boundary, and a term copy + ball: (usize, Heap) // heap boundary, and a term copy } struct DuplicateTerm<'a> { @@ -446,7 +446,7 @@ impl Machine { static ref ERR_STRING: String = String::from("an operator can't be both \ infix and postfix."); } - + if is_infix!(spec) { match self.op_dir.get(&(name.clone(), Fixity::Post)) { Some(_) => return EvalSession::EntryFailure(ERR_STRING.clone()), @@ -479,7 +479,7 @@ impl Machine { } } } - + pub fn submit_query<'a>(&mut self, code: Code, alloc_locs: AllocVarDict<'a>) -> EvalSession<'a> { let mut heap_locs = HashMap::new(); @@ -1658,7 +1658,7 @@ impl MachineState { } if let &Terminal::Terminal = term { - self.p = CodePtr::default(); + self.p = self.cp; } else { self.p += 1; } @@ -1680,7 +1680,7 @@ impl MachineState { } if let &Terminal::Terminal = term { - self.p = CodePtr::default(); + self.p = self.cp; } else { self.p += 1; }