From: Mark Date: Fri, 29 Dec 2023 17:11:39 +0000 (-0700) Subject: check that Target is an atom in scoped_clause_to_evacuable (#2248) X-Git-Tag: v0.9.4~56 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=75302ab716b431d3789cc423713b9a273e19df85;p=scryer-prolog.git check that Target is an atom in scoped_clause_to_evacuable (#2248) --- diff --git a/src/machine/loader.rs b/src/machine/loader.rs index fb200f03..fb9b22bb 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -1833,9 +1833,33 @@ impl Machine { } pub(crate) fn scoped_clause_to_evacuable(&mut self) -> CallResult { - let module_name = cell_as_atom!(self - .machine_st - .store(self.machine_st.deref(self.machine_st.registers[1]))); + let target = self.deref_register(1); + + let mut permission_error = || { + let err = self.machine_st.permission_error( + Permission::Modify, + atom!("static_procedure"), + functor_stub(atom!(":"), 2) + .into_iter() + .collect::(), + ); + + self.machine_st + .error_form(err, functor_stub(atom!("load"), 1)) + }; + + let module_name = read_heap_cell!(target, + (HeapCellValueTag::Atom, (name, arity)) => { + if arity == 0 { + name + } else { + return Err(permission_error()); + } + } + _ => { + return Err(permission_error()); + } + ); let loader = self.loader_from_heap_evacuable(temp_v!(3));