OSDN Git Service

In libobjc/:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Sep 2010 00:43:15 +0000 (00:43 +0000)
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Sep 2010 00:43:15 +0000 (00:43 +0000)
        * objc/deprecated/objc_error.h: New file.
        * objc/objc-api.h: Include deprecated/objc_error.h instead of
        defining objc_error and related.
        * error.c: New file.  Added _objc_abort function which replaces
        objc_error.  No change in functionality as they both print an
        error and abort.
        * misc.c: File removed.  Code moved into memory.c and error.c.
        * memory.c: New file.
        * objc-private/error.h: New file.
        * archive.c: Include objc-private/error.h and use _objc_abort
        instead of objc_error everywhere.
        * class.c: Same change.
        * encoding.c: Same change.
        * init.c: Same change, and simplified init_check_module_version.
        * memory.c: Same change.
        * sendmsg.c:  Same change.
        * thr.c: Same change.
        * Makefile.in (OBJ_DEPRECATED_H): Added objc_error.h.
        (OBJ_H): Reordered list.
        (OBJS): Removed misc.lo, added memory.lo and error.lo.
        (OBJS_GC): Removed misc_gc.lo, added memory_gc.lo and error_gc.lo.
        (misc_gc.lo): Rule removed.
        (error_gc.lo): Rule added.
        (memory_gc.lo): Rule added.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164223 138bc75d-0d04-0410-961f-82ee72b054a4

14 files changed:
libobjc/ChangeLog
libobjc/Makefile.in
libobjc/archive.c
libobjc/class.c
libobjc/encoding.c
libobjc/error.c [new file with mode: 0644]
libobjc/init.c
libobjc/libobjc.def
libobjc/memory.c [moved from libobjc/misc.c with 57% similarity]
libobjc/objc-private/error.h [new file with mode: 0644]
libobjc/objc/deprecated/objc_error.h [new file with mode: 0644]
libobjc/objc/objc-api.h
libobjc/sendmsg.c
libobjc/thr.c

index 0fdcb6e..0d46882 100644 (file)
@@ -1,5 +1,32 @@
 2010-09-12  Nicola Pero  <nicola.pero@meta-innovation.com>
 
+       * objc/deprecated/objc_error.h: New file.
+       * objc/objc-api.h: Include deprecated/objc_error.h instead of
+       defining objc_error and related.
+       * error.c: New file.  Added _objc_abort function which replaces
+       objc_error.  No change in functionality as they both print an
+       error and abort.
+       * misc.c: File removed.  Code moved into memory.c and error.c.
+       * memory.c: New file.
+       * objc-private/error.h: New file.
+       * archive.c: Include objc-private/error.h and use _objc_abort
+       instead of objc_error everywhere.
+       * class.c: Same change.
+       * encoding.c: Same change.
+       * init.c: Same change, and simplified init_check_module_version.
+       * memory.c: Same change.
+       * sendmsg.c:  Same change.
+       * thr.c: Same change.
+       * Makefile.in (OBJ_DEPRECATED_H): Added objc_error.h.
+       (OBJ_H): Reordered list.
+       (OBJS): Removed misc.lo, added memory.lo and error.lo.
+       (OBJS_GC): Removed misc_gc.lo, added memory_gc.lo and error_gc.lo.
+       (misc_gc.lo): Rule removed.
+       (error_gc.lo): Rule added.
+       (memory_gc.lo): Rule added.
+       
+2010-09-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
        * objc/objc.h (__GNU_LIBOBJC__): New #define providing an easy way
        to check the API version.  Added some comments.
 
index 1dfced3..ac042ac 100644 (file)
@@ -147,18 +147,18 @@ OBJC_H = \
   objc.h \
   objc-exception.h \
   \
-  message.h \
-  hash.h \
-  objc-list.h \
-  sarray.h \
-  objc-api.h \
   NXConstStr.h \
   Object.h \
   Protocol.h \
   encoding.h \
-  typedstream.h \
+  hash.h \
+  message.h \
+  objc-api.h \
+  objc-decls.h \
+  objc-list.h \
+  sarray.h \
   thr.h \
-  objc-decls.h
+  typedstream.h
 
 # User-visible header files containing deprecated APIs, from the
 # objc/deprecated directory
@@ -167,6 +167,7 @@ OBJC_DEPRECATED_H = \
   MetaClass.h \
   Object.h \
   STR.h \
+  objc_error.h \
   objc_unexpected_exception.h \
   struct_objc_class.h \
   struct_objc_protocol.h \
@@ -175,16 +176,47 @@ OBJC_DEPRECATED_H = \
 
 # Modules that comprise the runtime library.
 
