diff options
author | nicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-10 23:28:12 +0000 |
---|---|---|
committer | nicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-10 23:28:12 +0000 |
commit | 3c7443620817cc6069df183d192c42e9e3987d34 (patch) | |
tree | 17394fa0ccdc53e9f5134ffd956a7fcc4ca13406 /libobjc/objects.c | |
parent | e0931d1e10be3816ef123cc9b9735cc1fc49ead3 (diff) | |
download | gcc-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.c | 82 |
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; |