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 | |
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
-rw-r--r-- | sources/scalac/backend/jvm/GenJVM.java | 16 | ||||
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 17 |
2 files changed, 27 insertions, 6 deletions
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java index 5779cbb80c..2bd62a05ea 100644 --- a/sources/scalac/backend/jvm/GenJVM.java +++ b/sources/scalac/backend/jvm/GenJVM.java @@ -632,7 +632,9 @@ class GenJVM { case ZARRAY_SET : case BARRAY_SET : case SARRAY_SET : case CARRAY_SET : case IARRAY_SET : case LARRAY_SET : case FARRAY_SET : case DARRAY_SET : case OARRAY_SET : - case LENGTH : + case ZARRAY_LENGTH : case BARRAY_LENGTH : case SARRAY_LENGTH : + case CARRAY_LENGTH : case IARRAY_LENGTH : case LARRAY_LENGTH : + case FARRAY_LENGTH : case DARRAY_LENGTH : case OARRAY_LENGTH : case IS : case AS : case CONCAT : case THROW : @@ -650,7 +652,7 @@ class GenJVM { case HASHCODE : case TOSTRING : case BOX : - case APPLY : case UPDATE : + case APPLY : case UPDATE : case LENGTH : return false; default: throw Debug.abort("unknown primitive", sym); @@ -695,11 +697,13 @@ class GenJVM { case ZARRAY_GET : case BARRAY_GET : case SARRAY_GET : case CARRAY_GET : case IARRAY_GET : case LARRAY_GET : case FARRAY_GET : case DARRAY_GET : case OARRAY_GET : - assert args.length == 3; + assert args.length == 3 : "get - " + args.length; return genArrayAccess(args[1], args[2]); - case LENGTH: - assert args.length == 1; - return genArrayLength(args[0]); + case ZARRAY_LENGTH : case BARRAY_LENGTH : case SARRAY_LENGTH : + case CARRAY_LENGTH : case IARRAY_LENGTH : case LARRAY_LENGTH : + case FARRAY_LENGTH : case DARRAY_LENGTH : case OARRAY_LENGTH : + assert args.length == 2 : args.length; + return genArrayLength(args[1]); case AS_UVALUE : assert args.length == 1; gen(args[0], cst.T_VOID); 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) { |