Add starting functions for basic api
This commit is contained in:
parent
af00bee4ce
commit
ab61830442
1 changed files with 105 additions and 1 deletions
|
|
@ -1 +1,105 @@
|
|||
(ns coffi.ffi)
|
||||
(ns coffi.ffi
|
||||
(:refer-clojure :exclude [defstruct])
|
||||
(:import
|
||||
(java.lang.invoke VarHandle)
|
||||
(jdk.incubator.foreign
|
||||
MemoryAccess
|
||||
MemoryAddress
|
||||
MemoryHandles
|
||||
MemoryLayout
|
||||
MemoryLayout$PathElement
|
||||
MemoryLayouts
|
||||
MemorySegment
|
||||
FunctionDescriptor)))
|
||||
|
||||
(defmulti serialize*
|
||||
"Writes a serialized version of the `obj` to the given `segment`.
|
||||
|
||||
Any new allocations made during the serialization should be tied to the given
|
||||
`scope`, except in extenuating circumstances."
|
||||
(fn [type obj segment scope]
|
||||
type))
|
||||
|
||||
(defmulti deserialize
|
||||
"Deserializes the given object into a Clojure data structure."
|
||||
(fn [type obj]
|
||||
type))
|
||||
|
||||
(defmulti size-of
|
||||
"The size in bytes of the given `type`."
|
||||
(fn [type] type))
|
||||
|
||||
(defmethod size-of ::byte
|
||||
[type]
|
||||
Byte/SIZE)
|
||||
|
||||
(defmethod size-of ::short
|
||||
[type]
|
||||
Short/SIZE)
|
||||
|
||||
(defmethod size-of ::integer
|
||||
[type]
|
||||
Integer/SIZE)
|
||||
|
||||
(defmethod size-of ::long
|
||||
[type]
|
||||
Long/SIZE)
|
||||
|
||||
(defmethod size-of ::long-long
|
||||
[type]
|
||||
Long/SIZE)
|
||||
|
||||
(defmethod size-of ::char
|
||||
[type]
|
||||
Byte/SIZE)
|
||||
|
||||
(defmethod size-of ::float
|
||||
[type]
|
||||
Float/SIZE)
|
||||
|
||||
(defmethod size-of ::double
|
||||
[type]
|
||||
Double/SIZE)
|
||||
|
||||
(defmethod size-of ::pointer
|
||||
[type]
|
||||
(.byteSize MemoryLayouts/ADDRESS))
|
||||
|
||||
(def c-layout
|
||||
"Map of primitive type names to the [[CLinker]] types for a method handle."
|
||||
{::byte CLinker/C_CHAR
|
||||
::short CLinker/C_SHORT
|
||||
::integer CLinker/C_INT
|
||||
::long CLinker/C_LONG
|
||||
::long-long CLinker/C_LONG_LONG
|
||||
::char CLinker/C_CHAR
|
||||
::float CLinker/C_FLOAT
|
||||
::double CLinker/C_DOUBLE
|
||||
::pointer CLinker/C_POINTER})
|
||||
|
||||
(def java-layout
|
||||
"Map of primitive type names to the Java types for a method handle."
|
||||
{::byte Byte/TYPE
|
||||
::short Short/TYPE
|
||||
::integer Integer/TYPE
|
||||
::long Long/TYPE
|
||||
::long-long Long/TYPE
|
||||
::char Byte/TYPE
|
||||
::float Float/TYPE
|
||||
::double Double/TYPE
|
||||
::pointer MemoryAddress})
|
||||
|
||||
(defn alloc
|
||||
"Allocates `size` bytes."
|
||||
([size] (alloc size (ResourceScope/newImplicitScope)))
|
||||
([size scope] (MemorySegment/allocateNative size scope)))
|
||||
|
||||
(defn alloc-instance
|
||||
"Allocates a memory segment for the given `type`."
|
||||
([type] (alloc-instance type (ResourceScope/newImplicitScope)))
|
||||
([type scope] (MemorySegment/allocateNative (size-of type) scope)))
|
||||
|
||||
(defn serialize
|
||||
"Serializes the `obj` into a newly-allocated [[MemorySegment]]."
|
||||
([type obj] (serialize type obj (ResourceScope/newImplicitScope)))
|
||||
([type obj scope] (serialize* type obj (alloc-instance type scope) scope)))
|
||||
|
|
|
|||
Loading…
Reference in a new issue