diff gen/statements.cpp @ 308:6b62e8cdf970 trunk

[svn r329] Cleaned up a bunch of array code for handling special slice cases no longer relevant.
author lindquist
date Sat, 28 Jun 2008 05:57:16 +0200
parents 2b72433d5c8c
children d59c363fccad
line wrap: on
line diff
--- a/gen/statements.cpp	Sat Jun 28 03:45:18 2008 +0200
+++ b/gen/statements.cpp	Sat Jun 28 05:57:16 2008 +0200
@@ -912,45 +912,8 @@
     Type* aggrtype = DtoDType(aggr->type);
 
     // get length and pointer
-    LLValue* val = 0;
-    LLValue* niters = 0;
-
-    // static array
-    if (aggrtype->ty == Tsarray)
-    {
-        Logger::println("foreach over static array");
-        val = aggrval->getRVal();
-        assert(isaPointer(val->getType()));
-        const llvm::ArrayType* arrty = isaArray(val->getType()->getContainedType(0));
-        assert(arrty);
-        size_t nelems = arrty->getNumElements();
-        if(nelems == 0)
-            return;
-        niters = llvm::ConstantInt::get(keytype,nelems,false);
-    }
-    // dynamic array
-    else if (aggrtype->ty == Tarray)
-    {
-        if (DSliceValue* slice = aggrval->isSlice()) {
-            Logger::println("foreach over slice");
-            niters = slice->len;
-            assert(niters);
-            val = slice->ptr;
-            assert(val);
-        }
-        else {
-            Logger::println("foreach over dynamic array");
-            val = aggrval->getRVal();
-            niters = DtoGEPi(val,0,0);
-            niters = DtoLoad(niters, "numiterations");
-            val = DtoGEPi(val,0,1);
-            val = DtoLoad(val, "collection");
-        }
-    }
-    else
-    {
-        assert(0 && "aggregate type is not Tarray or Tsarray");
-    }
+    LLValue* niters = DtoArrayLen(aggrval);
+    LLValue* val = DtoArrayPtr(aggrval);
 
     if (niters->getType() != keytype)
     {
@@ -1001,10 +964,7 @@
     // get value for this iteration
     LLConstant* zero = llvm::ConstantInt::get(keytype,0,false);
     LLValue* loadedKey = p->ir->CreateLoad(keyvar,"tmp");
-    if (aggrtype->ty == Tsarray)
-        value->ir.irLocal->value = DtoGEP(val,zero,loadedKey,"tmp");
-    else if (aggrtype->ty == Tarray)
-        value->ir.irLocal->value = llvm::GetElementPtrInst::Create(val,loadedKey,"tmp",p->scopebb());
+    value->ir.irLocal->value = DtoGEP1(val,loadedKey);
 
     if (!value->isRef() && !value->isOut()) {
         DValue* dst = new DVarValue(value->type, valvar, true);