summaryrefslogtreecommitdiff
path: root/test/files/pos
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-01-09 14:33:04 +0000
committerMartin Odersky <odersky@gmail.com>2004-01-09 14:33:04 +0000
commit253a192ede3e994d6c832c124c7c02fb551d1006 (patch)
treec3fc90ddde9960bb4271ca758c58f92754dcc37b /test/files/pos
parent57bf1138b8fdaafc9c4ea1e883aba222ec8117cc (diff)
downloadscala-253a192ede3e994d6c832c124c7c02fb551d1006.tar.gz
scala-253a192ede3e994d6c832c124c7c02fb551d1006.tar.bz2
scala-253a192ede3e994d6c832c124c7c02fb551d1006.zip
*** empty log message ***
Diffstat (limited to 'test/files/pos')
-rw-r--r--test/files/pos/MailBox.scala68
-rw-r--r--test/files/pos/abstract-data.scala55
-rw-r--r--test/files/pos/bug245.scala18
3 files changed, 141 insertions, 0 deletions
diff --git a/test/files/pos/MailBox.scala b/test/files/pos/MailBox.scala
new file mode 100644
index 0000000000..c44da9fdfa
--- /dev/null
+++ b/test/files/pos/MailBox.scala
@@ -0,0 +1,68 @@
+package test;
+
+import scala.concurrent._;
+
+class MailBox with Monitor {
+ private abstract class Receiver {
+ def isDefined(msg: Any): boolean;
+ var msg: Any = null;
+ }
+
+ private val sent = new LinkedList[Any];
+ private var lastSent = sent;
+ private val receivers = new LinkedList[Receiver];
+ private var lastReceiver = receivers;
+
+ def send(msg: Any): unit = synchronized {
+ var r = receivers, r1 = r.next;
+ while (r1 != null && !r1.elem.isDefined(msg)) {
+ r = r1; r1 = r1.next;
+ }
+ if (r1 != null) {
+ r.next = r1.next; r1.elem.msg = msg; r1.elem.notify;
+ } else {
+ lastSent = lastSent.insert(msg);
+ }
+ }
+
+ def receive[a](f: PartialFunction[Any, a]): a = {
+ val msg: Any = synchronized {
+ var s = sent, s1 = s.next;
+ while (s1 != null && !f.isDefinedAt(s1.elem)) {
+ s = s1; s1 = s1.next
+ }
+ if (s1 != null) {
+ s.next = s1.next; s1.elem
+ } else {
+ val r = lastReceiver.insert(new Receiver {
+ def isDefined(msg: Any) = f.isDefinedAt(msg);
+ });
+ lastReceiver = r;
+ r.elem.wait();
+ r.elem.msg
+ }
+ }
+ f(msg)
+ }
+
+ def receiveWithin[a](msec: long)(f: PartialFunction[Any, a]): a = {
+ val msg: Any = synchronized {
+ var s = sent, s1 = s.next;
+ while (s1 != null && !f.isDefinedAt(s1.elem)) {
+ s = s1; s1 = s1.next ;
+ }
+ if (s1 != null) {
+ s.next = s1.next; s1.elem
+ } else {
+ val r = lastReceiver.insert(new Receiver {
+ def isDefined(msg: Any) = f.isDefinedAt(msg);
+ });
+ lastReceiver = r;
+ r.elem.wait(msec);
+ if (r.elem.msg == null) r.elem.msg = TIMEOUT;
+ r.elem.msg
+ }
+ }
+ f(msg)
+ }
+}
diff --git a/test/files/pos/abstract-data.scala b/test/files/pos/abstract-data.scala
new file mode 100644
index 0000000000..f3d4a966bb
--- /dev/null
+++ b/test/files/pos/abstract-data.scala
@@ -0,0 +1,55 @@
+package expAbstractData;
+
+/** A base class consisting of
+ * - a root trait (i.e. abstract class) `Exp' with an `eval' function
+ * - an abstract type `exp' bounded by `Exp'
+ * - a concrete instance class `Num' of `Exp' for numeric literals
+ */
+trait Base {
+ type exp <: Exp;
+
+ trait Exp {
+ def eval: int
+ }
+ class Num(v: int): exp extends Exp {
+ val value = v;
+ def eval = value
+ }
+}
+
+object testBase extends Base with Executable {
+ type exp = Exp;
+ val term = new Num(2);
+ System.out.println(term.eval);
+}
+
+/** Data extension: An extension of `Base' with `Plus' expressions
+ */
+trait BasePlus extends Base {
+ class Plus(l: exp, r: exp): exp extends Exp {
+ val left = l;
+ val right = r;
+ def eval = left.eval + right.eval
+ }
+}
+
+/** Operation extension: An extension of `Base' with 'show' methods.
+ */
+trait Show extends Base {
+ type exp <: Exp1;
+
+ trait Exp1 extends Exp {
+ def show: String;
+ }
+ class Num1(v: int): exp extends Num(v) with Exp1 {
+ def show = value.toString();
+ }
+}
+
+/** Operation extension: An extension of `BasePlus' with 'show' methods.
+ */
+trait ShowPlus extends BasePlus with Show {
+ class Plus1(l: exp, r: exp): exp extends Plus(l, r) with Exp1 {
+ def show = left.show + " + " + right.show
+ }
+} \ No newline at end of file
diff --git a/test/files/pos/bug245.scala b/test/files/pos/bug245.scala
new file mode 100644
index 0000000000..3e5dee820b
--- /dev/null
+++ b/test/files/pos/bug245.scala
@@ -0,0 +1,18 @@
+class Value {
+ def coerce: Int = 0;
+}
+
+object Test {
+
+ def foo(i: Int): Int = 0;
+
+ def fun0 : Value = null;
+ def fun0(i: Int ): Value = null;
+
+ def fun1(i: Int ): Value = null;
+ def fun1(l: Long): Value = null;
+
+ foo(fun0 );
+ foo(fun1(new Value));
+
+}