diff options
author | Antonio Cunei <antonio.cunei@epfl.ch> | 2008-09-27 10:47:46 +0000 |
---|---|---|
committer | Antonio Cunei <antonio.cunei@epfl.ch> | 2008-09-27 10:47:46 +0000 |
commit | e20362771cc395d6894658de101881b7ae6295b4 (patch) | |
tree | 528784afd94960a818fd2b0cb05f4f33709d223f | |
parent | 4678821611e07f7e443b03448e170473978ed93e (diff) | |
download | scala-e20362771cc395d6894658de101881b7ae6295b4.tar.gz scala-e20362771cc395d6894658de101881b7ae6295b4.tar.bz2 scala-e20362771cc395d6894658de101881b7ae6295b4.zip |
Fix for ticket #1301
-rw-r--r-- | src/library/scala/Array.scala | 38 |
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) + } } } } |