]> Repositorios git - scryer-prolog.git/commitdiff
Manage Float and Double FFI types in structs
authorAdrián Arroyo Calle <[email protected]>
Thu, 6 Jun 2024 20:18:17 +0000 (22:18 +0200)
committerAdrián Arroyo Calle <[email protected]>
Thu, 6 Jun 2024 20:18:17 +0000 (22:18 +0200)
src/ffi.rs

index a8ffd7442b7e2f769ce2fbb6aca17ac3d553c9ea..418acccedcfd2a29569a64be3e1ef242553bd696 100644 (file)
@@ -436,6 +436,18 @@ impl ForeignFunctionTable {
                     }
                     libffi::raw::FFI_TYPE_SINT64 => read_and_push_int!(i64),
                     libffi::raw::FFI_TYPE_POINTER => read_and_push_int!(i64),
+                   libffi::raw::FFI_TYPE_FLOAT => {
+                       field_ptr = field_ptr.add(field_ptr.align_offset(std::mem::align_of::<f32>()));
+                       let n = std::ptr::read(field_ptr as *mut f32);
+                       returns.push(Value::Float(f32::from(n).into()));
+                       field_ptr = field_ptr.add(std::mem::size_of::<f32>());
+                   }
+                   libffi::raw::FFI_TYPE_DOUBLE => {
+                       field_ptr = field_ptr.add(field_ptr.align_offset(std::mem::align_of::<f64>()));
+                       let n = std::ptr::read(field_ptr as *mut f64);
+                       returns.push(Value::Float(f64::from(n)));
+                       field_ptr = field_ptr.add(std::mem::size_of::<f64>());
+                   }
                     libffi::raw::FFI_TYPE_STRUCT => {
                         let substruct = struct_type.atom_fields[i].as_str();
                         let struct_type = self