Somewhat related, I had this code which "worked" on Alpha 2:

(defn ^java.nio.ByteBuffer to-byte-array [^com.eaio.uuid.UUID u]
  (let [lo (.getClockSeqAndNode u)
        hi (.getTime u)]
    (-> (java.nio.ByteBuffer/allocate 16)
      (.putLong hi)
      (.putLong lo)
      (.array))))

(can anyone spot the error?)

…which gave this exception on Alpha 3:

     [exec] Caused by: java.lang.ClassCastException: [B cannot be cast to 
java.nio.ByteBuffer
     [exec]     at 
worldsingles.data.uuid$to_byte_array.invokeStatic(uuid.clj:33)
     [exec]     at worldsingles.data.uuid$to_byte_array.invoke(uuid.clj)
     [exec]     at 
worldsingles.data.uuid$uuid_as_byte_array.invokeStatic(uuid.clj:36)
     [exec]     at worldsingles.data.uuid$uuid_as_byte_array.invoke(uuid.clj)
     [exec]     at 
worldsingles.news$add_basic_event_data.invokeStatic(news.clj:24)
     [exec]     at worldsingles.news$add_basic_event_data.invoke(news.clj)

Changing it to the following solved the problem:

(defn ^bytes to-byte-array [^com.eaio.uuid.UUID u]
  (let [lo (.getClockSeqAndNode u)
        hi (.getTime u)]
    (-> (java.nio.ByteBuffer/allocate 16)
      (.putLong hi)
      (.putLong lo)
      (.array))))

It returns a byte[] not a java.nio.ByteBuffer. I actually had three functions 
with this incorrect type hint (that, yes, all failed on Alpha 3).

I’m assuming that direct linking is causing return type hints to be a) static 
class names — which is breaking Rangel’s code — and b) are more strictly 
type-checked — which is breaking my code?

(we’re continuing to run tests on Alpha 3 but this is what we tripped over 
immediately)

Sean

