Hi, It looks like, because of the recur, the compiler fails to notice that if returns a primitive. As far as I understand in Compiler.java, RecurExpr does not implement MaybePrimitiveExpr and thus causes on canEmitPrimitive the surrounding IfExpr to return false.
Someone to confirm this analysis? On Tue, Nov 20, 2012 at 4:34 PM, Gunnar Völkel < gunnar.voel...@googlemail.com> wrote: > I have written a primitive function for exponentiation with integers as > power using the multiply-and-square algorithm. > For performance reasons I used primitive type hints for the arguments and > the return value. > Profiling the whole application I noticed that there are a lot of > java.lang.Double/valueOf calls. > Looking at the bytecode I see that in Clojure 1.3 as well as in Clojure > 1.4 the result value gets boxed and unboxed like > Double.valueOf(result).doubleValue(). > > Am I doing something wrong? Is there a serious bug related to the support > of primitive functions? > > The source code: > > (defn first-bit? > {:inline (fn [n] `(== 1 (clojure.lang.Numbers/and ~n, 1)) )} > [^long n] > (== 1 (clojure.lang.Numbers/and n, 1))) > > (defn exp-int > ^double [^double x, ^long c] > (loop [result 1.0, factor x, c c] > (if (> c 0) > (recur > (if (first-bit? c) > (* result factor) > result), > (* factor factor), > (bit-shift-right c 1)) > result))) > > Last lines of the Java bytecode of `exp-int`: > 59 dload 5; /* result */ > 61 invokestatic 40; /* java.lang.Double > java.lang.Double.valueOf(double c) */ > 64 checkcast 85; /* java.lang.Number */ > 67 invokevirtual 89; /* double doubleValue() */ > 70 dreturn; > > -- > 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 -- Professional: http://cgrand.net/ (fr) On Clojure: http://clj-me.cgrand.net/ (en) -- 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