Patchwork libobjc: remove deprecated API (patch 1)

login
register
mail settings
Submitter Nicola Pero
Date June 2, 2011, 11:15 p.m.
Message ID <1307056554.080415079@www2.webmail.us>
Download mbox | patch
Permalink /patch/98496/
State New
Headers show

Comments

Nicola Pero - June 2, 2011, 11:15 p.m.
This patch removes a number of deprecated libobjc functions and methods, which are part of the
"Traditional" Objective-C API that was deprecated in GCC 4.6.x and are to be removed in GCC 4.7.0.

It's the first of a long sequence of patches that does this removal one bit at a time.  This one
removes the deprecated objc_error(), objc_verror() and objc_set_error_handler() functions, and
all the deprecated Object methods whose implementation used to use these functions.

Unfortunately, all of our testcases use the "Traditional" Objective-C API when testing the GNU runtime
and they will need to be updated to use the "Modern" Objective-C API because the Traditional Objective-C
API is simply going away.  I'll update the relevant testcases with each patch.  This first patch requires
only a tiny update of a single testcase.

Committed to trunk.

Thanks

Patch

Index: libobjc/sendmsg.c
===================================================================
--- libobjc/sendmsg.c   (revision 174585)
+++ libobjc/sendmsg.c   (working copy)
@@ -977,16 +977,8 @@  __objc_forward (id object, SEL sel, arglist_t args
              : "instance" ),
              object->class_pointer->name, sel_getName (sel));
 
-    /* TODO: support for error: is surely deprecated ? */
-    err_sel = sel_get_any_uid ("error:");
-    if (__objc_responds_to (object, err_sel))
-      {
-       imp = get_implementation (object, object->class_pointer, err_sel);
-       return (*imp) (object, sel_get_any_uid ("error:"), msg);
-      }
-
-    /* The object doesn't respond to doesNotRecognize: or error:;
-       Therefore, a default action is taken.  */
+    /* The object doesn't respond to doesNotRecognize:.  Therefore, a
+       default action is taken.  */
     _objc_abort ("%s\n", msg);
 
     return 0;
Index: libobjc/Makefile.in
===================================================================
--- libobjc/Makefile.in (revision 174585)
+++ libobjc/Makefile.in (working copy)
@@ -139,7 +139,6 @@  OBJC_DEPRECATED_H = \
   STR.h \
   hash.h \
   objc-list.h \
-  objc_error.h \
   objc_get_uninstalled_dtable.h \
   objc_malloc.h \
   objc_msg_sendv.h \
Index: libobjc/libobjc.def
===================================================================
--- libobjc/libobjc.def (revision 174585)
+++ libobjc/libobjc.def (working copy)
@@ -25,7 +25,6 @@  search_for_method_in_list
 objc_get_uninstalled_dtable
 objc_hash_is_key_in_hash
 hash_is_key_in_hash
-objc_verror
 _objc_load_callback
 objc_malloc
 objc_atomic_malloc
@@ -53,7 +52,6 @@  objc_thread_remove
 __objc_class_name_Object
 __objc_class_name_Protocol
 __objc_class_name_NXConstantString
-objc_error
 __objc_object_alloc
 __objc_object_copy
 __objc_object_dispose
Index: libobjc/error.c
===================================================================
--- libobjc/error.c     (revision 174585)
+++ libobjc/error.c     (working copy)
@@ -45,53 +45,3 @@  _objc_abort (const char *fmt, ...)
   abort ();
   va_end (ap);
 }
-
-/* The rest of the file is deprecated.  */
-#include "objc/objc-api.h" /* For objc_error_handler.  */
-
-/*
-** 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: libobjc/ChangeLog
===================================================================
--- libobjc/ChangeLog   (revision 174585)
+++ libobjc/ChangeLog   (working copy)
@@ -1,3 +1,19 @@ 
+2011-06-02  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * Makefile.in (OBJC_DEPRECATED_H): Removed objc_error.h.
+       * objc/deprecated/objc_error.h: Removed.
+       * objc/objc-api.h: Do not include deprecated/objc_error.h.
+       * libobjc.def (objc_error, objc_verror): Removed.
+       * error.c (_objc_error_handler, objc_error, objc_verror,
+       objc_set_error_handler): Removed.
+       * Object.m ([-error:], [-perform:], [-perform:with:],
+       [-perform:with:with], [-subclassResponsibility:],
+       [-notImplemented:], [-shouldNotImplement:], [-doesNotRecognize:]):
+       Removed.
+       * objc/deprecated/Object.h: Removed the same methods.
+       * sendmsg.c (__objc_forward): Do not try to invoke the "error:"
+       method after trying to invoke the "doesNotRecognize:" method.
+       
 2011-05-26  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * sendmsg.c: Reindented part of the file.  No non-trivial changes
Index: libobjc/Object.m
===================================================================
--- libobjc/Object.m    (revision 174585)
+++ libobjc/Object.m    (working copy)
@@ -248,30 +248,6 @@  see the files COPYING3 and COPYING.RUNTIME respect
             :class_get_class_method(self->isa, aSel)));
 }
 
-- perform:(SEL)aSel
-{
-  IMP msg = objc_msg_lookup(self, aSel);
-  if (!msg)
-    return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
-  return (*msg)(self, aSel);
-}
-
-- perform:(SEL)aSel with:anObject
-{
-  IMP msg = objc_msg_lookup(self, aSel);
-  if (!msg)
-    return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
-  return (*msg)(self, aSel, anObject);
-}
-
-- perform:(SEL)aSel with:anObject1 with:anObject2
-{
-  IMP msg = objc_msg_lookup(self, aSel);
-  if (!msg)
-    return [self error:"invalid selector passed to %s", sel_get_name(_cmd)];
-  return (*msg)(self, aSel, anObject1, anObject2);
-}
-
 - (retval_t)forward:(SEL)aSel :(arglist_t)argFrame
 {
   (void) argFrame; /* UNUSED */
