2010-02-14 15:29:20 +00:00
|
|
|
#include "runtime.h"
|
|
|
|
|
|
|
|
// Subset of NSObject interface needed for properties.
|
|
|
|
@interface NSObject {}
|
|
|
|
- (id)retain;
|
|
|
|
- (id)copy;
|
|
|
|
- (id)autorelease;
|
|
|
|
- (void)release;
|
|
|
|
@end
|
|
|
|
|
2010-02-19 12:51:02 +00:00
|
|
|
id
|
|
|
|
objc_getProperty(id obj, SEL _cmd, ptrdiff_t offset, BOOL isAtomic)
|
2010-02-14 15:29:20 +00:00
|
|
|
{
|
2010-02-19 12:51:02 +00:00
|
|
|
char *addr;
|
|
|
|
id ret;
|
|
|
|
|
|
|
|
if (isAtomic)
|
|
|
|
{
|
|
|
|
@synchronized(obj)
|
2010-02-14 15:29:20 +00:00
|
|
|
{
|
2010-02-19 12:51:02 +00:00
|
|
|
return objc_getProperty(obj, _cmd, offset, NO);
|
2010-02-14 15:29:20 +00:00
|
|
|
}
|
2010-02-19 12:51:02 +00:00
|
|
|
}
|
|
|
|
addr = (char*)obj;
|
|
|
|
addr += offset;
|
|
|
|
ret = *(id*)addr;
|
|
|
|
return [[ret retain] autorelease];
|
2010-02-14 15:29:20 +00:00
|
|
|
}
|
|
|
|
|
2010-02-19 12:51:02 +00:00
|
|
|
void
|
|
|
|
objc_setProperty(id obj, SEL _cmd, ptrdiff_t offset, id arg, BOOL isAtomic,
|
|
|
|
BOOL isCopy)
|
2010-02-14 15:29:20 +00:00
|
|
|
{
|
2010-02-19 12:51:02 +00:00
|
|
|
char *addr;
|
|
|
|
id old;
|
|
|
|
|
|
|
|
if (isAtomic)
|
|
|
|
{
|
|
|
|
@synchronized(obj)
|
2010-02-14 15:29:20 +00:00
|
|
|
{
|
2010-02-19 12:51:02 +00:00
|
|
|
objc_setProperty(obj, _cmd, offset, arg, NO, isCopy);
|
|
|
|
return;
|
2010-02-14 15:29:20 +00:00
|
|
|
}
|
2010-02-19 12:51:02 +00:00
|
|
|
}
|
|
|
|
if (isCopy)
|
|
|
|
{
|
|
|
|
arg = [arg copy];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
arg = [arg retain];
|
|
|
|
}
|
|
|
|
addr = (char*)obj;
|
|
|
|
addr += offset;
|
|
|
|
old = *(id*)addr;
|
|
|
|
*(id*)addr = arg;
|
|
|
|
[old release];
|
2010-02-14 15:29:20 +00:00
|
|
|
}
|