/* GNU Objective C Runtime class related functions
- Copyright (C) 1993, 1995, 1996, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1993, 1995, 1996, 2009, 2010 Free Software Foundation, Inc.
Contributed by Kresten Krab Thorup
This file is part of GCC.
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
+#include "objc-private/common.h"
+#include "objc/runtime.h"
+#include "objc/thr.h" /* Required by objc-private/runtime.h. */
+#include "objc-private/module-abi-8.h" /* For CLS_ISCLASS and similar. */
+#include "objc-private/runtime.h" /* the kitchen sink */
-#include "tconfig.h" /* include defs of bzero for target */
-#include "objc/objc.h"
-#include "objc/runtime.h" /* the kitchen sink */
+#include <string.h> /* For memcpy() */
#if OBJC_WITH_GC
# include <gc.h>
+# include <gc_typed.h>
#endif
-id __objc_object_alloc (Class);
-id __objc_object_dispose (id);
-id __objc_object_copy (id);
-
-id (*_objc_object_alloc) (Class) = __objc_object_alloc; /* !T:SINGLE */
-id (*_objc_object_dispose) (id) = __objc_object_dispose; /* !T:SINGLE */
-id (*_objc_object_copy) (id) = __objc_object_copy; /* !T:SINGLE */
-
+/* FIXME: The semantics of extraBytes are not really clear. */
+inline
id
-class_create_instance (Class class)
+class_createInstance (Class class, size_t extraBytes)
{
id new = nil;
#if OBJC_WITH_GC
if (CLS_ISCLASS (class))
- new = (id) GC_malloc_explicitly_typed (class->instance_size,
- class->gc_object_type);
+ new = (id) GC_malloc_explicitly_typed (class->instance_size + extraBytes,
+ (GC_descr)class->gc_object_type);
#else
if (CLS_ISCLASS (class))
- new = (*_objc_object_alloc) (class);
+ new = (id) objc_calloc (class->instance_size + extraBytes, 1);
#endif
if (new != nil)
{
- memset (new, 0, class->instance_size);
+ /* There is no need to zero the memory, since both
+ GC_malloc_explicitly_typed and objc_calloc return zeroed
+ memory. */
new->class_pointer = class;
}
+
+ /* TODO: Invoke C++ constructors on all appropriate C++ instance
+ variables of the new object. */
+
return new;
}
+/* Traditional GNU Objective-C Runtime API. */
id
-object_copy (id object)
+object_copy (id object, size_t extraBytes)
{
if ((object != nil) && CLS_ISCLASS (object->class_pointer))
- return (*_objc_object_copy) (object);
+ {
+ /* TODO: How should it work with C++ constructors ? */
+ id copy = class_createInstance (object->class_pointer, extraBytes);
+ memcpy (copy, object, object->class_pointer->instance_size + extraBytes);
+ return copy;
+ }
else
return nil;
}
{
if ((object != nil) && CLS_ISCLASS (object->class_pointer))
{
- if (_objc_object_dispose)
- (*_objc_object_dispose) (object);
- else
- objc_free (object);
+ /* TODO: Invoke C++ destructors on all appropriate C++ instance
+ variables. But what happens with the garbage collector ?
+ Would object_dispose() be ever called in that case ? */
+
+ objc_free (object);
}
return nil;
}
-id __objc_object_alloc (Class class)
+const char *
+object_getClassName (id object)
{
- return (id) objc_malloc (class->instance_size);
+ if (object != nil)
+ return object->class_pointer->name;
+ else
+ return "Nil";
}
-id __objc_object_dispose (id object)
+Class
+object_setClass (id object, Class class_)
{
- objc_free (object);
- return 0;
-}
+ if (object == nil)
+ return Nil;
+ else
+ {
+ Class old_class = object->class_pointer;
-id __objc_object_copy (id object)
-{
- id copy = class_create_instance (object->class_pointer);
- memcpy (copy, object, object->class_pointer->instance_size);
- return copy;
+ object->class_pointer = class_;
+ return old_class;
+ }
}