@@ -302,45 +278,6 @@  see the files COPYING3 and COPYING.RUNTIME respect
   return nil;
 }
 
-- subclassResponsibility:(SEL)aSel
-{
-  return [self error:"subclass should override %s", sel_get_name(aSel)];
-}
-
-- notImplemented:(SEL)aSel
-{
-  return [self error:"method %s not implemented", sel_get_name(aSel)];
-}
-
-- shouldNotImplement:(SEL)aSel
-{
-  return [self error:"%s should not implement %s", 
-                    object_get_class_name(self), sel_get_name(aSel)];
-}
-
-- doesNotRecognize:(SEL)aSel
-{
-  return [self error:"%s does not recognize %s",
-                     object_get_class_name(self), sel_get_name(aSel)];
-}
-
-- error:(const char *)aString, ...
-{
-#define FMT "error: %s (%s)\n%s\n"
-  char fmt[(strlen((char*)FMT)+strlen((char*)object_get_class_name(self))
-            +((aString!=NULL)?strlen((char*)aString):0)+8)];
-  va_list ap;
-
-  sprintf(fmt, FMT, object_get_class_name(self),
-                    object_is_instance(self)?"instance":"class",
-                    (aString!=NULL)?aString:"");
-  va_start(ap, aString);
-  objc_verror(self, OBJC_ERR_UNKNOWN, fmt, ap);
-  va_end(ap);
-  return nil;
-#undef FMT
-}
-
 + (int)version
 {
   return class_get_version(self);
Index: libobjc/objc/deprecated/Object.h
===================================================================
--- libobjc/objc/deprecated/Object.h    (revision 174585)
+++ libobjc/objc/deprecated/Object.h    (working copy)
@@ -48,11 +48,6 @@ 
 + (struct objc_method_description *)descriptionForInstanceMethod:(SEL)aSel;
 - (struct objc_method_description *)descriptionForMethod:(SEL)aSel;
 
-/* Sending messages determined at run time */
-- perform:(SEL)aSel;
-- perform:(SEL)aSel with:anObject;
-- perform:(SEL)aSel with:anObject1 with:anObject2;
-
 /* Forwarding */
 - (retval_t)forward:(SEL)aSel :(arglist_t)argFrame;
 - (retval_t)performv:(SEL)aSel :(arglist_t)argFrame;
@@ -61,15 +56,6 @@ 
 + poseAs:(Class)aClassObject;
 - (Class)transmuteClassTo:(Class)aClassObject;
 
-/* Enforcing intentions */
-- subclassResponsibility:(SEL)aSel;
-- notImplemented:(SEL)aSel;
-- shouldNotImplement:(SEL)aSel;
-
-/* Error handling */
-- doesNotRecognize:(SEL)aSel;
-- error:(const char *)aString, ...;
-
 /* Archiving */
 + (int)version;
 + setVersion:(int)aVersion;
Index: libobjc/objc/deprecated/objc_error.h
===================================================================
--- libobjc/objc/deprecated/objc_error.h        (revision 174585)
+++ libobjc/objc/deprecated/objc_error.h        (working copy)
@@ -1,56 +0,0 @@ 
-/* 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: libobjc/objc/objc-api.h
===================================================================
--- libobjc/objc/objc-api.h     (revision 174585)
+++ libobjc/objc/objc-api.h     (working copy)
@@ -109,8 +109,6 @@  struct objc_method_description
    equivalent to "*".  */
 #define _C_ATOM     '%'
 
-#include "deprecated/objc_error.h"
-
 #include "deprecated/struct_objc_static_instances.h"
 #include "deprecated/struct_objc_symtab.h"
 #include "deprecated/struct_objc_module.h"
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog     (revision 174585)
+++ gcc/testsuite/ChangeLog     (working copy)
@@ -1,3 +1,7 @@ 
+2011-06-02  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc.dg/torture/forward-1.m (main): Updated testcase.
+
 2011-06-02  Asher Langton  <langton2@llnl.gov>
 
        PR fortran/49268
Index: gcc/testsuite/objc.dg/torture/forward-1.m
===================================================================
--- gcc/testsuite/objc.dg/torture/forward-1.m   (revision 174585)
+++ gcc/testsuite/objc.dg/torture/forward-1.m   (working copy)
@@ -71,7 +71,9 @@  id forwarder, receiver;
   /* If we have a reciever try to perform on that object */
     if (receiver)
         return [receiver performv: theSel: theArgFrame];
-    return [self doesNotRecognize:theSel];
+
+    /* Normally you'd emit an error here.  */
+    printf ("Unrecognized selector\n");
 }
 @end
 int main()