summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/LambdaLift.java
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-08-13 13:00:53 +0000
committerMartin Odersky <odersky@gmail.com>2003-08-13 13:00:53 +0000
commitab3ad145b7ca542eda46b89cd6f9b08175339f6c (patch)
treedaa17a02a12510f6dfbadedf0b597b7bc8838a35 /sources/scalac/transformer/LambdaLift.java
parent5d58eac358485e1031fc44fd9a94bd5fe77f0422 (diff)
downloadscala-ab3ad145b7ca542eda46b89cd6f9b08175339f6c.tar.gz
scala-ab3ad145b7ca542eda46b89cd6f9b08175339f6c.tar.bz2
scala-ab3ad145b7ca542eda46b89cd6f9b08175339f6c.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/transformer/LambdaLift.java')
-rw-r--r--sources/scalac/transformer/LambdaLift.java32
1 files changed, 30 insertions, 2 deletions
diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java
index 9651f928dd..c827d75bb7 100644
--- a/sources/scalac/transformer/LambdaLift.java
+++ b/sources/scalac/transformer/LambdaLift.java
@@ -530,17 +530,45 @@ public class LambdaLift extends OwnerTransformer
if (newtparams.length == 0) return tp;
switch (tp) {
case MethodType(_, _):
- return Type.PolyType(newtparams, tp.subst(oldtparams, newtparams));
+ return Type.PolyType(
+ newtparams,
+ new UpdateSubstSymMap(oldtparams, newtparams).apply(tp));
case PolyType(Symbol[] tparams, Type restpe):
Symbol[] tparams1 = new Symbol[tparams.length + newtparams.length];
System.arraycopy(tparams, 0, tparams1, 0, tparams.length);
System.arraycopy(newtparams, 0, tparams1, tparams.length, newtparams.length);
- return Type.PolyType(tparams1, restpe.subst(oldtparams, newtparams));
+ return Type.PolyType(
+ tparams1,
+ new UpdateSubstSymMap(oldtparams, newtparams).apply(restpe));
default:
throw new ApplicationError("illegal type: " + tp);
}
}
+ /* A substitution map which, instead of cloning parameters, updates
+ * their symbol's types.
+ */
+ static class UpdateSubstSymMap extends Type.SubstSymMap {
+ protected UpdateSubstSymMap(Symbol[] from, Symbol[] to) {
+ super(from, to);
+ }
+ public Type apply(Type t) {
+ switch (t) {
+ case MethodType(Symbol[] params, Type result):
+ for (int i = 0; i < params.length; i++) {
+ Type tp = params[i].type();
+ Type tp1 = apply(tp);
+ if (tp != tp1) params[i].updateInfo(tp1);
+ }
+ Type result1 = apply(result);
+ if (result1 == result) return t;
+ else return Type.MethodType(params, result1);
+ default:
+ return super.apply(t);
+ }
+ }
+ }
+
Type addParams(Type tp, Symbol[] newparams) {
if (newparams.length == 0) return tp;
switch (tp) {