Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
1327:49fd0c8040e6 | 1328:c78fd2d30da1 |
---|---|
154 else if ((len*elemsz) % newelemsz) { | 154 else if ((len*elemsz) % newelemsz) { |
155 throw new Exception("Bad array cast"); | 155 throw new Exception("Bad array cast"); |
156 } | 156 } |
157 return (len*elemsz)/newelemsz; | 157 return (len*elemsz)/newelemsz; |
158 } | 158 } |
159 | |
160 // slice copy when assertions are enabled | |
161 void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen) | |
162 { | |
163 if (dstlen != srclen) | |
164 throw new Exception("lengths don't match for array copy"); | |
165 else if (dst+dstlen <= src || src+srclen <= dst) | |
166 llvm_memcpy(dst, src, dstlen, 0); | |
167 else | |
168 throw new Exception("overlapping array copy"); | |
169 } |