From ef7ed5df72fb2cfb6a1dab38e335eb65e02b6204 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Sun, 19 Dec 2010 19:10:26 +0000 Subject: [PATCH] In libobjc/: 2010-12-19 Nicola Pero In libobjc/: 2010-12-19 Nicola Pero PR libobjc/47012 * accessors.m (objc_getProperty): If not atomic, do not retain/autorelease the returned value. (Problem reported by From-SVN: r168070 --- libobjc/ChangeLog | 6 ++++++ libobjc/accessors.m | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index e9bfedb2d3c3..55f35dc39892 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,9 @@ +2010-12-19 Nicola Pero + + PR libobjc/47012 + * accessors.m (objc_getProperty): If not atomic, do not + retain/autorelease the returned value. (Problem reported by + 2010-12-19 Nicola Pero * objc-private/runtime.h (__objc_selector_max_index, diff --git a/libobjc/accessors.m b/libobjc/accessors.m index d6469ea7ce50..a47903a6c87b 100644 --- a/libobjc/accessors.m +++ b/libobjc/accessors.m @@ -106,8 +106,18 @@ objc_getProperty (id self, SEL __attribute__((unused)) _cmd, ptrdiff_t offset, B { id *pointer_to_ivar = (id *)((char *)self + offset); + if (is_atomic == NO) - return AUTORELEASE (RETAIN (*pointer_to_ivar)); + { + /* Note that in this case, we do not RETAIN/AUTORELEASE the + returned value. The programmer should do it if it is + needed. Since access is non-atomic, other threads can be + ignored and the caller has full control of what happens + to the object and whether it needs to be RETAINed or not, + so it makes sense to leave the decision to him/her. This + is also what the Apple/NeXT runtime does. */ + return *pointer_to_ivar; + } else { objc_mutex_t lock = accessors_locks[ACCESSORS_HASH (pointer_to_ivar)]; -- 2.39.5