From 933c19c317d6c141f52be04ef7c96382b48f4459 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Thu, 7 Mar 2019 22:55:54 -0700 Subject: [PATCH] correct clause/2 to work only on properly scoped terms --- src/prolog/machine/system_calls.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 91fef9cc..5299c0f6 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -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(()); }, -- 2.54.0