Security of Java takes a dangerous turn for the worse, experts say (ars technica)
Security of Java takes a dangerous turn for the worse, experts say (ars technica)
Posted Sep 17, 2013 12:04 UTC (Tue) by HelloWorld (guest, #56129)In reply to: Security of Java takes a dangerous turn for the worse, experts say (ars technica) by eru
Parent article: Security of Java takes a dangerous turn for the worse, experts say (ars technica)
That's the kind of workaround I was referring to, it breaks for non-trivial cases, for example when it's not known at compile time which function implementation a call will end up in.
scala> import scala.annotation.tailrec
import scala.annotation.tailrec
scala> class Test {
| @tailrec def apply { apply }
| }
<console>:9: warning: method apply in class Test does nothing other than call itself recursively
@tailrec def apply { apply }
^
<console>:9: error: could not optimize @tailrec annotated method apply: it is neither private nor final so can be overridden
@tailrec def apply { apply }
^
It fails even for simple mutually recursive definitions:
scala> @tailrec def even(x: Int): Boolean = x == 0 || odd(x - 1); @tailrec def odd(x: Int): Boolean = x != 0 && even(x - 1)
<console>:10: error: @tailrec annotated method contains no recursive calls
@tailrec def even(x: Int): Boolean = x == 0 || odd(x - 1); @tailrec def odd(x: Int): Boolean = x != 0 && even(x - 1)
^
<console>:10: error: @tailrec annotated method contains no recursive calls
@tailrec def even(x: Int): Boolean = x == 0 || odd(x - 1); @tailrec def odd(x: Int): Boolean = x != 0 && even(x - 1)
It's not just about tail *recursion* optimization, it's about general tail *call* optimization. JVM modifications are needed to make this kind of thing work.
