From: Mark Thom Date: Mon, 18 May 2020 17:14:27 +0000 (-0600) Subject: fix partial_string_tail panic (#530) X-Git-Tag: v0.8.123~18 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=c14259060ccac0d6e582ad703dbaddfda6a1c575;p=scryer-prolog.git fix partial_string_tail panic (#530) --- diff --git a/src/prolog/machine/compile.rs b/src/prolog/machine/compile.rs index c4842978..ac43d01c 100644 --- a/src/prolog/machine/compile.rs +++ b/src/prolog/machine/compile.rs @@ -348,7 +348,9 @@ fn compile_into_module( ); match compile_into_module_impl(wam, &mut compiler, module, src, indices) { - Ok(()) => EvalSession::EntrySuccess, + Ok(()) => { + EvalSession::EntrySuccess + } Err(e) => { compiler.drop_expansions(&mut wam.code_repo); EvalSession::from(e) diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 4061bdbc..8281259e 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -1154,10 +1154,19 @@ impl MachineState { match pstr { Addr::PStrLocation(h, _) => { - let tail = self.heap[h + 1].as_addr(h + 1); - let target = self[temp_v!(2)]; + if let HeapCellValue::PartialString(_, true) = &self.heap[h] { + let tail = self.heap[h + 1].as_addr(h + 1); + let target = self[temp_v!(2)]; - self.unify(tail, target); + self.unify(tail, target); + } else { + self.fail = true; + return Ok(()); + } + } + Addr::EmptyList => { + self.fail = true; + return Ok(()); } _ => { unreachable!()