1 /* The implementation of class Object for Objective-C.
2 Copyright (C) 1993, 1994, 1995, 1997, 2002, 2009 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC 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 3, or (at your option) any
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 <http://www.gnu.org/licenses/>. */
27 #include "objc/Object.h"
28 #include "objc/Protocol.h"
29 #include "objc/objc-api.h"
31 @implementation Object
45 return [[self alloc] init];
50 return class_create_instance(self);
55 return object_dispose(self);
60 return [[self shallowCopy] deepen];
65 return object_copy(self);
80 return object_get_class(self);
85 return object_get_super_class(self);
88 - (MetaClass)metaClass
90 return object_get_meta_class(self);
95 return object_get_class_name(self);
108 - (BOOL)isEqual:anObject
110 return self==anObject;
113 - (int)compare:(id)anotherObject;
115 if ([self isEqual:anotherObject])
117 // Ordering objects by their address is pretty useless,
118 // so subclasses should override this is some useful way.
119 else if ((id)self > anotherObject)
132 return object_is_class(self);
137 return object_is_instance(self);
140 - (BOOL)isKindOf:(Class)aClassObject
144 for (class = self->isa; class!=Nil; class = class_get_super_class(class))
145 if (class==aClassObject)
150 - (BOOL)isMemberOf:(Class)aClassObject
152 return self->isa==aClassObject;
155 - (BOOL)isKindOfClassNamed:(const char *)aClassName
159 if (aClassName!=NULL)
160 for (class = self->isa; class!=Nil; class = class_get_super_class(class))
161 if (!strcmp(class_get_class_name(class), aClassName))
166 - (BOOL)isMemberOfClassNamed:(const char *)aClassName
168 return ((aClassName!=NULL)
169 &&!strcmp(class_get_class_name(self->isa), aClassName));
172 + (BOOL)instancesRespondTo:(SEL)aSel
174 return class_get_instance_method(self, aSel)!=METHOD_NULL;
177 - (BOOL)respondsTo:(SEL)aSel
179 return ((object_is_instance(self)
180 ?class_get_instance_method(self->isa, aSel)
181 :class_get_class_method(self->isa, aSel))!=METHOD_NULL);
184 + (IMP)instanceMethodFor:(SEL)aSel
186 return method_get_imp(class_get_instance_method(self, aSel));
189 // Indicates if the receiving class or instance conforms to the given protocol
190 // not usually overridden by subclasses
192 // Modified 9/5/94 to always search the class object's protocol list, rather
193 // than the meta class.
195 + (BOOL) conformsTo: (Protocol*)aProtocol
198 struct objc_protocol_list* proto_list;
201 for (proto_list = ((Class)self)->protocols;
202 proto_list; proto_list = proto_list->next)
204 for (i=0; i < proto_list->count; i++)
206 if ([proto_list->list[i] conformsTo: aProtocol])
211 if ((parent = [self superClass]))
212 return [parent conformsTo: aProtocol];
217 - (BOOL) conformsTo: (Protocol*)aProtocol
219 return [[self class] conformsTo:aProtocol];
222 - (IMP)methodFor:(SEL)aSel
224 return (method_get_imp(object_is_instance(self)
225 ?class_get_instance_method(self->isa, aSel)
226 :class_get_class_method(self->isa, aSel)));
229 + (struct objc_method_description *)descriptionForInstanceMethod:(SEL)aSel
231 return ((struct objc_method_description *)
232 class_get_instance_method(self, aSel));
235 - (struct objc_method_description *)descriptionForMethod:(SEL)aSel
237 return ((struct objc_method_description *)
238 (object_is_instance(self)
239 ?class_get_instance_method(self->isa, aSel)
240 :class_get_class_method(self->isa, aSel)));
245 IMP msg = objc_msg_lookup(self, aSel);
247 return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
248 return (*msg)(self, aSel);
251 - perform:(SEL)aSel with:anObject
253 IMP msg = objc_msg_lookup(self, aSel);
255 return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
256 return (*msg)(self, aSel, anObject);
259 - perform:(SEL)aSel with:anObject1 with:anObject2
261 IMP msg = objc_msg_lookup(self, aSel);
263 return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
264 return (*msg)(self, aSel, anObject1, anObject2);
267 - (retval_t)forward:(SEL)aSel :(arglist_t)argFrame
269 (void) argFrame; /* UNUSED */
270 return (retval_t)[self doesNotRecognize: aSel];
273 - (retval_t)performv:(SEL)aSel :(arglist_t)argFrame
275 return objc_msg_sendv(self, aSel, argFrame);
278 + poseAs:(Class)aClassObject
280 return class_pose_as(self, aClassObject);
283 - (Class)transmuteClassTo:(Class)aClassObject
285 if (object_is_instance(self))
286 if (class_is_class(aClassObject))
287 if (class_get_instance_size(aClassObject)==class_get_instance_size(isa))
288 if ([self isKindOf:aClassObject])
297 - subclassResponsibility:(SEL)aSel
299 return [self error:"subclass should override %s", sel_get_name(aSel)];
302 - notImplemented:(SEL)aSel
304 return [self error:"method %s not implemented", sel_get_name(aSel)];
307 - shouldNotImplement:(SEL)aSel
309 return [self error:"%s should not implement %s",
310 object_get_class_name(self), sel_get_name(aSel)];
313 - doesNotRecognize:(SEL)aSel
315 return [self error:"%s does not recognize %s",
316 object_get_class_name(self), sel_get_name(aSel)];
319 - error:(const char *)aString, ...
321 #define FMT "error: %s (%s)\n%s\n"
322 char fmt[(strlen((char*)FMT)+strlen((char*)object_get_class_name(self))
323 +((aString!=NULL)?strlen((char*)aString):0)+8)];
326 sprintf(fmt, FMT, object_get_class_name(self),
327 object_is_instance(self)?"instance":"class",
328 (aString!=NULL)?aString:"");
329 va_start(ap, aString);
330 objc_verror(self, OBJC_ERR_UNKNOWN, fmt, ap);
338 return class_get_version(self);
341 + setVersion:(int)aVersion
343 class_set_version(self, aVersion);
348 /* The following methods were deprecated in GCC 4.6.0 and will be
349 removed in the next GCC release.
352 @implementation Object (Deprecated)
354 + (int)streamVersion: (TypedStream*)aStream
356 if (aStream->mode == OBJC_READONLY)
357 return objc_get_stream_class_version (aStream, self);
359 return class_get_version (self);
362 // These are used to write or read the instance variables
363 // declared in this particular part of the object. Subclasses
364 // should extend these, by calling [super read/write: aStream]
365 // before doing their own archiving. These methods are private, in
366 // the sense that they should only be called from subclasses.
368 - read: (TypedStream*)aStream
370 (void) aStream; /* UNUSED */
371 // [super read: aStream];
375 - write: (TypedStream*)aStream
377 (void) aStream; /* UNUSED */
378 // [super write: aStream];