summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cunei <antonio.cunei@epfl.ch>2008-09-27 10:47:46 +0000
committerAntonio Cunei <antonio.cunei@epfl.ch>2008-09-27 10:47:46 +0000
commite20362771cc395d6894658de101881b7ae6295b4 (patch)
tree528784afd94960a818fd2b0cb05f4f33709d223f
parent4678821611e07f7e443b03448e170473978ed93e (diff)
downloadscala-e20362771cc395d6894658de101881b7ae6295b4.tar.gz
scala-e20362771cc395d6894658de101881b7ae6295b4.tar.bz2
scala-e20362771cc395d6894658de101881b7ae6295b4.zip
Fix for ticket #1301
-rw-r--r--src/library/scala/Array.scala38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/library/scala/Array.scala b/src/library/scala/Array.scala
index 05335ddfd2..cd44e42a6c 100644
--- a/src/library/scala/Array.scala
+++ b/src/library/scala/Array.scala
@@ -41,8 +41,42 @@ object Array {
dest match {
case xs: runtime.BoxedArray =>
xs.copyFrom(src, srcPos, destPos, length)
- case _ =>
- arraycopy(src, srcPos, dest, destPos, length)
+ case _ => {
+ def fillDest[T](da:Array[T],sa:Int=>T) = {
+ var d=destPos
+ for (s <- srcPos to srcPos+length-1) {
+ da(d)=sa(s); d=d+1
+ }
+ }
+ if (dest.isInstanceOf[Array[Any]]) {
+ def fill(sa:Int=>Any)=fillDest(dest.asInstanceOf[Array[Any]],sa)
+ src match {
+ case sa:Array[Int] => fill(s=>Int.box(sa(s)))
+ case sa:Array[Long] => fill(s=>Long.box(sa(s)))
+ case sa:Array[Char] => fill(s=>Char.box(sa(s)))
+ case sa:Array[Boolean] => fill(s=>Boolean.box(sa(s)))
+ case sa:Array[Byte] => fill(s=>Byte.box(sa(s)))
+ case sa:Array[Short] => fill(s=>Short.box(sa(s)))
+ case sa:Array[Double] => fill(s=>Double.box(sa(s)))
+ case sa:Array[Float] => fill(s=>Float.box(sa(s)))
+ case _ => arraycopy(src, srcPos, dest, destPos, length)
+ }
+ } else if (dest.isInstanceOf[Array[AnyVal]]) {
+ def fill(sa:Int=>AnyVal)=fillDest(dest.asInstanceOf[Array[AnyVal]],sa)
+ src match {
+ case sa:Array[Int] => fill(sa(_))
+ case sa:Array[Long] => fill(sa(_))
+ case sa:Array[Char] => fill(sa(_))
+ case sa:Array[Boolean] => fill(sa(_))
+ case sa:Array[Byte] => fill(sa(_))
+ case sa:Array[Short] => fill(sa(_))
+ case sa:Array[Double] => fill(sa(_))
+ case sa:Array[Float] => fill(sa(_))
+ case _ => arraycopy(src, srcPos, dest, destPos, length)
+ }
+ } else
+ arraycopy(src, srcPos, dest, destPos, length)
+ }
}
}
}