summaryrefslogtreecommitdiff
path: root/libobjc/objects.c
diff options
context:
space:
mode:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-10 23:28:12 +0000
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-10 23:28:12 +0000
commit3c7443620817cc6069df183d192c42e9e3987d34 (patch)
tree17394fa0ccdc53e9f5134ffd956a7fcc4ca13406 /libobjc/objects.c
parente0931d1e10be3816ef123cc9b9735cc1fc49ead3 (diff)
downloadgcc-3c7443620817cc6069df183d192c42e9e3987d34.tar.gz
2010-10-11 Nicola Pero <nicola.pero@meta-innovation.com>
* objc/objc.h: Updated comments. * objc/objc-api.h: (object_copy): Added one argument; use a #define to maintain backwards-compatibility. Moved _objc_object_alloc, _objc_object_copy, _objc_object_dispose and objc_get_uninstalled_dtable into objc/deprecated/objc_get_uninstalled_dtable.h and objc/deprecated/objc_object_alloc.h. Include these files. * objc/deprecated/objc_get_uninstalled_dtable.h: New. * objc/deprecated/objc_object_alloc.h: New. * objc/runtime.h (set_getName): New. (sel_getType): New. (sel_getUid): New. (sel_registerName): New. (sel_registerTypedName): New. (sel_isEqual): New. (class_createInstance): New. (object_copy): New. (object_dispose): New. * objects.c: Do not include tconfig.h. Include gc_typed.h if building the garbage collection version. (__objc_object_alloc): Removed. (__objc_object_copy): Removed. (__objc_object_dispose): Removed. (class_createInstance): New from code in class_create_instance. Cast second argument of GC_malloc_explicitly_typed. Use objc_calloc. Do not call _objc_object_alloc. (class_create_instance): Call class_createInstance. (object_copy): Added extraBytes argument. Do not call _objc_object_copy. (object_dispose): Do not call _objc_object_dispose. * memory.c (objc_free): When using garbage collection, mark the argument as unused. * selector.c (sel_getName): New. (sel_get_name): Call sel_getName. (sel_getType): New. (sel_get_type): Call sel_getType. (sel_registerName): New. (sel_register_name): Call sel_registerName. (sel_registerTypedName): New. (sel_register_typed_name): Call sel_registerTypedName. (sel_getUid): New. (sel_get_uid): Call sel_getUid. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165264 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libobjc/objects.c')
-rw-r--r--libobjc/objects.c82
1 files changed, 45 insertions, 37 deletions
diff --git a/libobjc/objects.c b/libobjc/objects.c
index 9c237f49ea5..d37a95d17b4 100644
--- a/libobjc/objects.c
+++ b/libobjc/objects.c
@@ -23,51 +23,67 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#include "objc-private/common.h"
-#include <string.h> /* For memset */
-#include "tconfig.h" /* include defs of bzero for target */
#include "objc/objc.h"
#include "objc/objc-api.h"
#include "objc-private/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
+class_create_instance (Class class)
+{
+ return class_createInstance (class, 0);
+}
+
+/* Temporary, while we are including objc-api.h instead of runtime.h. */
+#undef object_copy
+
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;
}
@@ -77,28 +93,20 @@ object_dispose (id object)
{
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)
-{
- return (id) objc_malloc (class->instance_size);
-}
+/*
+ Hook functions for memory allocation and disposal. Deprecated
+ and currently unused.
+*/
-id __objc_object_dispose (id object)
-{
- objc_free (object);
- return 0;
-}
-
-id __objc_object_copy (id object)
-{
- id copy = class_create_instance (object->class_pointer);
- memcpy (copy, object, object->class_pointer->instance_size);
- return copy;
-}
+id (*_objc_object_alloc) (Class) = 0;
+id (*_objc_object_dispose) (id) = 0;
+id (*_objc_object_copy) (id) = 0;