Fix bug with inlined serdes causing complex pointer serdes to fail

This commit is contained in:
Joshua Suskalo 2022-10-31 13:23:31 -05:00
parent 75bbe11971
commit fa40902ce9
No known key found for this signature in database
GPG key ID: 9B6BA586EFF1B9F0
2 changed files with 13 additions and 3 deletions

View file

@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. This change
- New function to allow getting the backing memory segment of a `coffi.ffi.StaticVariable`, to replace the `Addressable` implementation lost in the migration to JDK 18
### Fixed
- Bug where inline serde functions would fail on complex pointer types
- Bug where padding in structs may be increased when fields have alignments less than their size
- Bug where pointer alignment was incorrectly defined

View file

@ -251,10 +251,19 @@
;; argument is not converted to [[MemoryAddress/NULL]] if it's
;; considered primitive.
simple-args? (when const-args?
(every? mem/primitive? arg-types))
(and (every? mem/primitive? arg-types)
;; NOTE(Joshua): Pointer types with serdes (e.g. [::mem/pointer ::mem/int])
;; still require a scope, making them not qualify as "simple".
(every? keyword? (filter (comp #{::mem/pointer} mem/primitive-type) arg-types))))
const-ret? (s/valid? ::mem/type ret-type)
primitive-ret? (and const-ret? (or (mem/primitive? ret-type)
(#{::mem/void} ret-type)))
primitive-ret? (and const-ret?
(or (and (mem/primitive? ret-type)
;; NOTE(Joshua): Pointer types with serdes require deserializing the
;; return value, but don't require passing a scope to the downcall,
;; making them cause the return to not be primitive, but it may still
;; be "simple".
(or (keyword? ret-type) (not (#{::mem/pointer} (mem/primitive-type ret-type)))))
(#{::mem/void} ret-type)))
simple-ret? (and const-ret? (mem/primitive-type ret-type))
no-serde? (and const-args? (empty? arg-types)
primitive-ret?)]