xref: /netbsd-src/external/gpl3/gcc/dist/libobjc/objects.c (revision e9e6e0f6fbc36b8de7586170291cf5fc97cab8b6)
14fee23f9Smrg /* GNU Objective C Runtime class related functions
2*e9e6e0f6Smrg    Copyright (C) 1993-2022 Free Software Foundation, Inc.
34fee23f9Smrg    Contributed by Kresten Krab Thorup
44fee23f9Smrg 
54fee23f9Smrg This file is part of GCC.
64fee23f9Smrg 
74fee23f9Smrg GCC is free software; you can redistribute it and/or modify it under the
84fee23f9Smrg terms of the GNU General Public License as published by the Free Software
94fee23f9Smrg Foundation; either version 3, or (at your option) any later version.
104fee23f9Smrg 
114fee23f9Smrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
124fee23f9Smrg WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
134fee23f9Smrg FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
144fee23f9Smrg details.
154fee23f9Smrg 
164fee23f9Smrg Under Section 7 of GPL version 3, you are granted additional
174fee23f9Smrg permissions described in the GCC Runtime Library Exception, version
184fee23f9Smrg 3.1, as published by the Free Software Foundation.
194fee23f9Smrg 
204fee23f9Smrg You should have received a copy of the GNU General Public License and
214fee23f9Smrg a copy of the GCC Runtime Library Exception along with this program;
224fee23f9Smrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
234fee23f9Smrg <http://www.gnu.org/licenses/>.  */
244fee23f9Smrg 
2548fb7bfaSmrg #include "objc-private/common.h"
2648fb7bfaSmrg #include "objc/runtime.h"
2748fb7bfaSmrg #include "objc/thr.h"                   /* Required by objc-private/runtime.h.  */
2848fb7bfaSmrg #include "objc-private/module-abi-8.h"  /* For CLS_ISCLASS and similar.  */
2948fb7bfaSmrg #include "objc-private/runtime.h"	/* the kitchen sink */
304fee23f9Smrg 
3148fb7bfaSmrg #include <string.h>                     /* For memcpy()  */
324fee23f9Smrg 
334fee23f9Smrg #if OBJC_WITH_GC
34a41324a9Smrg # include <gc/gc.h>
35a41324a9Smrg # include <gc/gc_typed.h>
364fee23f9Smrg #endif
374fee23f9Smrg 
3848fb7bfaSmrg /* FIXME: The semantics of extraBytes are not really clear.  */
394fee23f9Smrg id
class_createInstance(Class class,size_t extraBytes)4048fb7bfaSmrg class_createInstance (Class class, size_t extraBytes)
414fee23f9Smrg {
424fee23f9Smrg   id new = nil;
434fee23f9Smrg 
444fee23f9Smrg #if OBJC_WITH_GC
454fee23f9Smrg   if (CLS_ISCLASS (class))
4648fb7bfaSmrg     new = (id) GC_malloc_explicitly_typed (class->instance_size + extraBytes,
4748fb7bfaSmrg 					   (GC_descr)class->gc_object_type);
484fee23f9Smrg #else
494fee23f9Smrg   if (CLS_ISCLASS (class))
5048fb7bfaSmrg     new = (id) objc_calloc (class->instance_size + extraBytes, 1);
514fee23f9Smrg #endif
524fee23f9Smrg 
534fee23f9Smrg   if (new != nil)
544fee23f9Smrg     {
5548fb7bfaSmrg       /* There is no need to zero the memory, since both
5648fb7bfaSmrg 	 GC_malloc_explicitly_typed and objc_calloc return zeroed
5748fb7bfaSmrg 	 memory.  */
584fee23f9Smrg       new->class_pointer = class;
594fee23f9Smrg     }
6048fb7bfaSmrg 
6148fb7bfaSmrg   /* TODO: Invoke C++ constructors on all appropriate C++ instance
6248fb7bfaSmrg      variables of the new object.  */
6348fb7bfaSmrg 
644fee23f9Smrg   return new;
654fee23f9Smrg }
664fee23f9Smrg 
6748fb7bfaSmrg /* Traditional GNU Objective-C Runtime API.  */
684fee23f9Smrg id
object_copy(id object,size_t extraBytes)6948fb7bfaSmrg object_copy (id object, size_t extraBytes)
704fee23f9Smrg {
714fee23f9Smrg   if ((object != nil) && CLS_ISCLASS (object->class_pointer))
7248fb7bfaSmrg     {
7348fb7bfaSmrg       /* TODO: How should it work with C++ constructors ? */
7448fb7bfaSmrg       id copy = class_createInstance (object->class_pointer, extraBytes);
7548fb7bfaSmrg       memcpy (copy, object, object->class_pointer->instance_size + extraBytes);
7648fb7bfaSmrg       return copy;
7748fb7bfaSmrg     }
784fee23f9Smrg   else
794fee23f9Smrg     return nil;
804fee23f9Smrg }
814fee23f9Smrg 
824fee23f9Smrg id
object_dispose(id object)834fee23f9Smrg object_dispose (id object)
844fee23f9Smrg {
854fee23f9Smrg   if ((object != nil) && CLS_ISCLASS (object->class_pointer))
864fee23f9Smrg     {
8748fb7bfaSmrg       /* TODO: Invoke C++ destructors on all appropriate C++ instance
8848fb7bfaSmrg 	 variables.  But what happens with the garbage collector ?
8948fb7bfaSmrg 	 Would object_dispose() be ever called in that case ?  */
9048fb7bfaSmrg 
914fee23f9Smrg       objc_free (object);
924fee23f9Smrg     }
934fee23f9Smrg   return nil;
944fee23f9Smrg }
954fee23f9Smrg 
9648fb7bfaSmrg const char *
object_getClassName(id object)9748fb7bfaSmrg object_getClassName (id object)
984fee23f9Smrg {
9948fb7bfaSmrg   if (object != nil)
10048fb7bfaSmrg     return object->class_pointer->name;
10148fb7bfaSmrg   else
10248fb7bfaSmrg     return "Nil";
1034fee23f9Smrg }
1044fee23f9Smrg 
10548fb7bfaSmrg Class
object_setClass(id object,Class class_)10648fb7bfaSmrg object_setClass (id object, Class class_)
1074fee23f9Smrg {
10848fb7bfaSmrg   if (object == nil)
10948fb7bfaSmrg     return Nil;
11048fb7bfaSmrg   else
11148fb7bfaSmrg     {
11248fb7bfaSmrg       Class old_class = object->class_pointer;
1134fee23f9Smrg 
11448fb7bfaSmrg       object->class_pointer = class_;
11548fb7bfaSmrg       return old_class;
11648fb7bfaSmrg     }
1174fee23f9Smrg }
118