-OBJS =    archive.lo class.lo encoding.lo gc.lo hash.lo init.lo linking.lo \
-         misc.lo nil_method.lo NXConstStr.lo Object.lo objects.lo \
-         Protocol.lo sarray.lo selector.lo sendmsg.lo thr.lo \
-         exception.lo
-
-OBJS_GC = archive_gc.lo class_gc.lo encoding_gc.lo gc_gc.lo hash_gc.lo \
-         init_gc.lo linking_gc.lo misc_gc.lo nil_method_gc.lo \
-         NXConstStr_gc.lo Object_gc.lo objects_gc.lo Protocol_gc.lo \
-         sarray_gc.lo selector_gc.lo sendmsg_gc.lo thr_gc.lo \
-         exception_gc.lo
+OBJS =  \
+   NXConstStr.lo \
+   Object.lo \
+   Protocol.lo \
+   archive.lo \
+   class.lo \
+   encoding.lo \
+   error.lo \
+   gc.lo \
+   hash.lo \
+   init.lo \
+   linking.lo \
+   memory.lo \
+   nil_method.lo \
+   objects.lo \
+   sarray.lo \
+   selector.lo \
+   sendmsg.lo \
+   thr.lo \
+   exception.lo
+
+OBJS_GC = \
+   NXConstStr_gc.lo \
+   Object_gc.lo \
+   Protocol_gc.lo \
+   archive_gc.lo \
+   class_gc.lo \
+   encoding_gc.lo \
+   error_gc.lo \
+   gc_gc.lo \
+   hash_gc.lo \
+   init_gc.lo \
+   linking_gc.lo \
+   memory_gc.lo \
+   nil_method_gc.lo \
+   objects_gc.lo \
+   sarray_gc.lo \
+   selector_gc.lo \
+   sendmsg_gc.lo \
+   thr_gc.lo \
+   exception_gc.lo
 
 runtime-info.h: 
        echo "" > tmp-runtime.m
@@ -208,6 +240,10 @@ encoding_gc.lo: encoding.c
        $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
                $(INCLUDES) $<
 
+error_gc.lo: error.c
+       $(LIBTOOL_COMPILE) $(CC) -c $(ALL_CFLAGS) -o $@ $(OBJC_GCFLAGS) \
+               $(INCLUDES) $<
+
 gc.lo: gc.c
        $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(INCLUDES) $<
 
@@ -231,7 +267,7 @@ linking_gc.lo: linking.m
        $(LIBTOOL_COMPILE) $(CC) -fgnu-runtime -c -o $@ $(ALL_CFLAGS) \
                $(OBJC_GCFLAGS) $(INCLUDES) $<
 
-misc_gc.lo: misc.c
+memory_gc.lo: memory.c
        $(LIBTOOL_COMPILE) $(CC) -c $(ALL_CFLAGS) -o $@ $(OBJC_GCFLAGS) \
                $(INCLUDES) $<
 
index 6603ab1..9b46976 100644 (file)
@@ -22,7 +22,10 @@ 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/>.  */
 
+/* This file is entirely deprecated and will be removed.  */
+
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 #include "tconfig.h"
 #include "objc/objc.h"
 #include "objc/objc-api.h"
@@ -364,8 +367,7 @@ __objc_write_extension (struct objc_typed_stream *stream, unsigned char code)
     }
   else 
     {
-      objc_error (nil, OBJC_ERR_BAD_OPCODE,
-                 "__objc_write_extension: bad opcode %c\n", code);
+      _objc_abort ("__objc_write_extension: bad opcode %c\n", code);
       return -1;
     }
 }
@@ -402,8 +404,7 @@ objc_write_root_object (struct objc_typed_stream *stream, id object)
 {
   int len = 0;
   if (stream->writing_root_p)
-    objc_error (nil, OBJC_ERR_RECURSE_ROOT, 
-               "objc_write_root_object called recursively");
+    _objc_abort ("objc_write_root_object called recursively");
   else
     {
       stream->writing_root_p = 1;
@@ -527,9 +528,8 @@ objc_read_char (struct objc_typed_stream *stream, char *val)
        }
 
       else
-       objc_error (nil, OBJC_ERR_BAD_DATA,
-                   "expected 8bit signed int, got %dbit int",
-                   (int) (buf&_B_NUMBER)*8);
+       _objc_abort ("expected 8bit signed int, got %dbit int",
+                    (int) (buf&_B_NUMBER)*8);
     }
   return len;
 }
@@ -549,9 +549,8 @@ objc_read_unsigned_char (struct objc_typed_stream *stream, unsigned char *val)
        len = (*stream->read) (stream->physical, (char*)val, 1);
 
       else
-       objc_error (nil, OBJC_ERR_BAD_DATA,
-                   "expected 8bit unsigned int, got %dbit int",
-                   (int) (buf&_B_NUMBER)*8);
+       _objc_abort ("expected 8bit unsigned int, got %dbit int",
+                    (int) (buf&_B_NUMBER)*8);
     }
   return len;
 }
@@ -571,8 +570,7 @@ objc_read_short (struct objc_typed_stream *stream, short *value)
          int pos = 1;
          int nbytes = buf[0] & _B_NUMBER;
          if (nbytes > (int) sizeof (short))
-           objc_error (nil, OBJC_ERR_BAD_DATA,
-                       "expected short, got bigger (%dbits)", nbytes*8);
+           _objc_abort ("expected short, got bigger (%dbits)", nbytes*8);
          len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
          (*value) = 0;
          while (pos <= nbytes)
