diff gen/arrays.c @ 22:a6360e68134a trunk

[svn r26] * Fixed templates defining a constant value * Fixed problem with slice-slice copy assignment if a side was a temporary slice
author lindquist
date Thu, 04 Oct 2007 07:35:02 +0200
parents 8d45266bbabe
children 4648206ca213
line wrap: on
line diff
--- a/gen/arrays.c	Thu Oct 04 07:01:15 2007 +0200
+++ b/gen/arrays.c	Thu Oct 04 07:35:02 2007 +0200
@@ -308,7 +308,21 @@
     assert(e->mem);
     const llvm::Type* t = e->mem->getType()->getContainedType(0);
     llvm::Value* ret = 0;
-    if (llvm::isa<llvm::ArrayType>(t)) {
+    if (e->arg != 0) {
+        // this means it's a real slice
+        ret = e->mem;
+
+        size_t elembsz = gTargetData->getTypeSize(ret->getType());
+        llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false);
+
+        if (llvm::isa<llvm::ConstantInt>(e->arg)) {
+            sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast<llvm::Constant>(e->arg));
+        }
+        else {
+            sz = llvm::BinaryOperator::createMul(elemsz,e->arg,"tmp",gIR->scopebb());
+        }
+    }
+    else if (llvm::isa<llvm::ArrayType>(t)) {
         ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb());
 
         size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0));