Skip to content

Commit 652be81

Browse files
committed
win32: add an unpleasant workaround for _NSConcreteGlobalBlock's linkage
1 parent 6cd94b7 commit 652be81

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

arc.m

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static inline DWORD arc_tls_key_create(void WINAPI(*cleanupFunction)(void*))
4545

4646
extern void _NSConcreteMallocBlock;
4747
extern void _NSConcreteStackBlock;
48-
extern void _NSConcreteGlobalBlock;
48+
extern struct objc_class _NSConcreteGlobalBlock;
4949

5050
@interface NSAutoreleasePool
5151
+ (Class)class;
@@ -190,6 +190,12 @@ static inline id retain(id obj)
190190
{
191191
if (isSmallObject(obj)) { return obj; }
192192
Class cls = obj->isa;
193+
194+
if ((Class)&_NSConcreteGlobalBlock == cls->isa)
195+
{
196+
cls = cls->isa;
197+
}
198+
193199
if ((Class)&_NSConcreteMallocBlock == cls ||
194200
(Class)&_NSConcreteStackBlock == cls)
195201
{
@@ -214,13 +220,14 @@ static inline void release(id obj)
214220
{
215221
if (isSmallObject(obj)) { return; }
216222
Class cls = obj->isa;
223+
217224
if (cls == &_NSConcreteMallocBlock)
218225
{
219226
_Block_release(obj);
220227
return;
221228
}
222229
if ((cls == &_NSConcreteStackBlock) ||
223-
(cls == &_NSConcreteGlobalBlock))
230+
(cls->isa == &_NSConcreteGlobalBlock))
224231
{
225232
return;
226233
}

class.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,10 @@ static inline Class classForObject(id obj)
300300
return SmallObjectClasses[(addr & OBJC_SMALL_OBJECT_MASK)];
301301
}
302302
}
303+
extern struct objc_class _NSConcreteGlobalBlock;
304+
if (obj->isa->isa == (Class)&_NSConcreteGlobalBlock) {
305+
return (Class)&_NSConcreteGlobalBlock;
306+
}
303307
return obj->isa;
304308
}
305309

0 commit comments

Comments
 (0)