diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2010-09-01 13:10:40 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2010-09-01 13:10:40 +0000 |
commit | ebe4fe96bac6c27bd7dbc28c95465ff9a2acb0f9 (patch) | |
tree | 0eef5ecb7291f6d1653d35a01ad8a10443de6249 /src | |
parent | 961741d5f5895fb08801cb07f4834dcf480f185f (diff) | |
download | scala-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.scala | 9 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala | 14 |
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 |