diff tango/lib/compiler/llvmdc/lifetime.d @ 286:a3b7c19c866c trunk

[svn r307] Fixed: multidimensional new expressions now work. Eg.: auto ma = new int[][] (3,9);
author lindquist
date Sat, 21 Jun 2008 04:47:14 +0200
parents 23d0d9855cad
children 2b72433d5c8c
line wrap: on
line diff
--- a/tango/lib/compiler/llvmdc/lifetime.d	Sat Jun 21 03:14:49 2008 +0200
+++ b/tango/lib/compiler/llvmdc/lifetime.d	Sat Jun 21 04:47:14 2008 +0200
@@ -293,23 +293,19 @@
     return null;
 }
 
-/+
-
 /**
  *
  */
-extern (C) Array _d_newarraymT(TypeInfo ti, int ndims, ...)
+extern (C) void* _d_newarraymT(TypeInfo ti, int ndims, size_t* dims)
 {
-    Array result;
+    void* result;
 
     debug(PRINTF) printf("_d_newarraymT(ndims = %d)\n", ndims);
     if (ndims == 0)
-        result = Array();
+        result = null;
     else
-    {   va_list q;
-        va_start!(int)(q, ndims);
-
-        void[] foo(TypeInfo ti, size_t* pdim, int ndims)
+    {
+        static void[] foo(TypeInfo ti, size_t* pdim, int ndims)
         {
             size_t dim = *pdim;
             void[] p;
@@ -317,7 +313,8 @@
             debug(PRINTF) printf("foo(ti = %p, ti.next = %p, dim = %d, ndims = %d\n", ti, ti.next, dim, ndims);
             if (ndims == 1)
             {
-                return _d_newarrayT(ti, dim);
+                auto r = _d_newarrayT(ti, dim);
+                return r[0 .. dim];
             }
             else
             {
@@ -330,19 +327,16 @@
             return p;
         }
 
-        size_t* pdim = cast(size_t *)q;
-        void[] arr = foo(ti, pdim, ndims);
-        result = Arra
-        debug(PRINTF) printf("result = %llx\n", result);
+        result = foo(ti, dims, ndims).ptr;
+        debug(PRINTF) printf("result = %p\n", result);
 
         version (none)
         {
             for (int i = 0; i < ndims; i++)
             {
-                printf("index %d: %d\n", i, va_arg!(int)(q));
+                printf("index %d: %d\n", i, *dims++);
             }
         }
-        va_end(q);
     }
     return result;
 }
@@ -351,19 +345,16 @@
 /**
  *
  */
-extern (C) Array _d_newarraymiT(TypeInfo ti, int ndims, ...)
+extern (C) void* _d_newarraymiT(TypeInfo ti, int ndims, size_t* dims)
 {
-    Array result;
+    void* result;
 
     debug(PRINTF) printf("_d_newarraymiT(ndims = %d)\n", ndims);
     if (ndims == 0)
-        result = 0;
+        result = null;
     else
     {
-        va_list q;
-        va_start!(int)(q, ndims);
-
-        void[] foo(TypeInfo ti, size_t* pdim, int ndims)
+        static void[] foo(TypeInfo ti, size_t* pdim, int ndims)
         {
             size_t dim = *pdim;
             void[] p;
@@ -371,7 +362,7 @@
             if (ndims == 1)
             {
                 auto r = _d_newarrayiT(ti, dim);
-                p = *cast(void[]*)(&r);
+                p = r[0 .. dim];
             }
             else
             {
@@ -384,23 +375,23 @@
             return p;
         }
 
-        size_t* pdim = cast(size_t *)q;
-        result = cast(ulong)foo(ti, pdim, ndims);
-        debug(PRINTF) printf("result = %llx\n", result);
+        result = foo(ti, dims, ndims).ptr;
+        debug(PRINTF) printf("result = %p\n", result);
 
         version (none)
         {
             for (int i = 0; i < ndims; i++)
             {
-                printf("index %d: %d\n", i, va_arg!(int)(q));
-                printf("init = %d\n", va_arg!(int)(q));
+                printf("index %d: %d\n", i, *dims++);
+                printf("init = %d\n", *dims++);
             }
         }
-        va_end(q);
     }
     return result;
 }
 
+/+
+
 /**
  *
  */