From ebe4fe96bac6c27bd7dbc28c95465ff9a2acb0f9 Mon Sep 17 00:00:00 2001 From: Iulian Dragos Date: Wed, 1 Sep 2010 13:10:40 +0000 Subject: 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. ........ --- src/compiler/scala/tools/nsc/transform/Erasure.scala | 9 ++++++++- .../scala/tools/nsc/transform/SpecializeTypes.scala | 14 +++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) (limited to 'src') 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 -- cgit v1.2.3