Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -73,11 +73,12 @@ AC_MSG_RESULT(yes) ], [ AC_MSG_RESULT(no) OBJCFLAGS="$old_OBJCFLAGS" ]) -AC_CHECK_FUNC(_Block_copy,, AC_SUBST(OFBLOCK_M, "OFBlock.m")) +AC_CHECK_FUNC(_Block_copy,, + AC_DEFINE(HAVE_BLOCK_COPY, 1, [Whether we have _Block_copy])) AC_CHECK_HEADERS([objfw-rt.h objc/objc.h]) test x"$ac_cv_header_objfw_rt_h" = x"yes" && objc_runtime="ObjFW-RT" @@ -151,10 +152,11 @@ case "$host_os" in darwin*) AC_SUBST(REEXPORT_LIBOBJC, [-Wl,-reexport-lobjc]) AC_SUBST(LDFLAGS_REEXPORT, [-Wl,-reexport-lobjfw]) + AC_SUBST(MACH_ALIAS_LIST, [-Wl,-alias_list,mach_alias_list]) ;; esac AC_C_BIGENDIAN([ AC_DEFINE(OF_BIG_ENDIAN, 1, [Whether we are big endian]) Index: extra.mk.in ================================================================== --- extra.mk.in +++ extra.mk.in @@ -5,13 +5,13 @@ OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR} ASPRINTF_M = @ASPRINTF_M@ ATOMIC_H = @ATOMIC_H@ BIN_PREFIX = @BIN_PREFIX@ +MACH_ALIAS_LIST = @MACH_ALIAS_LIST@ OBJC_PROPERTIES_M = @OBJC_PROPERTIES_M@ OBJC_SYNC_M = @OBJC_SYNC_M@ -OFBLOCK_M = @OFBLOCK_M@ OFPLUGIN_M = @OFPLUGIN_M@ OFPLUGINTESTS_M = @OFPLUGINTESTS_M@ OFTHREAD_M = @OFTHREAD_M@ OFTHREADTESTS_M = @OFTHREADTESTS_M@ PROPERTIESTESTS_M = @PROPERTIESTESTS_M@ Index: src/Makefile ================================================================== --- src/Makefile +++ src/Makefile @@ -6,10 +6,11 @@ STATIC_LIB = ${OBJFW_STATIC_LIB} SRCS = OFApplication.m \ OFArray.m \ OFAutoreleasePool.m \ + OFBlock.m \ OFConstantString.m \ OFDataArray.m \ OFDictionary.m \ OFExceptions.m \ OFFile.m \ @@ -40,26 +41,24 @@ OFXMLElementBuilder.m \ OFXMLParser.m \ unicode.m INCLUDES := ${SRCS:.m=.h} \ - OFBlock.h \ OFCollection.h \ ObjFW.h \ asprintf.h \ ${ATOMIC_H} \ macros.h \ objfw-defs.h \ ${THREADING_H} -SRCS += ${OFBLOCK_M} \ - ${ASPRINTF_M} \ +SRCS += ${ASPRINTF_M} \ iso_8859_15.m \ windows_1252.m \ ${OBJC_PROPERTIES_M} \ ${OBJC_SYNC_M} include ../buildsys.mk CPPFLAGS += -I.. LD = ${OBJC} -LDFLAGS += ${REEXPORT_LIBOBJC} +LDFLAGS += ${REEXPORT_LIBOBJC} ${MACH_ALIAS_LIST} Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -10,15 +10,15 @@ */ #include "config.h" #include -#include #include #include #import "OFBlock.h" +#import "OFExceptions.h" #import "atomic.h" /// \cond internal @protocol RetainRelease - retain; @@ -105,26 +105,32 @@ { __objc_exec_class(&module); } /* End of ObjC module */ #else -void *_NSConcreteStackBlock; -void *_NSConcreteGlobalBlock; -void *_NSConcreteMallocBlock; +extern void *_NSConcreteStackBlock; +extern void *_NSConcreteGlobalBlock; +extern void *_NSConcreteMallocBlock; #endif +#ifndef HAVE_BLOCK_COPY +static struct { + Class isa; +} alloc_failed_exception; + void* _Block_copy(const void *block_) { of_block_literal_t *block = (of_block_literal_t*)block_; if (block->isa == (Class)&_NSConcreteStackBlock) { of_block_literal_t *copy; if ((copy = malloc(block->descriptor->size)) == NULL) { - fputs("Not enough memory to copy block!\n", stderr); - exit(1); + alloc_failed_exception.isa = + [OFAllocFailedException class]; + @throw (OFAllocFailedException*)&alloc_failed_exception; } memcpy(copy, block, block->descriptor->size); copy->isa = (Class)&_NSConcreteMallocBlock; copy->reserved++; @@ -174,13 +180,14 @@ of_block_byref_t *src = (of_block_byref_t*)src_; of_block_byref_t **dst = (of_block_byref_t**)dst_; if ((src->flags & ~OF_BLOCK_HAS_COPY_DISPOSE) == 0) { if ((*dst = malloc(src->size)) == NULL) { - fputs("Not enough memory for block " - "variables!\n", stderr); - exit(1); + alloc_failed_exception.isa = + [OFAllocFailedException class]; + @throw (OFAllocFailedException*) + &alloc_failed_exception; } if (src->forwarding == src) src->forwarding = *dst; @@ -219,13 +226,18 @@ free(obj); } break; } } +#endif /// \cond internal @implementation OFBlock ++ (void)initialize +{ +} + + (Class)class { return self; } @@ -237,6 +249,17 @@ - (void)release { Block_release(self); } @end + +#if !defined(OF_GNU_RUNTIME) && !defined(OF_OBJFW_RUNTIME) +@implementation OFStackBlock +@end + +@implementation OFGlobalBlock +@end + +@implementation OFMallocBlock +@end +#endif /// \endcond ADDED src/mach_alias_list Index: src/mach_alias_list ================================================================== --- src/mach_alias_list +++ src/mach_alias_list @@ -0,0 +1,4 @@ +# List of aliases for Mach-O +_OBJC_CLASS_$_OFStackBlock __NSConcreteStackBlock +_OBJC_CLASS_$_OFGlobalBlock __NSConcreteGlobalBlock +_OBJC_CLASS_$_OFMallocBlock __NSConcreteMallocBlock