/ CoreFoundation_Prefix.h
CoreFoundation_Prefix.h
  1  /*
  2   * Copyright (c) 2015 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  /*	CoreFoundation_Prefix.h
 25  	Copyright (c) 2005-2014, Apple Inc. All rights reserved.
 26  */
 27  
 28  
 29  #define _DARWIN_UNLIMITED_SELECT 1
 30  
 31  #include <CoreFoundation/CFBase.h>
 32  
 33  
 34  #include <stdlib.h>
 35  #include <stdint.h>
 36  #include <string.h>
 37  
 38  #if DEPLOYMENT_TARGET_WINDOWS && defined(__cplusplus)
 39  extern "C" {
 40  #endif
 41  
 42  #if DEPLOYMENT_TARGET_IPHONESIMULATOR // work around <rdar://problem/16507706>
 43  #include <pthread/qos.h>
 44  #define qos_class_self() (QOS_CLASS_UTILITY)
 45  #define qos_class_main() (QOS_CLASS_UTILITY)
 46  #define pthread_set_qos_class_self_np(A, B) do {} while (0)
 47  #define pthread_override_qos_class_start_np(A, B, C) (NULL)
 48  #define pthread_override_qos_class_end_np(A) do {} while (0)
 49  #elif (DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED)
 50  #include <pthread/qos.h>
 51  #endif
 52  
 53  #define SystemIntegrityCheck(A, B)	do {} while (0)
 54  
 55      
 56  #if INCLUDE_OBJC
 57  #include <objc/objc.h>
 58  #else
 59  typedef signed char	BOOL; 
 60  typedef char * id;
 61  typedef char * Class;
 62  #ifndef YES
 63  #define YES (BOOL)1
 64  #endif
 65  #ifndef NO
 66  #define NO (BOOL)0
 67  #endif
 68  #ifndef nil
 69  #define nil NULL
 70  #endif
 71  #endif
 72  
 73  #define CRSetCrashLogMessage(A) do {} while (0)
 74  #define CRSetCrashLogMessage2(A) do {} while (0)
 75  
 76  #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI
 77  #import <libkern/OSAtomic.h>
 78  #import <pthread.h>
 79  #endif
 80  
 81  /* This macro creates some helper functions which are useful in dealing with libdispatch:
 82   *  __ PREFIX Queue -- manages and returns a singleton serial queue
 83   *
 84   * Use the macro like this:
 85   *   DISPATCH_HELPER_FUNCTIONS(fh, NSFileHandle)
 86   */
 87  
 88  #define DISPATCH_HELPER_FUNCTIONS(PREFIX, QNAME)			\
 89  static dispatch_queue_t __ ## PREFIX ## Queue(void) {			\
 90      static volatile dispatch_queue_t __ ## PREFIX ## dq = NULL;		\
 91      if (!__ ## PREFIX ## dq) {						\
 92          dispatch_queue_t dq = dispatch_queue_create("com.apple." # QNAME, NULL); \
 93          void * volatile *loc = (void * volatile *)&__ ## PREFIX ## dq;	\
 94          if (!OSAtomicCompareAndSwapPtrBarrier(NULL, dq, loc)) {		\
 95              dispatch_release(dq);					\
 96          }								\
 97      }									\
 98      return __ ## PREFIX ## dq;						\
 99  }									\
100  
101  
102  #define LIBAUTO_STUB	1
103  
104  #ifndef LIBAUTO_STUB
105  
106  #if DEPLOYMENT_TARGET_MACOSX
107  #include <auto_zone.h>
108  #endif
109  #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED
110  #include <objc/objc-auto.h>
111  #endif
112  
113  #endif // LIBAUTO_STUB
114  
115  #if DEPLOYMENT_TARGET_WINDOWS
116  // Compatibility with boolean.h
117  #if defined(__x86_64__)
118  typedef unsigned int	boolean_t;
119  #else
120  typedef int		boolean_t;
121  #endif
122  #endif
123  
124  #if DEPLOYMENT_TARGET_LINUX
125      
126  #define CF_PRIVATE
127  #define __strong
128  #define __weak
129  
130  #define strtod_l(a,b,locale) strtod(a,b)
131  #define strtoul_l(a,b,c,locale) strtoul(a,b,c)
132  #define strtol_l(a,b,c,locale) strtol(a,b,c)
133  #define strtoll_l(a,b,c,locale) strtoll(a,b,c)
134  #define strncasecmp_l(a, b, c, d) strncasecmp(a, b, c)
135  
136  #define fprintf_l(a,locale,b,...) fprintf(a, b, __VA_ARGS__)
137  
138  #include <pthread.h>
139  
140  CF_INLINE size_t
141  strlcpy(char * dst, const char * src, size_t maxlen) {
142      const size_t srclen = strlen(src);
143      if (srclen < maxlen) {
144          memcpy(dst, src, srclen+1);
145      } else if (maxlen != 0) {
146          memcpy(dst, src, maxlen-1);
147          dst[maxlen-1] = '\0';
148      }
149      return srclen;
150  }
151  
152  CF_INLINE size_t
153  strlcat(char * dst, const char * src, size_t maxlen) {
154      const size_t srclen = strlen(src);
155      const size_t dstlen = strnlen(dst, maxlen);
156      if (dstlen == maxlen) return maxlen+srclen;
157      if (srclen < maxlen-dstlen) {
158          memcpy(dst+dstlen, src, srclen+1);
159      } else {
160          memcpy(dst+dstlen, src, maxlen-dstlen-1);
161          dst[maxlen-1] = '\0';
162      }
163      return dstlen + srclen;
164  }
165  
166  #define issetugid() 0
167      
168  // Implemented in CFPlatform.c 
169  bool OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst);
170  bool OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst);
171  bool OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void *volatile *dst);
172  bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue );
173      
174  int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst);
175  int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst);
176  int32_t OSAtomicIncrement32(volatile int32_t *theValue);
177  int32_t OSAtomicDecrement32(volatile int32_t *theValue);
178  
179  int32_t OSAtomicAdd32( int32_t theAmount, volatile int32_t *theValue );
180  int32_t OSAtomicAdd32Barrier( int32_t theAmount, volatile int32_t *theValue );
181  bool OSAtomicCompareAndSwap32Barrier( int32_t oldValue, int32_t newValue, volatile int32_t *theValue );
182      
183  void OSMemoryBarrier();
184  
185  #include <malloc.h>
186  CF_INLINE size_t malloc_size(void *memblock) {
187      return malloc_usable_size(memblock);
188  }
189      
190  // substitute for dispatch_once
191  typedef pthread_once_t dispatch_once_t;
192  typedef void (^dispatch_block_t)(void);
193  void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);
194  
195  #endif
196  
197  #if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX    
198  #if !defined(MIN)
199  #define MIN(A,B)	((A) < (B) ? (A) : (B))
200  #endif
201      
202  #if !defined(MAX)
203  #define MAX(A,B)	((A) > (B) ? (A) : (B))
204  #endif
205      
206  #if !defined(ABS)
207  #define ABS(A)	((A) < 0 ? (-(A)) : (A))
208  #endif    
209  #endif
210  
211  #if DEPLOYMENT_TARGET_WINDOWS
212  
213  #define MAXPATHLEN MAX_PATH
214  #undef MAX_PATH
215  #undef INVALID_HANDLE_VALUE
216  
217  // Defined for source compatibility
218  #define ino_t _ino_t
219  #define off_t _off_t
220  #define mode_t uint16_t
221          
222  // This works because things aren't actually exported from the DLL unless they have a __declspec(dllexport) on them... so extern by itself is closest to __private_extern__ on Mac OS
223  #define CF_PRIVATE extern
224      
225  #define __builtin_expect(P1,P2) P1
226      
227  // These are replacements for POSIX calls on Windows, ensuring that the UTF8 parameters are converted to UTF16 before being passed to Windows
228  CF_EXPORT int _NS_stat(const char *name, struct _stat *st);
229  CF_EXPORT int _NS_mkdir(const char *name);
230  CF_EXPORT int _NS_rmdir(const char *name);
231  CF_EXPORT int _NS_chmod(const char *name, int mode);
232  CF_EXPORT int _NS_unlink(const char *name);
233  CF_EXPORT char *_NS_getcwd(char *dstbuf, size_t size);     // Warning: this doesn't support dstbuf as null even though 'getcwd' does
234  CF_EXPORT char *_NS_getenv(const char *name);
235  CF_EXPORT int _NS_rename(const char *oldName, const char *newName);
236  CF_EXPORT int _NS_open(const char *name, int oflag, int pmode = 0);
237  CF_EXPORT int _NS_chdir(const char *name);
238  CF_EXPORT int _NS_mkstemp(char *name, int bufSize);
239  CF_EXPORT int _NS_access(const char *name, int amode);
240  
241  #define BOOL WINDOWS_BOOL
242  
243  #define WIN32_LEAN_AND_MEAN
244  
245  #ifndef WINVER
246  #define WINVER  0x0501
247  #endif
248      
249  #ifndef _WIN32_WINNT
250  #define _WIN32_WINNT 0x0501
251  #endif
252  
253  // The order of these includes is important
254  #define FD_SETSIZE 1024
255  #include <winsock2.h>
256  #include <windows.h>
257  #include <pthread.h>
258  
259  #undef BOOL
260  
261  #ifndef HAVE_STRUCT_TIMESPEC
262  #define HAVE_STRUCT_TIMESPEC 1
263  struct timespec {
264          long tv_sec;
265          long tv_nsec;
266  };
267  #endif /* HAVE_STRUCT_TIMESPEC */
268  
269  #define __PRETTY_FUNCTION__ __FUNCTION__
270  
271  #define malloc_default_zone() (void *)0
272  #define malloc_zone_from_ptr(a) (void *)0
273  #define malloc_zone_malloc(zone,size) malloc(size)
274  #define malloc_zone_memalign(zone,align,size) malloc(size)
275  #define malloc_zone_calloc(zone,count,size) calloc(count,size)
276  #define bcopy(b1,b2,len) memmove(b2, b1, (size_t)(len))
277  typedef int malloc_zone_t;
278  typedef int uid_t;
279  typedef int gid_t;
280  #define geteuid() 0
281  #define getuid() 0
282  #define getegid() 0
283  
284  #define scalbn(A, B) _scalb(A, B)
285  
286  #define fsync(a) _commit(a)
287  #define malloc_create_zone(a,b) 123
288  #define malloc_set_zone_name(zone,name)
289  #define malloc_zone_realloc(zone,ptr,size) realloc(ptr,size)
290  #define malloc_zone_free(zone,ptr) free(ptr)
291  
292  // implemented in CFInternal.h
293  #define OSSpinLockLock(A) __CFLock(A)
294  #define OSSpinLockUnlock(A) __CFUnlock(A)
295      
296  typedef int32_t OSSpinLock;
297  
298  #define OS_SPINLOCK_INIT       0
299  
300  #include <stdint.h>
301  #include <stdbool.h>
302  #include <stdio.h>
303  #include <malloc.h>
304  
305  CF_INLINE size_t malloc_size(void *memblock) {
306      return _msize(memblock);
307  }
308  
309  CF_INLINE uint64_t mach_absolute_time() {
310      LARGE_INTEGER count;
311      QueryPerformanceCounter(&count);
312      // mach_absolute_time is unsigned, but this function returns a signed value.
313      return (uint64_t)count.QuadPart;
314  }
315  
316  CF_INLINE long long llabs(long long v) {
317      if (v < 0) return -v;
318      return v;
319  }
320  
321  #define strtod_l(a,b,locale) strtod(a,b)
322  #define strtoul_l(a,b,c,locale) strtoul(a,b,c)
323  #define strtol_l(a,b,c,locale) strtol(a,b,c)
324  #define strtoll_l(a,b,c,locale) _strtoi64(a,b,c)
325  #define strncasecmp(a, b, c) _strnicmp(a, b, c)
326  #define strncasecmp_l(a, b, c, d) _strnicmp(a, b, c)
327  #define snprintf _snprintf
328  
329  #define fprintf_l(a,locale,b,...) fprintf(a, b, __VA_ARGS__)
330  
331  CF_INLINE size_t
332  strlcpy(char * dst, const char * src, size_t maxlen) {
333      const size_t srclen = strlen(src);
334      if (srclen < maxlen) {
335          memcpy(dst, src, srclen+1);
336      } else if (maxlen != 0) {
337          memcpy(dst, src, maxlen-1);
338          dst[maxlen-1] = '\0';
339      }
340      return srclen;
341  }
342  
343  CF_INLINE size_t
344  strlcat(char * dst, const char * src, size_t maxlen) {
345      const size_t srclen = strlen(src);
346      const size_t dstlen = strnlen(dst, maxlen);
347      if (dstlen == maxlen) return maxlen+srclen;
348      if (srclen < maxlen-dstlen) {
349          memcpy(dst+dstlen, src, srclen+1);
350      } else {
351          memcpy(dst+dstlen, src, maxlen-dstlen-1);
352          dst[maxlen-1] = '\0';
353      }
354      return dstlen + srclen;
355  }
356  
357  #define sleep(x) Sleep(1000*x)
358  
359  #define issetugid() 0
360  
361  // CF exports these useful atomic operation functions on Windows
362  CF_EXPORT bool OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst);
363  CF_EXPORT bool OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst);
364  CF_EXPORT bool OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void *volatile *dst);
365  
366  CF_EXPORT int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst);
367  CF_EXPORT int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst);
368  CF_EXPORT int32_t OSAtomicIncrement32(volatile int32_t *theValue);
369  CF_EXPORT int32_t OSAtomicDecrement32(volatile int32_t *theValue);
370      
371  CF_EXPORT int32_t OSAtomicAdd32( int32_t theAmount, volatile int32_t *theValue );
372  CF_EXPORT int32_t OSAtomicAdd32Barrier( int32_t theAmount, volatile int32_t *theValue );
373  CF_EXPORT bool OSAtomicCompareAndSwap32Barrier( int32_t oldValue, int32_t newValue, volatile int32_t *theValue );
374  
375  /*
376  CF_EXPORT bool OSAtomicCompareAndSwap64( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue );
377  CF_EXPORT bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue );
378      
379  CF_EXPORT int64_t OSAtomicAdd64( int64_t __theAmount, volatile int64_t *__theValue );
380  CF_EXPORT int64_t OSAtomicAdd64Barrier( int64_t __theAmount, volatile int64_t *__theValue );
381  */
382  
383  //#ifndef NTDDI_VERSION
384  //#define NTDDI_VERSION NTDDI_WINXP
385  //#endif
386  
387  #include <io.h>
388  #include <fcntl.h>
389  #include <errno.h>
390      
391  #endif
392  
393  #if !defined(CF_PRIVATE)
394  #define CF_PRIVATE __attribute__((__visibility__("hidden")))
395  #endif
396  
397  #if DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_WINDOWS
398  
399  #include <stdarg.h>
400  
401  CF_INLINE int flsl( long mask ) {
402      int idx = 0;
403      while (mask != 0) mask = (unsigned long)mask >> 1, idx++;
404      return idx;
405  }
406      
407  CF_INLINE int popcountll(long long x) {
408      int count = 0;
409      while (x) {
410          count++;
411          x &= x - 1; // reset LS1B
412      }
413      return count;
414  }
415  
416  CF_PRIVATE int asprintf(char **ret, const char *format, ...);
417  
418  #endif
419  
420  #ifdef LIBAUTO_STUB
421  
422  #include <stddef.h>
423  
424  /* Stubs for functions in libauto. */
425  
426  enum {OBJC_GENERATIONAL = (1 << 0)};
427  
428  enum {
429      OBJC_RATIO_COLLECTION        = (0 << 0), 
430      OBJC_GENERATIONAL_COLLECTION = (1 << 0),
431      OBJC_FULL_COLLECTION         = (2 << 0),
432      OBJC_EXHAUSTIVE_COLLECTION   = (3 << 0),
433      OBJC_COLLECT_IF_NEEDED       = (1 << 3),
434      OBJC_WAIT_UNTIL_DONE         = (1 << 4),
435  };
436  
437      
438  enum {
439      AUTO_TYPE_UNKNOWN = -1,
440      AUTO_UNSCANNED = (1 << 0),
441      AUTO_OBJECT = (1 << 1),
442      AUTO_POINTERS_ONLY = (1 << 2),
443      AUTO_MEMORY_SCANNED = !AUTO_UNSCANNED,
444      AUTO_MEMORY_UNSCANNED = AUTO_UNSCANNED,
445      AUTO_MEMORY_ALL_POINTERS = AUTO_POINTERS_ONLY,
446      AUTO_MEMORY_ALL_WEAK_POINTERS = (AUTO_UNSCANNED | AUTO_POINTERS_ONLY),
447      AUTO_OBJECT_SCANNED = AUTO_OBJECT,
448      AUTO_OBJECT_UNSCANNED = AUTO_OBJECT | AUTO_UNSCANNED, 
449      AUTO_OBJECT_ALL_POINTERS = AUTO_OBJECT | AUTO_POINTERS_ONLY
450  };
451  typedef unsigned long auto_memory_type_t;
452  typedef struct _auto_zone_t auto_zone_t;
453  typedef struct auto_weak_callback_block {
454      struct auto_weak_callback_block *next;
455      void (*callback_function)(void *arg1, void *arg2);
456      void *arg1;
457      void *arg2;
458  } auto_weak_callback_block_t;
459  
460  CF_INLINE void *objc_memmove_collectable(void *a, const void *b, size_t c) { return memmove(a, b, c); }
461  CF_INLINE void *objc_collectableZone(void) { return 0; }
462  
463  CF_INLINE void *auto_zone_allocate_object(void *zone, size_t size, auto_memory_type_t type, int rc, int clear) { return 0; }
464  CF_INLINE const void *auto_zone_base_pointer(void *zone, const void *ptr) { return 0; }
465  CF_INLINE void auto_zone_set_scan_exactly(void *zone, void *ptr) {}
466  CF_INLINE void auto_zone_retain(void *zone, void *ptr) {}
467  CF_INLINE unsigned int auto_zone_release(void *zone, void *ptr) { return 0; }
468  CF_INLINE unsigned int auto_zone_retain_count(void *zone, const void *ptr) { return 0; }
469  CF_INLINE void auto_zone_set_unscanned(void *zone, void *ptr) {}
470  CF_INLINE void auto_zone_set_nofinalize(void *zone, void *ptr) {}
471  CF_INLINE int auto_zone_is_finalized(void *zone, const void *ptr) { return 0; }
472  CF_INLINE size_t auto_zone_size(void *zone, const void *ptr) { return 0; }
473  CF_INLINE void auto_register_weak_reference(void *zone, const void *referent, void **referrer, uintptr_t *counter, void **listHead, void **listElement) {}
474  CF_INLINE void auto_unregister_weak_reference(void *zone, const void *referent, void **referrer) {}
475  CF_INLINE int auto_zone_is_valid_pointer(void *zone, const void *ptr) { return 0; }
476  //CF_INLINE BOOL objc_isAuto(id object) { return 0; }
477  CF_INLINE void* auto_read_weak_reference(void *zone, void **referrer) { void *result = *referrer; return result; }
478  CF_INLINE void auto_assign_weak_reference(void *zone, const void *value, const void **location, auto_weak_callback_block_t *block) { *location = (void *)value; }
479  CF_INLINE auto_memory_type_t auto_zone_get_layout_type(void *zone, void *ptr) { return AUTO_UNSCANNED; }
480  CF_INLINE int auto_zone_set_write_barrier(void *zone, const void *dest, const void *new_value) { return false; }
481  
482  CF_INLINE void objc_assertRegisteredThreadWithCollector(void) {}
483  CF_INLINE void objc_registerThreadWithCollector(void) {}
484  
485  CF_INLINE uintptr_t _object_getExternalHash(id obj) {
486      return (uintptr_t)obj;
487  }
488      
489  // from objc-auto.h
490  
491  CF_INLINE BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) 
492  { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
493  
494  CF_INLINE BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation) 
495  { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
496  
497  CF_INLINE BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation) 
498  { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
499  
500  CF_INLINE BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation) 
501  { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
502  
503  CF_INLINE BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation) 
504  { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
505  
506  CF_INLINE BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation) 
507  { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
508  
509  CF_INLINE id objc_assign_strongCast(id val, id *dest) 
510  { return (*dest = val); }
511  
512  CF_INLINE id objc_assign_global(id val, id *dest) 
513  { return (*dest = val); }
514  
515  CF_INLINE id objc_assign_ivar(id val, id dest, ptrdiff_t offset) 
516  { return (*(id*)((char *)dest+offset) = val); }
517  
518  //CF_INLINE void *objc_memmove_collectable(void *dst, const void *src, size_t size) { return memmove(dst, src, size); }
519  
520  CF_INLINE id objc_read_weak(id *location) 
521  { return *location; }
522  
523  CF_INLINE id objc_assign_weak(id value, id *location) 
524  { return (*location = value); }
525  
526  
527  CF_INLINE void objc_finalizeOnMainThread(Class cls) { }
528  CF_INLINE BOOL objc_is_finalized(void *ptr) { return NO; }
529  CF_INLINE void objc_clear_stack(unsigned long options) { }
530  
531  CF_INLINE BOOL objc_collectingEnabled(void) { return NO; }
532  CF_INLINE void objc_start_collector_thread(void) { }
533  
534  CF_INLINE void objc_collect(unsigned long options) { }
535      
536  #endif
537  
538  #if DEPLOYMENT_TARGET_WINDOWS && defined(__cplusplus)
539  } // extern "C"
540  #endif