# HG changeset patch # User Tomas Lindquist Olsen # Date 1236105467 -3600 # Node ID c4c6e5e9c23e17e10982cf2684bef7d35c461560 # Parent 1d8a8ecf14e175307d03cdf4f91ac4faac0b5b71 Removed inline asm for overflow checking in runtime that wasn't working. diff -r 1d8a8ecf14e1 -r c4c6e5e9c23e runtime/internal/lifetime.d --- 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;