Index: src/OFObject.m ================================================================== --- src/OFObject.m +++ src/OFObject.m @@ -79,10 +79,13 @@ # define OFForward OFMethodNotFound # define OFForward_stret OFMethodNotFound_stret #endif struct PreIvars { +#ifdef OF_MSDOS + ptrdiff_t offset; +#endif int retainCount; #if !defined(OF_HAVE_ATOMIC_OPS) && !defined(OF_AMIGAOS) OFSpinlock retainCountSpinlock; #endif }; @@ -155,10 +158,37 @@ void OFFreeMemory(void *pointer) { free(pointer); } + +#ifdef OF_MSDOS +/* Unfortunately, DJGPP's memalign() is broken. */ + +static void * +alignedAlloc(size_t size, size_t alignment, ptrdiff_t *offset) +{ + char *ptr, *aligned; + + if ((ptr = malloc(size + alignment)) == NULL) + return NULL; + + aligned = (char *)OFRoundUpToPowerOf2(alignment, (uintptr_t)ptr); + *offset = aligned - ptr; + + return aligned; +} + +static void +alignedFree(void *ptr, ptrdiff_t offset) +{ + if (ptr == NULL) + return; + + free((void *)((uintptr_t)ptr - offset)); +} +#endif #if !defined(HAVE_ARC4RANDOM) && !defined(HAVE_GETRANDOM) static void initRandom(void) { @@ -330,43 +360,56 @@ OFAllocObject(Class class, size_t extraSize, size_t extraAlignment, void **extra) { OFObject *instance; size_t instanceSize; +#ifdef OF_MSDOS + ptrdiff_t offset; +#endif instanceSize = class_getInstanceSize(class); if OF_UNLIKELY (extraAlignment > 1) extraAlignment = OFRoundUpToPowerOf2(extraAlignment, PRE_IVARS_ALIGN + instanceSize) - PRE_IVARS_ALIGN - instanceSize; -#ifndef OF_WINDOWS - instance = calloc(1, PRE_IVARS_ALIGN + instanceSize + - extraAlignment + extraSize); -#else +#if defined(OF_WINDOWS) instance = __mingw_aligned_malloc(PRE_IVARS_ALIGN + instanceSize + extraAlignment + extraSize, OF_BIGGEST_ALIGNMENT); memset(instance, 0, PRE_IVARS_ALIGN + instanceSize + extraAlignment + extraSize); +#elif defined(OF_MSDOS) + instance = alignedAlloc(PRE_IVARS_ALIGN + instanceSize + + extraAlignment + extraSize, OF_BIGGEST_ALIGNMENT, &offset); + memset(instance, 0, PRE_IVARS_ALIGN + instanceSize + extraAlignment + + extraSize); +#else + instance = calloc(1, PRE_IVARS_ALIGN + instanceSize + + extraAlignment + extraSize); #endif if OF_UNLIKELY (instance == nil) { object_setClass((id)&allocFailedException, [OFAllocFailedException class]); @throw (id)&allocFailedException; } +#ifdef OF_MSDOS + ((struct PreIvars *)instance)->offset = offset; +#endif ((struct PreIvars *)instance)->retainCount = 1; #if !defined(OF_HAVE_ATOMIC_OPS) && !defined(OF_AMIGAOS) if OF_UNLIKELY (OFSpinlockNew( &((struct PreIvars *)instance)->retainCountSpinlock) != 0) { -# ifndef OF_WINDOWS - free(instance); +# if defined(OF_WINDOWS) + __mingw_aligned_free(instance); +# elif defined(OF_MSDOS) + alignedFree(instance, offset); # else - __mingw_aligned_free(instance); + free(instance); # endif @throw [OFInitializationFailedException exceptionWithClass: class]; } #endif @@ -376,14 +419,16 @@ if (!objc_constructInstance(class, instance)) { #if !defined(OF_HAVE_ATOMIC_OPS) && !defined(OF_AMIGAOS) OFSpinlockFree(&((struct PreIvars *)(void *) ((char *)instance - PRE_IVARS_ALIGN))->retainCountSpinlock); #endif -#ifndef OF_WINDOWS - free((char *)instance - PRE_IVARS_ALIGN); +#if defined(OF_WINDOWS) + __mingw_aligned_free((char *)instance - PRE_IVARS_ALIGN); +#elif defined(OF_MSDOS) + alignedFree((char *)instance - PRE_IVARS_ALIGN, offset); #else - __mingw_aligned_free((char *)instance - PRE_IVARS_ALIGN); + free((char *)instance - PRE_IVARS_ALIGN); #endif @throw [OFInitializationFailedException exceptionWithClass: class]; } @@ -1247,14 +1292,16 @@ #if !defined(OF_HAVE_ATOMIC_OPS) && !defined(OF_AMIGAOS) OFSpinlockFree(&PRE_IVARS->retainCountSpinlock); #endif -#ifndef OF_WINDOWS - free((char *)self - PRE_IVARS_ALIGN); +#if defined(OF_WINDOWS) + __mingw_aligned_free((char *)self - PRE_IVARS_ALIGN); +#elif defined(OF_MSDOS) + alignedFree((char *)self - PRE_IVARS_ALIGN, PRE_IVARS->offset); #else - __mingw_aligned_free((char *)self - PRE_IVARS_ALIGN); + free((char *)self - PRE_IVARS_ALIGN); #endif } /* Required to use properties with the Apple runtime */ - (id)copyWithZone: (void *)zone