|
|
1.1 ! root 1: /* This file contains the implementation of class Object. ! 2: Copyright (C) 1992 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public 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 ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: #include "tconfig.h" ! 22: #include "gstdarg.h" ! 23: #include "object.h" ! 24: #include "objc-proto.h" ! 25: ! 26: #include <errno.h> ! 27: #ifndef errno ! 28: extern int errno; ! 29: #endif ! 30: ! 31: #define CLASS(class) ((Class_t)class) ! 32: ! 33: ! 34: @implementation Object ! 35: ! 36: ! 37: + new ! 38: { ! 39: return class_createInstance (CLASS (self)); ! 40: } ! 41: ! 42: ! 43: + free { return nil; } ! 44: - free { return object_dispose (self); } ! 45: ! 46: ! 47: - copy { return [self shallowCopy]; } ! 48: ! 49: ! 50: - shallowCopy ! 51: { ! 52: return object_copy (self); ! 53: } ! 54: ! 55: ! 56: - deepCopy ! 57: { ! 58: return class_createInstance ([self class]); ! 59: } ! 60: ! 61: ! 62: + (Class_t)class { return CLASS (self); } ! 63: + (Class_t)superClass { return CLASS (self)->super_class; } ! 64: - (Class_t)class { return isa; } ! 65: - (Class_t)superClass { return isa->super_class; } ! 66: - (const char *)name { return object_getClassName (self); } ! 67: - self { return self; } ! 68: ! 69: ! 70: - (unsigned int)hash ! 71: { ! 72: return (unsigned int)self; /* gak! Not portable. */ ! 73: } ! 74: ! 75: ! 76: - (BOOL)isEqual:anObject ! 77: { ! 78: return self == anObject ; ! 79: } ! 80: ! 81: ! 82: - (BOOL)isKindOf:(Class_t)aClassObject ! 83: { ! 84: Class_t class; ! 85: ! 86: for (class = isa; class; class = class->super_class) ! 87: if (class == aClassObject) ! 88: return YES; ! 89: ! 90: return NO; ! 91: } ! 92: ! 93: ! 94: - (BOOL)isMemberOf:(Class_t)aClassObject ! 95: { ! 96: return isa == aClassObject ; ! 97: } ! 98: ! 99: ! 100: - (BOOL)isKindOfGivenName:(const char*)aClassName ! 101: { ! 102: Class_t class; ! 103: ! 104: for (class = isa; class; class = class->super_class) ! 105: if (!strcmp (class_getClassName (class), aClassName)) ! 106: return YES; ! 107: ! 108: return NO; ! 109: } ! 110: ! 111: ! 112: - (BOOL)isMemberOfGivenName:(const char*)aClassName ! 113: { ! 114: return !strcmp ([self name], aClassName); ! 115: } ! 116: ! 117: ! 118: + (BOOL)instancesRespondTo:(SEL)aSel ! 119: { ! 120: if (class_getInstanceMethod (CLASS (self), aSel)) ! 121: return YES; ! 122: ! 123: return NO; ! 124: } ! 125: ! 126: ! 127: - (BOOL)respondsTo:(SEL)aSel ! 128: { ! 129: if (class_getInstanceMethod (isa, aSel)) ! 130: return YES; ! 131: ! 132: return NO; ! 133: } ! 134: ! 135: ! 136: - perform:(SEL)aSel ! 137: { ! 138: return (*((IMP)objc_msgSend (self, aSel)))(self, aSel); ! 139: } ! 140: ! 141: ! 142: - perform:(SEL)aSel with:aObject ! 143: { ! 144: return (*((IMP)objc_msgSend (self, aSel)))(self, aSel, aObject); ! 145: } ! 146: ! 147: ! 148: + poseAs:(Class_t)aClassObject ! 149: { ! 150: return class_poseAs (self, aClassObject); ! 151: } ! 152: ! 153: ! 154: - subclassResponsibility:(SEL)aSel ! 155: { ! 156: return [self error:"subclass should override %s", aSel]; ! 157: } ! 158: ! 159: ! 160: - notImplemented:(SEL)aSel ! 161: { ! 162: return [self error:"method %s not implemented", aSel]; ! 163: } ! 164: ! 165: ! 166: - doesNotRecognize:(SEL)aSel ! 167: { ! 168: return [self error:"%s does not recognize %s", [self name], aSel]; ! 169: } ! 170: ! 171: - error:(const char*)aString, ... ! 172: { ! 173: #define FMT "error: %s (instance)\n%s\n" ! 174: ! 175: char fmt[strlen (FMT) ! 176: + strlen (isa->name) ! 177: + strlen (aString) + 8]; ! 178: va_list ap; ! 179: ! 180: sprintf (fmt, FMT, isa->name, aString); ! 181: va_start (ap, aString); ! 182: (*_error)(self, fmt, ap); ! 183: va_end (ap); ! 184: ! 185: #undef FMT ! 186: return self; ! 187: } ! 188: ! 189: ! 190: + error:(const char*)aString, ... ! 191: { ! 192: #define FMT "error: %s (class)\n%s\n" ! 193: ! 194: char fmt[strlen (FMT) ! 195: + strlen (isa->name) ! 196: + strlen (aString) + 8]; ! 197: va_list ap; ! 198: ! 199: sprintf (fmt, FMT, isa->name, aString); ! 200: va_start (ap, aString); ! 201: (*_error)(self, fmt, ap); ! 202: va_end (ap); ! 203: ! 204: #undef FMT ! 205: return self; ! 206: } ! 207: ! 208: ! 209: - storeOn:(int)aFd ! 210: { ! 211: int len; ! 212: long version = [[self class] version]; ! 213: ! 214: if ((len = write (aFd, "#", strlen ("#"))) != -1) ! 215: if ((len = write (aFd, [self name], strlen ([self name]) + 1)) != -1) ! 216: len = write (aFd, &version, sizeof (version)); ! 217: ! 218: if (len == -1) ! 219: [self error:"error passivating object, errno=%d", errno]; ! 220: ! 221: return self; ! 222: } ! 223: ! 224: ! 225: + readFrom:(int)aFd ! 226: { ! 227: id aObj = nil; ! 228: char objName[256]; ! 229: int len; ! 230: ! 231: ! 232: if ((len = read (aFd, &objName, strlen ("#"))) != -1) ! 233: if (objName[0] == '#') { ! 234: long version; ! 235: int i = 0; ! 236: ! 237: /* Read the object's class. */ ! 238: do { ! 239: len = read (aFd, &objName[i], sizeof (char)); ! 240: } while (objName[i++] && (len != -1)); ! 241: ! 242: /* Get its version. */ ! 243: if (len != -1) ! 244: len = read (aFd, &version, sizeof (version)); ! 245: ! 246: /* No errors??? ! 247: Then create a object. */ ! 248: if (len != -1) { ! 249: aObj = class_createInstance (objc_getClass (objName)); ! 250: ! 251: /* If the object was ! 252: successfully created then ! 253: tell it to dearchive ! 254: itself. */ ! 255: if (aObj) ! 256: [aObj readFrom:aFd]; ! 257: } ! 258: } ! 259: ! 260: if (len == -1) ! 261: [self error:"error activating object, errno=%d", errno]; ! 262: ! 263: return aObj; ! 264: } ! 265: ! 266: ! 267: - readFrom:(int)aFd { return self; } ! 268: ! 269: ! 270: + (int)version ! 271: { ! 272: return class_getVersion (CLASS (self)); ! 273: } ! 274: ! 275: ! 276: + setVersion:(int)aVersion ! 277: { ! 278: class_setVersion (CLASS (self), aVersion); ! 279: ! 280: return self; ! 281: } ! 282: ! 283: ! 284: @end ! 285: ! 286:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.