Annotation of gcc/objc/object.m, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.