Add null for implementing serdes

This commit is contained in:
Joshua Suskalo 2024-10-02 16:22:29 -04:00
parent fd8d649f63
commit bd7216a06e
No known key found for this signature in database
GPG key ID: 9B6BA586EFF1B9F0
3 changed files with 15 additions and 4 deletions

View file

@ -2,6 +2,9 @@
All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/).
## [UNRELEASED]
### Added
- New `coffi.mem/null` var for implementing custom types
### Fixed
- Usage of deprecated `(Class/STATIC_FIELD)` access pattern

View file

@ -292,7 +292,7 @@
;; cast null pointers to something understood by panama
(#{::mem/pointer} type)
`(or ~sym MemorySegment/NULL)
`(or ~sym mem/null)
(mem/primitive-type type)
`(mem/serialize* ~sym ~type-sym ~arena)

View file

@ -112,10 +112,18 @@
^long [addressable]
(.address ^MemorySegment addressable))
(def ^MemorySegment null
"The NULL pointer object.
While this object is safe to pass to functions which serialize to a pointer,
it's generally encouraged to simply pass `nil`. This value primarily exists to
make it easier to write custom types with a primitive pointer representation."
MemorySegment/NULL)
(defn null?
"Checks if a memory address is null."
[addr]
(or (.equals MemorySegment/NULL addr) (not addr)))
(or (.equals null addr) (not addr)))
(defn address?
"Checks if an object is a memory address.
@ -872,7 +880,7 @@
(serialize-into obj (second type) segment arena)
(address-of segment))
obj)
MemorySegment/NULL))
null))
(defmethod serialize* ::void
[_obj _type _arena]
@ -1132,7 +1140,7 @@
[obj _type ^Arena arena]
(if obj
(.allocateFrom arena ^String obj)
MemorySegment/NULL))
null))
(defmethod deserialize* ::c-string
[addr _type]