]> Repositorios git - scryer-prolog.git/commitdiff
correct clause/2 to work only on properly scoped terms
authorMark Thom <[email protected]>
Fri, 8 Mar 2019 05:55:54 +0000 (22:55 -0700)
committerMark Thom <[email protected]>
Fri, 8 Mar 2019 05:55:54 +0000 (22:55 -0700)
src/prolog/machine/system_calls.rs

index 91fef9ccebc21a8bf28b7b160d2134acbc0c523d..5299c0f6e67bb943be29c6dc0d94775b40c77ceb 100644 (file)
@@ -873,20 +873,25 @@ impl MachineState {
             &SystemClauseType::GetClause => {
                 let head = self[temp_v!(1)].clone();
 
-                let subsection = match self.store(self.deref(head)) {
+                let (module, subsection) = match self.store(self.deref(head)) {
                     Addr::Str(s) =>
                         match self.heap[s].clone() {
                             HeapCellValue::NamedStr(arity, name, ..) =>
-                                indices.get_clause_subsection(name, arity),
+                                (name.owning_module(), indices.get_clause_subsection(name, arity)),
                             _ => unreachable!()
                         },
                     Addr::Con(Constant::Atom(name, _)) =>
-                        indices.get_clause_subsection(name, 0),
+                        (name.owning_module(), indices.get_clause_subsection(name, 0)),
                     _ => unreachable!()
                 };
 
                 match subsection {
                     Some(dynamic_predicate_info) => {
+                        if dynamic_predicate_info.module_src != module {
+                            self.fail = true;
+                            return Ok(());
+                        }
+                        
                         self.execute_at_index(2, dynamic_predicate_info.clauses_subsection_p);
                         return Ok(());
                     },