Commit 7b869986 by Nicola Pero Committed by Nicola Pero

In libobjc/:

        * 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.

From-SVN: r164223
parent 201fb1f2
2010-09-12 Nicola Pero <nicola.pero@meta-innovation.com> 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 * objc/objc.h (__GNU_LIBOBJC__): New #define providing an easy way
to check the API version. Added some comments. to check the API version. Added some comments.
......
...@@ -147,18 +147,18 @@ OBJC_H = \ ...@@ -147,18 +147,18 @@ OBJC_H = \
objc.h \ objc.h \
objc-exception.h \ objc-exception.h \
\ \
message.h \
hash.h \
objc-list.h \
sarray.h \
objc-api.h \
NXConstStr.h \ NXConstStr.h \
Object.h \ Object.h \
Protocol.h \ Protocol.h \
encoding.h \ encoding.h \
typedstream.h \ hash.h \
message.h \
objc-api.h \
objc-decls.h \
objc-list.h \
sarray.h \
thr.h \ thr.h \
objc-decls.h typedstream.h
# User-visible header files containing deprecated APIs, from the # User-visible header files containing deprecated APIs, from the
# objc/deprecated directory # objc/deprecated directory
...@@ -167,6 +167,7 @@ OBJC_DEPRECATED_H = \ ...@@ -167,6 +167,7 @@ OBJC_DEPRECATED_H = \
MetaClass.h \ MetaClass.h \
Object.h \ Object.h \
STR.h \ STR.h \
objc_error.h \
objc_unexpected_exception.h \ objc_unexpected_exception.h \
struct_objc_class.h \ struct_objc_class.h \
struct_objc_protocol.h \ struct_objc_protocol.h \
...@@ -175,16 +176,47 @@ OBJC_DEPRECATED_H = \ ...@@ -175,16 +176,47 @@ OBJC_DEPRECATED_H = \
# Modules that comprise the runtime library. # Modules that comprise the runtime library.
OBJS = archive.lo class.lo encoding.lo gc.lo hash.lo init.lo linking.lo \ OBJS = \
misc.lo nil_method.lo NXConstStr.lo Object.lo objects.lo \ NXConstStr.lo \
Protocol.lo sarray.lo selector.lo sendmsg.lo thr.lo \ Object.lo \
exception.lo Protocol.lo \
archive.lo \
OBJS_GC = archive_gc.lo class_gc.lo encoding_gc.lo gc_gc.lo hash_gc.lo \ class.lo \
init_gc.lo linking_gc.lo misc_gc.lo nil_method_gc.lo \ encoding.lo \
NXConstStr_gc.lo Object_gc.lo objects_gc.lo Protocol_gc.lo \ error.lo \
sarray_gc.lo selector_gc.lo sendmsg_gc.lo thr_gc.lo \ gc.lo \
exception_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: runtime-info.h:
echo "" > tmp-runtime.m echo "" > tmp-runtime.m
...@@ -208,6 +240,10 @@ encoding_gc.lo: encoding.c ...@@ -208,6 +240,10 @@ encoding_gc.lo: encoding.c
$(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \ $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
$(INCLUDES) $< $(INCLUDES) $<
error_gc.lo: error.c
$(LIBTOOL_COMPILE) $(CC) -c $(ALL_CFLAGS) -o $@ $(OBJC_GCFLAGS) \
$(INCLUDES) $<
gc.lo: gc.c gc.lo: gc.c
$(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(INCLUDES) $< $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(INCLUDES) $<
...@@ -231,7 +267,7 @@ linking_gc.lo: linking.m ...@@ -231,7 +267,7 @@ linking_gc.lo: linking.m
$(LIBTOOL_COMPILE) $(CC) -fgnu-runtime -c -o $@ $(ALL_CFLAGS) \ $(LIBTOOL_COMPILE) $(CC) -fgnu-runtime -c -o $@ $(ALL_CFLAGS) \
$(OBJC_GCFLAGS) $(INCLUDES) $< $(OBJC_GCFLAGS) $(INCLUDES) $<
misc_gc.lo: misc.c memory_gc.lo: memory.c
$(LIBTOOL_COMPILE) $(CC) -c $(ALL_CFLAGS) -o $@ $(OBJC_GCFLAGS) \ $(LIBTOOL_COMPILE) $(CC) -c $(ALL_CFLAGS) -o $@ $(OBJC_GCFLAGS) \
$(INCLUDES) $< $(INCLUDES) $<
......
...@@ -22,7 +22,10 @@ a copy of the GCC Runtime Library Exception along with this program; ...@@ -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 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
/* This file is entirely deprecated and will be removed. */
#include "objc-private/common.h" #include "objc-private/common.h"
#include "objc-private/error.h"
#include "tconfig.h" #include "tconfig.h"
#include "objc/objc.h" #include "objc/objc.h"
#include "objc/objc-api.h" #include "objc/objc-api.h"
...@@ -364,8 +367,7 @@ __objc_write_extension (struct objc_typed_stream *stream, unsigned char code) ...@@ -364,8 +367,7 @@ __objc_write_extension (struct objc_typed_stream *stream, unsigned char code)
} }
else else
{ {
objc_error (nil, OBJC_ERR_BAD_OPCODE, _objc_abort ("__objc_write_extension: bad opcode %c\n", code);
"__objc_write_extension: bad opcode %c\n", code);
return -1; return -1;
} }
} }
...@@ -402,8 +404,7 @@ objc_write_root_object (struct objc_typed_stream *stream, id object) ...@@ -402,8 +404,7 @@ objc_write_root_object (struct objc_typed_stream *stream, id object)
{ {
int len = 0; int len = 0;
if (stream->writing_root_p) if (stream->writing_root_p)
objc_error (nil, OBJC_ERR_RECURSE_ROOT, _objc_abort ("objc_write_root_object called recursively");
"objc_write_root_object called recursively");
else else
{ {
stream->writing_root_p = 1; stream->writing_root_p = 1;
...@@ -527,9 +528,8 @@ objc_read_char (struct objc_typed_stream *stream, char *val) ...@@ -527,9 +528,8 @@ objc_read_char (struct objc_typed_stream *stream, char *val)
} }
else else
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected 8bit signed int, got %dbit int",
"expected 8bit signed int, got %dbit int", (int) (buf&_B_NUMBER)*8);
(int) (buf&_B_NUMBER)*8);
} }
return len; return len;
} }
...@@ -549,9 +549,8 @@ objc_read_unsigned_char (struct objc_typed_stream *stream, unsigned char *val) ...@@ -549,9 +549,8 @@ objc_read_unsigned_char (struct objc_typed_stream *stream, unsigned char *val)
len = (*stream->read) (stream->physical, (char*)val, 1); len = (*stream->read) (stream->physical, (char*)val, 1);
else else
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected 8bit unsigned int, got %dbit int",
"expected 8bit unsigned int, got %dbit int", (int) (buf&_B_NUMBER)*8);
(int) (buf&_B_NUMBER)*8);
} }
return len; return len;
} }
...@@ -571,8 +570,7 @@ objc_read_short (struct objc_typed_stream *stream, short *value) ...@@ -571,8 +570,7 @@ objc_read_short (struct objc_typed_stream *stream, short *value)
int pos = 1; int pos = 1;
int nbytes = buf[0] & _B_NUMBER; int nbytes = buf[0] & _B_NUMBER;
if (nbytes > (int) sizeof (short)) if (nbytes > (int) sizeof (short))
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected short, got bigger (%dbits)", nbytes*8);
"expected short, got bigger (%dbits)", nbytes*8);
len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes); len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
(*value) = 0; (*value) = 0;
while (pos <= nbytes) while (pos <= nbytes)
...@@ -600,8 +598,7 @@ objc_read_unsigned_short (struct objc_typed_stream *stream, ...@@ -600,8 +598,7 @@ objc_read_unsigned_short (struct objc_typed_stream *stream,
int pos = 1; int pos = 1;
int nbytes = buf[0] & _B_NUMBER; int nbytes = buf[0] & _B_NUMBER;
if (nbytes > (int) sizeof (short)) if (nbytes > (int) sizeof (short))
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected short, got int or bigger");
"expected short, got int or bigger");
len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes); len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
(*value) = 0; (*value) = 0;
while (pos <= nbytes) while (pos <= nbytes)
...@@ -627,7 +624,7 @@ objc_read_int (struct objc_typed_stream *stream, int *value) ...@@ -627,7 +624,7 @@ objc_read_int (struct objc_typed_stream *stream, int *value)
int pos = 1; int pos = 1;
int nbytes = buf[0] & _B_NUMBER; int nbytes = buf[0] & _B_NUMBER;
if (nbytes > (int) sizeof (int)) 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); len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
(*value) = 0; (*value) = 0;
while (pos <= nbytes) while (pos <= nbytes)
...@@ -654,7 +651,7 @@ objc_read_long (struct objc_typed_stream *stream, long *value) ...@@ -654,7 +651,7 @@ objc_read_long (struct objc_typed_stream *stream, long *value)
int pos = 1; int pos = 1;
int nbytes = buf[0] & _B_NUMBER; int nbytes = buf[0] & _B_NUMBER;
if (nbytes > (int) sizeof (long)) 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); len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
(*value) = 0; (*value) = 0;
while (pos <= nbytes) while (pos <= nbytes)
...@@ -675,7 +672,7 @@ __objc_read_nbyte_uint (struct objc_typed_stream *stream, ...@@ -675,7 +672,7 @@ __objc_read_nbyte_uint (struct objc_typed_stream *stream,
unsigned char buf[sizeof (unsigned int) + 1]; unsigned char buf[sizeof (unsigned int) + 1];
if (nbytes > sizeof (int)) 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); len = (*stream->read) (stream->physical, (char*)buf, nbytes);
(*val) = 0; (*val) = 0;
...@@ -712,7 +709,7 @@ __objc_read_nbyte_ulong (struct objc_typed_stream *stream, ...@@ -712,7 +709,7 @@ __objc_read_nbyte_ulong (struct objc_typed_stream *stream,
unsigned char buf[sizeof (unsigned long) + 1]; unsigned char buf[sizeof (unsigned long) + 1];
if (nbytes > sizeof (long)) 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); len = (*stream->read) (stream->physical, (char*)buf, nbytes);
(*val) = 0; (*val) = 0;
...@@ -793,8 +790,7 @@ objc_read_string (struct objc_typed_stream *stream, ...@@ -793,8 +790,7 @@ objc_read_string (struct objc_typed_stream *stream,
break; break;
default: default:
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected string, got opcode %c\n", (buf[0]&_B_CODE));
"expected string, got opcode %c\n", (buf[0]&_B_CODE));
} }
} }
...@@ -839,14 +835,13 @@ objc_read_object (struct objc_typed_stream *stream, id *object) ...@@ -839,14 +835,13 @@ objc_read_object (struct objc_typed_stream *stream, id *object)
/* check null-byte */ /* check null-byte */
len = (*stream->read) (stream->physical, (char*)buf, 1); len = (*stream->read) (stream->physical, (char*)buf, 1);
if (buf[0] != '\0') if (buf[0] != '\0')
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected null-byte, got opcode %c", buf[0]);
"expected null-byte, got opcode %c", buf[0]);
} }
else if ((buf[0]&_B_CODE) == _B_UCOMM) else if ((buf[0]&_B_CODE) == _B_UCOMM)
{ {
if (key) 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); len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
(*object) = objc_hash_value_for_key (stream->object_table, (*object) = objc_hash_value_for_key (stream->object_table,
LONG2PTR(key)); LONG2PTR(key));
...@@ -866,15 +861,13 @@ objc_read_object (struct objc_typed_stream *stream, id *object) ...@@ -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 */ else if (buf[0] == (_B_EXT | _BX_OBJROOT)) /* a root object */
{ {
if (key) if (key)
objc_error (nil, OBJC_ERR_BAD_KEY, _objc_abort ("cannot register root object...");
"cannot register root object...");
len = objc_read_object (stream, object); len = objc_read_object (stream, object);
__objc_finish_read_root_object (stream); __objc_finish_read_root_object (stream);
} }
else else
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected object, got opcode %c", buf[0]);
"expected object, got opcode %c", buf[0]);
} }
return len; return len;
} }
...@@ -917,18 +910,16 @@ objc_read_class (struct objc_typed_stream *stream, Class *class) ...@@ -917,18 +910,16 @@ objc_read_class (struct objc_typed_stream *stream, Class *class)
else if ((buf[0]&_B_CODE) == _B_UCOMM) else if ((buf[0]&_B_CODE) == _B_UCOMM)
{ {
if (key) 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); len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
*class = objc_hash_value_for_key (stream->stream_table, *class = objc_hash_value_for_key (stream->stream_table,
LONG2PTR(key)); LONG2PTR(key));
if (! *class) if (! *class)
objc_error (nil, OBJC_ERR_BAD_CLASS, _objc_abort ("cannot find class for key %lu", key);
"cannot find class for key %lu", key);
} }
else else
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected class, got opcode %c", buf[0]);
"expected class, got opcode %c", buf[0]);
} }
return len; return len;
} }
...@@ -974,15 +965,14 @@ objc_read_selector (struct objc_typed_stream *stream, SEL* selector) ...@@ -974,15 +965,14 @@ objc_read_selector (struct objc_typed_stream *stream, SEL* selector)
else if ((buf[0]&_B_CODE) == _B_UCOMM) else if ((buf[0]&_B_CODE) == _B_UCOMM)
{ {
if (key) 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); len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
(*selector) = objc_hash_value_for_key (stream->stream_table, (*selector) = objc_hash_value_for_key (stream->stream_table,
LONG2PTR(key)); LONG2PTR(key));
} }
else else
objc_error (nil, OBJC_ERR_BAD_DATA, _objc_abort ("expected selector, got opcode %c", buf[0]);
"expected selector, got opcode %c", buf[0]);
} }
return len; return len;
} }
...@@ -1082,8 +1072,7 @@ objc_write_type (TypedStream *stream, const char *type, const void *data) ...@@ -1082,8 +1072,7 @@ objc_write_type (TypedStream *stream, const char *type, const void *data)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, _objc_abort ("objc_write_type: cannot parse typespec: %s\n", type);
"objc_write_type: cannot parse typespec: %s\n", type);
return 0; return 0;
} }
} }
...@@ -1178,8 +1167,7 @@ objc_read_type(TypedStream *stream, const char *type, void *data) ...@@ -1178,8 +1167,7 @@ objc_read_type(TypedStream *stream, const char *type, void *data)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, _objc_abort ("objc_read_type: cannot parse typespec: %s\n", type);
"objc_read_type: cannot parse typespec: %s\n", type);
return 0; return 0;
} }
} }
...@@ -1276,13 +1264,12 @@ objc_write_types (TypedStream *stream, const char *type, ...) ...@@ -1276,13 +1264,12 @@ objc_write_types (TypedStream *stream, const char *type, ...)
res = objc_write_array (stream, t, len, va_arg (args, void *)); res = objc_write_array (stream, t, len, va_arg (args, void *));
t = objc_skip_typespec (t); t = objc_skip_typespec (t);
if (*t != _C_ARY_E) if (*t != _C_ARY_E)
objc_error (nil, OBJC_ERR_BAD_TYPE, "expected `]', got: %s", t); _objc_abort ("expected `]', got: %s", t);
} }
break; break;
default: default:
objc_error (nil, OBJC_ERR_BAD_TYPE, _objc_abort ("objc_write_types: cannot parse typespec: %s\n", type);
"objc_write_types: cannot parse typespec: %s\n", type);
} }
} }
va_end(args); va_end(args);
...@@ -1368,13 +1355,12 @@ objc_read_types(TypedStream *stream, const char *type, ...) ...@@ -1368,13 +1355,12 @@ objc_read_types(TypedStream *stream, const char *type, ...)
res = objc_read_array (stream, t, len, va_arg (args, void *)); res = objc_read_array (stream, t, len, va_arg (args, void *));
t = objc_skip_typespec (t); t = objc_skip_typespec (t);
if (*t != _C_ARY_E) if (*t != _C_ARY_E)
objc_error (nil, OBJC_ERR_BAD_TYPE, "expected `]', got: %s", t); _objc_abort ("expected `]', got: %s", t);
} }
break; break;
default: default:
objc_error (nil, OBJC_ERR_BAD_TYPE, _objc_abort ("objc_read_types: cannot parse typespec: %s\n", type);
"objc_read_types: cannot parse typespec: %s\n", type);
} }
} }
va_end (args); va_end (args);
...@@ -1446,7 +1432,7 @@ __objc_no_write (FILE *file __attribute__ ((__unused__)), ...@@ -1446,7 +1432,7 @@ __objc_no_write (FILE *file __attribute__ ((__unused__)),
const char *data __attribute__ ((__unused__)), const char *data __attribute__ ((__unused__)),
int len __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; return 0;
} }
...@@ -1455,7 +1441,7 @@ __objc_no_read (FILE *file __attribute__ ((__unused__)), ...@@ -1455,7 +1441,7 @@ __objc_no_read (FILE *file __attribute__ ((__unused__)),
const char *data __attribute__ ((__unused__)), const char *data __attribute__ ((__unused__)),
int len __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; return 0;
} }
...@@ -1470,8 +1456,7 @@ __objc_read_typed_stream_signature (TypedStream *stream) ...@@ -1470,8 +1456,7 @@ __objc_read_typed_stream_signature (TypedStream *stream)
; ;
sscanf (buffer, "GNU TypedStream %d", &stream->version); sscanf (buffer, "GNU TypedStream %d", &stream->version);
if (stream->version != OBJC_TYPED_STREAM_VERSION) if (stream->version != OBJC_TYPED_STREAM_VERSION)
objc_error (nil, OBJC_ERR_STREAM_VERSION, _objc_abort ("cannot handle TypedStream version %d", stream->version);
"cannot handle TypedStream version %d", stream->version);
return 1; return 1;
} }
......
...@@ -88,6 +88,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -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. */ structures is freeing data when is removed from the structures. */
#include "objc-private/common.h" #include "objc-private/common.h"
#include "objc-private/error.h"
#include "objc/objc.h" #include "objc/objc.h"
#include "objc/objc-api.h" #include "objc/objc-api.h"
#include "objc/thr.h" #include "objc/thr.h"
...@@ -500,8 +501,9 @@ objc_get_class (const char *name) ...@@ -500,8 +501,9 @@ objc_get_class (const char *name)
if (class) if (class)
return class; return class;
objc_error (nil, OBJC_ERR_BAD_CLASS, /* FIXME: Should we abort the program here ? */
"objc runtime: cannot find class %s\n", name); _objc_abort ("objc runtime: cannot find class %s\n", name);
return 0; return 0;
} }
......
...@@ -27,7 +27,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -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 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/common.h"
#include "objc-private/error.h"
#include "tconfig.h" #include "tconfig.h"
#include "coretypes.h" #include "coretypes.h"
#include "tm.h" #include "tm.h"
...@@ -316,8 +321,11 @@ objc_sizeof_type (const char *type) ...@@ -316,8 +321,11 @@ objc_sizeof_type (const char *type)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown complex type %s\n", /* FIXME: Is this so bad that we have to abort the
type); entire program ? (it applies to all the other
_objc_abort calls in this file).
*/
_objc_abort ("unknown complex type %s\n", type);
return 0; return 0;
} }
} }
...@@ -325,7 +333,7 @@ objc_sizeof_type (const char *type) ...@@ -325,7 +333,7 @@ objc_sizeof_type (const char *type)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type); _objc_abort ("unknown type %s\n", type);
return 0; return 0;
} }
} }
...@@ -491,8 +499,7 @@ objc_alignof_type (const char *type) ...@@ -491,8 +499,7 @@ objc_alignof_type (const char *type)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown complex type %s\n", _objc_abort ("unknown complex type %s\n", type);
type);
return 0; return 0;
} }
} }
...@@ -500,7 +507,7 @@ objc_alignof_type (const char *type) ...@@ -500,7 +507,7 @@ objc_alignof_type (const char *type)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type); _objc_abort ("unknown type %s\n", type);
return 0; return 0;
} }
} }
...@@ -643,7 +650,7 @@ objc_skip_typespec (const char *type) ...@@ -643,7 +650,7 @@ objc_skip_typespec (const char *type)
return ++type; return ++type;
else else
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "bad array type %s\n", type); _objc_abort ("bad array type %s\n", type);
return 0; return 0;
} }
...@@ -684,7 +691,7 @@ objc_skip_typespec (const char *type) ...@@ -684,7 +691,7 @@ objc_skip_typespec (const char *type)
default: default:
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, "unknown type %s\n", type); _objc_abort ("unknown type %s\n", type);
return 0; return 0;
} }
} }
...@@ -882,9 +889,8 @@ objc_layout_structure (const char *type, ...@@ -882,9 +889,8 @@ objc_layout_structure (const char *type,
if (*type != _C_UNION_B && *type != _C_STRUCT_B) if (*type != _C_UNION_B && *type != _C_STRUCT_B)
{ {
objc_error (nil, OBJC_ERR_BAD_TYPE, _objc_abort ("record (or union) type expected in objc_layout_structure, got %s\n",
"record (or union) type expected in objc_layout_structure, got %s\n", type);
type);
} }
type ++; type ++;
......
/* 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;
}
...@@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "objc-private/common.h" #include "objc-private/common.h"
#include "objc-private/error.h"
#include "objc/objc.h" #include "objc/objc.h"
#include "objc/objc-api.h" #include "objc/objc-api.h"
#include "objc/thr.h" #include "objc/thr.h"
...@@ -824,17 +825,8 @@ init_check_module_version (Module_t module) ...@@ -824,17 +825,8 @@ init_check_module_version (Module_t module)
{ {
if ((module->version != OBJC_VERSION) || (module->size != sizeof (Module))) if ((module->version != OBJC_VERSION) || (module->size != sizeof (Module)))
{ {
int code; _objc_abort ("Module %s version %d doesn't match runtime %d\n",
module->name, (int)module->version, OBJC_VERSION);
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);
} }
} }
...@@ -876,11 +868,10 @@ __objc_init_protocols (struct objc_protocol_list *protos) ...@@ -876,11 +868,10 @@ __objc_init_protocols (struct objc_protocol_list *protos)
} }
else if (protos->list[i]->class_pointer != proto_class) else if (protos->list[i]->class_pointer != proto_class)
{ {
objc_error (nil, OBJC_ERR_PROTOCOL_VERSION, _objc_abort ("Version %d doesn't match runtime protocol version %d\n",
"Version %d doesn't match runtime protocol version %d\n", (int) ((char *) protos->list[i]->class_pointer
(int) ((char *) protos->list[i]->class_pointer - (char *) 0),
- (char *) 0), PROTOCOL_VERSION);
PROTOCOL_VERSION);
} }
} }
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
; You should have received a copy of the GNU General Public License along with ; 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/>. ; GCC; see the file COPYING3. If not, see <http://www.gnu.org/licenses/>.
; FIXME: This file needs to be updated or removed
LIBRARY libobjc LIBRARY libobjc
EXPORTS EXPORTS
search_for_method_in_list search_for_method_in_list
......
/* GNU Objective C Runtime Miscellaneous /* GNU Objective C Runtime Memory allocation functions
Copyright (C) 1993, 1994, 1995, 1996, 1997, 2002, 2009 Copyright (C) 1993, 1994, 1995, 1996, 1997, 2002, 2009, 2010
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Kresten Krab Thorup Contributed by Kresten Krab Thorup
...@@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "objc-private/common.h" #include "objc-private/common.h"
#include "objc-private/error.h"
/* __USE_FIXED_PROTOTYPES__ used to be required to get prototypes for /* __USE_FIXED_PROTOTYPES__ used to be required to get prototypes for
malloc, free, etc. on some platforms. It is unclear if we still 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 ...@@ -38,57 +39,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "objc-private/runtime.h" #include "objc-private/runtime.h"
/* /*
** Error handler function Standard functions for memory allocation and disposal. Users should
** NULL so that default is to just print to stderr use these functions in their ObjC programs so that they work
*/ properly with garbage collectors as well as can take advantage of
static objc_error_handler _objc_error_handler = NULL; the exception/error handling available.
/* 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.
*/ */
void * void *
...@@ -96,7 +50,7 @@ objc_malloc (size_t size) ...@@ -96,7 +50,7 @@ objc_malloc (size_t size)
{ {
void *res = (void *) (*_objc_malloc) (size); void *res = (void *) (*_objc_malloc) (size);
if (! res) if (! res)
objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); _objc_abort ("Virtual memory exhausted\n");
return res; return res;
} }
...@@ -105,7 +59,7 @@ objc_atomic_malloc (size_t size) ...@@ -105,7 +59,7 @@ objc_atomic_malloc (size_t size)
{ {
void *res = (void *) (*_objc_atomic_malloc) (size); void *res = (void *) (*_objc_atomic_malloc) (size);
if (! res) if (! res)
objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); _objc_abort ("Virtual memory exhausted\n");
return res; return res;
} }
...@@ -114,7 +68,7 @@ objc_valloc (size_t size) ...@@ -114,7 +68,7 @@ objc_valloc (size_t size)
{ {
void *res = (void *) (*_objc_valloc) (size); void *res = (void *) (*_objc_valloc) (size);
if (! res) if (! res)
objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); _objc_abort ("Virtual memory exhausted\n");
return res; return res;
} }
...@@ -123,7 +77,7 @@ objc_realloc (void *mem, size_t size) ...@@ -123,7 +77,7 @@ objc_realloc (void *mem, size_t size)
{ {
void *res = (void *) (*_objc_realloc) (mem, size); void *res = (void *) (*_objc_realloc) (mem, size);
if (! res) if (! res)
objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); _objc_abort ("Virtual memory exhausted\n");
return res; return res;
} }
...@@ -132,7 +86,7 @@ objc_calloc (size_t nelem, size_t size) ...@@ -132,7 +86,7 @@ objc_calloc (size_t nelem, size_t size)
{ {
void *res = (void *) (*_objc_calloc) (nelem, size); void *res = (void *) (*_objc_calloc) (nelem, size);
if (! res) if (! res)
objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted\n"); _objc_abort ("Virtual memory exhausted\n");
return res; return res;
} }
...@@ -143,25 +97,28 @@ objc_free (void *mem) ...@@ -143,25 +97,28 @@ objc_free (void *mem)
} }
/* /*
** Hook functions for memory allocation and disposal. Hook functions for memory allocation and disposal. This makes it
** This makes it easy to substitute garbage collection systems easy to substitute garbage collection systems such as Boehm's GC by
** such as Boehm's GC by assigning these function pointers assigning these function pointers to the GC's allocation routines.
** to the GC's allocation routines. By default these point By default these point to the ANSI standard malloc, realloc, free,
** to the ANSI standard malloc, realloc, free, etc. etc.
**
** Users should call the normal objc routines above for Users should call the normal objc routines above for memory
** memory allocation and disposal within their programs. allocation and disposal within their programs.
*/ */
#if OBJC_WITH_GC #if OBJC_WITH_GC
#include <gc.h> #include <gc.h>
/* FIXME: The following sounds pointless because the GC_malloc
documentation says that it returns memory that is already zeroed!
*/
static void * static void *
GC_calloc (size_t nelem, size_t size) GC_calloc (size_t nelem, size_t size)
{ {
void *p = GC_malloc (nelem * size); void *p = GC_malloc (nelem * size);
if (! p) if (! p)
objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted!\n"); _objc_abort ("Virtual memory exhausted!\n");
memset (p, 0, nelem * size); memset (p, 0, nelem * size);
return p; return p;
......
/* 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 */
/* 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 */
...@@ -83,55 +83,7 @@ struct objc_method_description ...@@ -83,55 +83,7 @@ struct objc_method_description
#define _C_COMPLEX 'j' #define _C_COMPLEX 'j'
/* Error handling #include "deprecated/objc_error.h"
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 */
/* For every class which happens to have statically allocated instances in /* For every class which happens to have statically allocated instances in
......
...@@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
and friends. */ and friends. */
#include "objc-private/common.h" #include "objc-private/common.h"
#include "objc-private/error.h"
#include "tconfig.h" #include "tconfig.h"
#include "coretypes.h" #include "coretypes.h"
#include "tm.h" #include "tm.h"
...@@ -661,6 +662,7 @@ __objc_forward (id object, SEL sel, arglist_t args) ...@@ -661,6 +662,7 @@ __objc_forward (id object, SEL sel, arglist_t args)
: "instance" ), : "instance" ),
object->class_pointer->name, sel_get_name (sel)); object->class_pointer->name, sel_get_name (sel));
/* TODO: support for error: is surely deprecated ? */
err_sel = sel_get_any_uid ("error:"); err_sel = sel_get_any_uid ("error:");
if (__objc_responds_to (object, err_sel)) if (__objc_responds_to (object, err_sel))
{ {
...@@ -670,7 +672,7 @@ __objc_forward (id object, SEL sel, arglist_t args) ...@@ -670,7 +672,7 @@ __objc_forward (id object, SEL sel, arglist_t args)
/* The object doesn't respond to doesNotRecognize: or error:; Therefore, /* The object doesn't respond to doesNotRecognize: or error:; Therefore,
a default action is taken. */ a default action is taken. */
objc_error (object, OBJC_ERR_UNIMPLEMENTED, "%s\n", msg); _objc_abort ("%s\n", msg);
return 0; return 0;
} }
......
...@@ -23,6 +23,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -23,6 +23,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "objc-private/common.h" #include "objc-private/common.h"
#include "objc-private/error.h"
#define _LIBOBJC #define _LIBOBJC
/* The line below is needed for declarations of functions such as /* The line below is needed for declarations of functions such as
pthread_mutexattr_settype, without which gthr-posix.h may fail to 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) ...@@ -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))) if ((imp = (id (*) (id, SEL, id))objc_msg_lookup (object, selector)))
(*imp) (object, selector, argument); (*imp) (object, selector, argument);
else 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 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 */ /* Exit the thread */
objc_thread_exit (); objc_thread_exit ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment