]> Repositorios git - scryer-prolog.git/commitdiff
fix define_foreign_struct
authorSkgland <[email protected]>
Sun, 17 Aug 2025 16:22:22 +0000 (18:22 +0200)
committerBennet Bleßmann <[email protected]>
Sun, 24 Aug 2025 17:56:26 +0000 (19:56 +0200)
src/machine/system_calls.rs

index 442fd131cee36b488ddd23b58b81e92598d88bdb..3f6d12eaaddc2ec92c2c576e207549b551a320f7 100644 (file)
@@ -5173,15 +5173,29 @@ impl Machine {
     #[cfg(feature = "ffi")]
     #[inline(always)]
     pub(crate) fn define_foreign_struct(&mut self) -> CallResult {
+        fn stub_gen() -> MachineStub {
+            functor_stub(atom!("$define_foreign_struct"), 2)
+        }
+
         let struct_name_arg = self.deref_register(1);
         let fields_reg = self.deref_register(2);
         if let Some(struct_name) = self.machine_st.value_to_str_like(struct_name_arg) {
-            let stub_gen = || functor_stub(atom!("define_foreign_struct"), 2);
             let fields: Vec<Atom> = match self.machine_st.try_from_list(fields_reg, stub_gen) {
                 Ok(addrs) => {
                     let mut args = Vec::new();
                     for heap_cell in addrs {
-                        args.push(cell_as_atom_cell!(heap_cell).get_name());
+                        let arg_cell = self.machine_st.store(self.machine_st.deref(heap_cell));
+                        let Some(arg) = arg_cell.to_atom() else {
+                            let err = if arg_cell.is_var() {
+                                self.machine_st.instantiation_error()
+                            } else {
+                                self.machine_st.type_error(ValidType::Atom, heap_cell)
+                            };
+
+                            return Err(self.machine_st.error_form(err, stub_gen()));
+                        };
+
+                        args.push(arg);
                     }
                     args
                 }