|
|
1.1 root 1: /* The implementation of class Object for Objective-C. 1.1.1.4 ! root 2: Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. 1.1 root 3: 4: This file is part of GNU CC. 5: 6: GNU CC is free software; you can redistribute it and/or modify it 7: under the terms of the GNU General Public License as published by the 8: Free Software Foundation; either version 2, or (at your option) any 9: later version. 10: 11: GNU CC is distributed in the hope that it will be useful, but WITHOUT 12: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 14: License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU CC; see the file COPYING. If not, write to 1.1.1.4 ! root 18: the Free Software Foundation, 59 Temple Place - Suite 330, ! 19: Boston, MA 02111-1307, USA. */ 1.1 root 20: 21: /* As a special exception, if you link this library with files compiled 22: with GCC to produce an executable, this does not cause the resulting 23: executable to be covered by the GNU General Public License. This 24: exception does not however invalidate any other reasons why the 25: executable file might be covered by the GNU General Public License. */ 26: 1.1.1.3 root 27: #include <stdarg.h> 1.1 root 28: #include "objc/Object.h" 29: #include "objc/Protocol.h" 30: #include "objc/objc-api.h" 31: 32: extern void (*_objc_error)(id object, const char *format, va_list); 33: 34: extern int errno; 35: 36: #define MAX_CLASS_NAME_LEN 256 37: 38: @implementation Object 39: 40: + initialize 41: { 42: return self; 43: } 44: 45: - init 46: { 47: return self; 48: } 49: 50: + new 51: { 52: return [[self alloc] init]; 53: } 54: 55: + alloc 56: { 57: return class_create_instance(self); 58: } 59: 60: - free 61: { 62: return object_dispose(self); 63: } 64: 65: - copy 66: { 67: return [[self shallowCopy] deepen]; 68: } 69: 70: - shallowCopy 71: { 72: return object_copy(self); 73: } 74: 75: - deepen 76: { 77: return self; 78: } 79: 80: - deepCopy 81: { 82: return [self copy]; 83: } 84: 1.1.1.4 ! root 85: - (Class)class 1.1 root 86: { 87: return object_get_class(self); 88: } 89: 1.1.1.4 ! root 90: - (Class)superClass 1.1 root 91: { 92: return object_get_super_class(self); 93: } 94: 1.1.1.4 ! root 95: - (MetaClass)metaClass 1.1 root 96: { 97: return object_get_meta_class(self); 98: } 99: 100: - (const char *)name 101: { 102: return object_get_class_name(self); 103: } 104: 105: - self 106: { 107: return self; 108: } 109: 110: - (unsigned int)hash 111: { 112: return (size_t)self; 113: } 114: 115: - (BOOL)isEqual:anObject 116: { 117: return self==anObject; 118: } 119: 1.1.1.2 root 120: - (int)compare:anotherObject; 121: { 122: if ([self isEqual:anotherObject]) 123: return 0; 124: // Ordering objects by their address is pretty useless, 125: // so subclasses should override this is some useful way. 126: else if (self > anotherObject) 127: return 1; 128: else 129: return -1; 130: } 131: 1.1 root 132: - (BOOL)isMetaClass 133: { 134: return NO; 135: } 136: 137: - (BOOL)isClass 138: { 139: return object_is_class(self); 140: } 141: 142: - (BOOL)isInstance 143: { 144: return object_is_instance(self); 145: } 146: 1.1.1.4 ! root 147: - (BOOL)isKindOf:(Class)aClassObject 1.1 root 148: { 1.1.1.4 ! root 149: Class class; 1.1 root 150: 151: for (class = self->isa; class!=Nil; class = class_get_super_class(class)) 152: if (class==aClassObject) 153: return YES; 154: return NO; 155: } 156: 1.1.1.4 ! root 157: - (BOOL)isMemberOf:(Class)aClassObject 1.1 root 158: { 159: return self->isa==aClassObject; 160: } 161: 162: - (BOOL)isKindOfClassNamed:(const char *)aClassName 163: { 1.1.1.4 ! root 164: Class class; 1.1 root 165: 166: if (aClassName!=NULL) 167: for (class = self->isa; class!=Nil; class = class_get_super_class(class)) 168: if (!strcmp(class_get_class_name(class), aClassName)) 169: return YES; 170: return NO; 171: } 172: 173: - (BOOL)isMemberOfClassNamed:(const char *)aClassName 174: { 175: return ((aClassName!=NULL) 176: &&!strcmp(class_get_class_name(self->isa), aClassName)); 177: } 178: 179: + (BOOL)instancesRespondTo:(SEL)aSel 180: { 181: return class_get_instance_method(self, aSel)!=METHOD_NULL; 182: } 183: 184: - (BOOL)respondsTo:(SEL)aSel 185: { 186: return ((object_is_instance(self) 187: ?class_get_instance_method(self->isa, aSel) 188: :class_get_class_method(self->isa, aSel))!=METHOD_NULL); 189: } 190: 191: + (IMP)instanceMethodFor:(SEL)aSel 192: { 193: return method_get_imp(class_get_instance_method(self, aSel)); 194: } 195: 196: // Indicates if the receiving class or instance conforms to the given protocol 197: // not usually overridden by subclasses 1.1.1.3 root 198: // 199: // Modified 9/5/94 to always search the class object's protocol list, rather 200: // than the meta class. 201: 202: + (BOOL) conformsTo: (Protocol*)aProtocol 1.1 root 203: { 204: int i; 205: struct objc_protocol_list* proto_list; 1.1.1.3 root 206: id parent; 1.1 root 207: 1.1.1.4 ! root 208: for (proto_list = ((Class)self)->protocols; 1.1 root 209: proto_list; proto_list = proto_list->next) 210: { 211: for (i=0; i < proto_list->count; i++) 212: { 213: if ([proto_list->list[i] conformsTo: aProtocol]) 214: return YES; 215: } 216: } 217: 1.1.1.3 root 218: if (parent = [self superClass]) 219: return [parent conformsTo: aProtocol]; 1.1 root 220: else 221: return NO; 222: } 223: 1.1.1.3 root 224: - (BOOL) conformsTo: (Protocol*)aProtocol 225: { 226: return [[self class] conformsTo:aProtocol]; 227: } 228: 1.1 root 229: - (IMP)methodFor:(SEL)aSel 230: { 231: return (method_get_imp(object_is_instance(self) 232: ?class_get_instance_method(self->isa, aSel) 233: :class_get_class_method(self->isa, aSel))); 234: } 235: 236: + (struct objc_method_description *)descriptionForInstanceMethod:(SEL)aSel 237: { 238: return ((struct objc_method_description *) 239: class_get_instance_method(self, aSel)); 240: } 241: 242: - (struct objc_method_description *)descriptionForMethod:(SEL)aSel 243: { 244: return ((struct objc_method_description *) 245: (object_is_instance(self) 246: ?class_get_instance_method(self->isa, aSel) 247: :class_get_class_method(self->isa, aSel))); 248: } 249: 250: - perform:(SEL)aSel 251: { 252: IMP msg = objc_msg_lookup(self, aSel); 253: if (!msg) 254: return [self error:"invalid selector passed to %s", sel_get_name(_cmd)]; 255: return (*msg)(self, aSel); 256: } 257: 258: - perform:(SEL)aSel with:anObject 259: { 260: IMP msg = objc_msg_lookup(self, aSel); 261: if (!msg) 262: return [self error:"invalid selector passed to %s", sel_get_name(_cmd)]; 263: return (*msg)(self, aSel, anObject); 264: } 265: 266: - perform:(SEL)aSel with:anObject1 with:anObject2 267: { 268: IMP msg = objc_msg_lookup(self, aSel); 269: if (!msg) 270: return [self error:"invalid selector passed to %s", sel_get_name(_cmd)]; 271: return (*msg)(self, aSel, anObject1, anObject2); 272: } 273: 1.1.1.3 root 274: - (retval_t)forward:(SEL)aSel :(arglist_t)argFrame 1.1 root 275: { 1.1.1.3 root 276: return (retval_t)[self doesNotRecognize: aSel]; 1.1 root 277: } 278: 1.1.1.3 root 279: - (retval_t)performv:(SEL)aSel :(arglist_t)argFrame 1.1 root 280: { 1.1.1.2 root 281: return objc_msg_sendv(self, aSel, argFrame); 1.1 root 282: } 283: 1.1.1.4 ! root 284: + poseAs:(Class)aClassObject 1.1 root 285: { 286: return class_pose_as(self, aClassObject); 287: } 288: 1.1.1.4 ! root 289: - (Class)transmuteClassTo:(Class)aClassObject 1.1 root 290: { 291: if (object_is_instance(self)) 292: if (class_is_class(aClassObject)) 293: if (class_get_instance_size(aClassObject)==class_get_instance_size(isa)) 294: if ([self isKindOf:aClassObject]) 295: { 1.1.1.4 ! root 296: Class old_isa = isa; 1.1 root 297: isa = aClassObject; 298: return old_isa; 299: } 300: return nil; 301: } 302: 303: - subclassResponsibility:(SEL)aSel 304: { 305: return [self error:"subclass should override %s", sel_get_name(aSel)]; 306: } 307: 308: - notImplemented:(SEL)aSel 309: { 310: return [self error:"method %s not implemented", sel_get_name(aSel)]; 311: } 312: 1.1.1.2 root 313: - shouldNotImplement:(SEL)aSel 314: { 315: return [self error:"%s should not implement %s", 316: object_get_class_name(self), sel_get_name(aSel)]; 317: } 318: 1.1 root 319: - doesNotRecognize:(SEL)aSel 320: { 321: return [self error:"%s does not recognize %s", 322: object_get_class_name(self), sel_get_name(aSel)]; 323: } 324: 1.1.1.3 root 325: #ifdef __alpha__ 326: extern size_t strlen(const char*); 327: #endif 328: 1.1 root 329: - error:(const char *)aString, ... 330: { 331: #define FMT "error: %s (%s)\n%s\n" 332: char fmt[(strlen((char*)FMT)+strlen((char*)object_get_class_name(self)) 333: +((aString!=NULL)?strlen((char*)aString):0)+8)]; 334: va_list ap; 335: 336: sprintf(fmt, FMT, object_get_class_name(self), 337: object_is_instance(self)?"instance":"class", 338: (aString!=NULL)?aString:""); 339: va_start(ap, aString); 340: (*_objc_error)(self, fmt, ap); 341: va_end(ap); 342: return nil; 343: #undef FMT 344: } 345: 346: + (int)version 347: { 348: return class_get_version(self); 349: } 350: 351: + setVersion:(int)aVersion 352: { 353: class_set_version(self, aVersion); 354: return self; 355: } 356: 357: + (int)streamVersion: (TypedStream*)aStream 358: { 359: if (aStream->mode == OBJC_READONLY) 360: return objc_get_stream_class_version (aStream, self); 361: else 362: return class_get_version (self); 363: } 364: 365: // These are used to write or read the instance variables 366: // declared in this particular part of the object. Subclasses 367: // should extend these, by calling [super read/write: aStream] 368: // before doing their own archiving. These methods are private, in 369: // the sense that they should only be called from subclasses. 370: 371: - read: (TypedStream*)aStream 372: { 373: // [super read: aStream]; 374: return self; 375: } 376: 377: - write: (TypedStream*)aStream 378: { 379: // [super write: aStream]; 380: return self; 381: } 382: 383: - awake 384: { 385: // [super awake]; 386: return self; 387: } 388: 389: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.