X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=libobjc%2Fobjects.c;h=9dc75d3b8e96cc7a21ae1f8950f9119724a24050;hb=e60b6e23741c6d6059e6f765f18ce4c56366874b;hp=c3732e3a444e5d1e841686bd662f439ff4815644;hpb=348a34452087772cd6239c29fc30bb1e1ff4ce33;p=gcc.git diff --git a/libobjc/objects.c b/libobjc/objects.c index c3732e3a444..9dc75d3b8e9 100644 --- a/libobjc/objects.c +++ b/libobjc/objects.c @@ -1,72 +1,81 @@ /* GNU Objective C Runtime class related functions - Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1993-2020 Free Software Foundation, Inc. Contributed by Kresten Krab Thorup This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2, or (at your option) any later version. +Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with -GCC; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. -/* As a special exception, if you link this library with files compiled with - GCC to produce an executable, this does not cause the resulting executable - to be covered by the GNU General Public License. This exception does not - however invalidate any other reasons why the executable file might be - covered by the GNU General Public License. */ +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ -#include "tconfig.h" /* include defs of bzero for target */ -#include "objc/objc.h" -#include "objc/runtime.h" /* the kitchen sink */ +#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 /* For memcpy() */ #if OBJC_WITH_GC -# include +# include +# include #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; } @@ -76,28 +85,34 @@ 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) +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; + } }