diff options
author | xuwei-k <6b656e6a69@gmail.com> | 2016-07-26 18:03:14 +0900 |
---|---|---|
committer | xuwei-k <6b656e6a69@gmail.com> | 2016-10-28 15:51:56 +0900 |
commit | 26c87af9a9e86e13efb0b2eb4b8565a8089acaf5 (patch) | |
tree | f28cf2226a85e8e0b4e8b42eadfd604ec4e9e947 /src/library | |
parent | 4a487ca5d0da7925fcd23772e25cc10d8167a351 (diff) | |
download | scala-26c87af9a9e86e13efb0b2eb4b8565a8089acaf5.tar.gz scala-26c87af9a9e86e13efb0b2eb4b8565a8089acaf5.tar.bz2 scala-26c87af9a9e86e13efb0b2eb4b8565a8089acaf5.zip |
avoid boxing
scala.runtime.Rich{Double, Float} has `isNaN` and these are value class.
Also java.lang.{Double, Float} has `isNaN`.
- https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#isNaN--
- https://docs.oracle.com/javase/8/docs/api/java/lang/Float.html#isNaN--
We can't call `RichDouble#isNaN` because
`implicit def double2Double(x: Double): java.lang.Double`
is higher priority than
`implicit def doubleWrapper(x: Double): RichDouble`
```
$ scala -version
Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL
$ scala -Xprint:jvm -e "1.0.isNaN"
[[syntax trees at end of jvm]] // scalacmd616162202928036892.scala
package <empty> {
object Main extends Object {
def main(args: Array[String]): Unit = {
new <$anon: Object>();
()
};
def <init>(): Main.type = {
Main.super.<init>();
()
}
};
final class anon$1 extends Object {
def <init>(): <$anon: Object> = {
anon$1.super.<init>();
scala.this.Predef.double2Double(1.0).isNaN();
()
}
}
}
```
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/concurrent/duration/Duration.scala | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/library/scala/concurrent/duration/Duration.scala b/src/library/scala/concurrent/duration/Duration.scala index f69030bd3d..8d77d47b3f 100644 --- a/src/library/scala/concurrent/duration/Duration.scala +++ b/src/library/scala/concurrent/duration/Duration.scala @@ -120,7 +120,7 @@ object Duration { def fromNanos(nanos: Double): Duration = { if (nanos.isInfinite) if (nanos > 0) Inf else MinusInf - else if (nanos.isNaN) + else if (JDouble.isNaN(nanos)) Undefined else if (nanos > Long.MaxValue || nanos < Long.MinValue) throw new IllegalArgumentException("trying to construct too large duration with " + nanos + "ns") @@ -196,11 +196,11 @@ object Duration { } def *(factor: Double): Duration = - if (factor == 0d || factor.isNaN) Undefined + if (factor == 0d || JDouble.isNaN(factor)) Undefined else if (factor < 0d) -this else this def /(divisor: Double): Duration = - if (divisor.isNaN || divisor.isInfinite) Undefined + if (JDouble.isNaN(divisor) || divisor.isInfinite) Undefined else if ((divisor compare 0d) < 0) -this else this def /(divisor: Duration): Double = divisor match { @@ -627,13 +627,13 @@ final class FiniteDuration(val length: Long, val unit: TimeUnit) extends Duratio def *(factor: Double) = if (!factor.isInfinite) fromNanos(toNanos * factor) - else if (factor.isNaN) Undefined + else if (JDouble.isNaN(factor)) Undefined else if ((factor > 0) ^ (this < Zero)) Inf else MinusInf def /(divisor: Double) = if (!divisor.isInfinite) fromNanos(toNanos / divisor) - else if (divisor.isNaN) Undefined + else if (JDouble.isNaN(divisor)) Undefined else Zero // if this is made a constant, then scalac will elide the conditional and always return +0.0, SI-6331 |