Add docstrings
This commit is contained in:
parent
e72d57c10f
commit
fce3675a4b
1 changed files with 56 additions and 0 deletions
|
|
@ -508,6 +508,7 @@
|
||||||
(.downcallHandle (CLinker/getInstance) address method-type function-descriptor))
|
(.downcallHandle (CLinker/getInstance) address method-type function-descriptor))
|
||||||
|
|
||||||
(def ^:private load-instructions
|
(def ^:private load-instructions
|
||||||
|
"Mapping from primitive types to the instruction used to load them onto the stack."
|
||||||
{::byte :bload
|
{::byte :bload
|
||||||
::short :sload
|
::short :sload
|
||||||
::int :iload
|
::int :iload
|
||||||
|
|
@ -519,6 +520,7 @@
|
||||||
::pointer :aload})
|
::pointer :aload})
|
||||||
|
|
||||||
(def ^:private store-instructions
|
(def ^:private store-instructions
|
||||||
|
"Mapping from primitive types to the instruction used to pop them off the stack."
|
||||||
{::byte :bstore
|
{::byte :bstore
|
||||||
::short :sstore
|
::short :sstore
|
||||||
::int :istore
|
::int :istore
|
||||||
|
|
@ -530,6 +532,7 @@
|
||||||
::pointer :astore})
|
::pointer :astore})
|
||||||
|
|
||||||
(def ^:private prim-classes
|
(def ^:private prim-classes
|
||||||
|
"Mapping from primitive types to their box classes."
|
||||||
{::byte Byte
|
{::byte Byte
|
||||||
::short Short
|
::short Short
|
||||||
::int Integer
|
::int Integer
|
||||||
|
|
@ -540,6 +543,10 @@
|
||||||
::double Double})
|
::double Double})
|
||||||
|
|
||||||
(defn- to-object-asm
|
(defn- to-object-asm
|
||||||
|
"Constructs a bytecode sequence to box a primitive on the top of the stack.
|
||||||
|
|
||||||
|
If the `type` is not primitive, then no change will occur. If it is void, a
|
||||||
|
null reference will be pushed to the stack."
|
||||||
[type idx]
|
[type idx]
|
||||||
(cond
|
(cond
|
||||||
(identical? ::void type) [:ldc nil]
|
(identical? ::void type) [:ldc nil]
|
||||||
|
|
@ -556,12 +563,14 @@
|
||||||
[])))
|
[])))
|
||||||
|
|
||||||
(defn- insn-layout
|
(defn- insn-layout
|
||||||
|
"Gets the type keyword or class for referring to the type in bytecode."
|
||||||
[type]
|
[type]
|
||||||
(if (some-> (primitive-type type) (not= ::pointer))
|
(if (some-> (primitive-type type) (not= ::pointer))
|
||||||
(keyword (name type))
|
(keyword (name type))
|
||||||
(java-layout type)))
|
(java-layout type)))
|
||||||
|
|
||||||
(defn- downcall-fn
|
(defn- downcall-fn
|
||||||
|
"Creates a function to call `handle` without reflection."
|
||||||
[handle args ret]
|
[handle args ret]
|
||||||
(insn/new-instance
|
(insn/new-instance
|
||||||
{:flags #{:public :final}
|
{:flags #{:public :final}
|
||||||
|
|
@ -595,12 +604,15 @@
|
||||||
^MethodHandle handle))
|
^MethodHandle handle))
|
||||||
|
|
||||||
(defn- ensure-address
|
(defn- ensure-address
|
||||||
|
"Gets the address if the argument is [[Addressable]], otherwise
|
||||||
|
calls [[find-symbol]] on it."
|
||||||
[symbol-or-addr]
|
[symbol-or-addr]
|
||||||
(if (instance? Addressable symbol-or-addr)
|
(if (instance? Addressable symbol-or-addr)
|
||||||
(address-of symbol-or-addr)
|
(address-of symbol-or-addr)
|
||||||
(find-symbol symbol-or-addr)))
|
(find-symbol symbol-or-addr)))
|
||||||
|
|
||||||
(defn const
|
(defn const
|
||||||
|
"Gets the value of a constant stored in `symbol-or-addr`."
|
||||||
[symbol-or-addr type]
|
[symbol-or-addr type]
|
||||||
(deserialize (ensure-address symbol-or-addr) [::pointer type]))
|
(deserialize (ensure-address symbol-or-addr) [::pointer type]))
|
||||||
|
|
||||||
|
|
@ -625,6 +637,7 @@
|
||||||
(apply swap! meta f args)))
|
(apply swap! meta f args)))
|
||||||
|
|
||||||
(defn freset!
|
(defn freset!
|
||||||
|
"Sets the value of `static-var`"
|
||||||
[^StaticVariable static-var newval]
|
[^StaticVariable static-var newval]
|
||||||
(serialize-into
|
(serialize-into
|
||||||
newval (.-type static-var)
|
newval (.-type static-var)
|
||||||
|
|
@ -637,10 +650,22 @@
|
||||||
(freset! static-var (apply f @static-var args)))
|
(freset! static-var (apply f @static-var args)))
|
||||||
|
|
||||||
(defn static-variable
|
(defn static-variable
|
||||||
|
"Constructs a reference to a mutable value stored in `symbol-or-addr`.
|
||||||
|
|
||||||
|
The returned value can be dereferenced, and has metadata, and the address of
|
||||||
|
the value can be queried with [[address-of]].
|
||||||
|
|
||||||
|
See [[freset!]], [[fswap!]]."
|
||||||
[symbol-or-addr type]
|
[symbol-or-addr type]
|
||||||
(StaticVariable. (ensure-address symbol-or-addr) type (atom nil)))
|
(StaticVariable. (ensure-address symbol-or-addr) type (atom nil)))
|
||||||
|
|
||||||
(defn make-downcall
|
(defn make-downcall
|
||||||
|
"Constructs a downcall function reference to `symbol-or-addr` with the given `args` and `ret` types.
|
||||||
|
|
||||||
|
The function returned takes only arguments whose types match exactly
|
||||||
|
the [[java-layout]] for that type, and returns an argument with exactly
|
||||||
|
the [[java-layout]] of the `ret` type. This function will perform no
|
||||||
|
serialization or deserialization of arguments or the return type."
|
||||||
[symbol-or-addr args ret]
|
[symbol-or-addr args ret]
|
||||||
(-> symbol-or-addr
|
(-> symbol-or-addr
|
||||||
ensure-address
|
ensure-address
|
||||||
|
|
@ -650,6 +675,16 @@
|
||||||
(downcall-fn args ret)))
|
(downcall-fn args ret)))
|
||||||
|
|
||||||
(defn make-varargs-factory
|
(defn make-varargs-factory
|
||||||
|
"Returns a function for constructing downcalls with additional types for arguments.
|
||||||
|
|
||||||
|
The `required-args` are the types of the first arguments passed to the
|
||||||
|
downcall handle, and the values passed to the returned function are only the
|
||||||
|
varargs types.
|
||||||
|
|
||||||
|
The returned function is memoized, so that only one downcall function will be
|
||||||
|
generated per combination of argument types.
|
||||||
|
|
||||||
|
See [[make-downcall]]."
|
||||||
[symbol required-args ret]
|
[symbol required-args ret]
|
||||||
(memoize
|
(memoize
|
||||||
(fn [& types]
|
(fn [& types]
|
||||||
|
|
@ -670,6 +705,27 @@
|
||||||
:body (s/* any?)))))
|
:body (s/* any?)))))
|
||||||
|
|
||||||
(defmacro defcfn
|
(defmacro defcfn
|
||||||
|
"Defines a Clojure function which maps to a native function.
|
||||||
|
|
||||||
|
`name` is the symbol naming the resulting var.
|
||||||
|
`symbol` is a symbol or string naming the library symbol to link against.
|
||||||
|
`arg-types` is a vector of qualified keywords representing the argument types.
|
||||||
|
`ret-type` is a single qualified keyword representing the return type.
|
||||||
|
`arglist` is a binding vector for the symbols used in the wrapping function.
|
||||||
|
`body` is a function body referring to `arglist`. During the execution of the
|
||||||
|
body, `name` is bound to a function that will serialize its arguments, call
|
||||||
|
the native function, and deserialize its return type. If any body is present,
|
||||||
|
you must call this function in order to call the native code.
|
||||||
|
|
||||||
|
If no `arglist` and `body` is provided, then the resulting function will
|
||||||
|
simply serialize the arguments according to `arg-types`, call the native
|
||||||
|
function, and deserialize the return value.
|
||||||
|
|
||||||
|
The number of args in `arglist` need not match the number of `arg-types` for
|
||||||
|
the native function. It need only call the native wrapper function with the
|
||||||
|
correct arguments.
|
||||||
|
|
||||||
|
See [[serialize]], [[deserialize]], [[make-downcall]]."
|
||||||
{:arglists '([name docstring? attr-map? symbol arg-types ret-type]
|
{:arglists '([name docstring? attr-map? symbol arg-types ret-type]
|
||||||
[name docstring? attr-map? symbol arg-types ret-type arglist & body])}
|
[name docstring? attr-map? symbol arg-types ret-type arglist & body])}
|
||||||
[& args]
|
[& args]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue