From b2918936e78f4cd7acbde968cfa653f20100e079 Mon Sep 17 00:00:00 2001 From: Joshua Suskalo Date: Mon, 20 Sep 2021 19:41:10 -0500 Subject: [PATCH] Add struct serdes --- src/coffi/ffi.clj | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/coffi/ffi.clj b/src/coffi/ffi.clj index decd6f6..50f199a 100644 --- a/src/coffi/ffi.clj +++ b/src/coffi/ffi.clj @@ -499,6 +499,44 @@ [segment type] (clone-segment (slice segment 0 (size-of type)))) +;;; Struct types + +(defmethod c-layout ::struct + [[_struct fields]] + (let [fields (for [[field-name field] fields] + (.withName (c-layout field) + (name field-name)))] + (MemoryLayout/structLayout + (into-array MemoryLayout fields)))) + +(defmethod serialize-into ::struct + [obj [_struct fields] segment scope] + (loop [offset 0 + fields fields] + (when (seq fields) + (let [[field type] (first fields) + size (size-of type)] + (serialize-into + (get obj field) type + (slice segment offset size) scope) + (recur (+ offset size) (rest fields)))))) + +(defmethod deserialize-from ::struct + [segment [_struct fields]] + (loop [offset 0 + fields fields + obj {}] + (if (seq fields) + (let [[field type] (first fields) + size (size-of type)] + (recur + (+ offset size) + (rest fields) + (assoc obj field (deserialize-from + (slice segment offset size) + type)))) + obj))) + ;;; FFI Code loading and function access (defn load-system-library