@@ -600,8 +598,7 @@ objc_read_unsigned_short (struct objc_typed_stream *stream,
          int pos = 1;
          int nbytes = buf[0] & _B_NUMBER;
          if (nbytes > (int) sizeof (short))
-           objc_error (nil, OBJC_ERR_BAD_DATA,
-                       "expected short, got int or bigger");
+           _objc_abort ("expected short, got int or bigger");
          len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
          (*value) = 0;
          while (pos <= nbytes)
@@ -627,7 +624,7 @@ objc_read_int (struct objc_typed_stream *stream, int *value)
          int pos = 1;
          int nbytes = buf[0] & _B_NUMBER;
          if (nbytes > (int) sizeof (int))
-           objc_error (nil, OBJC_ERR_BAD_DATA, "expected int, got bigger");
+           _objc_abort ("expected int, got bigger");
          len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
          (*value) = 0;
          while (pos <= nbytes)
@@ -654,7 +651,7 @@ objc_read_long (struct objc_typed_stream *stream, long *value)
          int pos = 1;
          int nbytes = buf[0] & _B_NUMBER;
          if (nbytes > (int) sizeof (long))
-           objc_error (nil, OBJC_ERR_BAD_DATA, "expected long, got bigger");
+           _objc_abort ("expected long, got bigger");
          len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
          (*value) = 0;
          while (pos <= nbytes)
@@ -675,7 +672,7 @@ __objc_read_nbyte_uint (struct objc_typed_stream *stream,
   unsigned char buf[sizeof (unsigned int) + 1];
 
   if (nbytes > sizeof (int))
-    objc_error (nil, OBJC_ERR_BAD_DATA, "expected int, got bigger");
+    _objc_abort ("expected int, got bigger");
 
   len = (*stream->read) (stream->physical, (char*)buf, nbytes);
   (*val) = 0;
@@ -712,7 +709,7 @@ __objc_read_nbyte_ulong (struct objc_typed_stream *stream,
   unsigned char buf[sizeof (unsigned long) + 1];
 
   if (nbytes > sizeof (long))
-    objc_error (nil, OBJC_ERR_BAD_DATA, "expected long, got bigger");
+    _objc_abort ("expected long, got bigger");
 
   len = (*stream->read) (stream->physical, (char*)buf, nbytes);
   (*val) = 0;
@@ -793,8 +790,7 @@ objc_read_string (struct objc_typed_stream *stream,
        break;
        
       default:
-       objc_error (nil, OBJC_ERR_BAD_DATA,
-                   "expected string, got opcode %c\n", (buf[0]&_B_CODE));
+       _objc_abort ("expected string, got opcode %c\n", (buf[0]&_B_CODE));
       }
     }
 
@@ -839,14 +835,13 @@ objc_read_object (struct objc_typed_stream *stream, id *object)
          /* check null-byte */
          len = (*stream->read) (stream->physical, (char*)buf, 1);
          if (buf[0] != '\0')
-           objc_error (nil, OBJC_ERR_BAD_DATA,
-                       "expected null-byte, got opcode %c", buf[0]);
+           _objc_abort ("expected null-byte, got opcode %c", buf[0]);
        }
 
       else if ((buf[0]&_B_CODE) == _B_UCOMM)
        {
          if (key)
-           objc_error (nil, OBJC_ERR_BAD_KEY, "cannot register use upcode...");
+           _objc_abort ("cannot register use upcode...");
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
          (*object) = objc_hash_value_for_key (stream->object_table,
                                               LONG2PTR(key));
@@ -866,15 +861,13 @@ objc_read_object (struct objc_typed_stream *stream, id *object)
       else if (buf[0] == (_B_EXT | _BX_OBJROOT)) /* a root object */
        {
          if (key)
-           objc_error (nil, OBJC_ERR_BAD_KEY,
-                       "cannot register root object...");
+           _objc_abort ("cannot register root object...");
          len = objc_read_object (stream, object);
          __objc_finish_read_root_object (stream);
        }
 
       else
-       objc_error (nil, OBJC_ERR_BAD_DATA,
-                   "expected object, got opcode %c", buf[0]);
+       _objc_abort ("expected object, got opcode %c", buf[0]);
     }
   return len;
 }
@@ -917,18 +910,16 @@ objc_read_class (struct objc_typed_stream *stream, Class *class)
       else if ((buf[0]&_B_CODE) == _B_UCOMM)
        {
          if (key)
-           objc_error (nil, OBJC_ERR_BAD_KEY, "cannot register use upcode...");
+           _objc_abort ("cannot register use upcode...");
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
          *class = objc_hash_value_for_key (stream->stream_table,
                                            LONG2PTR(key));
          if (! *class)
-           objc_error (nil, OBJC_ERR_BAD_CLASS,
-                       "cannot find class for key %lu", key);
+           _objc_abort ("cannot find class for key %lu", key);
        }
 
       else
-       objc_error (nil, OBJC_ERR_BAD_DATA,
-                   "expected class, got opcode %c", buf[0]);
+       _objc_abort ("expected class, got opcode %c", buf[0]);
     }
   return len;
 }
