1/* GNU Objective C Runtime class related functions
2   Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
3   Contributed by Kresten Krab Thorup
4
5This file is part of GNU CC.
6
7GNU CC 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 2, or (at your option) any later version.
10
11GNU CC 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
16You should have received a copy of the GNU General Public License along with
17GNU CC; see the file COPYING.  If not, write to the Free Software
18Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA.  */
20
21/* As a special exception, if you link this library with files compiled with
22   GCC to produce an executable, this does not cause the resulting executable
23   to be covered by the GNU General Public License. This exception does not
24   however invalidate any other reasons why the executable file might be
25   covered by the GNU General Public License.  */
26
27#include "tconfig.h"         /* include defs of bzero for target */
28#include "objc.h"
29#include "runtime.h"		/* the kitchen sink */
30
31#if OBJC_WITH_GC
32# include <gc.h>
33#endif
34
35id __objc_object_alloc(Class);
36id __objc_object_dispose(id);
37id __objc_object_copy(id);
38
39id (*_objc_object_alloc)(Class)   = __objc_object_alloc;   /* !T:SINGLE */
40id (*_objc_object_dispose)(id)    = __objc_object_dispose; /* !T:SINGLE */
41id (*_objc_object_copy)(id)       = __objc_object_copy;    /* !T:SINGLE */
42
43id
44class_create_instance(Class class)
45{
46  id new = nil;
47
48#if OBJC_WITH_GC
49  if (CLS_ISCLASS(class))
50    new = (id)GC_malloc_explicitly_typed (class->instance_size,
51					  class->gc_object_type);
52#else
53  if (CLS_ISCLASS(class))
54    new = (*_objc_object_alloc)(class);
55#endif
56
57  if (new!=nil)
58    {
59      memset (new, 0, class->instance_size);
60      new->class_pointer = class;
61    }
62  return new;
63}
64
65id
66object_copy(id object)
67{
68  if ((object!=nil)&&CLS_ISCLASS(object->class_pointer))
69    return (*_objc_object_copy)(object);
70  else
71    return nil;
72}
73
74id
75object_dispose(id object)
76{
77  if ((object!=nil)&&CLS_ISCLASS(object->class_pointer))
78    {
79      if (_objc_object_dispose)
80        (*_objc_object_dispose)(object);
81      else
82        objc_free(object);
83    }
84  return nil;
85}
86
87id __objc_object_alloc(Class class)
88{
89  return (id)objc_malloc(class->instance_size);
90}
91
92id __objc_object_dispose(id object)
93{
94  objc_free(object);
95  return 0;
96}
97
98id __objc_object_copy(id object)
99{
100  id copy = class_create_instance(object->class_pointer);
101  memcpy(copy, object, object->class_pointer->instance_size);
102  return copy;
103}
104
105
106