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