-
Bug
-
Resolution: Done
-
Major
-
None
-
7.9.0.Final
-
2018 Week 30-32
-
-
NEW
-
NEW
When MVEL evaluates
java.math.BigDecimal.valueOf(100)
, MVEL determines a method from valueOf(double val) or valueOf(long val).
The result is not consistent. Sometimes uses valueOf(double val), Sometimes uses valueOf(long val).
ParseTools.getMethodScore() gives the same score for double and long.
https://github.com/mvel/mvel/blob/master/src/main/java/org/mvel2/util/ParseTools.java#L312-L367
So a selected method will depend on the order of result of "cls.getMethods()".
Reproducer:
$ unzip BigDecimalMvelTest.zip
$ cd BigDecimalMvelTest
$ mvn compile
$ ./loop.sh
It runs the MVEL test 100 times:
$ ./loop.sh result = 100.0 result = 100.0 result = 100.0 result = 100 result = 100.0 result = 100.0 ...
In my environment, "100.0" is the majority but randomly see "100" as well. (I couldn't reproduce with single run with java for loop)
Expectation is constantly "100" (using valueOf(long val)) because in case of usual Java "java.math.BigDecimal.valueOf(100)", Java compiler chooses valueOf(long val) if the parameter is int. (considering "direct supertype" https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10)
- is incorporated by
-
RHDM-699 MVEL uses random parameter type methods for BigDecimal.valueOf(100)
- Closed