summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorSzabolcs Berecz <szabolcs.berecz@gmail.com>2012-01-29 01:24:28 +0100
committerSzabolcs Berecz <szabolcs.berecz@gmail.com>2012-02-16 21:36:58 +0100
commit01ee3de96dcae707fb8fee28e93af0515519c603 (patch)
treee4dcd0e7ba8ab1036abd92dbfaecc2cb9fa14175 /test
parentb8b19b1ca1de01083cf0975226a34424bd729a5b (diff)
downloadscala-01ee3de96dcae707fb8fee28e93af0515519c603.tar.gz
scala-01ee3de96dcae707fb8fee28e93af0515519c603.tar.bz2
scala-01ee3de96dcae707fb8fee28e93af0515519c603.zip
replace methods containing a synchronized body with synchronized methods
The following: def f = synchronized { ... } will be rewritten to: <synchronized> def f = ... which is then emitted to the classfile with the synchronized flag set. Inlining of such transformed methods are disabled for now This transformation is not done on methods defined in a trait.
Diffstat (limited to 'test')
-rw-r--r--test/files/run/tailcalls.check1
-rw-r--r--test/files/run/tailcalls.scala13
2 files changed, 10 insertions, 4 deletions
diff --git a/test/files/run/tailcalls.check b/test/files/run/tailcalls.check
index 7670962db2..e3a70f46ae 100644
--- a/test/files/run/tailcalls.check
+++ b/test/files/run/tailcalls.check
@@ -43,6 +43,7 @@ test TailCall.g1 was successful
test TailCall.g2 was successful
test TailCall.g3 was successful
test TailCall.h1 was successful
+test TailCall.s1 was successful
test NonTailCall.f1 0 1 2 was successful
test NonTailCall.f2 was successful
diff --git a/test/files/run/tailcalls.scala b/test/files/run/tailcalls.scala
index 04a1a8ba19..4cf6dd46d3 100644
--- a/test/files/run/tailcalls.scala
+++ b/test/files/run/tailcalls.scala
@@ -182,6 +182,8 @@ class TailCall[S](s: S) {
def h1(n: Int, v: Int): Int = hP(n, v);
private def hP(n: Int, v: Int): Int = if (n == 0) v else hP(n - 1, v - 1);
+ final def s1(n: Int, v: Int): Int = synchronized { if (n == 0) v else s1(n - 1, v - 1) }
+
// !!! test return in non-tail-call position
// !!! test non-same-instance calls
// !!! test non-same-type calls
@@ -229,11 +231,13 @@ class NonTailCall {
Console.print(" " + n)
}
- final def f2(n: Int): Int = synchronized {
- if (n == 0) 0
- else f2(n - 1)
+ final def f2(n: Int): Int = {
+ val next = n - 1
+ synchronized {
+ if (n == 0) 0
+ else f2(next)
+ }
}
-
}
//############################################################################
@@ -366,6 +370,7 @@ object Test {
check_success("TailCall.g2", TailCall.g2(max, max ), 0)
check_success("TailCall.g3", TailCall.g3(max, max, Nil), 0)
check_success("TailCall.h1", TailCall.h1(max, max ), 0)
+ check_success("TailCall.s1", TailCall.s1(max, max ), 0)
println
val NonTailCall = new NonTailCall