Add GC-aware property accessors (in GC mode, we don't need all of the atomic juggling, because the GC looks after that stuff for us).

main
theraven 15 years ago
parent ae4eea1597
commit 01237af0fc

@ -8,6 +8,7 @@
#include "spinlock.h" #include "spinlock.h"
#include "visibility.h" #include "visibility.h"
#include "nsobject.h" #include "nsobject.h"
#include "gc_ops.h"
PRIVATE int spinlocks[spinlock_count]; PRIVATE int spinlocks[spinlock_count];
@ -19,6 +20,10 @@ id objc_getProperty(id obj, SEL _cmd, ptrdiff_t offset, BOOL isAtomic)
if (nil == obj) { return nil; } if (nil == obj) { return nil; }
char *addr = (char*)obj; char *addr = (char*)obj;
addr += offset; addr += offset;
if (current_gc_mode == GC_Required)
{
return *(id*)addr;
}
id ret; id ret;
if (isAtomic) if (isAtomic)
{ {
@ -39,6 +44,18 @@ id objc_getProperty(id obj, SEL _cmd, ptrdiff_t offset, BOOL isAtomic)
void objc_setProperty(id obj, SEL _cmd, ptrdiff_t offset, id arg, BOOL isAtomic, BOOL isCopy) void objc_setProperty(id obj, SEL _cmd, ptrdiff_t offset, id arg, BOOL isAtomic, BOOL isCopy)
{ {
if (nil == obj) { return; } if (nil == obj) { return; }
char *addr = (char*)obj;
addr += offset;
if (current_gc_mode == GC_Required)
{
if (isCopy)
{
arg = [arg copy];
}
*(id*)addr = arg;
return;
}
if (isCopy) if (isCopy)
{ {
arg = [arg copy]; arg = [arg copy];
@ -47,8 +64,6 @@ void objc_setProperty(id obj, SEL _cmd, ptrdiff_t offset, id arg, BOOL isAtomic,
{ {
arg = [arg retain]; arg = [arg retain];
} }
char *addr = (char*)obj;
addr += offset;
id old; id old;
if (isAtomic) if (isAtomic)
{ {

Loading…
Cancel
Save