X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5c19dc3ae3bd8e40a9c028b0deddd50ff337692c..6b200bc335dc93c5516ccb52f14bd896d8c7fad7:/OSX/utilities/src/SecCFRelease.h diff --git a/OSX/utilities/src/SecCFRelease.h b/OSX/utilities/src/SecCFRelease.h index 8a07dd35..f0b91828 100644 --- a/OSX/utilities/src/SecCFRelease.h +++ b/OSX/utilities/src/SecCFRelease.h @@ -30,6 +30,25 @@ // 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 & 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); \ @@ -39,6 +58,7 @@ (*_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); \ @@ -55,12 +75,10 @@ : (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); }) +#endif #endif /* _SECCFRELEASE_H_ */