Hi Everyone,
This patch is a first pass at adding support for exceptions for the GNU runtime. There are a few limitations at present:
- @synchronized() is not yet supported at all. gcc currently emits calls to runtime library functions that don't exist for this directive.
- Only id @catch statements are currently working. This is enough for NS_DURING and friends, but I need to spend more time reading the output from gcc -S to work out how it finds the class pointer to make arbitrary class type catch statements work.
- I've tested it with a few common cases[1] and the clang test suite (which doesn't test exceptions for the GNU runtime, but shows I haven't broken anything else), but there are probably a lot of cases I've missed.
David
[1] Simple test program:
#import <objc/Object.h>
#include <stdio.h>
void objc_exception_throw(id);
id e;
void foo(void)
{
e = [Object new];
@throw e;
}
void nest(void)
{
@try {
foo();
}
@finally {
printf("finally 1\n");
}
}
int main(void)
{
@try {
printf("try.\n");
nest();
printf("fail.\n");
}
@catch(id b) {
printf("Caught id %d.\n", e == b);
}
@finally {
printf("finally\n");
}
return 0;
}
clang.diff (9.55 KB)