Add function to create a library from a spec
This commit is contained in:
parent
30e549b406
commit
b5dd785fe0
1 changed files with 45 additions and 14 deletions
|
|
@ -691,23 +691,54 @@
|
||||||
(let [args (concat required-args types)]
|
(let [args (concat required-args types)]
|
||||||
(make-downcall symbol args ret)))))
|
(make-downcall symbol args ret)))))
|
||||||
|
|
||||||
(comment
|
(s/def :coffi.ffi.symbolspec/symbol string?)
|
||||||
|
(s/def :coffi.ffi.symbolspec/type keyword?)
|
||||||
|
(s/def ::symbolspec
|
||||||
|
(s/keys :req-un [:coffi.ffi.symbolspec/type :coffi.ffi.symbolspec/symbol]))
|
||||||
|
|
||||||
;; Idea for a data model
|
(defmulti reify-symbolspec
|
||||||
{:strlen {:type :function
|
"Takes a spec for a symbol reference and returns a live value for that type."
|
||||||
:symbol "strlen"
|
:type)
|
||||||
:function/args [::c-string]
|
(s/fdef reify-symbolspec
|
||||||
:function/ret ::int}
|
:args (s/cat :spec ::symbolspec))
|
||||||
:some-const {:type :const
|
|
||||||
:symbol "someConst"
|
|
||||||
:const/type ::int}
|
|
||||||
:some-var {:type :static-var
|
|
||||||
:symbol "someVar"
|
|
||||||
:static-var/type ::int}}
|
|
||||||
|
|
||||||
;; TODO(Joshua): Write a function that parses this and produces live values
|
(defmethod reify-symbolspec :downcall
|
||||||
|
[spec]
|
||||||
|
(make-downcall (:symbol spec)
|
||||||
|
(:function/args spec)
|
||||||
|
(:function/ret spec)))
|
||||||
|
|
||||||
)
|
(defmethod reify-symbolspec :varargs-factory
|
||||||
|
[spec]
|
||||||
|
(make-varargs-factory (:symbol spec)
|
||||||
|
(:function/args spec)
|
||||||
|
(:function/ret spec)))
|
||||||
|
|
||||||
|
(defmethod reify-symbolspec :const
|
||||||
|
[spec]
|
||||||
|
(const (:symbol spec)
|
||||||
|
(:const/type spec)))
|
||||||
|
|
||||||
|
(defmethod reify-symbolspec :static-var
|
||||||
|
[spec]
|
||||||
|
(static-variable (:symbol spec)
|
||||||
|
(:static-var/type spec)))
|
||||||
|
|
||||||
|
(s/def ::libspec
|
||||||
|
(s/map-of keyword? ::symbolspec))
|
||||||
|
|
||||||
|
(defn reify-libspec
|
||||||
|
"Converts"
|
||||||
|
[libspec]
|
||||||
|
(reduce-kv
|
||||||
|
(fn [m k v]
|
||||||
|
(assoc m k
|
||||||
|
(reify-symbolspec v)))
|
||||||
|
{}
|
||||||
|
libspec))
|
||||||
|
(s/fdef reify-libspec
|
||||||
|
:args (s/cat :libspec ::libspec)
|
||||||
|
:ret (s/map-of keyword? any?))
|
||||||
|
|
||||||
(s/def ::defcfn-args
|
(s/def ::defcfn-args
|
||||||
(s/and
|
(s/and
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue