In libobjc/: 2011-06-02 Nicola Pero <nicola.pero@meta-innovation.com>
In libobjc/: 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. In gcc/testsuite/: 2011-06-02 Nicola Pero <nicola.pero@meta-innovation.com> * objc.dg/torture/forward-1.m (main): Updated testcase. From-SVN: r174587
This commit is contained in:
parent
a700b5f073
commit
e79132c385
@ -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 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||
|
||||
PR target/49163
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -248,30 +248,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
: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 respectively. If not, see
|
||||
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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user