From: Skgland Date: Sun, 17 Aug 2025 16:22:22 +0000 (+0200) Subject: fix define_foreign_struct X-Git-Tag: v0.10.0~11^2~9 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=8bc8171ec78f34ad196c356b1f16cb7268228e2b;p=scryer-prolog.git fix define_foreign_struct --- diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 442fd131..3f6d12ea 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -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 = 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 }