]> git.saurik.com Git - apple/objc4.git/blob - runtime/objc-auto.mm
objc4-706.tar.gz
[apple/objc4.git] / runtime / objc-auto.mm
1 /*
2 * Copyright (c) 2004-2007 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 #include "objc-private.h"
25
26 // GC is no longer supported.
27
28 #if OBJC_NO_GC_API
29
30 // No GC and no GC symbols needed. We're done here.
31 # if SUPPORT_GC_COMPAT
32 # error inconsistent config settings
33 # endif
34
35 #else
36
37 // No GC but we do need to export GC symbols.
38 // These are mostly the same as the OBJC_NO_GC inline versions in objc-auto.h.
39
40 # if !SUPPORT_GC_COMPAT
41 # error inconsistent config settings
42 # endif
43
44 OBJC_EXPORT void objc_collect(unsigned long options __unused) { }
45 OBJC_EXPORT BOOL objc_collectingEnabled(void) { return NO; }
46 OBJC_EXPORT void objc_setCollectionThreshold(size_t threshold __unused) { }
47 OBJC_EXPORT void objc_setCollectionRatio(size_t ratio __unused) { }
48 OBJC_EXPORT void objc_startCollectorThread(void) { }
49
50 #if TARGET_OS_WIN32
51 OBJC_EXPORT BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation)
52 { void *original = InterlockedCompareExchangePointer((void * volatile *)objectLocation, (void *)replacement, (void *)predicate); return (original == predicate); }
53
54 OBJC_EXPORT BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation)
55 { void *original = InterlockedCompareExchangePointer((void * volatile *)objectLocation, (void *)replacement, (void *)predicate); return (original == predicate); }
56 #else
57 OBJC_EXPORT BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation)
58 { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
59
60 OBJC_EXPORT BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation)
61 { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); }
62 #endif
63
64 OBJC_EXPORT BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation)
65 { return objc_atomicCompareAndSwapPtr(predicate, replacement, objectLocation); }
66
67 OBJC_EXPORT BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation)
68 { return objc_atomicCompareAndSwapPtrBarrier(predicate, replacement, objectLocation); }
69
70 OBJC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation)
71 { return objc_atomicCompareAndSwapPtr(predicate, replacement, objectLocation); }
72
73 OBJC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation)
74 { return objc_atomicCompareAndSwapPtrBarrier(predicate, replacement, objectLocation); }
75
76 OBJC_EXPORT id objc_assign_strongCast(id val, id *dest)
77 { return (*dest = val); }
78
79 OBJC_EXPORT id objc_assign_global(id val, id *dest)
80 { return (*dest = val); }
81
82 OBJC_EXPORT id objc_assign_threadlocal(id val, id *dest)
83 { return (*dest = val); }
84
85 OBJC_EXPORT id objc_assign_ivar(id val, id dest, ptrdiff_t offset)
86 { return (*(id*)((char *)dest+offset) = val); }
87
88 OBJC_EXPORT id objc_read_weak(id *location)
89 { return *location; }
90
91 OBJC_EXPORT id objc_assign_weak(id value, id *location)
92 { return (*location = value); }
93
94 OBJC_EXPORT void *objc_memmove_collectable(void *dst, const void *src, size_t size)
95 { return memmove(dst, src, size); }
96
97 OBJC_EXPORT void objc_finalizeOnMainThread(Class cls __unused) { }
98 OBJC_EXPORT BOOL objc_is_finalized(void *ptr __unused) { return NO; }
99 OBJC_EXPORT void objc_clear_stack(unsigned long options __unused) { }
100
101 OBJC_EXPORT BOOL objc_collecting_enabled(void) { return NO; }
102 OBJC_EXPORT void objc_set_collection_threshold(size_t threshold __unused) { }
103 OBJC_EXPORT void objc_set_collection_ratio(size_t ratio __unused) { }
104 OBJC_EXPORT void objc_start_collector_thread(void) { }
105
106 OBJC_EXPORT id objc_allocate_object(Class cls, int extra)
107 { return class_createInstance(cls, extra); }
108
109 OBJC_EXPORT void objc_registerThreadWithCollector() { }
110 OBJC_EXPORT void objc_unregisterThreadWithCollector() { }
111 OBJC_EXPORT void objc_assertRegisteredThreadWithCollector() { }
112
113 OBJC_EXPORT malloc_zone_t* objc_collect_init(int(*callback)() __unused) { return nil; }
114 OBJC_EXPORT void* objc_collectableZone() { return nil; }
115
116 OBJC_EXPORT BOOL objc_isAuto(id object __unused) { return NO; }
117 OBJC_EXPORT BOOL objc_dumpHeap(char *filename __unused, unsigned long length __unused)
118 { return NO; }
119
120 // not OBJC_NO_GC_API
121 #endif