diff options
author | paltherr <paltherr@epfl.ch> | 2003-12-05 16:39:36 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-12-05 16:39:36 +0000 |
commit | 00915ce95499f6796f066377a511a2d25c6fd79e (patch) | |
tree | b0e2b2806bd26cb53003e632b6a945324f25f385 /sources/scalac | |
parent | 336268483f9eccc29858aa9fba11b60f48f1ec53 (diff) | |
download | scala-00915ce95499f6796f066377a511a2d25c6fd79e.tar.gz scala-00915ce95499f6796f066377a511a2d25c6fd79e.tar.bz2 scala-00915ce95499f6796f066377a511a2d25c6fd79e.zip |
- Added code to remove box(unbox(...)) and unbo...
- Added code to remove box(unbox(...)) and unbox(box(...))
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index 66c7461189..acb14659cb 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -213,7 +213,7 @@ public class Erasure extends GenTransformer implements Modifiers { qualifier = coerce(qualifier, prefix); // Might end up with "box(unbox(...))". That's needed by backend. - if (isUnboxedType(prefix)) qualifier = box(qualifier); + if (isUnboxedType(prefix)) qualifier = box(qualifier, true); return gen.Select(tree.pos, qualifier, symbol); case Ident(_): @@ -343,6 +343,18 @@ public class Erasure extends GenTransformer implements Modifiers { /** Boxes the given tree. */ private Tree box(Tree tree) { + return box(tree, false); + } + + /** Boxes the given tree. */ + private Tree box(Tree tree, boolean force) { + switch (tree) { + case Apply(Tree fun, Tree[] args): + if (primitives.getPrimitive(fun.symbol()) == Primitive.UNBOX) { + assert args.length == 1: tree; + if (!force) return args[0]; + } + } Symbol symbol = primitives.getBoxValueSymbol(tree.getType()); Tree boxtree = gen.mkRef(tree.pos, symbol); return tree.getType().equals(UNBOXED_UNIT) @@ -352,6 +364,13 @@ public class Erasure extends GenTransformer implements Modifiers { /** Unboxes the given tree to the given type. */ private Tree unbox(Tree tree, Type pt) { + switch (tree) { + case Apply(Tree fun, Tree[] args): + if (primitives.getPrimitive(fun.symbol()) == Primitive.BOX) { + assert args.length == 1: tree; + return args[0]; + } + } Symbol symbol = primitives.getUnboxValueSymbol(pt); return gen.mkApply_V(gen.mkRef(tree.pos, symbol), new Tree[]{tree}); } |