changeset 1038:c4c6e5e9c23e

Removed inline asm for overflow checking in runtime that wasn't working.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 03 Mar 2009 19:37:47 +0100
parents 1d8a8ecf14e1
children 21691e437c95
files runtime/internal/lifetime.d
diffstat 1 files changed, 18 insertions(+), 90 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/internal/lifetime.d	Tue Mar 03 19:27:23 2009 +0100
+++ b/runtime/internal/lifetime.d	Tue Mar 03 19:37:47 2009 +0100
@@ -82,6 +82,14 @@
 
     alias bool function(Object) CollectHandler;
     CollectHandler collectHandler = null;
+
+    size_t length_adjust(size_t sizeelem, size_t newlength)
+    {
+        size_t newsize = sizeelem * newlength;
+        if (newsize / newlength != sizeelem)
+            onOutOfMemoryError();
+        return newsize;
+    }
 }
 
 
@@ -213,26 +221,13 @@
     if (length == 0 || size == 0)
         return null;
 
-    version (D_InlineAsm_X86)
-    {
-        asm
-        {
-            mov     EAX,size        ;
-            mul     EAX,length      ;
-            mov     size,EAX        ;
-            jc      Loverflow       ;
-        }
-    }
-    else
-        size *= length;
+    size = length_adjust(size, length);
+
     p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0);
     debug(PRINTF) printf(" p = %p\n", p);
     memset(p, 0, size);
+
     return p;
-
-Loverflow:
-    onOutOfMemoryError();
-    return null;
 }
 
 /**
@@ -253,18 +248,9 @@
         auto initializer = ti.next.init();
         auto isize = initializer.length;
         auto q = initializer.ptr;
-        version (D_InlineAsm_X86)
-        {
-            asm
-            {
-                mov     EAX,size        ;
-                mul     EAX,length      ;
-                mov     size,EAX        ;
-                jc      Loverflow       ;
-            }
-        }
-        else
-            size *= length;
+
+        size = length_adjust(size, length);
+
         auto p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0);
         debug(PRINTF) printf(" p = %p\n", p);
         if (isize == 1)
@@ -288,10 +274,6 @@
         result = p;
     }
     return result;
-
-Loverflow:
-    onOutOfMemoryError();
-    return null;
 }
 
 /**
@@ -306,25 +288,11 @@
     if (length == 0 || size == 0)
         return null;
 
-    version (D_InlineAsm_X86)
-    {
-        asm
-        {
-            mov     EAX,size        ;
-            mul     EAX,length      ;
-            mov     size,EAX        ;
-            jc      Loverflow       ;
-        }
-    }
-    else
-        size *= length;
+    size = length_adjust(size, length);
+
     p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0);
     debug(PRINTF) printf(" p = %p\n", p);
     return p;
-
-Loverflow:
-    onOutOfMemoryError();
-    return null;
 }
 
 /**
@@ -626,25 +594,7 @@
 
     if (newlength)
     {
-        version (D_InlineAsm_X86)
-        {
-            size_t newsize = void;
-
-            asm
-            {
-                mov EAX, newlength;
-                mul EAX, sizeelem;
-                mov newsize, EAX;
-                jc  Loverflow;
-            }
-        }
-        else
-        {
-            size_t newsize = sizeelem * newlength;
-
-            if (newsize / newlength != sizeelem)
-                goto Loverflow;
-        }
+        size_t newsize = length_adjust(sizeelem, newlength);
 
         debug(PRINTF) printf("newsize = %x, newlength = %x\n", newsize, newlength);
 
@@ -684,10 +634,6 @@
     }
 
     return newdata;
-
-Loverflow:
-    onOutOfMemoryError();
-    return null;
 }
 
 
@@ -727,25 +673,7 @@
 
     if (newlength)
     {
-        version (D_InlineAsm_X86)
-        {
-            size_t newsize = void;
-
-            asm
-            {
-                mov     EAX,newlength   ;
-                mul     EAX,sizeelem    ;
-                mov     newsize,EAX     ;
-                jc      Loverflow       ;
-            }
-        }
-        else
-        {
-            size_t newsize = sizeelem * newlength;
-
-            if (newsize / newlength != sizeelem)
-                goto Loverflow;
-        }
+        size_t newsize = length_adjust(sizeelem, newlength);
         debug(PRINTF) printf("newsize = %x, newlength = %x\n", newsize, newlength);
 
         size_t size = plength * sizeelem;