make private with-c-layout implementation behave like the one in

`layout`
This commit is contained in:
Kristin Rutenkolk 2024-12-19 14:17:18 +01:00
parent bba05c7dfd
commit 0c84c323b3

View file

@ -1564,13 +1564,13 @@
(recur (cond-> (+ offset size) (recur (cond-> (+ offset size)
(pos? r) (+ (- align r))) (pos? r) (+ (- align r)))
(cond-> aligned-fields (cond-> aligned-fields
(pos? r) (conj [::padding [::padding (- align r)]]) (pos? r) (conj [:coffi.layout/padding [:coffi.mem/padding (- align r)]])
:always (conj field)) :always (conj field))
fields)) fields))
(let [strongest-alignment (reduce max (map (comp align-of second) (nth struct-spec 1))) (let [strongest-alignment (reduce max (map (comp align-of second) (nth struct-spec 1)))
r (rem offset strongest-alignment)] r (rem offset strongest-alignment)]
(cond-> aligned-fields (cond-> aligned-fields
(pos? r) (conj [::padding [::padding (- strongest-alignment r)]])))))] (pos? r) (conj [:coffi.layout/padding [:coffi.mem/padding (- strongest-alignment r)]])))))]
(assoc struct-spec 1 aligned-fields))) (assoc struct-spec 1 aligned-fields)))
(defn- coffitype->typename [in] (defn- coffitype->typename [in]
@ -1637,7 +1637,7 @@
(defn- typelist [typename fields] (defn- typelist [typename fields]
(->> (->>
(partition 2 2 (interleave (reductions + 0 (map (comp size-of second) fields)) fields)) (partition 2 2 (interleave (reductions + 0 (map (comp size-of second) fields)) fields))
(filter (fn [[_ [_ field-type]]] (not (and (vector? field-type) (= ::padding (first field-type)))))))) (filter (fn [[_ [_ field-type]]] (not (and (vector? field-type) (= "padding" (name (first field-type)))))))))
(defn register-new-struct-deserialization [typename [_struct fields]] (defn register-new-struct-deserialization [typename [_struct fields]]
(let [typelist (typelist typename fields)] (let [typelist (typelist typename fields)]
@ -1675,7 +1675,7 @@
(defn register-new-struct-serialization [typename [_struct fields]] (defn register-new-struct-serialization [typename [_struct fields]]
(let [typelist (typelist typename fields) (let [typelist (typelist typename fields)
fieldnames (filter #(not= ::padding %) (map first fields))] fieldnames (filter #(not= "padding" (name %)) (map first fields))]
(defmethod generate-serialize typename [_type source-form global-offset segment-source-form] (defmethod generate-serialize typename [_type source-form global-offset segment-source-form]
(->> typelist (->> typelist
(map-indexed (map-indexed
@ -1945,14 +1945,16 @@
(partition 2 2) (partition 2 2)
(map (fn [[_type sym]] (with-meta sym {:tag (coffitype->typename _type)}))) (map (fn [[_type sym]] (with-meta sym {:tag (coffitype->typename _type)})))
(vec)) (vec))
struct-layout (with-c-layout [::struct struct-layout-raw [::struct
(->> (->>
members members
(partition 2 2) (partition 2 2)
(map vec) (map vec)
(map #(update % 1 keyword)) (map #(update % 1 keyword))
(map reverse) (map reverse)
(map vec))]) (map vec)
(vec))]
struct-layout (with-c-layout struct-layout-raw)
segment-form (with-meta 'segment {:tag 'java.lang.foreign.MemorySegment})] segment-form (with-meta 'segment {:tag 'java.lang.foreign.MemorySegment})]
(if (resolve typename) (ns-unmap *ns* typename)) (if (resolve typename) (ns-unmap *ns* typename))
(register-new-struct-deserialization coffi-typename struct-layout) (register-new-struct-deserialization coffi-typename struct-layout)