You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
2.8 KiB
Objective-C
166 lines
2.8 KiB
Objective-C
#include <malloc.h>
|
|
#include <string.h>
|
|
#include <inttypes.h>
|
|
#include <objc/runtime.h>
|
|
#include <objc/objc.h>
|
|
#import "YSObject.h"
|
|
#import "YSZone.h"
|
|
|
|
typedef struct obj_layout_unpadded {
|
|
int32_t retained;
|
|
} unp;
|
|
#define UNP sizeof(unp)
|
|
|
|
#ifndef __BIGGEST_ALIGNMENT__
|
|
#define __BIGGEST_ALIGNMENT__ sizeof(void *) + sizeof(void *)
|
|
#endif
|
|
|
|
struct obj_layout {
|
|
char padding[__BIGGEST_ALIGNMENT__ - ((UNP % __BIGGEST_ALIGNMENT__)
|
|
? (UNP % __BIGGEST_ALIGNMENT__) : __BIGGEST_ALIGNMENT__)];
|
|
int32_t retained;
|
|
};
|
|
typedef struct obj_layout *obj;
|
|
|
|
|
|
inline id YSAllocateObject(Class theClass, YSUInteger extraBytes, YSZone *zone) {
|
|
id new;
|
|
int size;
|
|
|
|
size = class_getInstanceSize(theClass) + extraBytes + sizeof(struct obj_layout);
|
|
if (zone == 0) {
|
|
zone = YSDefaultMallocZone();
|
|
}
|
|
|
|
new = YSZoneMalloc(zone, size);
|
|
if (new != nil) {
|
|
memset(new, 0, size);
|
|
new = (id) &( (obj)new )[1];
|
|
object_setClass(new, theClass);
|
|
//AADD
|
|
}
|
|
|
|
return new;
|
|
}
|
|
|
|
inline id YSDeallocateObject(id theObject) {
|
|
Class theClass = object_getClass(theObject);
|
|
|
|
if ( (theObject != nil) && !class_isMetaClass(theClass) ) {
|
|
object_dispose(theObject);
|
|
}
|
|
}
|
|
|
|
@implementation YSObject
|
|
|
|
/*
|
|
+(void) load {
|
|
//impl
|
|
return;
|
|
}*/
|
|
|
|
-(id) init {
|
|
return self;
|
|
}
|
|
|
|
-(id) self {
|
|
return self;
|
|
}
|
|
|
|
+(void) initialize {
|
|
//implement later
|
|
return;
|
|
}
|
|
|
|
+(id) allocWithZone: (YSZone *) zone {
|
|
return YSAllocateObject(self, 0, zone);
|
|
}
|
|
|
|
+(id) copyWithZone: (YSZone *) zone {
|
|
return self;
|
|
}
|
|
|
|
+(id) alloc {
|
|
return [self allocWithZone: YSDefaultMallocZone()];
|
|
}
|
|
|
|
+(id) new {
|
|
return [[self alloc] init];
|
|
}
|
|
|
|
-(Class) class {
|
|
return object_getClass(self);
|
|
}
|
|
|
|
-(void) dealloc {
|
|
YSDeallocateObject(self);
|
|
}
|
|
|
|
-(id) copy {
|
|
return [(id)self copyWithZone: YSDefaultMallocZone()];
|
|
}
|
|
|
|
+(Class) superclass {
|
|
return class_getSuperclass(self);
|
|
}
|
|
-(Class) superclass {
|
|
return class_getSuperclass(object_getClass(self));
|
|
}
|
|
|
|
+(Class) class {
|
|
return self;
|
|
}
|
|
|
|
-(BOOL) isEqual: (id) anObject {
|
|
return (self == anObject);
|
|
}
|
|
|
|
+(BOOL) isKindOfClass: (Class) theClass {
|
|
if (theClass == [YSObject class]) {
|
|
return YES;
|
|
}
|
|
|
|
return NO;
|
|
}
|
|
|
|
-(BOOL) isProxy {
|
|
return NO;
|
|
}
|
|
|
|
-(id) performSelector: (SEL) theSelector {
|
|
IMP msg;
|
|
|
|
if (theSelector == 0) {
|
|
//raise exception
|
|
perror("null selector given");
|
|
return;
|
|
}
|
|
|
|
msg = objc_msg_lookup(self, theSelector);
|
|
if (!msg) {
|
|
//raise exception
|
|
perror("invalid selector");
|
|
return nil;
|
|
}
|
|
|
|
return (*msg)(self, theSelector);
|
|
}
|
|
|
|
-(YSZone *) zone {
|
|
return YSZoneFromPointer(self);
|
|
}
|
|
|
|
+(YSZone *) zone {
|
|
return YSDefaultMallocZone();
|
|
}
|
|
|
|
//dummy methods
|
|
+(oneway void) release {
|
|
return;
|
|
}
|
|
|
|
+(id) retain {
|
|
return self;
|
|
}
|
|
@end
|