From 253a192ede3e994d6c832c124c7c02fb551d1006 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 9 Jan 2004 14:33:04 +0000 Subject: *** empty log message *** --- test/files/pos/MailBox.scala | 68 ++++++++++++++++++++++++++++++++++++++ test/files/pos/abstract-data.scala | 55 ++++++++++++++++++++++++++++++ test/files/pos/bug245.scala | 18 ++++++++++ 3 files changed, 141 insertions(+) create mode 100644 test/files/pos/MailBox.scala create mode 100644 test/files/pos/abstract-data.scala create mode 100644 test/files/pos/bug245.scala (limited to 'test/files/pos') 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)); + +} -- cgit v1.2.3