From 18f5699f3ae0f0a947516d340a6fefbf6b04c952 Mon Sep 17 00:00:00 2001 From: Kristin Rutenkolk Date: Sun, 29 Dec 2024 11:32:31 +0100 Subject: [PATCH] remove necessity to create array when deserializing --- src/clj/coffi/mem.clj | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/clj/coffi/mem.clj b/src/clj/coffi/mem.clj index c9a945f..2b3604f 100644 --- a/src/clj/coffi/mem.clj +++ b/src/clj/coffi/mem.clj @@ -1868,18 +1868,30 @@ (if (= array-copy-method :loop) (let [a (gensym 'array)] - (concat - `(let [~a (~(coffitype->array-fn array-type) ~n)]) - [(list `dotimes ['m n] - (list `aset a 'm (generate-deserialize array-type `(+ ~offset (* ~(size-of array-type) ~'m)) segment-source-form)))] - [(if raw? a `(vec ~a))])) - (let [a (gensym 'array)] - (concat - `(let [~a (~(coffitype->array-fn array-type) ~n)]) - (map - #(list `aset a % (generate-deserialize array-type (+ offset (* (size-of array-type) %)) segment-source-form)) - (range n)) - [(if raw? a `(vec ~a))]))))) + (if raw? + (concat + `(let [~a (~(coffitype->array-fn array-type) ~n)]) + [(list `dotimes ['m n] + (list `aset a 'm (generate-deserialize array-type `(+ ~offset (* ~(size-of array-type) ~'m)) segment-source-form)))] + [(if raw? a `(vec ~a))]) + (list `loop ['i 0 'v (list `transient [])] + (list `if (list `< 'i n) + (list `recur (list `unchecked-inc 'i) (list `conj! 'v (generate-deserialize array-type `(+ ~offset (* ~(size-of array-type) ~'i)) segment-source-form))) + (list `persistent! 'v))) + )) + (if raw? + (let [a (gensym 'array)] + (concat + `(let [~a (~(coffitype->array-fn array-type) ~n)]) + (map + #(list `aset a % (generate-deserialize array-type (+ offset (* (size-of array-type) %)) segment-source-form)) + (range n)) + [(if raw? a `(vec ~a))])) + (vec + (map + #(generate-deserialize array-type (+ offset (* (size-of array-type) %)) segment-source-form) + (range n))) + )))) (defn- typelist [typename fields] (->>