The type-hint on init-state is wrong.
It has to be either
(defn {:tag 'longs} init-state [] (long-array 1))
or (preferred)
(defn init-state ^longs [] (long-array 1))
shlomi...@gmail.com writes:
> I tried playing around with the new primitive type hints and got the
> following weird behavior on [org.clojure/clojure "1.7.0-beta2"]:
>
> (defn ^longs init-state [] (long-array 1))
>
> (defn ^long store-state [^longs c ^long a] (aset c 0 a))
>
> running the following line resulted in an exception:
>
> (let [x (init-state)]
> (store-state x 5))
>
> 1. Caused by java.lang.VerifyError
> (class: clojure_7/core$eval13270, method: invoke signature:
> ()Ljava/lang/Object;) Unable to pop operand off an empty stack
>
> Class.java: -2
> java.lang.Class/getDeclaredConstructors0
> Class.java: 2671
> java.lang.Class/privateGetDeclaredConstructors
> Class.java: 3075 java.lang.Class/getConstructor0
> Class.java: 412 java.lang.Class/newInstance
> Compiler.java: 4843 clojure.lang.Compiler$ObjExpr/eval
> Compiler.java: 6791 clojure.lang.Compiler/eval
> Compiler.java: 7237 clojure.lang.Compiler/load
> REPL: 1 reverse-index.main/eval13258
> Compiler.java: 6792 clojure.lang.Compiler/eval
> Compiler.java: 6755 clojure.lang.Compiler/eval
> core.clj: 3079 clojure.core/eval
> main.clj: 240 clojure.main/repl/read-eval-print/fn
> main.clj: 240 clojure.main/repl/read-eval-print
> main.clj: 258 clojure.main/repl/fn
> main.clj: 258 clojure.main/repl
> RestFn.java: 1523 clojure.lang.RestFn/invoke
> interruptible_eval.clj: 58
> clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn
> AFn.java: 152 clojure.lang.AFn/applyToHelper
> AFn.java: 144 clojure.lang.AFn/applyTo
> core.clj: 628 clojure.core/apply
> core.clj: 1866 clojure.core/with-bindings*
> RestFn.java: 425 clojure.lang.RestFn/invoke
> interruptible_eval.clj: 56
> clojure.tools.nrepl.middleware.interruptible-eval/evaluate
> interruptible_eval.clj: 188
> clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
> interruptible_eval.clj: 157
> clojure.tools.nrepl.middleware.interruptible-eval/run-next/fn
> AFn.java: 22 clojure.lang.AFn/run
> ThreadPoolExecutor.java: 1142
> java.util.concurrent.ThreadPoolExecutor/runWorker
> ThreadPoolExecutor.java: 617
> java.util.concurrent.ThreadPoolExecutor$Worker/run
> Thread.java: 745 java.lang.Thread/run
>
> while the following line worked just fine:
>
> (store-state (init-state) 5)
>
> and also this works fine:
>
> (def a (init-state))
> (store-state a 5)
>
> (aget a 0) ;; 5
>
> What do you think?
--