summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-03-28 16:08:26 +0000
committerpaltherr <paltherr@epfl.ch>2003-03-28 16:08:26 +0000
commit277c7242d07959aeb607dfcb19f615bfd2da123b (patch)
treec148e52ab07165f8abcfb2251104ed8815342808 /sources/scalac/transformer
parent5ee5a01aadb13ce19eb2aa96354bf1fb13340808 (diff)
downloadscala-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.java17
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) {