diff runtime/internal/arrayInit.d @ 1328:c78fd2d30da1

Changed array slice copying to call a runtime function when assertions or array bound checks are enabled instead of just doing a memcpy. This makes sure an exception is thrown if the copy is invalid (ie. different lengths or overlap). Fixes ticket #283 . Rebuilding the runtime is necessary.
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sun, 10 May 2009 02:23:05 +0200
parents 6b2c75bd86dd
children b3ba2c6ff038
line wrap: on
line diff
--- a/runtime/internal/arrayInit.d	Sun May 10 00:50:35 2009 +0200
+++ b/runtime/internal/arrayInit.d	Sun May 10 02:23:05 2009 +0200
@@ -156,3 +156,14 @@
     }
     return (len*elemsz)/newelemsz;
 }
+
+// slice copy when assertions are enabled
+void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen)
+{
+    if (dstlen != srclen)
+        throw new Exception("lengths don't match for array copy");
+    else if (dst+dstlen <= src || src+srclen <= dst)
+        llvm_memcpy(dst, src, dstlen, 0);
+    else
+        throw new Exception("overlapping array copy");
+}