]> Repositorios git - scryer-prolog.git/commitdiff
check that Target is an atom in scoped_clause_to_evacuable (#2248)
authorMark <[email protected]>
Fri, 29 Dec 2023 17:11:39 +0000 (10:11 -0700)
committerMark <[email protected]>
Fri, 29 Dec 2023 17:12:08 +0000 (10:12 -0700)
src/machine/loader.rs

index fb200f03b1fd3a1242df67b7a17e6a544c609c29..fb9b22bb936d5df33263be16b94f24c6cfa46305 100644 (file)
@@ -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::<MachineStub>(),
+            );
+
+            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));