summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java16
-rw-r--r--sources/scalac/transformer/Erasure.java17
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) {