[CLJ-1325] Report warnings if *unchecked-math* and boxing happens Created: 16/Jan/14 Updated: 29/Aug/14 Resolved: 29/Aug/14
|Affects Version/s:||Release 1.6|
|Fix Version/s:||Release 1.7|
|Reporter:||Alex Miller||Assignee:||Alex Miller|
|Attachments:||boxed.diff boxedmath.txt clj-1325.patch clj-1325-v2.patch clj-1325-v3.patch|
|Patch:||Code and Test|
Currently, it is difficult to tell that the compiler is using boxed math unless you look at the generated bytecode. The proposed enhancement here is to emit new warnings if *unchecked-math* is on and boxed math is occurring.
Approach: In the compiler, when compiling a StaticMethodExpr, if *unchecked-math* is true and the class is clojure.lang.Numbers and one of the parameters of static method is of type java.lang.Object or java.lang.Number, then emit a warning at compile-time.
In addition, there is a new WarnBoxedMath Java annotation - a small number of methods on Numbers with Object parameters use this annotation to indicate that warning should not take place. The same annotation can be (but is not currently) used to mark methods on Numbers without Object/Number params that should warn. See boxedmath.txt for a list of methods and categories.
|Comment by Alex Miller [ 14/Apr/14 10:56 PM ]|
Moving to 1.7.
|Comment by Alex Miller [ 15/Apr/14 10:17 AM ]|
List of methods in Numbers and whether they should be considered "boxed math" or not, with some questions.
|Comment by Alex Miller [ 14/May/14 2:34 PM ]|
Ready for screening.
|Comment by Alex Miller [ 16/May/14 11:19 AM ]|
clj-1325-v2.patch is identical to last except for a cleaned up the commit message.
|Comment by Alex Miller [ 16/May/14 11:51 AM ]|
Added v3 patch that just reworks block/indentation style to match surrounding code better.
|Comment by Stuart Sierra [ 16/May/14 1:15 PM ]|
1) There is no way to get both overflow checks and boxed-math warnings at the same time. Maybe this doesn't matter.
2) The error messages aren't ideal, because they refer to clojure.lang.Numbers, but we can assume that anyone savvy enough to be using *unboxed-math* will also be savvy enough to know what clojure.lang.Numbers is.
3) This doesn't protect me from autoboxing in arbitrary Java method calls, but normal reflection warnings should catch most real-world cases, since few Java APIs overload on primitive and Object.