Annotation of GNUtools/cc/objc/Object.m, revision 1.1

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

unix.superglobalmegacorp.com

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