Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
1327:49fd0c8040e6 | 1328:c78fd2d30da1 |
---|---|
400 | 400 |
401 #undef ARRAY_INIT | 401 #undef ARRAY_INIT |
402 | 402 |
403 // array init mem | 403 // array init mem |
404 // void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) | 404 // void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) |
405 // + | |
406 // array slice copy when assertions are on! | |
407 // void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen) | |
405 { | 408 { |
406 std::string fname("_d_array_init_mem"); | 409 std::string fname("_d_array_init_mem"); |
407 std::vector<const LLType*> types; | 410 std::string fname2("_d_array_slice_copy"); |
408 types.push_back(voidPtrTy); | 411 std::vector<const LLType*> types; |
409 types.push_back(sizeTy); | 412 types.push_back(voidPtrTy); |
410 types.push_back(voidPtrTy); | 413 types.push_back(sizeTy); |
411 types.push_back(sizeTy); | 414 types.push_back(voidPtrTy); |
412 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); | 415 types.push_back(sizeTy); |
413 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) | 416 const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); |
417 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M) | |
418 ->setAttributes(Attr_1_3_NoCapture); | |
419 llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M) | |
414 ->setAttributes(Attr_1_3_NoCapture); | 420 ->setAttributes(Attr_1_3_NoCapture); |
415 } | 421 } |
416 | 422 |
417 ///////////////////////////////////////////////////////////////////////////////////// | 423 ///////////////////////////////////////////////////////////////////////////////////// |
418 ///////////////////////////////////////////////////////////////////////////////////// | 424 ///////////////////////////////////////////////////////////////////////////////////// |