]> git.saurik.com Git - apple/security.git/blobdiff - OSX/utilities/src/SecCFRelease.h
Security-57740.51.3.tar.gz
[apple/security.git] / OSX / utilities / src / SecCFRelease.h
index 8a07dd35d3b950f4ac1e993310eac90273e0b193..f0b91828a3535fd97f0c69b097dccbb1bc9cf401 100644 (file)
 // Retains its argument unless it's NULL.  Always returns its argument.
 #define CFRetainSafe(CF) ({ __typeof__(CF) _cf = (CF); _cf ? (CFRetain(_cf), _cf) : _cf; })
 
 // Retains its argument unless it's NULL.  Always returns its argument.
 #define CFRetainSafe(CF) ({ __typeof__(CF) _cf = (CF); _cf ? (CFRetain(_cf), _cf) : _cf; })
 
+// Releases CF unless it's NULL.  Always returns NULL, for your convenience and constructs like:
+// return CFReleaseSafe(foo);
+#define CFReleaseSafe(CF) ({ __typeof__(CF) _cf = (CF); (_cf ? (CFRelease(_cf), ((__typeof__(CF))0)) : _cf); })
+
+
+#if 0
+// Objective-C defines &<bridged-object> to be a constant reference, which we can't assign to, so we
+// suffer multiple evaluations of arguments (avoid using it with side-effects) to make things compile well
+
+#define CFTransferRetained(VAR1, VAR2) ({ CFReleaseSafe(VAR1); VAR1 = VAR2; VAR2 = ((__typeof__(VAR2))0)); })
+
+#define CFAssignRetained(VAR, CF) ({ CFReleaseSafe(VAR); VAR1 = CF; CF = ((__typeof__(CF))0)); })
+
+#define CFRetainAssign(VAR,CF) ({ CFReleaseSafe(VAR); VAR = CFRetainSafe(CF); })
+
+#define CFReleaseNull(CF) ({ CFReleaseSafe(CF); CF = ((__typeof__(CF))0)); })
+
+#else
+
 // Assume VAR1 is NULL or an already retained object and CFReleaseSafe VAR1 and assigns VAR2 to VAR1. Returns VAR2.
 #define CFTransferRetained(VAR1, VAR2) ({ \
     __typeof__(VAR1) *const _pvar1 = &(VAR1); \
 // Assume VAR1 is NULL or an already retained object and CFReleaseSafe VAR1 and assigns VAR2 to VAR1. Returns VAR2.
 #define CFTransferRetained(VAR1, VAR2) ({ \
     __typeof__(VAR1) *const _pvar1 = &(VAR1); \
@@ -39,6 +58,7 @@
     (*_pvar1) = *_pvar1 ? (CFRelease(*_pvar1), _var2) : _var2; \
 })
 
     (*_pvar1) = *_pvar1 ? (CFRelease(*_pvar1), _var2) : _var2; \
 })
 
+
 // Assume CF is NULL or an already retained object and CFReleaseSafe VAR and assigns CF to VAR. Returns CF.
 #define CFAssignRetained(VAR,CF) ({ \
     __typeof__(VAR) *const _pvar = &(VAR); \
 // Assume CF is NULL or an already retained object and CFReleaseSafe VAR and assigns CF to VAR. Returns CF.
 #define CFAssignRetained(VAR,CF) ({ \
     __typeof__(VAR) *const _pvar = &(VAR); \
                    : (CFRelease(*_pvar), ((__typeof__(_cf))0))))); \
 })
 
                    : (CFRelease(*_pvar), ((__typeof__(_cf))0))))); \
 })
 
-// Releases CF unless it's NULL.  Always returns NULL, for your convenience and constructs like:
-// return CFReleaseSafe(foo);
-#define CFReleaseSafe(CF) ({ __typeof__(CF) _cf = (CF); (_cf ? (CFRelease(_cf), ((__typeof__(CF))0)) : _cf); })
 
 // Assigns NULL to CF. Releases the value stored at CF unless it was NULL.  Always returns NULL, for your convenience
 #define CFReleaseNull(CF) ({ __typeof__(CF) *const _pcf = &(CF), _cf = *_pcf; (_cf ? (*_pcf) = ((__typeof__(CF))0), (CFRelease(_cf), ((__typeof__(CF))0)) : _cf); })
 
 
 // Assigns NULL to CF. Releases the value stored at CF unless it was NULL.  Always returns NULL, for your convenience
 #define CFReleaseNull(CF) ({ __typeof__(CF) *const _pcf = &(CF), _cf = *_pcf; (_cf ? (*_pcf) = ((__typeof__(CF))0), (CFRelease(_cf), ((__typeof__(CF))0)) : _cf); })
 
+#endif
 
 #endif /* _SECCFRELEASE_H_ */
 
 #endif /* _SECCFRELEASE_H_ */