diff options
author | paltherr <paltherr@epfl.ch> | 2003-03-28 16:08:26 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-03-28 16:08:26 +0000 |
commit | 277c7242d07959aeb607dfcb19f615bfd2da123b (patch) | |
tree | c148e52ab07165f8abcfb2251104ed8815342808 /sources/scalac/transformer | |
parent | 5ee5a01aadb13ce19eb2aa96354bf1fb13340808 (diff) | |
download | scala-277c7242d07959aeb607dfcb19f615bfd2da123b.tar.gz scala-277c7242d07959aeb607dfcb19f615bfd2da123b.tar.bz2 scala-277c7242d07959aeb607dfcb19f615bfd2da123b.zip |
- Fixed erasure to replace length calls on unbo...
- Fixed erasure to replace length calls on unboxed array by primitive
- calls Fixed GenJVM to optimize length primitives
Diffstat (limited to 'sources/scalac/transformer')
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index a72710f2dc..551eb2380d 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -428,6 +428,7 @@ public class Erasure extends Transformer implements Modifiers { case Select(Tree array, _): if (isUnboxedArray(array.type().erasure())) { switch (primitives.getPrimitive(fun.symbol())) { + case LENGTH: return transformLength(tree); case APPLY: return transformApply(tree); case UPDATE: return transformUpdate(tree); } @@ -555,6 +556,22 @@ public class Erasure extends Transformer implements Modifiers { return coerce(transform(expr), pt); } + /** Transform an array length */ + Tree transformLength(Tree tree) { + switch (tree) { + case Apply(Select(Tree array, _), Tree[] args): + assert args.length == 0 : Debug.show(args); + Type finalType = tree.type().erasure(); + array = transform(array); + Symbol symbol = primitives.getArrayLengthSymbol(array.type()); + Tree method = gen.mkRef(tree.pos,primitives.RUNTIME_TYPE,symbol); + args = new Tree[] { array }; + return coerce(gen.Apply(tree.pos, method, args), finalType); + default: + throw Debug.abort("illegal case", tree); + } + } + /** Transform an array apply */ Tree transformApply(Tree tree) { switch (tree) { |