@@ -974,15 +965,14 @@ objc_read_selector (struct objc_typed_stream *stream, SEL* selector)
       else if ((buf[0]&_B_CODE) == _B_UCOMM)
        {
          if (key)
-           objc_error (nil, OBJC_ERR_BAD_KEY, "cannot register use upcode...");
+           _objc_abort ("cannot register use upcode...");
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
          (*selector) = objc_hash_value_for_key (stream->stream_table, 
                                                 LONG2PTR(key));
        }
 
       else
-       objc_error (nil, OBJC_ERR_BAD_DATA,
-                   "expected selector, got opcode %c", buf[0]);
+       _objc_abort ("expected selector, got opcode %c", buf[0]);
     }
   return len;
 }
@@ -1082,8 +1072,7 @@ objc_write_type (TypedStream *stream, const char *type, const void *data)
 
   default:
     {
-      objc_error (nil, OBJC_ERR_BAD_TYPE,
-                 "objc_write_type: cannot parse typespec: %s\n", type);
+      _objc_abort ("objc_write_type: cannot parse typespec: %s\n", type);
       return 0;
     }
   }
@@ -1178,8 +1167,7 @@ objc_read_type(TypedStream *stream, const char *type, void *data)
 
   default:
     {
-      objc_error (nil, OBJC_ERR_BAD_TYPE,
-                 "objc_read_type: cannot parse typespec: %s\n", type);
+      _objc_abort ("objc_read_type: cannot parse typespec: %s\n", type);
       return 0;
     }
   }
@@ -1276,13 +1264,12 @@ objc_write_types (TypedStream *stream, const char *type, ...)
          res = objc_write_array (stream, t, len, va_arg (args, void *));
          t = objc_skip_typespec (t);
          if (*t != _C_ARY_E)
-           objc_error (nil, OBJC_ERR_BAD_TYPE, "expected `]', got: %s", t);
+           _objc_abort ("expected `]', got: %s", t);
        }
        break; 
        
       default:
-       objc_error (nil, OBJC_ERR_BAD_TYPE, 
-                   "objc_write_types: cannot parse typespec: %s\n", type);
+       _objc_abort ("objc_write_types: cannot parse typespec: %s\n", type);
       }
     }
   va_end(args);
@@ -1368,13 +1355,12 @@ objc_read_types(TypedStream *stream, const char *type, ...)
          res = objc_read_array (stream, t, len, va_arg (args, void *));
          t = objc_skip_typespec (t);
          if (*t != _C_ARY_E)
-           objc_error (nil, OBJC_ERR_BAD_TYPE, "expected `]', got: %s", t);
+           _objc_abort ("expected `]', got: %s", t);
        }
        break; 
        
       default:
-       objc_error (nil, OBJC_ERR_BAD_TYPE, 
-                   "objc_read_types: cannot parse typespec: %s\n", type);
+       _objc_abort ("objc_read_types: cannot parse typespec: %s\n", type);
       }
     }
   va_end (args);
@@ -1446,7 +1432,7 @@ __objc_no_write (FILE *file __attribute__ ((__unused__)),
                 const char *data __attribute__ ((__unused__)),
                 int len __attribute__ ((__unused__)))
 {
-  objc_error (nil, OBJC_ERR_NO_WRITE, "TypedStream not open for writing");
+  _objc_abort ("TypedStream not open for writing");
   return 0;
 }
 
@@ -1455,7 +1441,7 @@ __objc_no_read (FILE *file __attribute__ ((__unused__)),
                const char *data __attribute__ ((__unused__)),
                int len __attribute__ ((__unused__)))
 {
-  objc_error (nil, OBJC_ERR_NO_READ, "TypedStream not open for reading");
+  _objc_abort ("TypedStream not open for reading");
   return 0;
 }
 
@@ -1470,8 +1456,7 @@ __objc_read_typed_stream_signature (TypedStream *stream)
     ;
   sscanf (buffer, "GNU TypedStream %d", &stream->version);
   if (stream->version != OBJC_TYPED_STREAM_VERSION)
-    objc_error (nil, OBJC_ERR_STREAM_VERSION,
-               "cannot handle TypedStream version %d", stream->version);
+    _objc_abort ("cannot handle TypedStream version %d", stream->version);
   return 1;
 }
 
index 37b2b4e..76f9e8f 100644 (file)
@@ -88,6 +88,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   structures is freeing data when is removed from the structures.  */
 
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 #include "objc/objc.h"
 #include "objc/objc-api.h"
 #include "objc/thr.h"
@@ -500,8 +501,9 @@ objc_get_class (const char *name)
   if (class)
     return class;
   
-  objc_error (nil, OBJC_ERR_BAD_CLASS, 
-              "objc runtime: cannot find class %s\n", name);
+  /* FIXME: Should we abort the program here ?  */
+  _objc_abort ("objc runtime: cannot find class %s\n", name);
+
   return 0;
 }
 
index 5694530..c0d79d9 100644 (file)
@@ -27,7 +27,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 /* FIXME: This file has no business including tm.h.  */
 
+/* FIXME: This file contains functions that will abort the entire
+   program if they fail.  Is that really needed ?
+*/
+
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 #include "tconfig.h"
 #include "coretypes.h"
 #include "tm.h"
