A more reproduceable example: (let [y (float 10)] (println (str y)))
Yields this: float y = RT.uncheckedFloatCast(10L); ((IFn)const__42.getRawRoot()).invoke(((IFn)const__43.getRawRoot()).invoke(Float.valueOf(y))); On Wednesday, February 24, 2016 at 1:15:41 PM UTC-7, Michael du Breuil wrote: > > (let [x (float -199)] > (.draw batch ^TextureRegion @hud-corner-top-left > x > (float -32))) > > That's an interop call to libgdx. That generated the disassembly I pasted > before. > > On Wednesday, February 24, 2016 at 5:05:30 AM UTC-7, Nicola Mometto wrote: >> >> >> > On 24 Feb 2016, at 11:58, Michael du Breuil <wicked.she...@gmail.com> >> wrote: >> > >> > That just performs a runtime cast to a variable then reference the >> variable later, which is even worse. >> > >> > float x = RT.uncheckedFloatCast(-199L);((SpriteBatch)batch) >> > >> .draw((TextureRegion)((IFn)const__5.getRawRoot()).invoke(const__42.getRawRoot()), >> >> x, >> > >> > RT.uncheckedFloatCast(-32L)); >> > >> >> >> No it doesn't. >> >> having >> >> (ns test) >> >> (definterface Foo >> (x [^float y])) >> >> (let [a (float 1)] >> (defn y [b] >> (.x ^Foo b a))) >> >> This is the disassemble of y's invoke method: >> >> public java.lang.Object invoke(java.lang.Object); >> Code: >> 0: aload_1 >> 1: aconst_null >> 2: astore_1 >> 3: checkcast #18 // class test/Foo >> 6: aload_0 >> 7: getfield #14 // Field a:F >> 10: invokeinterface #22, 2 // InterfaceMethod >> test/Foo.x:(F)Ljava/lang/Object; >> 15: areturn >> >> No float cast involved there. The primitive float is closed over and used >> directly. >> >> > I definitely expected the compiler to pay attention to it, although I >> also discovered at the same time that the compilier doesn't actually >> resolve expressions like (+ (* 2 4) 1) to just be 9 at compile time either, >> even though all the values were constants. Both of these are a problem >> because they are inside the hot loop of the program. (There are some >> constant math expressions that are only expressions as it is easier to >> read/change ^:const named things then to just put one resultant number. >> > >> > Is it worth opening a Jira issue for resolving either or both of these >> at compile time? I looked a briefly at the definition for (float ) but I'm >> not at all familiar with how the byte code is generated and how to actually >> replace that with what I'm looking for. >> >> Sure, although I don't think doing this kind of constant folding this is >> going to be a priority. >> >> > >> > On Wednesday, February 24, 2016 at 3:58:46 AM UTC-7, Nicola Mometto >> wrote: >> > Those are runtime casts, this is the expected behaviour (although one >> could argue that clojure should be able to optimize them away at compile >> time). >> > >> > If you want to avoid the runtime casting, you can do something like >> this: >> > >> > (let [x (float 123)] >> > (defn y [..] >> > (.foo bar x))) >> > >> > >> > > On 24 Feb 2016, at 10:53, Michael du Breuil <wicked.she...@gmail.com> >> wrote: >> > > >> > > The following (this is interop with libgdx if anyone is curious, >> hud-corner-top-left is a delayed TextureRegion >> > > >> > > (.draw batch ^TextureRegion @hud-corner-top-left >> > > (float -199) >> > > (float -32)) >> > > >> > > Which yields the following: >> > > >> .draw((TextureRegion)((IFn)const__5.getRawRoot()).invoke(const__41.getRawRoot()), >> >> >> > > RT.uncheckedFloatCast(-199L), >> > > RT.uncheckedFloatCast(-32L));null;((SpriteBatch)batch) >> > > >> > > Unless I'm missing something on how to interpret bytecode :) I can >> post more source if you want but that is one interop call and its generated >> code, the rest will look the same. >> > > >> > > On Wednesday, February 24, 2016 at 3:44:11 AM UTC-7, Nicola Mometto >> wrote: >> > > Can you post the code? >> > > >> > > > On 24 Feb 2016, at 10:26, Michael du Breuil < >> wicked.she...@gmail.com> wrote: >> > > > >> > > > I have some interop code that I have carefully specified all the >> arguments to be in the correct type (IE the function signature takes 3 >> floats, so I cast everything to float so that I can avoid reflection). What >> I'm surprised by is compile time constants such as (float -173) or (float >> 8.5) are not saved as the correct primitive type, using jd-gui I see that >> these were actually turned into RT.uncheckedFloatCast(-173L), and >> RT.uncheckedFloatCast(8.5D), respectively. Why isn't this just saved as a >> the correct primitive directly in the generated bytecode? This is with >> clojure 1.8.0 >> > > > >> > > > -- >> > > > You received this message because you are subscribed to the Google >> > > > Groups "Clojure" group. >> > > > To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com. >> > > > For more options, visit 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 clo...@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+u...@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+u...@googlegroups.com. >> > > For more options, visit 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 clo...@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+u...@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+u...@googlegroups.com. >> > For more options, visit 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.