summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-12-05 16:39:36 +0000
committerpaltherr <paltherr@epfl.ch>2003-12-05 16:39:36 +0000
commit00915ce95499f6796f066377a511a2d25c6fd79e (patch)
treeb0e2b2806bd26cb53003e632b6a945324f25f385
parent336268483f9eccc29858aa9fba11b60f48f1ec53 (diff)
downloadscala-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(...))
-rw-r--r--sources/scalac/transformer/Erasure.java21
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});
}