xref: /netbsd-src/external/gpl3/gcc.old/dist/libobjc/objects.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
136ac495dSmrg /* GNU Objective C Runtime class related functions
2*8feb0f0bSmrg    Copyright (C) 1993-2020 Free Software Foundation, Inc.
336ac495dSmrg    Contributed by Kresten Krab Thorup
436ac495dSmrg 
536ac495dSmrg This file is part of GCC.
636ac495dSmrg 
736ac495dSmrg GCC is free software; you can redistribute it and/or modify it under the
836ac495dSmrg terms of the GNU General Public License as published by the Free Software
936ac495dSmrg Foundation; either version 3, or (at your option) any later version.
1036ac495dSmrg 
1136ac495dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1236ac495dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1336ac495dSmrg FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
1436ac495dSmrg details.
1536ac495dSmrg 
1636ac495dSmrg Under Section 7 of GPL version 3, you are granted additional
1736ac495dSmrg permissions described in the GCC Runtime Library Exception, version
1836ac495dSmrg 3.1, as published by the Free Software Foundation.
1936ac495dSmrg 
2036ac495dSmrg You should have received a copy of the GNU General Public License and
2136ac495dSmrg a copy of the GCC Runtime Library Exception along with this program;
2236ac495dSmrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2336ac495dSmrg <http://www.gnu.org/licenses/>.  */
2436ac495dSmrg 
2536ac495dSmrg #include "objc-private/common.h"
2636ac495dSmrg #include "objc/runtime.h"
2736ac495dSmrg #include "objc/thr.h"                   /* Required by objc-private/runtime.h.  */
2836ac495dSmrg #include "objc-private/module-abi-8.h"  /* For CLS_ISCLASS and similar.  */
2936ac495dSmrg #include "objc-private/runtime.h"	/* the kitchen sink */
3036ac495dSmrg 
3136ac495dSmrg #include <string.h>                     /* For memcpy()  */
3236ac495dSmrg 
3336ac495dSmrg #if OBJC_WITH_GC
3436ac495dSmrg # include <gc/gc.h>
3536ac495dSmrg # include <gc/gc_typed.h>
3636ac495dSmrg #endif
3736ac495dSmrg 
3836ac495dSmrg /* FIXME: The semantics of extraBytes are not really clear.  */
3936ac495dSmrg id
class_createInstance(Class class,size_t extraBytes)4036ac495dSmrg class_createInstance (Class class, size_t extraBytes)
4136ac495dSmrg {
4236ac495dSmrg   id new = nil;
4336ac495dSmrg 
4436ac495dSmrg #if OBJC_WITH_GC
4536ac495dSmrg   if (CLS_ISCLASS (class))
4636ac495dSmrg     new = (id) GC_malloc_explicitly_typed (class->instance_size + extraBytes,
4736ac495dSmrg 					   (GC_descr)class->gc_object_type);
4836ac495dSmrg #else
4936ac495dSmrg   if (CLS_ISCLASS (class))
5036ac495dSmrg     new = (id) objc_calloc (class->instance_size + extraBytes, 1);
5136ac495dSmrg #endif
5236ac495dSmrg 
5336ac495dSmrg   if (new != nil)
5436ac495dSmrg     {
5536ac495dSmrg       /* There is no need to zero the memory, since both
5636ac495dSmrg 	 GC_malloc_explicitly_typed and objc_calloc return zeroed
5736ac495dSmrg 	 memory.  */
5836ac495dSmrg       new->class_pointer = class;
5936ac495dSmrg     }
6036ac495dSmrg 
6136ac495dSmrg   /* TODO: Invoke C++ constructors on all appropriate C++ instance
6236ac495dSmrg      variables of the new object.  */
6336ac495dSmrg 
6436ac495dSmrg   return new;
6536ac495dSmrg }
6636ac495dSmrg 
6736ac495dSmrg /* Traditional GNU Objective-C Runtime API.  */
6836ac495dSmrg id
object_copy(id object,size_t extraBytes)6936ac495dSmrg object_copy (id object, size_t extraBytes)
7036ac495dSmrg {
7136ac495dSmrg   if ((object != nil) && CLS_ISCLASS (object->class_pointer))
7236ac495dSmrg     {
7336ac495dSmrg       /* TODO: How should it work with C++ constructors ? */
7436ac495dSmrg       id copy = class_createInstance (object->class_pointer, extraBytes);
7536ac495dSmrg       memcpy (copy, object, object->class_pointer->instance_size + extraBytes);
7636ac495dSmrg       return copy;
7736ac495dSmrg     }
7836ac495dSmrg   else
7936ac495dSmrg     return nil;
8036ac495dSmrg }
8136ac495dSmrg 
8236ac495dSmrg id
object_dispose(id object)8336ac495dSmrg object_dispose (id object)
8436ac495dSmrg {
8536ac495dSmrg   if ((object != nil) && CLS_ISCLASS (object->class_pointer))
8636ac495dSmrg     {
8736ac495dSmrg       /* TODO: Invoke C++ destructors on all appropriate C++ instance
8836ac495dSmrg 	 variables.  But what happens with the garbage collector ?
8936ac495dSmrg 	 Would object_dispose() be ever called in that case ?  */
9036ac495dSmrg 
9136ac495dSmrg       objc_free (object);
9236ac495dSmrg     }
9336ac495dSmrg   return nil;
9436ac495dSmrg }
9536ac495dSmrg 
9636ac495dSmrg const char *
object_getClassName(id object)9736ac495dSmrg object_getClassName (id object)
9836ac495dSmrg {
9936ac495dSmrg   if (object != nil)
10036ac495dSmrg     return object->class_pointer->name;
10136ac495dSmrg   else
10236ac495dSmrg     return "Nil";
10336ac495dSmrg }
10436ac495dSmrg 
10536ac495dSmrg Class
object_setClass(id object,Class class_)10636ac495dSmrg object_setClass (id object, Class class_)
10736ac495dSmrg {
10836ac495dSmrg   if (object == nil)
10936ac495dSmrg     return Nil;
11036ac495dSmrg   else
11136ac495dSmrg     {
11236ac495dSmrg       Class old_class = object->class_pointer;
11336ac495dSmrg 
11436ac495dSmrg       object->class_pointer = class_;
11536ac495dSmrg       return old_class;
11636ac495dSmrg     }
11736ac495dSmrg }
118