@@ -316,8 +321,11 @@ objc_sizeof_type (const char *type)
            
            default:
              {
-               objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown complex type %s\n",
-                           type);
+               /* FIXME: Is this so bad that we have to abort the
+                  entire program ?  (it applies to all the other
+                  _objc_abort calls in this file).
+               */
+               _objc_abort ("unknown complex type %s\n", type);
                return 0;
              }
        }
@@ -325,7 +333,7 @@ objc_sizeof_type (const char *type)
 
   default:
     {
-      objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type);
+      _objc_abort ("unknown type %s\n", type);
       return 0;
     }
   }
@@ -491,8 +499,7 @@ objc_alignof_type (const char *type)
            
            default:
              {
-               objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown complex type %s\n",
-                           type);
+               _objc_abort ("unknown complex type %s\n", type);
                return 0;
              }
        }
@@ -500,7 +507,7 @@ objc_alignof_type (const char *type)
 
   default:
     {
-      objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type);
+      _objc_abort ("unknown type %s\n", type);
       return 0;
     }
   }
@@ -643,7 +650,7 @@ objc_skip_typespec (const char *type)
       return ++type;
     else
       {
-       objc_error (nil, OBJC_ERR_BAD_TYPE, "bad array type %s\n", type);
+       _objc_abort ("bad array type %s\n", type);
        return 0;
       }
 
@@ -684,7 +691,7 @@ objc_skip_typespec (const char *type)
 
   default:
     {
-      objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type);
+      _objc_abort ("unknown type %s\n", type);
       return 0;
     }
   }
@@ -882,9 +889,8 @@ objc_layout_structure (const char *type,
 
   if (*type != _C_UNION_B && *type != _C_STRUCT_B)
     {
-      objc_error (nil, OBJC_ERR_BAD_TYPE,
-                 "record (or union) type expected in objc_layout_structure, got %s\n",
-                 type);
+      _objc_abort ("record (or union) type expected in objc_layout_structure, got %s\n",
+                  type);
     }
 
   type ++;
diff --git a/libobjc/error.c b/libobjc/error.c
new file mode 100644 (file)
index 0000000..0dc8fd8
--- /dev/null
@@ -0,0 +1,99 @@
+/* GNU Objective C Runtime Error Functions
+   Copyright (C) 1993, 1994, 1995, 1996, 1997, 2002, 2009, 2010
+   Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+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 3, or (at your option) any
+later version.
+
+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.
+
+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.
+
+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 "objc-private/common.h"
+#include "objc-private/error.h"
+
+/* __USE_FIXED_PROTOTYPES__ used to be required to get prototypes for
+   malloc, free, etc. on some platforms.  It is unclear if we still
+   need it, but it can't hurt.
+*/
+#define __USE_FIXED_PROTOTYPES__
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+/* Prints an error message and aborts the program.  */
+void
+_objc_abort (const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start (ap, fmt);
+  vfprintf (stderr, fmt, ap);
+  abort ();
+  va_end (ap);
+}
+
+/* The rest of the file is deprecated.  */
+#include "objc/objc.h"
+#include "objc/objc-api.h"
+
+/*
+** Error handler function
+** NULL so that default is to just print to stderr
+*/
+static objc_error_handler _objc_error_handler = NULL;
+
+/* Trigger an objc error */
+void
+objc_error (id object, int code, const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start (ap, fmt);
+  objc_verror (object, code, fmt, ap);
+  va_end (ap);
+}
+
+/* Trigger an objc error */
+void
+objc_verror (id object, int code, const char *fmt, va_list ap)
+{
+  BOOL result = NO;
+
+  /* Call the error handler if its there
+     Otherwise print to stderr */
+  if (_objc_error_handler)
+    result = (*_objc_error_handler) (object, code, fmt, ap);
+  else
+    vfprintf (stderr, fmt, ap);
+
+  /* Continue if the error handler says its ok
+     Otherwise abort the program */
+  if (result)
+    return;
+  else
+    abort ();
+}
+
+/* Set the error handler */
+objc_error_handler
+objc_set_error_handler (objc_error_handler func)
+{
+  objc_error_handler temp = _objc_error_handler;
+  _objc_error_handler = func;
+  return temp;
+}
index 75e0b10..de624cf 100644 (file)
@@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 #include "objc/objc.h"
 #include "objc/objc-api.h"
 #include "objc/thr.h"
@@ -824,17 +825,8 @@ init_check_module_version (Module_t module)
 {
   if ((module->version != OBJC_VERSION) || (module->size != sizeof (Module)))
     {
-      int code;
-
-      if (module->version > OBJC_VERSION)
-       code = OBJC_ERR_OBJC_VERSION;
-      else if (module->version < OBJC_VERSION)
-       code = OBJC_ERR_GCC_VERSION;
-      else
-       code = OBJC_ERR_MODULE_SIZE;
-
-      objc_error (nil, code, "Module %s version %d doesn't match runtime %d\n",
-                 module->name, (int)module->version, OBJC_VERSION);
+      _objc_abort ("Module %s version %d doesn't match runtime %d\n",
+                  module->name, (int)module->version, OBJC_VERSION);
     }
 }
 
@@ -876,11 +868,10 @@ __objc_init_protocols (struct objc_protocol_list *protos)
        }
       else if (protos->list[i]->class_pointer != proto_class)
        {
-         objc_error (nil, OBJC_ERR_PROTOCOL_VERSION,
-                    "Version %d doesn't match runtime protocol version %d\n",
-                    (int) ((char *) protos->list[i]->class_pointer
-                           - (char *) 0),
-                    PROTOCOL_VERSION);
+         _objc_abort ("Version %d doesn't match runtime protocol version %d\n",
+                      (int) ((char *) protos->list[i]->class_pointer
+                             - (char *) 0),
+                      PROTOCOL_VERSION);
        }
     }
 
index 27be47e..2d27fa5 100644 (file)
@@ -16,6 +16,8 @@
 ;  You should have received a copy of the GNU General Public License along with
 ;  GCC; see the file COPYING3.  If not, see <http://www.gnu.org/licenses/>.
 
+; FIXME: This file needs to be updated or removed
+
 LIBRARY libobjc
 EXPORTS
 search_for_method_in_list
similarity index 57%
rename from libobjc/misc.c
rename to libobjc/memory.c
index fde1f30..2cb4dd3 100644 (file)
@@ -1,5 +1,5 @@
-/* GNU Objective C Runtime Miscellaneous 
-   Copyright (C) 1993, 1994, 1995, 1996, 1997, 2002, 2009
+/* GNU Objective C Runtime Memory allocation functions
+   Copyright (C) 1993, 1994, 1995, 1996, 1997, 2002, 2009, 2010
    Free Software Foundation, Inc.
    Contributed by Kresten Krab Thorup
 
@@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 
 /* __USE_FIXED_PROTOTYPES__ used to be required to get prototypes for
    malloc, free, etc. on some platforms.  It is unclear if we still
@@ -38,57 +39,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "objc-private/runtime.h"
 
 /*
-** Error handler function
-** NULL so that default is to just print to stderr
-*/
-static objc_error_handler _objc_error_handler = NULL;
-
-/* Trigger an objc error */
-void
-objc_error (id object, int code, const char *fmt, ...)
-{
-  va_list ap;
-
-  va_start (ap, fmt);
-  objc_verror (object, code, fmt, ap);
-  va_end (ap);
-}
-
-/* Trigger an objc error */
-void
-objc_verror (id object, int code, const char *fmt, va_list ap)
-{
-  BOOL result = NO;
-
-  /* Call the error handler if its there
-     Otherwise print to stderr */
-  if (_objc_error_handler)
-    result = (*_objc_error_handler) (object, code, fmt, ap);
-  else
-    vfprintf (stderr, fmt, ap);
-
-  /* Continue if the error handler says its ok
-     Otherwise abort the program */
-  if (result)
-    return;
-  else
-    abort ();
-}
-
-/* Set the error handler */
-objc_error_handler
-objc_set_error_handler (objc_error_handler func)
-{
-  objc_error_handler temp = _objc_error_handler;
-  _objc_error_handler = func;
-  return temp;
-}
-
-/*
-** Standard functions for memory allocation and disposal.
-** Users should use these functions in their ObjC programs so
-** that they work properly with garbage collectors as well as
-** can take advantage of the exception/error handling available.
+  Standard functions for memory allocation and disposal.  Users should
+  use these functions in their ObjC programs so that they work
+  properly with garbage collectors as well as can take advantage of
+  the exception/error handling available.
 */
 
 void *
@@ -96,7 +50,7 @@ objc_malloc (size_t size)
 {
   void *res = (void *) (*_objc_malloc) (size);
   if (! res)
-    objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
+    _objc_abort ("Virtual memory exhausted\n");
   return res;
 }
 
@@ -105,7 +59,7 @@ objc_atomic_malloc (size_t size)
 {
   void *res = (void *) (*_objc_atomic_malloc) (size);
   if (! res)
-    objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
+    _objc_abort ("Virtual memory exhausted\n");
   return res;
 }
 
@@ -114,7 +68,7 @@ objc_valloc (size_t size)
 {
   void *res = (void *) (*_objc_valloc) (size);
   if (! res)
-    objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
+    _objc_abort ("Virtual memory exhausted\n");
   return res;
 }
 
@@ -123,7 +77,7 @@ objc_realloc (void *mem, size_t size)
 {
   void *res = (void *) (*_objc_realloc) (mem, size);
   if (! res)
-    objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
+    _objc_abort ("Virtual memory exhausted\n");
   return res;
 }
 
@@ -132,7 +86,7 @@ objc_calloc (size_t nelem, size_t size)
 {
   void *res = (void *) (*_objc_calloc) (nelem, size);
   if (! res)
-    objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n");
+    _objc_abort ("Virtual memory exhausted\n");
   return res;
 }
 
