diff gen/toir.cpp @ 335:17b844102023 trunk

[svn r356] Fixed problem with array length assignment introduced in [355]
author lindquist
date Sat, 12 Jul 2008 17:04:36 +0200
parents 20446d22f832
children aaade6ded589
line wrap: on
line diff
--- a/gen/toir.cpp	Sat Jul 12 15:43:13 2008 +0200
+++ b/gen/toir.cpp	Sat Jul 12 17:04:36 2008 +0200
@@ -563,27 +563,23 @@
     Logger::print("AssignExp::toElem: %s | %s = %s\n", toChars(), e1->type->toChars(), e2->type ? e2->type->toChars() : 0);
     LOG_SCOPE;
 
+    if (e1->op == TOKarraylength)
+    {
+        Logger::println("performing array.length assignment");
+        ArrayLengthExp *ale = (ArrayLengthExp *)e1;
+        DValue* arr = ale->e1->toElem(p);
+        DVarValue arrval(ale->e1->type, arr->getLVal(), true);
+        DValue* newlen = e2->toElem(p);
+        DSliceValue* slice = DtoResizeDynArray(arrval.getType(), &arrval, newlen);
+        DtoAssign(&arrval, slice);
+        return newlen;
+    }
+
+    Logger::println("performing normal assignment");
+
     DValue* l = e1->toElem(p);
     DValue* r = e2->toElem(p);
-
-    Logger::println("performing assignment");
-
-    DImValue* im = r->isIm();
-    if (!im || !im->inPlace()) {
-        Logger::println("assignment not inplace");
-        if (DArrayLenValue* al = l->isArrayLen())
-        {
-            DLRValue* arrlenval = l->isLRValue();
-            assert(arrlenval);
-            DVarValue arrval(arrlenval->getLType(), arrlenval->getLVal(), true);
-            DSliceValue* slice = DtoResizeDynArray(arrval.getType(), &arrval, r);
-            DtoAssign(&arrval, slice);
-        }
-        else
-        {
-            DtoAssign(l, r);
-        }
-    }
+    DtoAssign(l, r);
 
     if (l->isSlice() || l->isComplex())
         return l;
@@ -1945,9 +1941,7 @@
     LOG_SCOPE;
 
     DValue* u = e1->toElem(p);
-    Logger::println("e1 = %s", e1->type->toChars());
-
-    return new DArrayLenValue(e1->type, u->getLVal(), type, DtoArrayLen(u));
+    return new DImValue(type, DtoArrayLen(u));
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////