Fix Objective C exception handling instability
parent
6697c6cb35
commit
edfee7c3a3
|
@ -3,19 +3,30 @@
|
||||||
#include "../factor.h"
|
#include "../factor.h"
|
||||||
#import "Foundation/NSException.h"
|
#import "Foundation/NSException.h"
|
||||||
|
|
||||||
|
/* This code is convoluted because Cocoa places restrictions on longjmp and
|
||||||
|
exception handling. In particular, a longjmp can never cross an NS_DURING,
|
||||||
|
NS_HANDLER or NS_ENDHANDLER. */
|
||||||
void platform_run()
|
void platform_run()
|
||||||
{
|
{
|
||||||
|
CELL error = F;
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
NS_DURING
|
||||||
SETJMP(stack_chain->toplevel);
|
SETJMP(stack_chain->toplevel);
|
||||||
handle_error();
|
handle_error();
|
||||||
NS_DURING
|
|
||||||
|
if(error != F)
|
||||||
|
{
|
||||||
|
CELL e = error;
|
||||||
|
error = F;
|
||||||
|
general_error(ERROR_OBJECTIVE_C,error,true);
|
||||||
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
NS_VOIDRETURN;
|
NS_VOIDRETURN;
|
||||||
NS_HANDLER
|
NS_HANDLER
|
||||||
general_error(ERROR_OBJECTIVE_C,
|
error = tag_object(make_alien(F,(CELL)localException));
|
||||||
tag_object(make_alien(F,(CELL)localException)),
|
|
||||||
true);
|
|
||||||
NS_ENDHANDLER
|
NS_ENDHANDLER
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue