]> Repositorios git - scryer-prolog.git/commitdiff
add permission error for attempts at redefining builtins, re: #50
authorMark Thom <[email protected]>
Thu, 6 Sep 2018 22:34:27 +0000 (16:34 -0600)
committerMark Thom <[email protected]>
Thu, 6 Sep 2018 22:34:27 +0000 (16:34 -0600)
src/prolog/compile.rs

index 0b9330c0f77ce4318cf08303b7be6a89a041c3cd..931fb37aa46f6eb9cc0bf0f878e2708b6acb3af6 100644 (file)
@@ -124,7 +124,14 @@ fn compile_decl(wam: &mut Machine, tl: TopLevel, queue: Vec<TopLevel>) -> EvalSe
             EvalSession::from(ParserError::InvalidModuleDecl),
         _ => {
             let name = try_eval_session!(if let Some(name) = tl.name() {
-                Ok(name)
+                match ClauseType::from(name.clone(), tl.arity(), None) {
+                    ClauseType::Named(..) | ClauseType::Op(..) =>
+                        Ok(name),
+                    _ => {
+                        let err_str = format!("{}/{}", name.as_str(), tl.arity());
+                        Err(SessionError::ImpermissibleEntry(err_str))
+                    }
+                }
             } else {
                 Err(SessionError::NamelessEntry)
             });
@@ -132,7 +139,7 @@ fn compile_decl(wam: &mut Machine, tl: TopLevel, queue: Vec<TopLevel>) -> EvalSe
             let mut code = try_eval_session!(compile_relation(&tl, false, wam.machine_flags()));
             try_eval_session!(compile_appendix(&mut code, queue, false, wam.machine_flags()));
 
-            if !code.is_empty() {
+            if !code.is_empty() {                
                 wam.add_user_code(name, tl.arity(), code, tl.as_predicate().ok().unwrap())
             } else {
                 EvalSession::from(SessionError::ImpermissibleEntry(String::from("no code generated.")))