summaryrefslogtreecommitdiff
path: root/test/files/run/tailcalls.scala
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2007-10-11 14:39:17 +0000
committerIulian Dragos <jaguarul@gmail.com>2007-10-11 14:39:17 +0000
commite2565c03562743d04f2f2c3557f5342ea5b76fbe (patch)
tree1b11f0d5cce63b1b7a36dd644051d0db486f2974 /test/files/run/tailcalls.scala
parentab477e33c3d389a34361e9474848da3d1e57a9fe (diff)
downloadscala-e2565c03562743d04f2f2c3557f5342ea5b76fbe.tar.gz
scala-e2565c03562743d04f2f2c3557f5342ea5b76fbe.tar.bz2
scala-e2565c03562743d04f2f2c3557f5342ea5b76fbe.zip
- Improved tail call elimination to handle call...
- Improved tail call elimination to handle calls on a different instance. - Improved tail calls by skipping trivial arguments (when the argument to the call is the parameter itself) - added preliminary support for incremental DFA.
Diffstat (limited to 'test/files/run/tailcalls.scala')
-rw-r--r--test/files/run/tailcalls.scala12
1 files changed, 12 insertions, 0 deletions
diff --git a/test/files/run/tailcalls.scala b/test/files/run/tailcalls.scala
index 1bd698a832..0e158ac39f 100644
--- a/test/files/run/tailcalls.scala
+++ b/test/files/run/tailcalls.scala
@@ -194,6 +194,11 @@ class TailCall[S](s: S) {
}
+object FancyTailCalls {
+ val f1 = new FancyTailCalls
+ val f2 = new FancyTailCalls
+}
+
class FancyTailCalls {
def tcTryLocal(x: Int, v: Int): Int = {
@@ -214,6 +219,12 @@ class FancyTailCalls {
tcTryCatch(x - 1, v)
}
+ import FancyTailCalls._
+ final def differentInstance(n: Int, v: Int): Int = {
+ if (n == 0) v
+ else if ((n % 2) == 0) f1.differentInstance(n - 1, v)
+ else f2.differentInstance(n - 1, v)
+ }
}
class NonTailCall {
@@ -374,6 +385,7 @@ object Test {
val FancyTailCalls = new FancyTailCalls;
check_success("FancyTailCalls.tcTryLocal", FancyTailCalls.tcTryLocal(max, max), max)
check_success("FancyTailCalls.tcTryCatch", FancyTailCalls.tcTryCatch(max, max), max)
+ check_success("FancyTailCalls.differentInstance", FancyTailCalls.differentInstance(max, 42), 42)
}
}