Hi Reid,
> On May 21, 2016, at 11:44 PM, Reid McKenzie <m...@arrdem.com> wrote:
> 
> You should be able to do this:
> 
> (defn f [a ^bytes b ^bytes c]
>    (if (instance? ByteBuffer a)
>      (.f binding ^ByteBuffer a b c)
>      (.f binding ^bytes a b c)))
> 
> 
> You have a bimorphic function and yes there isn't a way to express that with 
> Clojure's calling convention and consequent hinting support. So 1) yes, 2) no 
> but no promises there, 3) see above.

Thanks! That confirms my suspicions. Unfortunately, I was hoping to solve this 
statically. Since some of these call sites are really only useful internally, 
I’ll deal with the multi-var version, because my library’s the only one to pay 
that cost.


thanks!
lvh

> I don't have a Clojure instance handy, but this should compile to
> 1) load the a argument
> 2) check instanceof against the class ByteBuffer
> 3) branch to the appropriate instance invoke
> 4) load b, c, a, from the arguments (as Objects), checkcasting appropriately 
> to get typed as hinted values on the stack
> 5) invoke (fully type qualified, no reflection).
> 
> On Saturday, May 21, 2016 at 4:57:43 PM UTC-5, lvh ‌ wrote:
> Hi, 
> 
> 
> 
> I’m working on caesium[1], Clojure bindings for libsodium using jnr-ffi. Up 
> until recently, I was able to stick to byte arrays for all APIs; but I’ve 
> started writing new nonce-misuse resistant cryptosystems[2], so I need to 
> have some byte-level layout within a byte array. I’m using 
> java.nio.ByteBuffer to provide mutable byte array “views” on top of an 
> existing byte array. 
> 
> The underlying C API takes (const) char *s. jnr-ffi understands how to 
> translate both byte[] and ByteBuffer to char *. Previously, I had functions 
> like: 
> 
> (defn f 
>   [^bytes a ^bytes b ^bytes c] 
>   (.f binding a b c)) 
> 
> All was well; no reflection. However, now `binding` has two signatures for f: 
>  [byte[] byte[] byte[]] and [ByteBuffer byte[] byte[]]. If I remove the first 
> ^byte annotation, everything works well, but this generates reflection 
> warnings. 
> 
> 1. Does this reflection warning mean that there will be actual reflection if 
> the type is known at the call site? (I believe the answer is “yes”.) 
> 2. Does that change with AOT? 
> 3. Is there a way to keep the same fn name, e.g. have: 
> 
> (defn f 
>   [a ^bytes b ^bytes c] 
>   (.f binding a b c)) 
> 
> … without reflection, as long as all callers of f have the type of `a` 
> statically determined? Again, I’m assuming the answer here is “no”, because 
> this resolution is done locally. 
> 
> I can solve this in a macro since the two definitions are identical except 
> for the type hint, but I’d first just like to check that I’m not missing some 
> of the finer points of Java interop/type hinting. Also, does this mean that I 
> necessarily have two fns with different names, one for each signature? E.g.: 
> 
> (defn f-bytes 
>   [^bytes a ^bytes b ^bytes c] 
>   (.f binding a b c)) 
> 
> (defn f-bytebuffer 
>   [^java.nio.ByteBuffer a ^bytes b ^bytes c] 
>   (.f binding a b c)) 
> 
> I know that having two overloads with the same arity doesn’t work, so I’m 
> guessing the answer is “no" there as well :-( 
> 
> 
> Thanks in advance! 
> lvh 
> 
> [1]: https://github.com/lvh/caesium <https://github.com/lvh/caesium> 
> [2]: https://www.lvh.io/posts/nonce-misuse-resistance-101.html 
> <https://www.lvh.io/posts/nonce-misuse-resistance-101.html>
> 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en 
> <http://groups.google.com/group/clojure?hl=en>
> --- 
> You received this message because you are subscribed to the Google Groups 
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to clojure+unsubscr...@googlegroups.com 
> <mailto:clojure+unsubscr...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to