fix array serialization
This commit is contained in:
parent
c49dc796b2
commit
51dfbc39ed
1 changed files with 8 additions and 10 deletions
|
|
@ -1965,13 +1965,13 @@
|
||||||
(list (coffitype->array-write-fn member-type) segment-source-form length offset (list (coffitype->array-fn member-type) length source-form)))
|
(list (coffitype->array-write-fn member-type) segment-source-form length offset (list (coffitype->array-fn member-type) length source-form)))
|
||||||
|
|
||||||
(defn- generate-serialize-vector-as-array-loop [member-type length source-form offset segment-source-form]
|
(defn- generate-serialize-vector-as-array-loop [member-type length source-form offset segment-source-form]
|
||||||
(let [obj (with-meta (gensym 'src-array) {:tag (coffitype->typename [::array member-type length :raw? true])})]
|
(let [obj (with-meta (gensym 'src-array) {:tag (coffitype->typename [::array member-type length :raw? false])})]
|
||||||
(list `let [obj source-form]
|
(list `let [obj source-form]
|
||||||
(list `dotimes ['n length]
|
(list `dotimes ['n length]
|
||||||
(generate-serialize member-type `(nth ~obj ~'n) `(+ ~offset (* ~(size-of member-type) ~'n)) segment-source-form)))))
|
(generate-serialize member-type `(nth ~obj ~'n) `(+ ~offset (* ~(size-of member-type) ~'n)) segment-source-form)))))
|
||||||
|
|
||||||
(defn- generate-serialize-vector-as-array-inline [member-type length source-form offset segment-source-form]
|
(defn- generate-serialize-vector-as-array-inline [member-type length source-form offset segment-source-form]
|
||||||
(let [obj (with-meta (gensym 'src-array) {:tag (coffitype->typename [::array member-type length :raw? true])})]
|
(let [obj (with-meta (gensym 'src-array) {:tag (coffitype->typename [::array member-type length :raw? false])})]
|
||||||
(concat
|
(concat
|
||||||
(list `let [obj source-form])
|
(list `let [obj source-form])
|
||||||
(map
|
(map
|
||||||
|
|
@ -1979,13 +1979,11 @@
|
||||||
(range length)))))
|
(range length)))))
|
||||||
|
|
||||||
(defn generate-serialize-vector-as-array [member-type length source-form offset segment-source-form]
|
(defn generate-serialize-vector-as-array [member-type length source-form offset segment-source-form]
|
||||||
(if (coffitype->array-write-fn member-type)
|
(let [cutoff 1024 ;this magic value has been benchmarked, but it may need adjusting for specific architectures
|
||||||
(generate-serialize-vector-as-array-bulk member-type length source-form offset segment-source-form)
|
obj (with-meta (gensym 'src-array) {:tag (coffitype->typename [::array member-type length :raw? false])})]
|
||||||
(let [inline-cutoff 32 ;this magic value has been benchmarked, but it may need adjusting for specific architectures
|
(if (or (<= length cutoff) (not (coffitype->array-write-fn member-type)))
|
||||||
obj (with-meta (gensym 'src-array) {:tag (coffitype->typename [::array member-type length :raw? true])})]
|
(generate-serialize-vector-as-array-loop member-type length source-form offset segment-source-form)
|
||||||
(if (< length inline-cutoff)
|
(generate-serialize-vector-as-array-bulk member-type length source-form offset segment-source-form))))
|
||||||
(generate-serialize-vector-as-array-inline member-type length source-form offset segment-source-form)
|
|
||||||
(generate-serialize-vector-as-array-loop member-type length source-form offset segment-source-form)))))
|
|
||||||
|
|
||||||
(defmethod generate-serialize :coffi.mem/array [[_arr member-type length & {:keys [raw?]}] source-form offset segment-source-form]
|
(defmethod generate-serialize :coffi.mem/array [[_arr member-type length & {:keys [raw?]}] source-form offset segment-source-form]
|
||||||
(if raw?
|
(if raw?
|
||||||
|
|
@ -1999,7 +1997,7 @@
|
||||||
(->> typelist
|
(->> typelist
|
||||||
(map-indexed
|
(map-indexed
|
||||||
(fn [index [offset [_ field-type]]]
|
(fn [index [offset [_ field-type]]]
|
||||||
(generate-serialize field-type (list (symbol (str "." (name (nth fieldnames index)))) 'source-obj) (if (number? global-offset) (+ global-offset offset) `(unchecked-add-int ~global-offset ~offset)) segment-source-form)))
|
(generate-serialize field-type (list (symbol (str "." (name (nth fieldnames index)))) 'source-obj) (if (number? global-offset) (+ global-offset offset) `(+ ~global-offset ~offset)) segment-source-form)))
|
||||||
(concat [`let ['source-obj source-form]])))))
|
(concat [`let ['source-obj source-form]])))))
|
||||||
|
|
||||||
(gen-interface
|
(gen-interface
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue