From d28a000877a6aa2118512efdda7e108539fd1dac Mon Sep 17 00:00:00 2001 From: Riccardo Date: Thu, 21 Dec 2017 08:34:46 +0100 Subject: [PATCH 1/2] Compatibility for OS/compiler not supporting weak symbols --- ChangeLog | 5 +++++ Source/NSObject.m | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/ChangeLog b/ChangeLog index 7e87c7d43..eb206fd09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-12-21 Riccardo Mottola + + * Source\NSObject.m: + Compatibility for OS/compiler not supporting weak symbols. + 2017-12-18 Graham Lee * Source/NSJSONSerialization.m: Fix for bug #12 on github. This diff --git a/Source/NSObject.m b/Source/NSObject.m index c68b06232..c598ade43 100644 --- a/Source/NSObject.m +++ b/Source/NSObject.m @@ -77,6 +77,11 @@ #endif #endif +#define SUPPORT_WEAK 1 +#if (__GNUC__ == 3) && defined (__WIN32) +#undef SUPPORT_WEAK +#endif + /* When this is `YES', every call to release/autorelease, checks to make sure isn't being set up to release itself too many times. This does not need mutex protection. */ @@ -451,6 +456,7 @@ typedef struct obj_layout *obj; * runtime. When linked against an older version, we will use our internal * versions. */ +#ifdef SUPPORT_WEAK __attribute__((weak)) BOOL objc_release_fast_no_destroy_np(id anObject); @@ -462,6 +468,7 @@ size_t object_getRetainCount_np(id anObject); __attribute__((weak)) id objc_retain_fast_np(id anObject); +#endif static BOOL objc_release_fast_no_destroy_internal(id anObject) { @@ -524,7 +531,11 @@ static BOOL objc_release_fast_no_destroy_internal(id anObject) static BOOL release_fast_no_destroy(id anObject) { +#ifdef SUPPORT_WEAK if (objc_release_fast_no_destroy_np) +#else + if (0) +#endif { return objc_release_fast_no_destroy_np(anObject); } @@ -536,7 +547,11 @@ static BOOL release_fast_no_destroy(id anObject) static void objc_release_fast_np_internal(id anObject) { +#ifdef SUPPORT_WEAK if (release_fast_no_destroy(anObject)) +#else + if (0) +#endif { [anObject dealloc]; } @@ -544,7 +559,11 @@ static void objc_release_fast_np_internal(id anObject) static void release_fast(id anObject) { +#ifdef SUPPORT_WEAK if (objc_release_fast_np) +#else + if (0) +#endif { objc_release_fast_np(anObject); } @@ -573,7 +592,11 @@ size_t object_getRetainCount_np_internal(id anObject) size_t getRetainCount(id anObject) { +#ifdef SUPPORT_WEAK if (object_getRetainCount_np) +#else + if (0) +#endif { return object_getRetainCount_np(anObject); } @@ -668,7 +691,11 @@ static id objc_retain_fast_np_internal(id anObject) static id retain_fast(id anObject) { +#ifdef SUPPORT_WEAK if (objc_retain_fast_np) +#else + if (0) +#endif { return objc_retain_fast_np(anObject); } From ae335197f47348d6455d051708eef40c791460aa Mon Sep 17 00:00:00 2001 From: Riccardo Date: Thu, 21 Dec 2017 13:11:08 +0100 Subject: [PATCH 2/2] cleanup previous commit --- ChangeLog | 7 ++++++- Source/NSObject.m | 41 +++++++++++++++++------------------------ 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index eb206fd09..30c33450c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ 2017-12-21 Riccardo Mottola - * Source\NSObject.m: + * Source/NSObject.m: + Cleanup previous commit. + +2017-12-21 Riccardo Mottola + + * Source/NSObject.m: Compatibility for OS/compiler not supporting weak symbols. 2017-12-18 Graham Lee diff --git a/Source/NSObject.m b/Source/NSObject.m index c598ade43..8ee2b0954 100644 --- a/Source/NSObject.m +++ b/Source/NSObject.m @@ -1,5 +1,5 @@ /** Implementation of NSObject for GNUStep - Copyright (C) 1994-2010 Free Software Foundation, Inc. + Copyright (C) 1994-2017 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: August 1994 @@ -77,9 +77,15 @@ #endif #endif -#define SUPPORT_WEAK 1 + +/* platforms which do not support weak */ #if (__GNUC__ == 3) && defined (__WIN32) +#define WEAK_ATTRIBUTE #undef SUPPORT_WEAK +#else +/* all platforms which support weak */ +#define WEAK_ATTRIBUTE __attribute__((weak)) +#define SUPPORT_WEAK 1 #endif /* When this is `YES', every call to release/autorelease, checks to @@ -456,19 +462,18 @@ typedef struct obj_layout *obj; * runtime. When linked against an older version, we will use our internal * versions. */ -#ifdef SUPPORT_WEAK -__attribute__((weak)) +WEAK_ATTRIBUTE BOOL objc_release_fast_no_destroy_np(id anObject); -__attribute__((weak)) +WEAK_ATTRIBUTE void objc_release_fast_np(id anObject); -__attribute__((weak)) +WEAK_ATTRIBUTE size_t object_getRetainCount_np(id anObject); -__attribute__((weak)) +WEAK_ATTRIBUTE id objc_retain_fast_np(id anObject); -#endif + static BOOL objc_release_fast_no_destroy_internal(id anObject) { @@ -533,13 +538,11 @@ static BOOL release_fast_no_destroy(id anObject) { #ifdef SUPPORT_WEAK if (objc_release_fast_no_destroy_np) -#else - if (0) -#endif { return objc_release_fast_no_destroy_np(anObject); } else +#endif { return objc_release_fast_no_destroy_internal(anObject); } @@ -547,11 +550,7 @@ static BOOL release_fast_no_destroy(id anObject) static void objc_release_fast_np_internal(id anObject) { -#ifdef SUPPORT_WEAK if (release_fast_no_destroy(anObject)) -#else - if (0) -#endif { [anObject dealloc]; } @@ -561,13 +560,11 @@ static void release_fast(id anObject) { #ifdef SUPPORT_WEAK if (objc_release_fast_np) -#else - if (0) -#endif { objc_release_fast_np(anObject); } else +#endif { objc_release_fast_np_internal(anObject); } @@ -594,13 +591,11 @@ size_t getRetainCount(id anObject) { #ifdef SUPPORT_WEAK if (object_getRetainCount_np) -#else - if (0) -#endif { return object_getRetainCount_np(anObject); } else +#endif { return object_getRetainCount_np_internal(anObject); } @@ -693,13 +688,11 @@ static id retain_fast(id anObject) { #ifdef SUPPORT_WEAK if (objc_retain_fast_np) -#else - if (0) -#endif { return objc_retain_fast_np(anObject); } else +#endif { return objc_retain_fast_np_internal(anObject); }