Annotation of gcc/objc/Object.m, revision 1.1

1.1     ! root        1: /* The implementation of class Object for Objective-C.
        !             2:    Copyright (C) 1993 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: - (BOOL)isMetaClass
        !           120: {
        !           121:   return NO;
        !           122: }
        !           123: 
        !           124: - (BOOL)isClass
        !           125: {
        !           126:   return object_is_class(self);
        !           127: }
        !           128: 
        !           129: - (BOOL)isInstance
        !           130: {
        !           131:   return object_is_instance(self);
        !           132: }
        !           133: 
        !           134: - (BOOL)isKindOf:(Class*)aClassObject
        !           135: {
        !           136:   Class* class;
        !           137: 
        !           138:   for (class = self->isa; class!=Nil; class = class_get_super_class(class))
        !           139:     if (class==aClassObject)
        !           140:       return YES;
        !           141:   return NO;
        !           142: }
        !           143: 
        !           144: - (BOOL)isMemberOf:(Class*)aClassObject
        !           145: {
        !           146:   return self->isa==aClassObject;
        !           147: }
        !           148: 
        !           149: - (BOOL)isKindOfClassNamed:(const char *)aClassName
        !           150: {
        !           151:   Class* class;
        !           152: 
        !           153:   if (aClassName!=NULL)
        !           154:     for (class = self->isa; class!=Nil; class = class_get_super_class(class))
        !           155:       if (!strcmp(class_get_class_name(class), aClassName))
        !           156:         return YES;
        !           157:   return NO;
        !           158: }
        !           159: 
        !           160: - (BOOL)isMemberOfClassNamed:(const char *)aClassName
        !           161: {
        !           162:   return ((aClassName!=NULL)
        !           163:           &&!strcmp(class_get_class_name(self->isa), aClassName));
        !           164: }
        !           165: 
        !           166: + (BOOL)instancesRespondTo:(SEL)aSel
        !           167: {
        !           168:   return class_get_instance_method(self, aSel)!=METHOD_NULL;
        !           169: }
        !           170: 
        !           171: - (BOOL)respondsTo:(SEL)aSel
        !           172: {
        !           173:   return ((object_is_instance(self)
        !           174:            ?class_get_instance_method(self->isa, aSel)
        !           175:            :class_get_class_method(self->isa, aSel))!=METHOD_NULL);
        !           176: }
        !           177: 
        !           178: + (IMP)instanceMethodFor:(SEL)aSel
        !           179: {
        !           180:   return method_get_imp(class_get_instance_method(self, aSel));
        !           181: }
        !           182: 
        !           183: // Indicates if the receiving class or instance conforms to the given protocol
        !           184: // not usually overridden by subclasses
        !           185: - (BOOL) conformsTo: (Protocol*)aProtocol
        !           186: {
        !           187:   int i;
        !           188:   struct objc_protocol_list* proto_list;
        !           189: 
        !           190:   for (proto_list = isa->protocols;
        !           191:        proto_list; proto_list = proto_list->next)
        !           192:     {
        !           193:       for (i=0; i < proto_list->count; i++)
        !           194:       {
        !           195:         if ([proto_list->list[i] conformsTo: aProtocol])
        !           196:           return YES;
        !           197:       }
        !           198:     }
        !           199: 
        !           200:   if ([self superClass])
        !           201:     return [[self superClass] conformsTo: aProtocol];
        !           202:   else
        !           203:     return NO;
        !           204: }
        !           205: 
        !           206: - (IMP)methodFor:(SEL)aSel
        !           207: {
        !           208:   return (method_get_imp(object_is_instance(self)
        !           209:                          ?class_get_instance_method(self->isa, aSel)
        !           210:                          :class_get_class_method(self->isa, aSel)));
        !           211: }
        !           212: 
        !           213: + (struct objc_method_description *)descriptionForInstanceMethod:(SEL)aSel
        !           214: {
        !           215:   return ((struct objc_method_description *)
        !           216:            class_get_instance_method(self, aSel));
        !           217: }
        !           218: 
        !           219: - (struct objc_method_description *)descriptionForMethod:(SEL)aSel
        !           220: {
        !           221:   return ((struct objc_method_description *)
        !           222:            (object_is_instance(self)
        !           223:             ?class_get_instance_method(self->isa, aSel)
        !           224:             :class_get_class_method(self->isa, aSel)));
        !           225: }
        !           226: 
        !           227: - perform:(SEL)aSel
        !           228: {
        !           229:   IMP msg = objc_msg_lookup(self, aSel);
        !           230:   if (!msg)
        !           231:     return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
        !           232:   return (*msg)(self, aSel);
        !           233: }
        !           234: 
        !           235: - perform:(SEL)aSel with:anObject
        !           236: {
        !           237:   IMP msg = objc_msg_lookup(self, aSel);
        !           238:   if (!msg)
        !           239:     return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
        !           240:   return (*msg)(self, aSel, anObject);
        !           241: }
        !           242: 
        !           243: - perform:(SEL)aSel with:anObject1 with:anObject2
        !           244: {
        !           245:   IMP msg = objc_msg_lookup(self, aSel);
        !           246:   if (!msg)
        !           247:     return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
        !           248:   return (*msg)(self, aSel, anObject1, anObject2);
        !           249: }
        !           250: 
        !           251: - forward:(SEL)aSel :(arglist_t)argFrame
        !           252: {
        !           253:   return [self doesNotRecognize: aSel];
        !           254: }
        !           255: 
        !           256: - performv:(SEL)aSel :(arglist_t)argFrame
        !           257: {
        !           258:   return objc_msg_sendv(self, aSel, method_get_argsize(0), argFrame);
        !           259: }
        !           260: 
        !           261: + poseAs:(Class*)aClassObject
        !           262: {
        !           263:   return class_pose_as(self, aClassObject);
        !           264: }
        !           265: 
        !           266: - (Class*)transmuteClassTo:(Class*)aClassObject
        !           267: {
        !           268:   if (object_is_instance(self))
        !           269:     if (class_is_class(aClassObject))
        !           270:       if (class_get_instance_size(aClassObject)==class_get_instance_size(isa))
        !           271:         if ([self isKindOf:aClassObject])
        !           272:           {
        !           273:             Class* old_isa = isa;
        !           274:             isa = aClassObject;
        !           275:             return old_isa;
        !           276:           }
        !           277:   return nil;
        !           278: }
        !           279: 
        !           280: - subclassResponsibility:(SEL)aSel
        !           281: {
        !           282:   return [self error:"subclass should override %s", sel_get_name(aSel)];
        !           283: }
        !           284: 
        !           285: - notImplemented:(SEL)aSel
        !           286: {
        !           287:   return [self error:"method %s not implemented", sel_get_name(aSel)];
        !           288: }
        !           289: 
        !           290: - doesNotRecognize:(SEL)aSel
        !           291: {
        !           292:   return [self error:"%s does not recognize %s",
        !           293:                      object_get_class_name(self), sel_get_name(aSel)];
        !           294: }
        !           295: 
        !           296: - error:(const char *)aString, ...
        !           297: {
        !           298: #define FMT "error: %s (%s)\n%s\n"
        !           299:   char fmt[(strlen((char*)FMT)+strlen((char*)object_get_class_name(self))
        !           300:             +((aString!=NULL)?strlen((char*)aString):0)+8)];
        !           301:   va_list ap;
        !           302: 
        !           303:   sprintf(fmt, FMT, object_get_class_name(self),
        !           304:                     object_is_instance(self)?"instance":"class",
        !           305:                     (aString!=NULL)?aString:"");
        !           306:   va_start(ap, aString);
        !           307:   (*_objc_error)(self, fmt, ap);
        !           308:   va_end(ap);
        !           309:   return nil;
        !           310: #undef FMT
        !           311: }
        !           312: 
        !           313: + (int)version
        !           314: {
        !           315:   return class_get_version(self);
        !           316: }
        !           317: 
        !           318: + setVersion:(int)aVersion
        !           319: {
        !           320:   class_set_version(self, aVersion);
        !           321:   return self;
        !           322: }
        !           323: 
        !           324: + (int)streamVersion: (TypedStream*)aStream
        !           325: {
        !           326: #ifndef __alpha__
        !           327:   if (aStream->mode == OBJC_READONLY)
        !           328:     return objc_get_stream_class_version (aStream, self);
        !           329:   else
        !           330: #endif
        !           331:     return class_get_version (self);
        !           332: }
        !           333: 
        !           334: // These are used to write or read the instance variables 
        !           335: // declared in this particular part of the object.  Subclasses
        !           336: // should extend these, by calling [super read/write: aStream]
        !           337: // before doing their own archiving.  These methods are private, in
        !           338: // the sense that they should only be called from subclasses.
        !           339: 
        !           340: - read: (TypedStream*)aStream
        !           341: {
        !           342:   // [super read: aStream];  
        !           343:   return self;
        !           344: }
        !           345: 
        !           346: - write: (TypedStream*)aStream
        !           347: {
        !           348:   // [super write: aStream];
        !           349:   return self;
        !           350: }
        !           351: 
        !           352: - awake
        !           353: {
        !           354:   // [super awake];
        !           355:   return self;
        !           356: }
        !           357: 
        !           358: @end

unix.superglobalmegacorp.com

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