diff gen/runtime.cpp @ 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 329e45865d84
children 551b01341728
line wrap: on
line diff
--- a/gen/runtime.cpp	Sun May 10 00:50:35 2009 +0200
+++ b/gen/runtime.cpp	Sun May 10 02:23:05 2009 +0200
@@ -402,8 +402,12 @@
 
     // array init mem
     // void _d_array_init_mem(void* a, size_t na, void* v, size_t nv)
+    // +
+    // array slice copy when assertions are on!
+    // void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen)
     {
         std::string fname("_d_array_init_mem");
+        std::string fname2("_d_array_slice_copy");
         std::vector<const LLType*> types;
         types.push_back(voidPtrTy);
         types.push_back(sizeTy);
@@ -412,6 +416,8 @@
         const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false);
         llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M)
             ->setAttributes(Attr_1_3_NoCapture);
+        llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M)
+            ->setAttributes(Attr_1_3_NoCapture);
     }
 
     /////////////////////////////////////////////////////////////////////////////////////