summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-09-01 13:10:40 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-09-01 13:10:40 +0000
commitebe4fe96bac6c27bd7dbc28c95465ff9a2acb0f9 (patch)
tree0eef5ecb7291f6d1653d35a01ad8a10443de6249 /src
parent961741d5f5895fb08801cb07f4834dcf480f185f (diff)
downloadscala-ebe4fe96bac6c27bd7dbc28c95465ff9a2acb0f9.tar.gz
scala-ebe4fe96bac6c27bd7dbc28c95465ff9a2acb0f9.tar.bz2
scala-ebe4fe96bac6c27bd7dbc28c95465ff9a2acb0f9.zip
Merged revisions 22807-22808 via svnmerge from
https://lampsvn.epfl.ch/svn-repos/scala/scala/trunk ........ r22807 | dragos | 2010-08-23 10:51:47 +0200 (Mon, 23 Aug 2010) | 1 line Optimized away box(unbox(E)) ===> E. ........ r22808 | dragos | 2010-08-23 10:51:50 +0200 (Mon, 23 Aug 2010) | 1 line Don't box class parameters when passed to the super constructor, from specialized subclasses. ........
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala9
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala14
2 files changed, 19 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 4c000ce3f7..f33be12bd4 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -464,7 +464,14 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
else BLOCK(tree, REF(BoxedUnit_UNIT))
case x =>
assert(x != ArrayClass)
- (REF(boxMethod(x)) APPLY tree) setPos (tree.pos) setType ObjectClass.tpe
+ tree match {
+ case Apply(boxFun, List(arg)) if (isUnbox(tree.symbol)) =>
+ log("boxing an unbox: " + tree)
+ log("replying with " + arg)
+ arg
+ case _ =>
+ (REF(boxMethod(x)) APPLY tree) setPos (tree.pos) setType ObjectClass.tpe
+ }
})
}
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index d9b60b9ca1..2351c892c0 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -950,8 +950,6 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
satisfiable(env, silent)
}
- /*************************** Term transformation ************************************/
-
class Duplicator extends {
val global: SpecializeTypes.this.global.type = SpecializeTypes.this.global
} with typechecker.Duplicators
@@ -1144,7 +1142,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
if (symbol.isConstructor) {
val t = atOwner(symbol) {
val superRef: Tree = Select(Super(nme.EMPTY.toTypeName, nme.EMPTY.toTypeName), nme.CONSTRUCTOR)
- forwardCall(tree.pos, superRef, vparamss)
+ forwardCtorCall(tree.pos, superRef, vparamss)
}
if (symbol.isPrimaryConstructor) localTyper typed {
atPos(symbol.pos)(treeCopy.DefDef(tree, mods, name, tparams, vparamss, tpt, Block(List(t), Literal(()))))
@@ -1395,6 +1393,16 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
atPos(pos) { (receiver /: argss) (Apply) }
}
+ private def forwardCtorCall(pos: util.Position, receiver: Tree, paramss: List[List[ValDef]]): Tree = {
+ val argss = paramss map (_ map (x =>
+ if (x.name.endsWith("$sp"))
+ gen.mkAsInstanceOf(Literal(Constant(null)), x.symbol.tpe)
+ else
+ Ident(x.symbol))
+ )
+ atPos(pos) { (receiver /: argss) (Apply) }
+ }
+
/** Concrete methods that use a specialized type, or override such methods. */
private val concreteSpecMethods: mutable.Set[Symbol] = new mutable.HashSet