summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2005-05-25 16:28:05 +0000
committerburaq <buraq@epfl.ch>2005-05-25 16:28:05 +0000
commit2ab6994175646d212f9254bac51b87527f3150a3 (patch)
tree5c3069b2a556aa5666895cf0a426ec99f77fad5c
parent11f1938e73b7748e3d8ef1a532096d2a3a81c4dc (diff)
downloadscala-2ab6994175646d212f9254bac51b87527f3150a3.tar.gz
scala-2ab6994175646d212f9254bac51b87527f3150a3.tar.bz2
scala-2ab6994175646d212f9254bac51b87527f3150a3.zip
bugfix of #423
-rw-r--r--sources/scala/tools/scalac/transformer/UnCurry.scala26
-rw-r--r--sources/scalac/transformer/LambdaLift.java6
2 files changed, 20 insertions, 12 deletions
diff --git a/sources/scala/tools/scalac/transformer/UnCurry.scala b/sources/scala/tools/scalac/transformer/UnCurry.scala
index d5e999f81b..0205e3e0b4 100644
--- a/sources/scala/tools/scalac/transformer/UnCurry.scala
+++ b/sources/scala/tools/scalac/transformer/UnCurry.scala
@@ -156,17 +156,25 @@ class UnCurry(global: scalac_Global, descr: UnCurryPhase) extends OwnerTransform
// argument to parameterless function e => ( => e)
val ftype: Type = fn.getType();
val fn1: Tree = transform(fn);
- val myInArray: boolean = TreeInfo.methSymbol(fn1) == global.definitions.PREDEF_ARRAY();
- inArray = myInArray;
+ val myInArray: boolean =
+ TreeInfo.methSymbol(fn1) == global.definitions.PREDEF_ARRAY();
+ val old = inArray;
+ inArray = myInArray; // a hack to communicate with toSequence.
val args1 = transformArgs(tree.pos, args, ftype);
- if (myInArray)
- fn1 match {
- case Tree$Apply(TypeApply(Select(fn2, _), targs), _) =>
- return gen.mkBlock(args1(0).pos, fn2, args1(0))
- case _ =>
- assert(false, "dead")
+ inArray = old;
+ if (myInArray) {
+ args1(0).getType().baseType(global.definitions.ARRAY_CLASS).match {
+ case Type.NoType =>
+ copy.Apply(tree,fn, Predef.Array[Tree]{args1(0)});
+ case _ => fn1 match {
+ case Tree$Apply(TypeApply(Select(fn2, _), targs), _) =>
+ return gen.mkBlock(args1(0).pos, fn2, args1(0))
+ case _ =>
+ assert(false, "dead")
+ }
}
- if (TreeInfo.methSymbol(fn1) == global.definitions.ANY_MATCH && !(args1(0).isInstanceOf[Tree.Visitor])) {
+ }
+ if (TreeInfo.methSymbol(fn1) == global.definitions.ANY_MATCH && !(args1(0).isInstanceOf[Tree.Visitor])) {
TreeInfo.methPart(fn1) match {
case Tree$Select(qual, name) =>
assert(name == Names._match);
diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java
index 18af31ac55..3a8456d9f4 100644
--- a/sources/scalac/transformer/LambdaLift.java
+++ b/sources/scalac/transformer/LambdaLift.java
@@ -459,8 +459,8 @@ public class LambdaLift extends OwnerTransformer
Tree fn1 = transform(fn);
switch (fn1) {
case TypeApply(Tree fn2, Tree[] targs):
- if (args.length == 1 && fn2.symbol() == definitions.PREDEF_ARRAY()) {
- throw new ApplicationError("this should not happen");
+ //if (args.length == 1 && fn2.symbol() == definitions.PREDEF_ARRAY()) {
+ // throw new ApplicationError("this should not happen");
/* // this moved to UnCurry
switch (args[0]) {
case Sequence(Tree[] items):
@@ -479,7 +479,7 @@ public class LambdaLift extends OwnerTransformer
}
}
*/
- }
+ //}
fn1 = copy.TypeApply(
fn1, fn2, addFreeArgs(tree.pos, get(free.ftvs, fsym), targs, true));
break;