]> git.ipfire.org Git - thirdparty/gcc.git/blame_incremental - libobjc/objects.c
Makefile.def: Remove reference to boehm-gc target module.
[thirdparty/gcc.git] / libobjc / objects.c
... / ...
CommitLineData
1/* GNU Objective C Runtime class related functions
2 Copyright (C) 1993-2016 Free Software Foundation, Inc.
3 Contributed by Kresten Krab Thorup
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under the
8terms of the GNU General Public License as published by the Free Software
9Foundation; either version 3, or (at your option) any later version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14details.
15
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23<http://www.gnu.org/licenses/>. */
24
25#include "objc-private/common.h"
26#include "objc/runtime.h"
27#include "objc/thr.h" /* Required by objc-private/runtime.h. */
28#include "objc-private/module-abi-8.h" /* For CLS_ISCLASS and similar. */
29#include "objc-private/runtime.h" /* the kitchen sink */
30
31#include <string.h> /* For memcpy() */
32
33#if OBJC_WITH_GC
34# include <gc/gc.h>
35# include <gc/gc_typed.h>
36#endif
37
38/* FIXME: The semantics of extraBytes are not really clear. */
39inline
40id
41class_createInstance (Class class, size_t extraBytes)
42{
43 id new = nil;
44
45#if OBJC_WITH_GC
46 if (CLS_ISCLASS (class))
47 new = (id) GC_malloc_explicitly_typed (class->instance_size + extraBytes,
48 (GC_descr)class->gc_object_type);
49#else
50 if (CLS_ISCLASS (class))
51 new = (id) objc_calloc (class->instance_size + extraBytes, 1);
52#endif
53
54 if (new != nil)
55 {
56 /* There is no need to zero the memory, since both
57 GC_malloc_explicitly_typed and objc_calloc return zeroed
58 memory. */
59 new->class_pointer = class;
60 }
61
62 /* TODO: Invoke C++ constructors on all appropriate C++ instance
63 variables of the new object. */
64
65 return new;
66}
67
68/* Traditional GNU Objective-C Runtime API. */
69id
70object_copy (id object, size_t extraBytes)
71{
72 if ((object != nil) && CLS_ISCLASS (object->class_pointer))
73 {
74 /* TODO: How should it work with C++ constructors ? */
75 id copy = class_createInstance (object->class_pointer, extraBytes);
76 memcpy (copy, object, object->class_pointer->instance_size + extraBytes);
77 return copy;
78 }
79 else
80 return nil;
81}
82
83id
84object_dispose (id object)
85{
86 if ((object != nil) && CLS_ISCLASS (object->class_pointer))
87 {
88 /* TODO: Invoke C++ destructors on all appropriate C++ instance
89 variables. But what happens with the garbage collector ?
90 Would object_dispose() be ever called in that case ? */
91
92 objc_free (object);
93 }
94 return nil;
95}
96
97const char *
98object_getClassName (id object)
99{
100 if (object != nil)
101 return object->class_pointer->name;
102 else
103 return "Nil";
104}
105
106Class
107object_setClass (id object, Class class_)
108{
109 if (object == nil)
110 return Nil;
111 else
112 {
113 Class old_class = object->class_pointer;
114
115 object->class_pointer = class_;
116 return old_class;
117 }
118}