changeset 1039:21691e437c95

Updated lifetime.d with a 32bit faster codepath for overflow checks.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 03 Mar 2009 19:47:39 +0100
parents c4c6e5e9c23e
children 0477f98d357e
files runtime/internal/lifetime.d
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/internal/lifetime.d	Tue Mar 03 19:37:47 2009 +0100
+++ b/runtime/internal/lifetime.d	Tue Mar 03 19:47:39 2009 +0100
@@ -85,9 +85,20 @@
 
     size_t length_adjust(size_t sizeelem, size_t newlength)
     {
-        size_t newsize = sizeelem * newlength;
-        if (newsize / newlength != sizeelem)
-            onOutOfMemoryError();
+        size_t newsize = void;
+        static if (size_t.sizeof < ulong.sizeof)
+        {
+            ulong s = cast(ulong)sizeelem * cast(ulong)newlength;
+            if (s > size_t.max)
+                onOutOfMemoryError();
+            newsize = cast(size_t)s;
+        }
+        else
+        {
+            newsize = sizeelem * newlength;
+            if (newsize / newlength != sizeelem)
+                onOutOfMemoryError();
+        }
         return newsize;
     }
 }