diff base/src/java/lang/System.d @ 38:2e09b0e6857a

work on phobosfication
author Frank Benoit <benoit@tionex.de>
date Wed, 25 Mar 2009 11:18:25 +0100
parents 1bf55a6eb092
children 6be48cf9f95c
line wrap: on
line diff
--- a/base/src/java/lang/System.d	Wed Mar 25 08:46:48 2009 +0100
+++ b/base/src/java/lang/System.d	Wed Mar 25 11:18:25 2009 +0100
@@ -80,7 +80,12 @@
         }
     }
 
-    static void arraycopy(T[] src, uint srcPos, T[] dest, uint destPos, uint len)
+    version(D_Version2){
+        mixin("alias const(T) CT;");
+    } else { // D1
+        alias T CT;
+    }
+    static void arraycopy(CT[] src, uint srcPos, T[] dest, uint destPos, uint len)
     {
         if(len == 0) return;
 
@@ -88,19 +93,21 @@
         assert(dest);
         debug{validCheck(src.length - srcPos, dest.length - destPos, len);}
 
-        if(src is dest){
+        // overlapping?
+        if((src.ptr <= dest.ptr && src.ptr + len > dest.ptr)
+         ||(src.ptr >= dest.ptr && src.ptr < dest.ptr + len)){
             if( destPos < srcPos ){
                 for(int i=0; i<len; ++i){
-                    dest[destPos+i] = src[srcPos+i];
+                    dest[destPos+i] = cast(T)src[srcPos+i];
                 }
             }
             else{
                 for(int i=len-1; i>=0; --i){
-                    dest[destPos+i] = src[srcPos+i];
+                    dest[destPos+i] = cast(T)src[srcPos+i];
                 }
             }
         }else{
-            dest[destPos..(len+destPos)] = src[srcPos..(len+srcPos)];
+            dest[destPos..(len+destPos)] = cast(T[])src[srcPos..(len+srcPos)];
         }
     }
 }