@@ -143,25 +97,28 @@ objc_free (void *mem)
 }
 
 /*
-** Hook functions for memory allocation and disposal.
-** This makes it easy to substitute garbage collection systems
-** such as Boehm's GC by assigning these function pointers
-** to the GC's allocation routines.  By default these point
-** to the ANSI standard malloc, realloc, free, etc.
-**
-** Users should call the normal objc routines above for
-** memory allocation and disposal within their programs.
+  Hook functions for memory allocation and disposal.  This makes it
+  easy to substitute garbage collection systems such as Boehm's GC by
+  assigning these function pointers to the GC's allocation routines.
+  By default these point to the ANSI standard malloc, realloc, free,
+  etc.
+
+  Users should call the normal objc routines above for memory
+  allocation and disposal within their programs.
 */
 
 #if OBJC_WITH_GC
 #include <gc.h>
 
+/* FIXME: The following sounds pointless because the GC_malloc
+   documentation says that it returns memory that is already zeroed!
+*/
 static void *
 GC_calloc (size_t nelem, size_t size)
 {
   void *p = GC_malloc (nelem * size);
   if (! p)
-    objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted!\n");
+    _objc_abort ("Virtual memory exhausted!\n");
 
   memset (p, 0, nelem * size);
   return p;
diff --git a/libobjc/objc-private/error.h b/libobjc/objc-private/error.h
new file mode 100644 (file)
index 0000000..2df9cb7
--- /dev/null
@@ -0,0 +1,37 @@
+/* GNU Objective C Runtime Common Private Definitions
+   Copyright (C) 2010 Free Software Foundation, Inc.
+   Contributed by Nicola Pero
+
+This file is part of GCC.
+
+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 3, or (at your option) any later version.
+
+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.
+
+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.
+
+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/>.  */
+
+#ifndef __objc_private_error_INCLUDE_GNU
+#define __objc_private_error_INCLUDE_GNU
+
+/* Prints an unrecoverable error to stderr, then aborts the program.
+   This should only be used for errors that really are unrecorevable:
+   failure to allocate memory, and failure to load an Objective-C
+   module.  All other usages of this function should be converted into
+   some milder type of error.
+*/
+void
+_objc_abort (const char *fmt, ...);
+
+#endif /* __objc_private_error_INCLUDE_GNU */
diff --git a/libobjc/objc/deprecated/objc_error.h b/libobjc/objc/deprecated/objc_error.h
new file mode 100644 (file)
index 0000000..7a7ebe9
--- /dev/null
@@ -0,0 +1,56 @@
+/* This API is incredibly limited and unsophisticated.  objc_error()
+   generally causes the program to abort, so it should only be used
+   when something so dramatic happens that it could be pointless to
+   continue.  Only two cases I can think of: failure to allocate new
+   memory or failure to load an Objective-C module.
+*/
+/* Error handling
+  
+   Call objc_error() or objc_verror() to record an error; this error
+   routine will generally exit the program but not necessarily if the
+   user has installed his own error handler.
+  
+   Call objc_set_error_handler to assign your own function for
+   handling errors.  The function should return YES if it is ok
+   to continue execution, or return NO or just abort if the
+   program should be stopped.  The default error handler is just to
+   print a message on stderr.
+  
+   The error handler function should be of type objc_error_handler
+   The first parameter is an object instance of relevance.
+   The second parameter is an error code.
+   The third parameter is a format string in the printf style.
+   The fourth parameter is a variable list of arguments.  */
+void objc_error(id object, int code, const char* fmt, ...);
+void objc_verror(id object, int code, const char* fmt, va_list ap);
+typedef BOOL (*objc_error_handler)(id, int code, const char *fmt, va_list ap);
+objc_error_handler objc_set_error_handler(objc_error_handler func);
+
+/* Error codes
+   These are used by the runtime library, and your
+   error handling may use them to determine if the error is
+   hard or soft thus whether execution can continue or abort.  */
+#define OBJC_ERR_UNKNOWN 0             /* Generic error */
+
+#define OBJC_ERR_OBJC_VERSION 1        /* Incorrect runtime version */
+#define OBJC_ERR_GCC_VERSION 2         /* Incorrect compiler version */
+#define OBJC_ERR_MODULE_SIZE 3         /* Bad module size */
+#define OBJC_ERR_PROTOCOL_VERSION 4    /* Incorrect protocol version */
+
+#define OBJC_ERR_MEMORY 10             /* Out of memory */
+
+#define OBJC_ERR_RECURSE_ROOT 20       /* Attempt to archive the root
+                                         object more than once. */
+#define OBJC_ERR_BAD_DATA 21           /* Didn't read expected data */
+#define OBJC_ERR_BAD_KEY 22            /* Bad key for object */
+#define OBJC_ERR_BAD_CLASS 23          /* Unknown class */
+#define OBJC_ERR_BAD_TYPE 24           /* Bad type specification */
+#define OBJC_ERR_NO_READ 25            /* Cannot read stream */
+#define OBJC_ERR_NO_WRITE 26           /* Cannot write stream */
+#define OBJC_ERR_STREAM_VERSION 27     /* Incorrect stream version */
+#define OBJC_ERR_BAD_OPCODE 28         /* Bad opcode */
+
+#define OBJC_ERR_UNIMPLEMENTED 30      /* Method is not implemented */
+
+#define OBJC_ERR_BAD_STATE 40          /* Bad thread state */
+
index 0ae4322..89c5fcd 100644 (file)
@@ -83,55 +83,7 @@ struct objc_method_description
 #define _C_COMPLEX   'j'
 
 
-/* Error handling
-  
-   Call objc_error() or objc_verror() to record an error; this error
-   routine will generally exit the program but not necessarily if the
-   user has installed his own error handler.
-  
-   Call objc_set_error_handler to assign your own function for
-   handling errors.  The function should return YES if it is ok
-   to continue execution, or return NO or just abort if the
-   program should be stopped.  The default error handler is just to
-   print a message on stderr.
-  
-   The error handler function should be of type objc_error_handler
-   The first parameter is an object instance of relevance.
-   The second parameter is an error code.
-   The third parameter is a format string in the printf style.
-   The fourth parameter is a variable list of arguments.  */
-extern void objc_error(id object, int code, const char* fmt, ...);
-extern void objc_verror(id object, int code, const char* fmt, va_list ap);
-typedef BOOL (*objc_error_handler)(id, int code, const char *fmt, va_list ap);
-extern objc_error_handler objc_set_error_handler(objc_error_handler func);
-
-/* Error codes
-   These are used by the runtime library, and your
-   error handling may use them to determine if the error is
-   hard or soft thus whether execution can continue or abort.  */
-#define OBJC_ERR_UNKNOWN 0             /* Generic error */
-
-#define OBJC_ERR_OBJC_VERSION 1        /* Incorrect runtime version */
-#define OBJC_ERR_GCC_VERSION 2         /* Incorrect compiler version */
-#define OBJC_ERR_MODULE_SIZE 3         /* Bad module size */
-#define OBJC_ERR_PROTOCOL_VERSION 4    /* Incorrect protocol version */
-
-#define OBJC_ERR_MEMORY 10             /* Out of memory */
-
-#define OBJC_ERR_RECURSE_ROOT 20       /* Attempt to archive the root
-                                         object more than once. */
-#define OBJC_ERR_BAD_DATA 21           /* Didn't read expected data */
-#define OBJC_ERR_BAD_KEY 22            /* Bad key for object */
-#define OBJC_ERR_BAD_CLASS 23          /* Unknown class */
-#define OBJC_ERR_BAD_TYPE 24           /* Bad type specification */
-#define OBJC_ERR_NO_READ 25            /* Cannot read stream */
-#define OBJC_ERR_NO_WRITE 26           /* Cannot write stream */
-#define OBJC_ERR_STREAM_VERSION 27     /* Incorrect stream version */
-#define OBJC_ERR_BAD_OPCODE 28         /* Bad opcode */
-
-#define OBJC_ERR_UNIMPLEMENTED 30      /* Method is not implemented */
-
-#define OBJC_ERR_BAD_STATE 40          /* Bad thread state */
+#include "deprecated/objc_error.h"
 
 
 /* For every class which happens to have statically allocated instances in
index 3bf28b9..32d9dc7 100644 (file)
@@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    and friends.  */
 
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 #include "tconfig.h"
 #include "coretypes.h"
 #include "tm.h"
@@ -661,6 +662,7 @@ __objc_forward (id object, SEL sel, arglist_t args)
              : "instance" ),
              object->class_pointer->name, sel_get_name (sel));
 
