OSDN Git Service

2011-02-16 Jonathan Wakely <jwakely.gcc@gmail.com>
[pf3gnuchains/gcc-fork.git] / libobjc / objects.c
index df74b85..1c69456 100644 (file)
 /* GNU Objective C Runtime class related functions
-   Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1995, 1996, 2009, 2010 Free Software Foundation, Inc.
    Contributed by Kresten Krab Thorup
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify it under the
+GCC is free software; you can redistribute it and/or modify it under the
 terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2, or (at your option) any later version.
+Foundation; either version 3, or (at your option) any later version.
 
-GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 details.
 
-You should have received a copy of the GNU General Public License along with
-GNU CC; see the file COPYING.  If not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
 
-/* As a special exception, if you link this library with files compiled with
-   GCC to produce an executable, this does not cause the resulting executable
-   to be covered by the GNU General Public License. This exception does not
-   however invalidate any other reasons why the executable file might be
-   covered by the GNU General Public License.  */
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
 
-#include "tconfig.h"         /* include defs of bzero for target */
-#include "objc.h"
-#include "runtime.h"           /* the kitchen sink */
+#include "objc-private/common.h"
+#include "objc/runtime.h"
+#include "objc/thr.h"                   /* Required by objc-private/runtime.h.  */
+#include "objc-private/module-abi-8.h"  /* For CLS_ISCLASS and similar.  */
+#include "objc-private/runtime.h"      /* the kitchen sink */
+
+#include <string.h>                     /* For memcpy()  */
 
 #if OBJC_WITH_GC
 # include <gc.h>
+# include <gc_typed.h>
 #endif
 
-id __objc_object_alloc(Class);
-id __objc_object_dispose(id);
-id __objc_object_copy(id);
-
-id (*_objc_object_alloc)(Class)   = __objc_object_alloc;   /* !T:SINGLE */ 
-id (*_objc_object_dispose)(id)    = __objc_object_dispose; /* !T:SINGLE */
-id (*_objc_object_copy)(id)       = __objc_object_copy;    /* !T:SINGLE */
-
+/* FIXME: The semantics of extraBytes are not really clear.  */
+inline
 id
-class_create_instance(Class class)
+class_createInstance (Class class, size_t extraBytes)
 {
   id new = nil;
 
 #if OBJC_WITH_GC
-  if (CLS_ISCLASS(class))
-    new = (id)GC_malloc_explicitly_typed (class->instance_size,
-                                         class->gc_object_type);
+  if (CLS_ISCLASS (class))
+    new = (id) GC_malloc_explicitly_typed (class->instance_size + extraBytes,
+                                          (GC_descr)class->gc_object_type);
 #else
-  if (CLS_ISCLASS(class))
-    new = (*_objc_object_alloc)(class);
+  if (CLS_ISCLASS (class))
+    new = (id) objc_calloc (class->instance_size + extraBytes, 1);
 #endif
 
-  if (new!=nil)
+  if (new != nil)
     {
-      memset (new, 0, class->instance_size);
+      /* There is no need to zero the memory, since both
+        GC_malloc_explicitly_typed and objc_calloc return zeroed
+        memory.  */
       new->class_pointer = class;
     }
+
+  /* TODO: Invoke C++ constructors on all appropriate C++ instance
+     variables of the new object.  */
+
   return new;
 }
 
+/* Traditional GNU Objective-C Runtime API.  */
 id
-object_copy(id object)
+class_create_instance (Class class)
 {
-  if ((object!=nil)&&CLS_ISCLASS(object->class_pointer))
-    return (*_objc_object_copy)(object);
+  return class_createInstance (class, 0);
+}
+
+id
+object_copy (id object, size_t extraBytes)
+{
+  if ((object != nil) && CLS_ISCLASS (object->class_pointer))
+    {
+      /* TODO: How should it work with C++ constructors ? */
+      id copy = class_createInstance (object->class_pointer, extraBytes);
+      memcpy (copy, object, object->class_pointer->instance_size + extraBytes);
+      return copy;
+    }
   else
     return nil;
 }
 
 id
-object_dispose(id object)
+object_dispose (id object)
 {
-  if ((object!=nil)&&CLS_ISCLASS(object->class_pointer))
+  if ((object != nil) && CLS_ISCLASS (object->class_pointer))
     {
-      if (_objc_object_dispose)
-        (*_objc_object_dispose)(object);
-      else
-        objc_free(object);
+      /* TODO: Invoke C++ destructors on all appropriate C++ instance
+        variables.  But what happens with the garbage collector ?
+        Would object_dispose() be ever called in that case ?  */
+
+      objc_free (object);
     }
   return nil;
 }
 
-id __objc_object_alloc(Class class)
+const char *
+object_getClassName (id object)
 {
-  return (id)objc_malloc(class->instance_size);
+  if (object != nil)
+    return object->class_pointer->name;
+  else
+    return "Nil";
 }
 
-id __objc_object_dispose(id object) 
+Class
+object_setClass (id object, Class class_)
 {
-  objc_free(object);
-  return 0;
-}
+  if (object == nil)
+    return Nil;
+  else
+    {
+      Class old_class = object->class_pointer;
 
-id __objc_object_copy(id object)
-{
-  id copy = class_create_instance(object->class_pointer);
-  memcpy(copy, object, object->class_pointer->instance_size);
-  return copy;
+      object->class_pointer = class_;
+      return old_class;
+    }
 }
 
-
+/* Hook functions for memory allocation and disposal.  Deprecated and
+   currently unused.  */
+id (*_objc_object_alloc) (Class)   = 0;
+id (*_objc_object_dispose) (id)    = 0;
+id (*_objc_object_copy) (id)       = 0;