From b49c0f5d36295a8e574ed95e7131724817f2c878 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 21 May 2018 16:20:08 -0600 Subject: [PATCH] get rid of spurious warning, add type error for skip_max_list --- src/prolog/ast.rs | 12 ++++++++++++ src/prolog/machine/mod.rs | 5 ++++- src/prolog/machine/system_calls.rs | 7 ++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 5fac17a5..30d5ac54 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -1609,6 +1609,18 @@ pub enum IndexPtr { #[derive(Clone)] pub struct CodeIndex(pub Rc>); +impl CodeIndex { + pub fn is_undefined(&self) -> bool { + let index_ptr = self.0.borrow().0; + + if let IndexPtr::Undefined = index_ptr { + true + } else { + false + } + } +} + #[derive(Clone)] pub struct ModuleCodeIndex(pub IndexPtr, pub ClauseName); diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index 6753fc91..ddbf0b37 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -57,7 +57,10 @@ impl<'a> SubModuleUser for MachineCodeIndex<'a> { fn insert_dir_entry(&mut self, name: ClauseName, arity: usize, idx: ModuleCodeIndex) { if let Some(ref mut code_idx) = self.code_dir.get_mut(&(name.clone(), arity)) { - println!("warning: overwriting {}/{}", &name, arity); + if !code_idx.is_undefined() { + println!("warning: overwriting {}/{}", &name, arity); + } + set_code_index!(code_idx, idx.0, idx.1); return; diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index a48f766c..cd78785f 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -148,9 +148,14 @@ impl MachineState { } else { self.fail = true; }, - _ => { + Addr::HeapCell(_) | Addr::StackCell(..) => { let stub = MachineError::functor_stub(clause_name!("$skip_max_list"), 4); return Err(self.error_form(MachineError::instantiation_error(), stub)); + }, + addr => { + let stub = MachineError::functor_stub(clause_name!("$skip_max_list"), 4); + return Err(self.error_form(MachineError::type_error(ValidType::Integer, addr), + stub)); } }; -- 2.54.0