+    /* TODO: support for error: is surely deprecated ? */
     err_sel = sel_get_any_uid ("error:");
     if (__objc_responds_to (object, err_sel))
       {
@@ -670,7 +672,7 @@ __objc_forward (id object, SEL sel, arglist_t args)
 
     /* The object doesn't respond to doesNotRecognize: or error:;  Therefore,
        a default action is taken. */
-    objc_error (object, OBJC_ERR_UNIMPLEMENTED, "%s\n", msg);
+    _objc_abort ("%s\n", msg);
 
     return 0;
   }
index 0a58536..50196e8 100644 (file)
@@ -23,6 +23,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
 #include "objc-private/common.h"
+#include "objc-private/error.h"
 #define _LIBOBJC
 /* The line below is needed for declarations of functions such as
    pthread_mutexattr_settype, without which gthr-posix.h may fail to
@@ -129,12 +130,16 @@ __objc_thread_detach_function (struct __objc_thread_start_state *istate)
     if ((imp = (id (*) (id, SEL, id))objc_msg_lookup (object, selector)))
        (*imp) (object, selector, argument);
     else
-      objc_error (object, OBJC_ERR_UNIMPLEMENTED,
-                 "objc_thread_detach called with bad selector.\n");
+      {
+       /* FIXME: Should we abort here ? */
+       _objc_abort ("objc_thread_detach called with bad selector.\n");
+      }
   }
   else
-    objc_error (nil, OBJC_ERR_BAD_STATE,
-               "objc_thread_detach called with NULL state.\n");
+    {
+      /* FIXME: Should we abort here ? */
+      _objc_abort ("objc_thread_detach called with NULL state.\n");
+    }
 
   /* Exit the thread */
   objc_thread_exit ();