> On Jul 29, 2015, at 4:55 PM, Rangel Spasov <raspa...@gmail.com> wrote:
> 
> Hey guys,
> 
> I'm getting this compiler error after upgrading to alpha3, I assume it has 
> something to do with the direct linking changes?
> 
> I think it's related to clj-ssh library, and this method specifically:
> 
> (defn- ^{:tag (Class/forName "[B")} as-bytes
>   "Return arg as a byte array.  arg must be a string or a byte array."
>   [arg]
>   (if (string? arg)
>     (.getBytes ^String arg ascii)
>     arg))
> 
> The exception is below:
> 
> #error {
> 
>  :cause Unable to resolve classname: (Class/forName "[B")
> 
>  :via
> 
>  [{:type clojure.lang.Compiler$CompilerException
> 
>    :message java.lang.IllegalArgumentException: Unable to resolve classname: 
> (Class/forName "[B"), compiling:(clj_ssh/ssh.clj:94:1)
> 
>    :at [clojure.lang.Compiler analyzeSeq Compiler.java 6891]}
> 
>   {:type java.lang.IllegalArgumentException
> 
>    :message Unable to resolve classname: (Class/forName "[B")
> 
>    :at [clojure.lang.Compiler$HostExpr tagToClass Compiler.java 1132]}]
> 
>  :trace
> 
>  [[clojure.lang.Compiler$HostExpr tagToClass Compiler.java 1132]
> 
>   [clojure.lang.Compiler tagClass Compiler.java 8384]
> 
>   [clojure.lang.Compiler$FnMethod parse Compiler.java 5309]
> 
>   [clojure.lang.Compiler$FnExpr parse Compiler.java 3977]
> 
>   [clojure.lang.Compiler analyzeSeq Compiler.java 6882]
> 
>   [clojure.lang.Compiler analyze Compiler.java 6685]
> 
>   [clojure.lang.Compiler analyzeSeq Compiler.java 6872]
> 
>   [clojure.lang.Compiler analyze Compiler.java 6685]
> 
>   [clojure.lang.Compiler access$300 Compiler.java 38]
> 
>   [clojure.lang.Compiler$DefExpr$Parser parse Compiler.java 593]
> 
>   [clojure.lang.Compiler analyzeSeq Compiler.java 6884]
> 
>   [clojure.lang.Compiler analyze Compiler.java 6685]
> 
>   [clojure.lang.Compiler analyze Compiler.java 6646]
> 
>   [clojure.lang.Compiler eval Compiler.java 6947]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.RT loadResourceScript RT.java 372]
> 
>   [clojure.lang.RT loadResourceScript RT.java 363]
> 
>   [clojure.lang.RT load RT.java 453]
> 
>   [clojure.lang.RT load RT.java 419]
> 
>   [clojure.core$load$fn__5436 invoke core.clj 5869]
> 
>   [clojure.core$load invokeStatic core.clj 5868]
> 
>   [clojure.core$load_one invokeStatic core.clj 5669]
> 
>   [clojure.core$load_one invoke core.clj -1]
> 
>   [clojure.core$load_lib$fn__5385 invoke core.clj 5714]
> 
>   [clojure.core$load_lib invokeStatic core.clj 5713]
> 
>   [clojure.core$load_lib doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 142]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$load_libs invokeStatic core.clj 5751]
> 
>   [clojure.core$load_libs doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 137]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$require invokeStatic core.clj 5773]
> 
>   [clojure.core$require doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 930]
> 
>   [cloud_monkey.ssh$eval21511$loading__5328__auto____21512 invoke ssh.clj 1]
> 
>   [cloud_monkey.ssh$eval21511 invokeStatic ssh.clj 1]
> 
>   [cloud_monkey.ssh$eval21511 invoke ssh.clj -1]
> 
>   [clojure.lang.Compiler eval Compiler.java 6943]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.RT loadResourceScript RT.java 372]
> 
>   [clojure.lang.RT loadResourceScript RT.java 363]
> 
>   [clojure.lang.RT load RT.java 453]
> 
>   [clojure.lang.RT load RT.java 419]
> 
>   [clojure.core$load$fn__5436 invoke core.clj 5869]
> 
>   [clojure.core$load invokeStatic core.clj 5868]
> 
>   [clojure.core$load_one invokeStatic core.clj 5669]
> 
>   [clojure.core$load_one invoke core.clj -1]
> 
>   [clojure.core$load_lib$fn__5385 invoke core.clj 5714]
> 
>   [clojure.core$load_lib invokeStatic core.clj 5713]
> 
>   [clojure.core$load_lib doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 142]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$load_libs invokeStatic core.clj 5751]
> 
>   [clojure.core$load_libs doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 137]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$require invokeStatic core.clj 5773]
> 
>   [clojure.core$require doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 1289]
> 
>   [cloud_monkey.execution_pipeline$eval21505$loading__5328__auto____21506 
> invoke execution_pipeline.clj 1]
> 
>   [cloud_monkey.execution_pipeline$eval21505 invokeStatic 
> execution_pipeline.clj 1]
> 
>   [cloud_monkey.execution_pipeline$eval21505 invoke execution_pipeline.clj -1]
> 
>   [clojure.lang.Compiler eval Compiler.java 6943]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.RT loadResourceScript RT.java 372]
> 
>   [clojure.lang.RT loadResourceScript RT.java 363]
> 
>   [clojure.lang.RT load RT.java 453]
> 
>   [clojure.lang.RT load RT.java 419]
> 
>   [clojure.core$load$fn__5436 invoke core.clj 5869]
> 
>   [clojure.core$load invokeStatic core.clj 5868]
> 
>   [clojure.core$load_one invokeStatic core.clj 5669]
> 
>   [clojure.core$load_one invoke core.clj -1]
> 
>   [clojure.core$load_lib$fn__5385 invoke core.clj 5714]
> 
>   [clojure.core$load_lib invokeStatic core.clj 5713]
> 
>   [clojure.core$load_lib doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 142]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$load_libs invokeStatic core.clj 5751]
> 
>   [clojure.core$load_libs doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 137]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$require invokeStatic core.clj 5773]
> 
>   [clojure.core$require doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 1523]
> 
>   [cloud_monkey.events$eval21499$loading__5328__auto____21500 invoke 
> events.clj 1]
> 
>   [cloud_monkey.events$eval21499 invokeStatic events.clj 1]
> 
>   [cloud_monkey.events$eval21499 invoke events.clj -1]
> 
>   [clojure.lang.Compiler eval Compiler.java 6943]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.RT loadResourceScript RT.java 372]
> 
>   [clojure.lang.RT loadResourceScript RT.java 363]
> 
>   [clojure.lang.RT load RT.java 453]
> 
>   [clojure.lang.RT load RT.java 419]
> 
>   [clojure.core$load$fn__5436 invoke core.clj 5869]
> 
>   [clojure.core$load invokeStatic core.clj 5868]
> 
>   [clojure.core$load_one invokeStatic core.clj 5669]
> 
>   [clojure.core$load_one invoke core.clj -1]
> 
>   [clojure.core$load_lib$fn__5385 invoke core.clj 5714]
> 
>   [clojure.core$load_lib invokeStatic core.clj 5713]
> 
>   [clojure.core$load_lib doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 142]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$load_libs invokeStatic core.clj 5751]
> 
>   [clojure.core$load_libs doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 137]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$require invokeStatic core.clj 5773]
> 
>   [clojure.core$require doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 1789]
> 
>   [cloud_monkey.aleph_netty$eval1588$loading__5328__auto____1589 invoke 
> aleph_netty.clj 1]
> 
>   [cloud_monkey.aleph_netty$eval1588 invokeStatic aleph_netty.clj 1]
> 
>   [cloud_monkey.aleph_netty$eval1588 invoke aleph_netty.clj -1]
> 
>   [clojure.lang.Compiler eval Compiler.java 6943]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.RT loadResourceScript RT.java 372]
> 
>   [clojure.lang.RT loadResourceScript RT.java 363]
> 
>   [clojure.lang.RT load RT.java 453]
> 
>   [clojure.lang.RT load RT.java 419]
> 
>   [clojure.core$load$fn__5436 invoke core.clj 5869]
> 
>   [clojure.core$load invokeStatic core.clj 5868]
> 
>   [clojure.core$load_one invokeStatic core.clj 5669]
> 
>   [clojure.core$load_one invoke core.clj -1]
> 
>   [clojure.core$load_lib$fn__5385 invoke core.clj 5714]
> 
>   [clojure.core$load_lib invokeStatic core.clj 5713]
> 
>   [clojure.core$load_lib doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 142]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$load_libs invokeStatic core.clj 5751]
> 
>   [clojure.core$load_libs doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 137]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$require invokeStatic core.clj 5773]
> 
>   [clojure.core$require doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 512]
> 
>   [cloud_monkey.core$eval14$loading__5328__auto____15 invoke core.clj 1]
> 
>   [cloud_monkey.core$eval14 invokeStatic core.clj 1]
> 
>   [cloud_monkey.core$eval14 invoke core.clj -1]
> 
>   [clojure.lang.Compiler eval Compiler.java 6943]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.RT loadResourceScript RT.java 372]
> 
>   [clojure.lang.RT loadResourceScript RT.java 363]
> 
>   [clojure.lang.RT load RT.java 453]
> 
>   [clojure.lang.RT load RT.java 419]
> 
>   [clojure.core$load$fn__5436 invoke core.clj 5869]
> 
>   [clojure.core$load invokeStatic core.clj 5868]
> 
>   [clojure.core$load_one invokeStatic core.clj 5669]
> 
>   [clojure.core$load_one invoke core.clj -1]
> 
>   [clojure.core$load_lib$fn__5385 invoke core.clj 5714]
> 
>   [clojure.core$load_lib invokeStatic core.clj 5713]
> 
>   [clojure.core$load_lib doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 142]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$load_libs invokeStatic core.clj 5751]
> 
>   [clojure.core$load_libs doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn applyTo RestFn.java 137]
> 
>   [clojure.core$apply invokeStatic core.clj 635]
> 
>   [clojure.core$require invokeStatic core.clj 5773]
> 
>   [clojure.core$require doInvoke core.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 408]
> 
>   [user$eval5 invokeStatic form-init3436449082767268851.clj 1]
> 
>   [user$eval5 invoke form-init3436449082767268851.clj -1]
> 
>   [clojure.lang.Compiler eval Compiler.java 6943]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler eval Compiler.java 6932]
> 
>   [clojure.lang.Compiler load Compiler.java 7390]
> 
>   [clojure.lang.Compiler loadFile Compiler.java 7328]
> 
>   [clojure.main$load_script invokeStatic main.clj 275]
> 
>   [clojure.main$init_opt invokeStatic main.clj 277]
> 
>   [clojure.main$init_opt invoke main.clj -1]
> 
>   [clojure.main$initialize invokeStatic main.clj 308]
> 
>   [clojure.main$null_opt invokeStatic main.clj 342]
> 
>   [clojure.main$null_opt invoke main.clj -1]
> 
>   [clojure.main$main invokeStatic main.clj 421]
> 
>   [clojure.main$main doInvoke main.clj -1]
> 
>   [clojure.lang.RestFn invoke RestFn.java 421]
> 
>   [clojure.lang.Var invoke Var.java 383]
> 
>   [clojure.lang.AFn applyToHelper AFn.java 156]
> 
>   [clojure.lang.Var applyTo Var.java 700]
> 
>   [clojure.main main main.java 37]]}
> 
> 
> On Wednesday, July 29, 2015 at 3:51:18 PM UTC-7, Alex Miller wrote:
> Clojure 1.8.0-alpha3 is now available.
> 
> Try it via
> - Download: https://repo1.maven.org/maven2/org/clojure/clojure/1.8.0-alpha3
> - Leiningen: [org.clojure/clojure "1.8.0-alpha3"]
> 
> Tuples have been disabled after further analysis of performance impacts.
> 
> This alpha has initial support for direct linking which you can enable with 
> -Dclojure.compiler.direct-linking=true
> 
> Direct linking allows functions compiled with direct linking on to make 
> direct static method calls to most other functions, instead of going through 
> the var and the Fn object. This can enable further optimization by the jit, 
> at a cost in dynamism. In particular, directly-linked calls will not see 
> redefinitions.
> 
> In alpha3, clojure.core is compiled with direct linking by default and 
> therefore other namespaces cannot redefine core fns and have those 
> redefinitions seen by core code.
> 
> Functions declared as dynamic will never be linked to directly.
> 
> As with all alphas, this represents ongoing work-in-progress that is subject 
> to change.

-- 
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