diff tango/lib/compiler/llvmdc/aaA.d @ 163:a8cd9bc1021a trunk

[svn r179] lots and lots of fixes, much more of tango now compiles/works.
author lindquist
date Mon, 05 May 2008 07:36:29 +0200
parents 1700239cab2e
children
line wrap: on
line diff
--- a/tango/lib/compiler/llvmdc/aaA.d	Mon May 05 00:56:53 2008 +0200
+++ b/tango/lib/compiler/llvmdc/aaA.d	Mon May 05 07:36:29 2008 +0200
@@ -29,6 +29,7 @@
 
 /*
  *  Modified by Sean Kelly <sean@f4.ca> for use with Tango.
+ *  Modified by Tomas Lindquist Olsen <tomas@famolsen.dk> for use with LLVMDC.
  */
 
 private
@@ -61,13 +62,7 @@
     1610612741UL, 4294967291UL
 ];
 
-/* This is the type of the return value for dynamic arrays.
- * It should be a type that is returned in registers.
- * Although DMD will return types of Array in registers,
- * gcc will not, so we instead use a 'long'.
- */
-alias long ArrayRet_t;
-
+// This is the type of the return value for dynamic arrays.
 struct Array
 {
     size_t length;
@@ -93,10 +88,8 @@
  * it is completely opaque.
  */
 
-struct AA
-{
-    BB* a;
-}
+// LLVMDC doesn't pass structs in registers so no need to wrap it ...
+alias BB* AA;
 
 /**********************************
  * Align to next pointer boundary, so that
@@ -210,9 +203,9 @@
         }
     }
 
-    if (aa.a)
+    if (aa)
     {
-        foreach (e; aa.a.b)
+        foreach (e; aa.b)
         {
             if (e)
                 _aaLen_x(e);
@@ -224,7 +217,7 @@
 }
 body
 {
-    return aa.a ? aa.a.nodes : 0;
+    return aa ? aa.nodes : 0;
 }
 
 
@@ -233,40 +226,41 @@
  * Add entry for key if it is not already there.
  */
 
-void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, ...)
+void* _aaGet(AA* aa_arg, TypeInfo keyti, size_t valuesize, void* pkey)
 in
 {
-    assert(aa);
+    assert(aa_arg);
 }
 out (result)
 {
     assert(result);
-    assert(aa.a);
-    assert(aa.a.b.length);
-    //assert(_aaInAh(*aa.a, key));
+    assert(*aa_arg);
+    assert((*aa_arg).b.length);
+    //assert(_aaInAh(*aa, key));
 }
 body
 {
-    auto pkey = cast(void *)(&valuesize + 1);
+    //auto pkey = cast(void *)(&valuesize + 1);
     size_t i;
     aaA *e;
     auto keysize = aligntsize(keyti.tsize());
 
-    if (!aa.a)
-        aa.a = new BB();
+    if (!*aa_arg)
+        *aa_arg = new BB();
+    auto aa = *aa_arg;
 
-    if (!aa.a.b.length)
+    if (!aa.b.length)
     {
         alias aaA *pa;
         auto len = prime_list[0];
 
-        aa.a.b = new pa[len];
+        aa.b = new pa[len];
     }
 
     auto key_hash = keyti.getHash(pkey);
     //printf("hash = %d\n", key_hash);
-    i = key_hash % aa.a.b.length;
-    auto pe = &aa.a.b[i];
+    i = key_hash % aa.b.length;
+    auto pe = &aa.b[i];
     while ((e = *pe) !is null)
     {
         if (key_hash == e.hash)
@@ -292,11 +286,11 @@
     e.hash = key_hash;
     *pe = e;
 
-    auto nodes = ++aa.a.nodes;
-    //printf("length = %d, nodes = %d\n", (*aa.a).length, nodes);
-    if (nodes > aa.a.b.length * 4)
+    auto nodes = ++aa.nodes;
+    //printf("length = %d, nodes = %d\n", (*aa).length, nodes);
+    if (nodes > aa.b.length * 4)
     {
-        _aaRehash(aa,keyti);
+        _aaRehash(aa_arg,keyti);
     }
 
 Lret:
@@ -309,22 +303,22 @@
  * Returns null if it is not already there.
  */
 
-void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, ...)
+void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void *pkey)
 {
     //printf("_aaGetRvalue(valuesize = %u)\n", valuesize);
-    if (!aa.a)
+    if (!aa)
         return null;
 
-    auto pkey = cast(void *)(&valuesize + 1);
+    //auto pkey = cast(void *)(&valuesize + 1);
     auto keysize = aligntsize(keyti.tsize());
-    auto len = aa.a.b.length;
+    auto len = aa.b.length;
 
     if (len)
     {
         auto key_hash = keyti.getHash(pkey);
         //printf("hash = %d\n", key_hash);
         size_t i = key_hash % len;
-        auto e = aa.a.b[i];
+        auto e = aa.b[i];
         while (e !is null)
         {
             if (key_hash == e.hash)
@@ -349,7 +343,7 @@
  *      !=null  in aa, return pointer to value
  */
 
-void* _aaIn(AA aa, TypeInfo keyti, ...)
+void* _aaIn(AA aa, TypeInfo keyti, void *pkey)
 in
 {
 }
@@ -359,19 +353,19 @@
 }
 body
 {
-    if (aa.a)
+    if (aa)
     {
-        auto pkey = cast(void *)(&keyti + 1);
+        //auto pkey = cast(void *)(&keyti + 1);
 
-        //printf("_aaIn(), .length = %d, .ptr = %x\n", aa.a.length, cast(uint)aa.a.ptr);
-        auto len = aa.a.b.length;
+        //printf("_aaIn(), .length = %d, .ptr = %x\n", aa.length, cast(uint)aa.ptr);
+        auto len = aa.b.length;
 
         if (len)
         {
             auto key_hash = keyti.getHash(pkey);
             //printf("hash = %d\n", key_hash);
             size_t i = key_hash % len;
-            auto e = aa.a.b[i];
+            auto e = aa.b[i];
             while (e !is null)
             {
                 if (key_hash == e.hash)
@@ -396,17 +390,17 @@
  * If key is not in aa[], do nothing.
  */
 
-void _aaDel(AA aa, TypeInfo keyti, ...)
+void _aaDel(AA aa, TypeInfo keyti, void *pkey)
 {
-    auto pkey = cast(void *)(&keyti + 1);
+    //auto pkey = cast(void *)(&keyti + 1);
     aaA *e;
 
-    if (aa.a && aa.a.b.length)
+    if (aa && aa.b.length)
     {
         auto key_hash = keyti.getHash(pkey);
         //printf("hash = %d\n", key_hash);
-        size_t i = key_hash % aa.a.b.length;
-        auto pe = &aa.a.b[i];
+        size_t i = key_hash % aa.b.length;
+        auto pe = &aa.b[i];
         while ((e = *pe) !is null) // null means not found
         {
             if (key_hash == e.hash)
@@ -439,7 +433,7 @@
                         e.right = null;
                     }
 
-                    aa.a.nodes--;
+                    aa.nodes--;
 
                     // Should notify GC that e can be free'd now
                     break;
@@ -457,7 +451,7 @@
  * Produce array of values from aa.
  */
 
-ArrayRet_t _aaValues(AA aa, size_t keysize, size_t valuesize)
+Array _aaValues(AA aa, size_t keysize, size_t valuesize)
 in
 {
     assert(keysize == aligntsize(keysize));
@@ -486,21 +480,21 @@
         } while (e !is null);
     }
 
-    if (aa.a)
+    if (aa)
     {
         a.length = _aaLen(aa);
         a.ptr = cast(byte*) gc_malloc(a.length * valuesize,
                                       valuesize < (void*).sizeof &&
                                       valuesize > (void).sizeof  ? BlkAttr.NO_SCAN : 0);
         resi = 0;
-        foreach (e; aa.a.b)
+        foreach (e; aa.b)
         {
             if (e)
                 _aaValues_x(e);
         }
         assert(resi == a.length);
     }
-    return *cast(ArrayRet_t*)(&a);
+    return a;
 }
 
 
@@ -567,10 +561,10 @@
     }
 
     //printf("Rehash\n");
-    if (paa.a)
+    if (*paa)
     {
-        auto aa = paa.a;
-        auto len = _aaLen(*paa);
+        auto aa = *paa;
+        auto len = _aaLen(aa);
         if (len)
         {   size_t i;
 
@@ -588,12 +582,12 @@
                     _aaRehash_x(e);
             }
 
-            newb.nodes = aa.nodes;
+            newb.nodes = (*aa).nodes;
         }
 
-        *paa.a = newb;
+        **paa = newb;
     }
-    return (*paa).a;
+    return *paa;
 }
 
 
@@ -601,7 +595,7 @@
  * Produce array of N byte keys from aa.
  */
 
-ArrayRet_t _aaKeys(AA aa, size_t keysize)
+Array _aaKeys(AA aa, size_t keysize)
 {
     byte[] res;
     size_t resi;
@@ -625,22 +619,19 @@
 
     auto len = _aaLen(aa);
     if (!len)
-        return 0;
+        return Array();
     res = (cast(byte*) gc_malloc(len * keysize,
                                  keysize < (void*).sizeof &&
                                  keysize > (void).sizeof  ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize];
     resi = 0;
-    foreach (e; aa.a.b)
+    foreach (e; aa.b)
     {
         if (e)
             _aaKeys_x(e);
     }
     assert(resi == len);
 
-    Array a;
-    a.length = len;
-    a.ptr = res.ptr;
-    return *cast(ArrayRet_t*)(&a);
+    return Array(len, res.ptr);
 }
 
 
@@ -659,7 +650,7 @@
 body
 {   int result;
 
-    //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg);
+    //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa, keysize, dg);
 
     int treewalker(aaA* e)
     {   int result;
@@ -686,9 +677,9 @@
         return result;
     }
 
-    if (aa.a)
+    if (aa)
     {
-        foreach (e; aa.a.b)
+        foreach (e; aa.b)
         {
             if (e)
             {
@@ -712,7 +703,7 @@
 body
 {   int result;
 
-    //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg);
+    //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa, keysize, dg);
 
     int treewalker(aaA* e)
     {   int result;
@@ -739,9 +730,9 @@
         return result;
     }
 
-    if (aa.a)
+    if (aa)
     {
-        foreach (e; aa.a.b)
+        foreach (e; aa.b)
         {
             if (e)
             {