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